index前後の改行,kanjiskip,xkanjiskip

index前後の改行,kanjiskip,xkanjiskip

- 奥村 晴彦 の投稿
返信数: 6
既出だったらすみません(この前のTUG打合せで出た話題に関連)。

\index{}前後が和文なら\kanjiskipが入らないようです(したがって改行もされません)。
\index{}前後が和文と欧文なら\xkanjiskipが入ります。
これは意図通りの動作なのでしょうか。

\hsize=10zw
% \kanjiskip=2zw
% \xkanjiskip=1zw

あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A\index{う}あ\index{い}A
% 普通に改行される

あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え\index{う}あ\index{い}え
% 最後の「え」の直前で改行される

あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え\nobreak あ\nobreak え
% 一切改行されない
奥村 晴彦 への返信

Re: index前後の改行,kanjiskip,xkanjiskip

- 北川 弘典 の投稿
pTeX の \kanjiskip の扱いが変わっている(\kanjiskip は glue ノードとして挿入されることはあまりない)ことによるものです.
ノードとして
    \JY1/mc/m/n/10 あ
    \JY1/mc/m/n/10 え
のように和文文字が連続した時に,行分割時などに
「あ」「え」の間に暗黙に \kanjiskip の glue があるものと取り扱われることになっています.

しかし,\makeindex ありの状態では,「あ\index{い}え」からは
    \JY1/mc/m/n/10 あ
    \write3{\indexentry{い}{\thepage }}
    \JY1/mc/m/n/10 え
のようになるので,「あ」「え」はノードの意味で連続していない
こととなり,これが \kanjiskip が入らない原因です.

余談1:
同様の挙動は,\mark, \vadjust, \insert でもおこります.

余談2:
\penalty (禁則処理で暗に挿入されるものを含む)に関しては
adjust_hlist 内で補正が行われます.例えば「お\penalty600あ」では
    \JY1/mc/m/n/10 お
    \penalty 600
    \glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924
    \JY1/mc/m/n/10 あ
のようになり,\kanjiskip はきちんと補われています.
北川 弘典 への返信

Re: index前後の改行,kanjiskip,xkanjiskip

- 奥村 晴彦 の投稿
ありがとうございます。
\index をどこに入れるかが議論になったので,いろいろやっているうちに,\makeindex の有無で組版結果が変わることに気づきました。
で,「ほげ」が索引語なら
わがはいは\hskip\kanjiskip\index{ほげ}ほげである。
とするのがいいことになるのでしょうか。
奥村 晴彦 への返信

Re: index前後の改行,kanjiskip,xkanjiskip

- 本田 知亮 の投稿
あのときの議論では

(1)\indexは索引語の直前におく
(2)ただし段落の先頭の単語を索引語とする場合は
索引語の直後におく

というのが現状での現実的な策として
主張されました.

(1)は索引語の途中で改ページされると
直後においた場合に「次のページ」がとられる,
(2)は\indexと索引語の間で改ページされ
「前のページ」がとられる
ということへの対処です.

ただ,この場合(1)で\kanjiskipの挿入の有無で
問題が起こることがあるという指摘があって
では最適な方策はないのか・・・
実務的には(1)(2)でだいたい確率的には安心できて
そして「あとは確認する!」と(^-^;

実際

ああ(改行)いい

という組版結果があるところで

ああ\index{う}いい

とすることで

ああい(改行)い

となることはあって,これが責了間際でおこると
運が悪いと雪だるま式にずれてひどいことになります.
幸い,このレベルのずれが許容されないのは
責了間際であって,その場合
修正箇所そのものが少ないく全件チェックが容易なので実務的には大きな問題にはなりません.

\xkanjiskipの場合では

\documentclass{jarticle}
\makeindex
\textwidth3zw
\textheight\baselineskip
\begin{document}
あA\index{う}いい
\end{document}

で,

.\JY1/mc/m/n/10 あ
.\glue(\xkanjiskip) 2.40553 plus 1.0 minus 1.0
.\OT1/cmr/m/n/10 A
.\write3{\indexentry{う}{\thepage }}
.\glue(\xkanjiskip) 2.40553 plus 1.0 minus 1.0
.\JY1/mc/m/n/10 い
.\JY1/mc/m/n/10 い

となるので,\index{う}が「い」に対する索引であった場合,\indexが前のページになります.
#このソースで再現できます.

このパターンは,見かけた記憶がないのですが
可能性としてはあるとは思います.

それなら,どうすればいいのかといわれると
うまい手は思いつかないですが,
ちなみにluatex-jaだとどうなるんでしょう.

本田 知亮 への返信

Re: index前後の改行,kanjiskip,xkanjiskip

- 北川 弘典 の投稿
> ちなみにluatex-jaだとどうなるんでしょう.
現状では,glue は「次の文字」の直前に置かれます.

\documentclass{ltjsarticle}
\makeindex
\tracingonline1\showboxdepth10000\showboxbreadth10000
\begin{document}
\setbox0=\hbox{ああ\index{う}いい}
\nonstopmode\showbox0
\end{document}

では

> \box0=
\hbox(8.13882+1.10983)x36.99463, direction TLT
.\JY3/mc/m/n/10 あ
.\glue 0.0 plus 0.92491 minus 0.09242
.\JY3/mc/m/n/10 あ
.\write3{\indexentry{う}{\thepage }}
.\glue 0.0 plus 0.92491 minus 0.09242
.\JY3/mc/m/n/10 い
.\glue 0.0 plus 0.92491 minus 0.09242
.\JY3/mc/m/n/10 い

となります.

本田 知亮 への返信

Re: index前後の改行,kanjiskip,xkanjiskip

- Z. R. の投稿

「ゴースト」を使う、てのはダメなのかな……。

\documentclass[a4paper]{jsarticle}
\showboxdepth=100\showboxbreadth=100\tracingoutput=1
\usepackage{makeidx}\makeindex
%% \jaindex{}:索引語の出現の直前に置く
\def\jaindex{\jaghost\kern-1zw\relax\index}
\chardef\jaghost=\jis"2121\relax % ゴースト=全角空白
\begin{document}
A\jaindex{ほげ}ほげ\par
あ\jaindex{ほげ}ほげ\par
(\jaindex{ほげ}ほげ\par
、\jaindex{ほげ}ほげ\par
\jaindex{ほげ}ほげ\par
\end{document}