Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

和欧文間に \nolinebreak があるとき当該箇所に \xkanjiskip が挿入されない #52

Closed
yudai-nkt opened this issue Aug 21, 2017 · 11 comments
Labels

Comments

@yudai-nkt
Copy link

yudai-nkt commented Aug 21, 2017

以下のコードを pLaTeX + dvipdfmx で処理すると pLaTeX のバージョンによって組版結果が異なります.(2017-04-15 版の pLaTeX が手元になかったので,このバージョンではテストできませんでした)

\documentclass{jsarticle}
\begin{document}
ほげ\nolinebreak foo
\end{document}

pLaTeX2e <2016/11/29> による出力:
mwe-16

pLaTeX2e <2017/05/05> による出力:
mwe-17

このとおり,新しい pLaTeX では「ほげ」と "foo" の間に \xkanjiskip が入りませんが,旧版のように入るのが正しい結果ではないかと思います.upLaTeX や(texjporg ではないですが)LuaLaTeX + LuaTeX-ja でこれに相当する文書を作成しても同様でした.

なお,

ほげ\nobreak foo\bye

を TeX Live 2017 の plain e-pTeX + dvipdfmx で処理しても \xkanjiskip は挿入されているので,pLaTeX の問題のようです.

@yudai-nkt
Copy link
Author

pLaTeX を更新してみましたが,最新版の pLaTeX2e <2017/07/29> でも 2017-05-05 版と同様に \xkanjiskip は入りませんでした.

@aminophen
Copy link
Member

aminophen commented Aug 21, 2017

報告ありがとうございます。2017/05/05 あたりで,ここ#45 にある理由,すなわち あ\linebreak) のような禁則ペナルティ文字直前で改行できない問題を修正するため,\(no)linebreak の内部マクロの一つに \hskip\z@ を足したためだと思います(pldoc.pdf もご参照ください)。

\xkanjiskip は未考慮だったので後で考えます。

なお,

ほげ\nobreak foo

については,plain e-pTeX のみならず pLaTeX でも同様に \xkanjiskip が入るはずです(ただし禁則ペナルティ前での \break は効かない)。 \(no)linebreak\(no)break の実装思想が違う理由も pldoc.pdf に書いたとおりです。

@aminophen aminophen added the bug label Aug 21, 2017
@yudai-nkt
Copy link
Author

GitHub 上の議論だけ追いかけて具体的なコミットや pldoc.pdf を読んでいなかったため,\nobreak
\nolinebreak[4] の違いは LaTeX の場合と同様に

  • 垂直モードのチェック
  • 空白の後ろに置かれたときの考慮

のみと思っていました,ありがとうございます.自分の用途だとどちらの処理も不要なのでひとまずは \nobreak を使うことにします.

@aminophen
Copy link
Member

aminophen commented Aug 23, 2017

対策を考えてみました。合算が起きても起きなくても無害そうなのは「余分な0のペナルティ」?

\makeatletter
\def\@no@lnbk #1[#2]{%
  \ifvmode
    \@nolnerr
  \else
    \@tempskipa\lastskip
    \unskip
    \penalty #1\@getpen{#2}%
    \penalty\z@\relax %% added (2017/05/03)
    \ifdim\@tempskipa>\z@
      \hskip\@tempskipa
      \ignorespaces
    \fi
  \fi}
\makeatother

これは「明示的な(= \penalty プリミティブによる)ペナルティ同士は合算されない」という仕様を利用しています。つまり LaTeX 本来の \penalty #1\@getpen{#2}% というコードが発行するペナルティと、新たに追加した \penalty\z@\relax は合算されません。そして、後続文字に pTeX の前禁則ペナルティがあった場合、これは「0との合算」になるので、実質的に合算を防げていることになります。

これなら、「\linebreak によるペナルティと後続の前禁則ペナルティの合算が起きない」かつ「\xkanjiskip の挿入は正常に行われる」ような気がします。

@aminophen
Copy link
Member

修正を入れた platex (pLaTeX2e <2017/07/29>+1) および uplatex (pLaTeX2e <2017/07/29u01>+1) を先程リリースしましたので完了とします。何かあったら reopen してください。

@yudai-nkt
Copy link
Author

TeX Live を更新して修正を確認できました.対応ありがとうございます.

@okumuralab
Copy link
Member

すみません,理解できていないのですが,

\documentclass{jsarticle}
\begin{document}

ああああああああああ
ああああああああああ
ああああああああああ
ああああああああああ
ああああああああ\nolinebreak ん

\end{document}

でTeX Live 2017では「ん」の前で改行が起こってしまいます。2016では大丈夫です。

@aminophen aminophen reopened this Jan 26, 2018
@aminophen
Copy link
Member

後で確認します。

@aminophen
Copy link
Member

aminophen commented Jan 26, 2018

多分 \@no@lnbk\penalty\z@\relax を足したせいだと思いますが,これを足した理由は

あ\linebreak )

で改行を起こすためです。悩ましいですが,元に戻したほうが良い?

@aminophen
Copy link
Member

\nolinebreak の変更を revert し,pLaTeX2e <2017/10/28>+4 を CTAN upload しました。

@okumuralab
Copy link
Member

ありがとうございましたm(__)m

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants