papersize \specialと\pdflastypos

papersize \specialと\pdflastypos

- 阿部 紀行 の投稿
返信数: 8
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
阿部 紀行 への返信

Re: papersize \specialと\pdflastypos

- aminophen の投稿
\AtBeginDvi ではなく素で発行した \special は,最初にページを \shipout する時に初めて効く,
という話とは関係ないのでしょうか。
(紙のサイズの設定タイミングと,e-pTeX の \pdfpage〜 の設定タイミングの整合性)
aminophen への返信

Re: papersize \specialと\pdflastypos

- 阿部 紀行 の投稿
\pdfpageheightはソース中そもそも値が変わっていないように思うので,関係ないように思うのですが…….
阿部 紀行 への返信

Re: papersize \specialと\pdflastypos

- Akira Kakuto の投稿
(48424058 - 32201344) / 65536 = 845.04684 - 597.5078
なので,papersize \special (a) があるときには,
paperwidth と paperheight を入れ替えて \pdflastypos
を計算しているようです。
dir_tate の場合に問題があるかもしれません。
北川さん,お願い致します。
Akira Kakuto への返信

Re: papersize \specialと\pdflastypos

- Akira Kakuto の投稿
%\special{papersize=\the\paperheight,\the\paperwidth}% (a)
%\AtBeginDvi{\special{papersize=\the\paperheight,\the\paperwidth}}% (b)

のように逆転しておくと,どの場合も変化しません(??)。

Akira Kakuto への返信

Re: papersize \specialと\pdflastypos

- 阿部 紀行 の投稿
\setlength{\pdfpagewidth}{\paperheight}
\setlength{\pdfpageheight}{\paperwidth}
と逆にしてみたら,29564319という微妙な値が…….上野計算からも32201344が出てくるかと思ったのですが.

うーん,北川君待ちでしょうか…….

Akira Kakuto への返信

Re: papersize \specialと\pdflastypos

- 北川 弘典 の投稿

すみません,ようやく今このスレッドに気づきました.

  • \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 ではこれらをすべて「『高さ』は物理的な縦方向」と思うことにしています(まだ不必要なコードがあったりしますが……).

北川 弘典 への返信

Re: papersize \specialと\pdflastypos

- aminophen の投稿
> https://github.com/texjporg/tex-jp-build/tree/pdfsavepos では
> これらをすべて「『高さ』は物理的な縦方向」と思うことにしています

北川さんによる修正が,r49956 で入りました。
TeX Live 2019 に反映されるでしょう。