Re: dvipdfmx での用紙サイズの拡大/縮小

名前: ZR
日時: 2008-12-24 01:54:32
IPアドレス: 122.29.155.*

>>52389 表題の件についてちょっと考えてみました。 ■ 仕様の確認 まず最初に TeX、DVI ドライバ、jsarticle(等の新クラス)、geometry の 仕様についての確認です。間違っていたら指摘してください。 - TeX の仕様では、「true な長さを使う」または「\shipout を行う」と、 \mag はそれ以降変更できなくなる。(他にも条件があるかも知れないが それを含めて)それ以外の場合は \mag は再設定可能。 - 現状では、jsarticle は必ず \mag を設定し、その後で true な長さを 用いている。 - geometry は mag オプションを指定した時にのみ \mag を設定する。また truedimen オプションを指定した場合にのみ自発的に true な長さを用いる。 (ユーザ自身が true な長さを設定する可能性もある。) - geometry が読まれる前に用紙サイズ(\paperwidth と \paperheight)と \mag が設定されていて、geometry のオプションでそれらが変更されない 場合、その値を使って正しい処理が行われる。 - papersize special で指定する長さは実際の長さである。つまり、true な 長さと同じく、DVI の mag による影響を受けない。 - DVI の原点の用紙左上からのオフセット値は 1truein である。(1in では ない。ただし dvips は動作が変?) - geometry で mag が 1000 でない場合、オフセットが 1in になるように \hoffset, \voffset で調整している。 ■ jsarticle の修正の可能性 jsarticle の修正について、以下の 3 つの場合を試してみました。 A) 現状のまま。 B) 基底サイズが既定の 10pt の場合は true な長さを使わないことにする。 つまり、3 箇所ある「1truein」を「10pt なら 1in、それ以外は 1truein」 に変更する。 C) 1truein の値を自力で求める。つまり「1000in / mag」とする。 (1) 基底サイズ 10pt の場合。 %<例>-------- \documentclass[a4paper,10pt]{jsarticle} \usepackage[mag=500]{geometry} %<EOF>-------- A) はエラー。B), C) は正常。 (2) 基底サイズが 10pt でない場合、その 1。 %<例>-------- \documentclass[a4paper,12pt]{jsarticle} \usepackage{geometry} %<EOF>-------- A), B), C) とも同じ結果で、用紙サイズの設定が不正になる。"a4paper" で jsarticle は 10/12 に縮小した大きさを設定するが、geometry(ここ にも a4paper オプションが引き渡される)は A4 そのままの値を指定し、 かつ jsarticle で設定された mag (1200) を引き継ぐため。 (3) 基底サイズが 10pt でない場合、その 2。 %<例>-------- \documentclass[a4paper,12pt]{jsarticle} \usepackage[truedimen]{geometry} %<EOF>-------- A), B), C) ともに正常。「jsarticle で 10pt でない場合は長さを true で指定する」というのが(初心者向けの)注意書きだから、geometry でも truedimen を指定し true な長さを使用するというのは理にかなっている のかも。 (4) 基底サイズが 10pt でない場合、その 3。 %<例>-------- \documentclass[a4paper]{jsarticle} \usepackage[mag=1200,truedimen]{geometry} %<EOF>-------- (3) と同じ効果をこの指定でも得られる。A) はエラー。B), C) は正常。 これを使うと、「10.5pt」(mag=1050)とか「和文サイズ 12bp」(mag=1302)と いった指定も可能。 (5) 基底サイズが 10pt でない場合、その 4。 %<例>-------- \documentclass[a4paper,12pt]{jsarticle} \usepackage[mag=500]{geometry} %<EOF>-------- (3) を 50% に縮小したものを作りたいのだが、こういう指定を正しく動かす のは、恐らくは、geometry に jsarticle 用の修正を組み込む(あまり望ましく ないですね)ことをしないと無理。とりあえず、 %<例>-------- \documentclass[a4paper]{jsarticle} \usepackage[papersize={105truemm,148.5truemm},mag=600]{geometry} %<EOF>-------- のように、実際に 50% にした値を true で指定するしかない。これは文書内で 出てくる長さについても同じことがいえるので本質的に避けようがない。 以上を踏まえて、私の考察は次のようになりました。 - jsarticle を B) か C) のように修正するのは、(1) や (4) が可能になる ので有意義に思われる。 - その上で「基底サイズが 10pt 以外の時は、geometry でも truedimen を 用いる」ことを注意すると jsarticle と geometry の整合がよくなる。 - (5) が結局実現できないので、C) が B) より優位であるわけではない。 ■ geometry の動作の疑問点 例えば、次のような設定の場合、 %<例>-------- \documentclass{article} \usepackage[papersize={400pt,400pt},mag=500,showframe]{geometry} \begin{document} papersize = \the\paperwidth, \the\paperheight \end{document} %<EOF>-------- papersize special 中の用紙サイズは 200pt×200pt ですが、LaTeX 内の 用紙サイズの設定は 400pt×400pt のままであるべきだと考えています。 しかし、上の例を実際に処理すると、\paperwidth, \paperheight は 200pt(+誤差)になっていて、またそのため、showframe で現れる紙面 の枠が誤った位置に出力されています。 ■ その他 >>52388 >あるいは,同じことをしているのなら,js*のほうでgeometryの機能を >取り込んでしまえばいいんですね。どなたか冬休みの課題でやってくださる >学生さんがいたらいいのですが……。 geometry はかなり多機能で大きなパッケージなので、それを取り込むと いうのは、クラス・パッケージの設計としてあまり好ましくないような。 一部だけ取り込むとすると、残りの機能を使いたい場合に geometry を 併用した時の衝突がさらに激しくなるでしょうから、これもよくない…。 >>52373 %-- B案 -- >geometry パッケージで上記 \special の出力を抑止する方法、または、 >dvipdfmx -p a5 -m 0.72 を強要する方法がわかりません。 最新の 4.2 版(2008/12/21 更新)の geometry ではオプションに 「driver=none」を指定すると、DVI ドライバ特有の指定が抑止されます。 ただ、mag を再設定すると、offset を調整する必要が出てくるので、この 方法はあまり賢明でないかもしれません。 なお、 (>>52387) >> \usepackage{atbegshi}% geometryにdvipdfmを指定するときに必要。なぜ? >については、\AtBeginShipoutFirst の定義/未定義判定がやや甘かったので、 >次バージョンgeometry v4.2では修正いたします。しばらくお待ちください。 の件も対処されています。

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)