(e-pTeX) \pdfsaveposの有無で出力が変わる

(e-pTeX) \pdfsaveposの有無で出力が変わる

- 阿部 紀行 の投稿
返信数: 7
タイトル通りですが,\pdfsaveposの有無で出力が変わることがあるようですが,それってそういうもんなんでしょうか?

以下再現ソースです.
\documentclass{jsarticle}
\textwidth=5zw
\parindent=0pt
\begin{document}
あいうえ
\pdfsavepos
\hbox{\vbox{さしすせ}}かき
\newpage
あいうえ
\hbox{\vbox{さしすせ}}かき
\end{document}

結果は添付の通りです.一ページ目と二ページ目は\pdfsaveposの有無しか違わないので,結果は同じだろうと思ったのですが,一ページ目では二行目にある「え」が二ページ目では一行目に移りました.

ちなみにLuaTeX-jaでの対応するソース

\documentclass{ltjsarticle}
\textwidth=5\zw
\parindent=0pt
\begin{document}
あいうえ
\savepos
\hbox{\vbox{さしすせ}}かき
\newpage
あいうえ
\hbox{\vbox{さしすせ}}かき
\end{document}

だと同じ出力を得ることができています.
阿部 紀行 への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- Dora TeX の投稿
\lastnodetype を用いて調べてみると,e-pTeX の \pdfsavepos も LuaTeX の \savepos も,whatsit ノードを生み出すという点では共通のようですが,両エンジンで行分割アルゴリズムが異なるのでしょうか。

\pdfsavepos の代わりに \label や \special や \write のように,whatsit ノードを生み出す他の命令でも同様の違いがもたらされました。
Dora TeX への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- aminophen の投稿
pTeX では「\kanjiskip は glue ノードとして挿入されることはあまりない」
という forum:1062 の話と関係しているのでしょうか?
(LuaTeX-ja では glue ノードとして挿入される、という話だったような。)
例でいうと「え」の後に改行が入らなくなる理由はこれで説明つきそうです。
Dora TeX への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- 阿部 紀行 の投稿
> \pdfsavepos の代わりに \label や \special や \write のように,whatsit ノードを生み出す他の命令でも同様の違いがもたらされました。

\specialや\writeで変わるのと同じと言われるとそりゃ変わっても仕方がない気がしてきました.なんか納得しました.ありがとうございます.(でも誰か細かいことを教えてくれるのに期待.)
阿部 紀行 への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- Z. R. の投稿

pTeX 系では「グルー・カーン・ペナルティがなくても行分割可能になる」場合があるので、念のため分割可能であるかも確認しておきます。

% plain e-pTeX 文書
\vbox{\hsize=1zw \noindent
あ\pdfsavepos い\special{pn 1}う\write16{foo}え
}
\bye

これをコンパイルすると、「い」「う」「え」は全部はみ出してしまいます。なので、「和文文字と whatsit の間」は分割可能にならない、と推定できます。

阿部 紀行 への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- Z. R. の投稿

(「細かい話」への需要があるようなので。)

% plain e-pTeX 文書
\jfont\rml=rml \rml % 1zwを丁度10ptに
\kanjiskip=5pt
\showboxdepth=100 \showboxbreadth=100 \tracingonline=1
\setbox0\hbox{%
あ\pdfsavepos い\special{pn 1}う\write16{foo}え
\penalty42 お\relax か
}\showbox0
\bye

\showbox の結果:

> \box0=
\hbox(8.99998+1.0)x70.0, yoko direction
.\rml あ
.\pdfsavepos
.\rml い
.\special{pn 1}
.\rml う
.\write*{foo}
.\rml え
.\penalty 42
.\glue(\kanjiskip) 5.0
.\rml お
.\rml か

「隣接した和文文字同士の間には暗黙の \kanjiskip が入る」という規則のため、〈お〉と〈か〉の間に暗黙の \kanjiskip が入ります。ボックスの中に 2 つの \kanjiskip があるため、横幅は(10.0×6+5.0×2=)70.0pt となっています。

この結果からわかることは:ペナルティを入れた場合は、それによって消えてしまう暗黙の \kanjiskip を補うために、明示的な \kanjiskip のノードが挿入されます。それに対して、whatsit を入れた場合には同様の処理は行われないため、元々あった \kanjiskip が消えてしまうわけです。

\pdfsavepos は whatsit の一種」(これは pdfTeX の決定)でかつ「whatsit が入ると \(x)kanjiskip が消える」(これは元祖 pTeX の決定)なので、e-pTeX における \pdfsavepos の挙動についても他の選択肢は無さそうです。

Dora TeX への返信

Re: (e-pTeX) \pdfsaveposの有無で出力が変わる

- 本田 知亮 の投稿
以下のサンプルで状況がみえるように思います.
1062と同じだと思います.

\documentclass{jarticle}
\begin{document}
\hbox to5zw{ああ\pdfsavepos ああ}
\par
\hbox to5zw{ああああ}
\end{document}

abenoriさんの例だとjsかjかで結果が変わると思います.

\indexなどは「完全な透過」ではないと
理解していたので,そういうものだと思ってました.
現象としては\kanjiskipが挿入されないんだなと.

LaTeXのどこかのドキュメントに
「\indexの\@bshackとかは完璧じゃない」
とあった記憶があるので、そんなもんかなと.