jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- Lemures Lemniscati の投稿
返信数: 5

Cygwin + Tex Live 2023 を使用しています.

This is LuaHBTeX, Version 1.16.0 (TeX Live 2023/Cygwin)
LaTeX2e <2022-11-01> patch level 1
 L3 programming layer <2023-02-22>
Document Class: jlreq 2023/03/05 jlreq

問題点

  1. lualatex で jlreq.cls を使用し,
  2. \obeylines が有効な状態で \endnote を使用し,
  3. \obeylines が無効な状態で \theendnotes が実行されると,
  4. endnote 内で,改行による改段落以後のインデントがずれる.

再現方法

例えば下記の test.tex を lualatex で処理しますと, 2番目の \endnote のインデントが改段落以後ずれます.

--- test.tex ---

\documentclass{jlreq}
\begin{document}

\begingroup\obeylines%
テスト\endnote{改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.%
\par%
改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.}
\endgroup

\begingroup\obeylines%
テスト\endnote{改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.
改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.改段落を含むながい endnote をいれる.}
\endgroup

\theendnotes
\end{document}

期待すること

\obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されても,endnote 内で(改行による)改段落以後のインデントがずれることがない.

現状の回避方法

最初の \endnote のように,\obeylines が効いた状態の \endnote 内では改行による改段落をさけ \par を使うこと.

そのほか

バグとは呼べないかもしれませんが,想定外の挙動だったので報告させていただきました.

Lemures Lemniscati への返信

Re: jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- 阿部 紀行 の投稿
単純化するとLaTeXでも現れる次の現象に起因するようです.どうするか少し考えます.

\documentclass{article}
\begin{document}

\begingroup
\obeylines%
\gdef\X{This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text.
This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. This is a test text. }%
\endgroup

\begin{enumerate}
\item \X
\end{enumerate}

\end{document}
阿部 紀行 への返信

Re: jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- Lemures Lemniscati の投稿

お手数おかけします.

なるほど.これはLaTeXの本体の方の問題のようですね. lualatex だけでなく latex でも同様でした.

長いテキストを例にあげてしまいましたが,短くしても再現可能でした.

\documentclass{article}
\begin{document}

\begingroup
\obeylines%
\gdef\X{This is a test text.
This is a test text.}%
\endgroup

\begin{enumerate}
\item \X
\end{enumerate}

\end{document}
Lemures Lemniscati への返信

Re: jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- 本田 知亮 の投稿
ちょっと入り組んでますね.

list系環境は,\parshapeで形を作ってますが,
\parshapeは\parでリセットされてしまいます.
ところが,list系環境では\parがあっても形を継続するために細工がされています.
list系環境では \par は実質的に {\par} になってて,
\parで段落がかわっても,
\parshapeのリセットがグループ内でローカルになって,すぐグループからでるので
\parshapeが継続する(list系環境の形が継続する)という仕組みです.

一方で\obeylinesの影響下で定義された \X の中の改行 ^^M は
そのまま \X の中で \active のまま残ります
ところが,\obeylines でなされている
\let^^M\obeydline(\obeydline は \protected\def\obeydline{\par} です)
はglobalではありません.

しかし,\X が \obeylines の影響の外側で使われた場合,^^M は \active なので
エラーがでないということは\activeな ^^M には何か定義があります.
実際\obeylinesと一緒に
\global\let^^M\par % this is in case ^^M appears in a \write
なんてのがあるので,\item \X で \X の中に残っている \active な ^^M は \par です.
これは,ややこしいことに {\par} ではなく,本物の \par です.

ですので「本物の\par」で\parshapeがリセットされてしまうという流れだと思います.

いったん \parshape がリセットされるとそれを再設定するコードはありません.
\item は段落の始まりに水平方向の位置の調整と見出しの出力を行うので
以降の\itemによる項目は\parshapeがないものになるのが分かります.

ということで・・・例えば対症療法的には\parshapeのリセットを閉じ込めればいいので

\catcode`\^^M\active\def^^M{{\@@par}}
\item \X

とすればとりあえずは形はくずれないとは思います(\@@parは \let\@@par\par と定義されている「本物の\par」)が
これをlistの中(実際は\@trivlistの中,\@setparのあたり)に仕込んだら
どうなるんでしょう.あんまり影響は起きなさそうなきもしますが
latex.ltxでのコメントにある\writeがlist系で使われるときに何かあるかもしれません.

\item \leavevmode{\X}

でもいいかもしれません.\leavevmodeはたぶんあった方がいいです.


本田 知亮 への返信

Re: jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- 阿部 紀行 の投稿
ありがとうございます.理由まで追えていなかったので助かりました.個人的には\obeylinesに全部対応できるか自信がないのでこれも無視しようかなと思いかけていたのですが,グルーピングするだけでよいのは楽ですね.マイナスの影響があるか悩んでみましたが,後注の使い方に限ればなさそうな気もします.
阿部 紀行 への返信

Re: jlreq.cls の \endnote のバグ? \obeylines が有効な状態で \endnote を使用し,\obeylines が無効な状態で \theendnotes が実行されると,endnote 内で改段落以後のインデントがずれる.

- Lemures Lemniscati の投稿

ご検討ありがとうございます.

別の方向性で,乱暴ですが…… すでに保存済みのマクロ(そのときに \obeylines が影響していたかどうかによらず)を list 環境内に貼っていく状況であれば, (そして,\obeylines が影響していない状態で定義されたマクロに新しく何かを読み込むようなコードが入っていないという前提で) \obeylineslist 環境内におくと,一応解決するように見えます.

※ どうしても \obeylines を使いたい人だけ,このように回避すれば十分なのかもしれません.

\documentclass{article}
\begin{document}

\def\XA{This is a test text A.

This is a test text.}

\def\XB{This is a test text.\par
This is a test text B.}

\def\XC{This is a test text.
This is a test text C.}

\begingroup
\obeylines%
\gdef\X{This is a test text X.
This is a test text.}%
\endgroup

\begin{enumerate}
\obeylines
\item \XA
\item \XB
\item \XC
\item \X
\item \XA
\item \XB
\item \XC
\item \X
\end{enumerate}

\end{document}