名前: ZR 日時: 2010-07-10 02:54:45 IPアドレス: 119.104.58.*
>>55068 少し自分なりに考えてみました。 ここでは「斜体」を「正のスラント値をもつ」の意味で用います。 1. pLaTeX では \text** 命令の「左側」のイタリック補正自動挿入は 無効化されている。(>>55068 より) 2. \xkanjiskip とイタリック補正が同時に起こる時に \xkanjiskip が 消えてしまうのは、前が和文の時のみであり、前が欧文の場合は 両方残る。(>>55069 より) 3. \text** の外のフォントが斜体の場合には「右側」のイタリック補正 は行われない。 <1. の補足> 「左側」の自動挿入が起こるのは次のような場合です。 %<サンプル> \documentclass{article} \usepackage{txfonts} \begin{document} \begin{quote}\itshape You must think of \emph{what} to write before thinking of \emph{how} to write. \end{quote} \end{document} この場合、LaTeX は少々複雑な処理をして、最終的に of\/ {\upshape what} to と書いたのと同じ出力をします。pLaTeX ではこの処理が無効化されている ので、of の後の \/ を明示的に入れる必要があります。 なぜ、左側のイタリック補正自動挿入だけ無効化して右側を残したのかが 気になりますが、やっぱり右側のイタリック補正は頻出するので、手動に した時の面倒を考えるとできなかったということでしょうか。 <2. の補足> つまり、 string {\itshape of}漢字 の場合は〈f〉と〈漢〉の間にイタリック補正(カーン)と和欧文間空白の 両方が入ります。 <3. の補足> これは \maybe@ic@ の定義によります。この場合にイタリック 補正を入れてはいけないことは少し考えれば解ります。 以上のことから、「衝突」が問題になるのは \text**{漢字}ABC のように、 (*1) \text** の中が和文で、その後に欧文が続く場合 (つまり、>>55068 で本田さんが指摘したケース)に限られることが 判ります。 ここで、和文の書体の使用について次のような仮定をおくことにします。 (*2) 和文の斜体は、同じ段落内では斜体でない書体と混在しない。 この仮定の下では、 (*3) \text** の中のフォントが斜体でない場合は(右側の)イタリック 補正を行わない という変更を加えれば問題が起こらなくなります。理由は次の通りです。 - 右側のイタリック補正が必要なのは、中が斜体で外が非斜体の場合に 限られる。従って、(*3) の変更により、必要なイタリック補正が 失われる危険性はない。 - さらに、3. の事実と (*3) の変更内容を合わせると、実際に右側の イタリック補正が行われるのは、中が斜体で外が非斜体の場合(前項 の「必要な」場合)に限られる。「衝突」が起こる (*1) の条件と今の 条件を合わせると、\text** の中に和文の斜体が存在し、かつ外側に 非斜体が存在することになり、(*2) の仮定に反する。ゆえに「衝突」 が起こる場合はもはや存在しない。 以下のようにすると変更を少なく抑えることができます。 %<サンプル>------- \documentclass{jsarticle} \makeatletter % 変更後のフォントが斜体でなければ右側のイタリック補正自動挿入を % キャンセルする。フォント変更後に呼ばれる \check@icl を乗っ取る % という形にしている。 \def\xx@check@ic{% \ifdim \fontdimen\@ne\font>\z@ \else \let\check@icr\@empty \fi} \def \check@nocorr@ #1#2\nocorr#3\@nil {% \let \check@icl \maybe@ic %ここは何でもよい \def \check@icr {\ifvmode \else \aftergroup \maybe@ic \fi}% \def \reserved@a {\nocorr}% \def \reserved@b {#1}% \def \reserved@c {#3}% \ifx \reserved@a \reserved@b \ifx \reserved@c \@empty \let \check@icl \@empty \else \let \check@icl \@empty \let \check@icr \@empty \fi \else \ifx \reserved@c \@empty \else \let \check@icr \@empty \fi \fi \let \check@icl \xx@check@ic %*追加* %(もちろん無駄なコードを除いてもいいけど…) } \makeatother \begin{document} % 必要なイタリック補正と和欧文間空白が入る 漢\textbf{f}漢f\textbf{漢}f\par 漢\textit{f}漢\par \textit{f\/\textup{漢}f}\par \begin{quote}\slshape % 仮に和文斜体が可能だとして % イタリック補正は不要、和欧文間空白が入る 漢\textbf{f}漢f\textbf{漢}f \end{quote} \end{document} %<EOF>--------------
この書き込みへの返事: