Ticket #28164

\inhibitglue の TeX コードを見直す

Open Date: 2012-04-24 21:39 Last Update: 2012-04-25 12:32

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None

Details

十日ほど前に、どこかで \inhibitglue がコケているという話を聞いて、 調べてみました。

\protected\def\inhibitglue{\relax%
  \ifvmode
    \ltj@reset@globaldefs
    \xdef\@@tempa{\the\everypar}%
    \xdef\@@tempb{\everypar={\@@tempa}\@@tempa\noexpand\ltj@@ihb}%
    \everypar\expandafter{\@@tempb}%
    \ltj@restore@globaldefs
  \else\ifhmode\ltj@@ihb\fi\fi}

恐らく、意図としては、

元々の \everypar の内容が「XXXXX」である場合、 それを「\everypar={XXXX}XXXX\ltj@@ihb」に変える

だと思うのですが、 上のコードだと XXXXX が (2 回目の) \xdef 中で完全展開されてしまうことになり、 これは一般的には正しくありません。

Ticket History (3/6 Histories)

2012-04-24 21:39 Updated by: zrbabbler
  • New Ticket "\inhibitglue の TeX コードを見直す" created
2012-04-24 21:50 Updated by: zrbabbler
Comment

「意図」通りに書くと次のようになります。

\protected\def\inhibitglue{\relax%
  \ifvmode
    \ltj@reset@globaldefs
    \xdef\ltj@@g@newep{%
      \everypar={\the\everypar}\the\everypar\noexpand\ltj@@ihb}%
    \everypar\expandafter{\ltj@@g@newep}%
    \ltj@restore@globaldefs
  \else\ifhmode\ltj@@ihb\fi\fi}

ただここで問題になることがあって、元のコードでは \@@tempa\@@tempb という「自分の名前空間の外(自分の制御外)」の制御綴に対してグローバルな代入をする、 という(あまり一般的でない)ことを行っています。 これは意図したことでしょうか?

多分そうではなくて、ltj が抜けたのだと思いますが、 それでも、(ローカル代入に使っている)\ltj@@tempa 等にグローバル代入をするのは非常に危険です。 上のコードでは取りあえず専用の変数 \ltj@@g@newep にしています。 (一般的に、同じ変数に対してグローバル代入とローカル代入を混ぜるのは危険なので、可能な限り避けるべきです。)

2012-04-24 22:04 Updated by: zrbabbler
Comment

なお、TeX コードの見直しについては、こちらでブランチを切っていて、 明らかな間違いについてはそこで修正することにします。

確認が必要なものはチケットに上げていきます。

2012-04-24 22:05 Updated by: abenori
Comment

zrbabbler への返信

手元では以下のコードでこけていたのですが,とりあえず上記のようにしたら通るようになりました.

\documentclass{article}
\usepackage{luatexja}
\newenvironment{sample}{\trivlist\item\inhibitglue}{\endtrivlist}
\begin{document}
\begin{sample}
\end{sample}
\end{document}

2012-04-24 22:18 Updated by: h7k
Comment

おお,ありがとうございます.仰られた通り,

元々の \everypar の内容が「XXXXX」である場合、 それを「\everypar={XXXX}XXXX\ltj@@ihb」に変える

という目的でのみ急ごしらえで書いたコードでした.\xdef にしたのもたぶんその場の成り行きで書いてしまったものかと.

\inhibitglue の別の問題で悩んでいてコメントの文面を悩んでいたら,いつのまにか進んでいてびっくり.


# 「別の問題」というのは,チケット #28162 にも書きましたが,ltjsarticle.cls 下で

あああ

\inhibitglue\paragraph{hoge}
という入力をすると,(\inhibitglue 由来の whatsit ノードだけからなる)余計な行ができてしまうということです. ノード挿入以外でなんとか(段落頭の)JFM グルー挿入抑制を制御できたらいいのですが.

2012-04-25 12:32 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2012-04-25 12:32
Comment

チケット #28162 もあって,外側の \ifvmode ... \fi はなくしましたので,完了とします.

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login