texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

\text... の \xkanjiskip 対策は必要か? #51

Closed aminophen closed 6 years ago

aminophen commented 7 years ago

pLaTeX カーネルには \check@nocorr@ が再定義されています。\xkanjiskip が入らない問題に対策するためらしいのですが,簡単なテストでは LaTeX のコードそのままでも問題なく見えます。

\documentclass{article}

\makeatletter
\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
}
\makeatother

\begin{document}
\xkanjiskip10pt
あ\texttt{abc}い
\end{document}

pTeX の挙動が変わったのでしょうか? もしもう不要なのであれば,LaTeX との差分をなくすため修正を外してしまいたいと考えています。

h-kitagawa commented 7 years ago

aminophen さんによる上記のサンプルを試してみました.

この間に pTeX 本体に「xkanjiskip 挿入時にはイタリック補正を無視する」補正が入ったのだと思いますが,ちょっと記憶にないので探してみます.

h-kitagawa commented 7 years ago

私は LaTeX 本来の定義に戻して構わないと考えています.

2010-12-31 の ptex-base.ch の修正コミット をみると,それより前の pTeX では次のようになっていたようです(\/ はイタリック補正).

  1. 「欧文文字 → \/」の場合には \/ を無視する(つまり,後に \xkanjiskip挿入可能)
  2. 「和文文字 → \/」の場合にはこの後に \xkanjiskip は挿入できない

前段落で述べたコミットは,もともとはアクセント付き文字についての \xkanjiskip 挿入の修正でしたが,副作用として次のように仕様変更されています.

さて,今問題になっている pLaTeX カーネルの \check@nocorr@ 修正は 2. に対応するものだと推測されます.ただ,これは「左への \/ 挿入」を無効化しているので,以下のソースで LaTeX と pLaTeX の間に差異が発生しています(pLaTeX では f と a の間の \/ が入らない):

\documentclass{article}
\begin{document}
\setbox0=\hbox{\textit{f\textup{af}b}}
\showboxdepth10000
\showboxbreadth10000
\tracingonline1
\showbox0
\end{document}

(修正:\check@nocorr\check@nocorr@

aminophen commented 7 years ago

いつ頃の変更なのか追跡できていなかったのですが,2010 年,p3.2 とのヒントでさがしてみると

https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55068.html

からの「\textbfと直後の欧文とのアキ」がヒットしました。

「入るべきイタリック補正が入らない」のは確かなので,pTeX が修正されたいまは pLaTeX 側の workaround は外すほうがよさそうですね。例の qa も参考にテストケースを作ってみましょう。

aminophen commented 7 years ago

556520f で exppl2e.sty に本家 LaTeX のコードを持ってきました。

qa から適当に拾ってきたテストケースも足して tests/icorr_xkanjiskip.tex を置いています。私の追加分は \showbox とかは使っていないですがとりあえず。

kbhonda commented 7 years ago

この件ですが,北川さんの追跡の通りだと思います.

もともと\textXXとitalic correctionに問題があって \xkanjiskip vs icみたいな議論がありました. 乙部さんの指摘から始まったpTeX MLとかでの話です (乙部さんによるjnic.sty(Japanese No Italic Correction style)が pLaTeX2eに取り込まれたのでした). icより\xkanjiskipだよねーみたいな流れでした.

そのあと,pTeX MLとかQ&Aで アクセント付き文字で\xkanjiskipが消える話, AAA\textXX{和文}BBBで\xkanjiskipが入る・入らない話(qa55068)を 指摘して,ともに北川さんが作られたpatchが適用されたという流れでした.

aminophen commented 7 years ago

texjporg/jsclasses#37, texjporg/jsclasses#59 の話題で:

jsclasses では \textmc と \textgt が \DeclareTextFontCommand を使わずに,単純な(=イタリック補正を削除して)定義に変更されています。その説明に

次のコマンドはイタリック補正なども含めて定義されていますが,和文ではイタリック補正はあまり役に立たず,欧文・和文間のグルーが入らないという副作用もありますので,単純な定義に直します。 [2016-08-26] 和欧文間の\xkanjiskip が入らない問題は,plfonts.dtx v1.3i (2000/07/13) の時点で修正されていました。逆に,amsmath パッケージを読み込んだ場合に,数式内の添字で文字サイズが変化するようになるはずのところが,変わらなくなっていましたので,修正しました。

とあります。ここでいう「副作用」つまり「イタリック補正と和欧文間グルーの衝突」は

完全に対処されていると思われます。それでもなお \textmc と \textgt を簡略化しなければならない理由は何でしょうか?

というのも,fixjfm.sty をご覧いただくとわかりますが,そこでは

とあるので,もし仮に (★) で問題が起きるのであれば Yue ZHANG さんに伝えた方が良いと思うのです。どなたかわかる方いらっしゃいますか?

zr-tex8r commented 6 years ago

それでもなお \textmc と \textgt を簡略化しなければならない理由は何でしょうか?

この簡略化が2010年以前に必要だったのは確かでしょう。

古い pTeX については pLaTeX カーネル内(=今回の #51 で削除した jnic.sty 由来コード)で

古いpLaTeXでの修正は「右側のイタリック補正は残している」ので、「\textXX{和文}直後でxkanjiskipが消える」問題は残っていたわけです(それを対処したい、というのがqa:55068の話題)。なので、「中がほぼ確実に和文である」\textmc\textgtでは右側イタリック補正は不要なので、これを外してxkanjiskipを活かす、という処置が妥当だったでしょう。

2010年以降のpTeXしか考えないのであれば、恐らくこの処置も不要でしょう。

aminophen commented 6 years ago

コメントありがとうございます。jsclasses は「古い TeX 環境でクラスだけ新しいものを使う」可能性がないとは言えないので,処置は残したほうがいいのでしょうね。pLaTeX のほうは安心して削除することにします。

aminophen commented 6 years ago

次のリリースへ向けて,カーネルからも \check@nocorr@ 修正を削除しました。ひとまず完了とします。