移植された\pdfsaveposを実際に使ってみました。タイプセットすると,確かに紙面上の位置が取得されている(ような気が)します。時(すなわち,当該ページが組版される時点)であるため,値を取得するためには少なくとも次のページに進まなければなりません2。従って上のテストソースには\newpageを挿入しています。文書を作成しているときpapersizeオプションが無性に恋しくなるのは周知の事実です。いうことで,papersizeオプションを宣言して\pdfsaveposを実行してみたところ,その結果は上と変わってしまいました。sp}\end{document}おそらくpapersizeオプションの何らかの作用が\pdfsaveposの機能に干渉するのでしょう。実際にjsarticle.clsを覗くと,papersizeオプションの有無は以下の\specialの発行に(のみ)関与しています。中身ベタ打ち,usemag)問題の検証のため,\AtBeginDviをプリアンブルに移しpapersizeオプションを外してみました。グローバルに宣言したpapersizeというオプションがどこか他の場所3で悪さをしているのではないかと考えたためです。pdfsaveposCheck.tex\documentclass[a4paper,9pt]{jsarticle}\AtBeginDvi{\special{papersize=\the\stockwidth,\the\stockheight}}%%%この一行がpapersizeオプションと同じ意味のはず。いえば\magによる拡大縮小が特徴であり,それとの相性の悪いパッケージを読み込むと不具合が生じることってあるみたいですよね4。最近のJS文書クラスには\magを使わずに組版を行うnomagオプションというものがあるみたいです。nomagを宣言してもう一度試してみましょう。sp}\end{document}上のどちらとも異なる値。\mag使ってないししょうがないのかな...?ケース5(papersize宣言,nomag)この状態でpapersizeオプションをつけたらどうなるのでしょうか(もはや怖いもの見たさ)。sp}\end{document}これまでのどのケースとも異なる値。まとめ以上の試行をまとめると,次の表のようになります。おける\pdfsaveposの実装を調べてみました。ファイルを出力するまでの役割しか負わないはずです。起動すらしていないのに)\pdflastyposの値が帰ってきています。上における位置を取得している事になります。specialを用いるものが一般的です。それを解釈することにより目的のサイズの紙面が得られます。ユーザーがサイズを指定する手段として用いる方法は内部でこれが動いています(こちらとこちらの記事が詳しいです)。specialはこの書式を満たしているため,この点についてはユーザーが考慮する必要なく自動的に連携がとれています。例2・例3の場合,紙面サイズはdviwareに正しく伝わるが,仮想的なPDFの原点位置が設定されない。プリミティブであり,デフォルト値はともに0です。ファイルに影響を及ぼす事はありません。座標系を(仮想的に)用意することができます(原点位置の決定方法の詳細は後述)。specialは\magがかかっていないサイズ,すなわち文字サイズ指定に依らない出力紙面そのもののサイズを指定しています7。jsarticle.clsなどで,\AtBeginDvi{\special{papersize=\the\stockwidth,\the\stockheight}}というソースの付近が処理(おそらく字句解析)される時点では,\stockwidthや\stockheightには\magの効果がかかっていない紙面サイズが代入されています。specialを発行したのちに,\stockwidthや\stockheightに\magの逆数をかけ,値を変更しています。初めの例において「ケース2」と「ケース3」とで違いが生じた理由はこれであると考えられます。座標を実際よりも大きく計測してしまったのでしょう。ページサイズの指定はpapersizeオプションにまかせ,手動指定は避けるのが賢明だと考えられます。原点が設定され,それに対する位置を計算した(?)。文書クラス内ですでに変更されていたものであり,実際の紙面サイズを表してはいなかった。原点の,紙面に対する位置は次のように定められているようです。紙面左上から\hoffset+1インチだけ右に進み,\voffset+1インチだけ下に進んだ位置をページの基準点としており,通常の文書クラスでは\hoffsetや\voffsetは0ptとされます。a4paperオプションを与えると,以下のようにページレイアウトが設定されます。inchが1tureinであり,かつ\hoffsetと\voffsetが0ptと設定されているならば,上の法則は以下のように書き下すことができます。ページの基準点から1inだけ左に進み,1inだけ上に進み,\pdfpageheightだけ下に進んだ位置がPDF原点位置となる。タイプセットすることによりこれを確認することが出来ます。1ページ目をshipoutし,位置を確定させる%%%%以上が測定部分。sp値それらの差:\the\numexpr\pdflastypos+\dimexpr\paperheight-1truein+1in-\pdfpageheight\relax\relax\end{document}ドキュメントクラスのオプションusemagや9ptを,nomagや8pt,12ptなどに入れ替えて実験を行うと,実測値と理論値(の絶対値)が常に一致することがわかります。原点位置の決定法則はおそらく正しいことが確認されます。nomagでは原点位置と紙面左下端が一致することも理解できますね(左下端の座標が(0,0)となるため)。何が起こっているのか,いくつかの例で図示すると以下のようになります。(以下の図は距離の差を誇張しているため,縮尺は正確ではありません。文字サイズ9pt,usemagでタイプセットすると,ページ左下端の座標は(-451254,-4826063)となりました。原点位置)に対する青点(紙面左下端)の座標を計測しているためと考えられます。文字サイズ9pt,nomagでタイプセットすると,ページ左下端の座標は(0,0)となりました。原点位置と紙面左下端が一致しているためと考えられます。文書クラスでusemag,かつ10pt以外の文字サイズを指定した際には不都合を生じます。原点が指定されてしまうためです。原点が設定されてしまった」とみなして良いでしょう。文書クラスで\pdfsaveposを用いる際には,nomagオプションが必須であると考えるべきです。(追記)\pdfsaveposを,「PDF原点位置が紙面左下端に設定されることを前提として」用いる場合にはnomagオプションが必須であると言えます。座標を,その点から紙面下端までの距離として利用する場合などです。文書クラスのオプションによらず正常に機能すると考えられます。これから「ケース2」と「ケース5」とで違いが生じた理由を説明できます。原点が意図しない位置に設定されてしまったわけですね。原点が設定され,それに対する位置を計算した。文書クラス内ですでに変更されていたものであり,実際の紙面サイズを表してはいなかった。原点が設定され,それに対する位置を計算した。前節のプロセスにより指定された原点とその地点の距離を計測し,\pdflastxpos,\pdflastyposに格納します。時(該当部分の含まれるページが組版される時点)であることには注意が必要です。少なくとも\pdfsaveposが含まれるページの次ページに進むまでは\pdflastxposなどは取得できません。原点位置が定義される前に\pdfsaveposが呼び出された場合,\pdfpagewidth,\pdfpageheightは\shipoutしたボックスの寸法と\hoffset,\voffsetから計算された「現在のページサイズ」に自動的に設定されるようです。系列のプリミティブ』講演資料より「現在のページサイズ」が具体的にどう計算されるかについては文献が見当たらなかったため,正確なことは言えません。エンジンが自動で計測する「現在のページサイズ」は同一ではないということが確実に言えるでしょう。,「ケース1」と「ケース4」の測定距離が同一でないことから,この「現在のページサイズ」の計測方法は,ユーザーやパッケージが\magを用いて紙面サイズを拡大・縮小することを想定せず設計されている可能性も考えられます。specialを用いずに紙面サイズ指定を行なった場合にも\pdfsaveposを正しく機能させるための工夫であると考えられるのですが...。これとJS文書クラスの相性は今ひとつなようです。文書クラスが想定する紙面サイズ)を元に位置を計算。「現在のページサイズ」の計算は\magの影響を受けている。原点が設定され,それに対する位置を計算した。文書クラス内ですでに変更されていたものであり,実際の紙面サイズを表してはいなかった。文書クラスが想定する紙面サイズ)を元に位置を計算。原点が設定され,それに対する位置を計算した。文書クラスで\pdfsaveposを用いて正しい測定を行いたい場合は,papersizeオプションおよびnomagオプションを必ず宣言しなければいけないようです。パッケージなどで実際に利用されています。前に値を呼び出すと,1つ前の\pdfsaveposにより計測された座標(なければ初期値0)が返されます。例示ソースにおいては考えにくいですが,当初この問題に直面したとき,作業ファイルに複数のパッケージをロードしており,「どれかのパッケージにもpapersizeオプションが用意されており,予期せぬ動作を引き起こしているのではないか」と考えました。↩これも同様に,当初の作業ファイルで複数のパッケージをロードしていたために思いついた操作です。ソース(pdfutils.ch)より。↩マクロツイーターのコメントより。仕様に合わせた措置であると考えられます。requestStockLike6@VoDTeXとLaTeXとMETAFONTが好き。upLoginユーザーは見つかりませんでした。