papersize \specialの有無で\pdflastyposの値が変わるようで悩んでいます.お知恵をお貸しいただけると助かります.e-pTeXはpapersize \special実行時に\pdfpagewidthと\pdfpageheightを更新しますが,それが影響しているわけではないように見えています.
ソースは以下です.先ほど更新したW32TeXで試しています.(オプションdvipdfmxが不要ですが無視してください…….)
\documentclass[dvipdfmx]{tarticle}
\setlength{\pdfpagewidth}{\paperwidth}
\setlength{\pdfpageheight}{\paperheight}
% 以下二行をコメントアウトしたりしなかったりして試してみる.
\special{papersize=\the\paperwidth,\the\paperheight}% (a)
\AtBeginDvi{\special{papersize=\the\paperwidth, \the\paperheight}}% (b)
\begin{document}
A\pdfsavepos
\newpage
\message{pdflatexpos = \the\pdflastxpos, pdflastypos = \the\pdflastypos, pdfpagewidth = \the\pdfpagewidth, pdfpageheight = \the\pdfpageheight}
\end{document}
以下のように,(a)を有効にした時のみ値が変わっています.
* (a)(b)ともにコメントアウト
pdflatexpos = 33717886, pdflastypos = 48424058, pdfpagewidth = 597.50787pt, pdfpageheight = 845.04684pt
* (a)のみコメントアウト
pdflatexpos = 33717886, pdflastypos = 48424058, pdfpagewidth = 597.50787pt, pdfpageheight = 845.04684pt
* (b)のみコメントアウト
pdflatexpos = 33717886, pdflastypos = 32201344, pdfpagewidth = 597.50787pt, pdfpageheight = 845.04684pt
* どちらもコメントアウトしない
pdflatexpos = 33717886, pdflastypos = 32201344, pdfpagewidth = 597.50787pt, pdfpageheight = 845.04684pt
すみません,ようやく今このスレッドに気づきました.
- \pdfsavepos で「絶対位置」を取得する際には,\pdfpage{width,height} そのものの値ではなく cur_page_{width, height} という内部変数の値が使われる.
- cur_page_{width, height} が設定されるのは以下の2つ: a) 各ページの shipout 開始時 b) shipout 中に papersize special に遭遇したとき
- a) では,\pdfpage{width,height} が 0 でなければ cur_page_{width, height} はそれぞれその値になる.
- 問題は b) で,\pdfpage{width,height} も cur_page_{width, height} も同時に変更するが,その中に次のような処理がある:
if (dvi_dir=dir_tate)or(dvi_dir=dir_dtou) then begin t:=cur_page_height; cur_page_height:=cur_page_width; cur_page_width:=t; end;
今回の状況では,おそらくこの if 文の影響で \pdflastypos 計算のために使う cur_page_height が \pdfpagewidth の値として設定されてしまったと推測されます.
上記 3 行のコードは,おそらく「\pdfpage{width,height} や papersize special の『幅・高さ』は物理的な方向か?」ということに ついて私がまだ良くわかっていないときに書いたのでしょう.
https://github.com/texjporg/tex-jp-build/tree/pdfsavepos ではこれらをすべて「『高さ』は物理的な縦方向」と思うことにしています(まだ不必要なコードがあったりしますが……).