nagパッケージを使うとfootnote環境でalign環境が使えない

nagパッケージを使うとfootnote環境でalign環境が使えない

- ultimatile ᚢᛚᛏᛁᛗᚨᛏᛁᛚᛖ の投稿
返信数: 8

古い記法等を警告するnagパッケージを使っているときにfootnote環境内にalign環境を書くと

! Improper \halign inside $$'s.
 \halign 

l.9 \end{align}

と出てエラーになりタイプセットが通らなくなりました.

nagパッケージを使わないと表現できないものがあるわけではないのでnagを使わなければ済む話ではありますが, 回避方法等何かお分かりの方がいらっしゃればご教示いただきたいです.

よろしくお願いいたします.

普段はlatexmkを使ってBXjsclsをxelatexでタイプセットしています.

念のためjsarticleをuplatexでタイプセットしてみましたが同様の結果でした.

latexmkの-fオプションで問題のないpdfは出力されるようです.

ソースコード

\RequirePackage[l2tabu, orthodox]{nag}
\documentclass[a4paper, xelatex, ja=standard, everyparhook=compat]{bxjsarticle}
%\documentclass[uplatex]{jsarticle}
\usepackage{amsmath}
\begin{document}
\footnote{
\begin{align}
x&\\y&
\end{align}
}
\end{document}

&が&に置換されてしまうようです...

使用コマンド

bxjsarticle, xelatexの場合 latexmk -pv

jsarticle, uplatexの場合 latexmk -pv -pdfdvi

ソースコード, 使用した.latexmkrc, ログファイルを添付しています.

使用環境

macOS 10.15.7

mactex: 2022.0321 (TeX Live 2022)

ultimatile ᚢᛚᛏᛁᛗᚨᛏᛁᛚᛖ への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- aminophen の投稿
\RequirePackage[l2tabu,orthodox]{nag} この行があっても

\documentclass{article}
\documentclass{jarticle}
\documentclass{jlreq}

の場合は問題ないようなので

\documentclass{jsarticle}

の何が問題なのか調べてみました。

\everydisplay=\expandafter{\the\everydisplay \narrowbaselines}

の行を消すとエラーが出なくなりました。
nag は '$' の定義を書き換えているようなのですが,
それと \everydisplay が衝突している理由はまだわかっていません。
aminophen への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- 和田 勇 の投稿
情報提供だけ

article と名のつくドキュメントクラスで \halign 及び \everydisplay を使っているのは以下の三つ。
これら三つのドキュメントクラスは、いずれも同じエラーを出します。
その他で独断で選んだものは、問題は発生しませんでした。

/usr/local/texlive/2022/texmf-dist/tex/luatex/luatexja/ltjsarticle.cls
164:  $$\everycr{}\halign to\displaywidth\bgroup
188:    $$\everycr{}\halign to\linewidth% $$
458:\everydisplay=\expandafter{\the\everydisplay \narrowbaselines}

/usr/local/texlive/2022/texmf-dist/tex/latex/bxjscls/bxjsarticle.cls
325:  $$\everycr{}\halign to\displaywidth\bgroup
349:    $$\everycr{}\halign to\linewidth% $$
1093:\everydisplay=\expandafter{\the\everydisplay \narrowbaselines}

/usr/local/texlive/2022/texmf-dist/tex/platex/jsclasses/jsarticle.cls
140:  $$\everycr{}\halign to\displaywidth\bgroup
165:    $$\everycr{}\halign to\linewidth% $$
806:\everydisplay=\expandafter{\the\everydisplay \narrowbaselines}
和田 勇 への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- aminophen の投稿
> これら三つのドキュメントクラスは、いずれも同じエラーを出します。

全て jsclasses の派生版ですね。

・\halign の登場自体はエラーとは無関係
・\everydisplay に \narrowbaselines を入れていることが問題

どうやら \narrowbaselines の定義に問題があるような気がしてきました。
https://github.com/texjporg/jsclasses/issues/77
aminophen への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- ultimatile ᚢᛚᛏᛁᛗᚨᛏᛁᛚᛖ の投稿
aminophenさん, 和田勇さん
コメントありがとうございます.
jsclassesのバグのようですので修正されるのを待ちたいと思います.
issueも立てていただきありがとうございました.
ultimatile ᚢᛚᛏᛁᛗᚨᛏᛁᛚᛖ への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- 北見 けん の投稿
調べてみました。
「jsclassesのバグ」というのはちょっと違うような気がします。

まず、原因です。
下の例のように、$$ と \halign の間に
\begingroup\endgroup が挟まってもエラーにはならないのですが、
挟まるのが \bgroup\egroup だとエラーになる、ということのようです。
例では \everydisplay(LaTeXでは \frozen@everydispay に保存されている) を使って $$ と \halign の間に挟まるようにしていますが、
直接書いても同様です。

このTeXの挙動、私は知りませんでした。どこかに書かれているでしょうか?

で、質問にある状況でどうしてこれが起こるかというと、以下のような事情です。
nag パッケージは LaTeX コードの妥当性チェックのために \footnotesize に細工をします。
この細工の中で、チェック作業を保護するために \bgroup と \egroup を使っています。
一報、 js***クラスは、ディスプレイ数式で行送りを設定するために
\everydisplay に \narrowbaselines を入れています。
これが巡りめぐって \footnote 内の $$ のところで \bgroup と \egroup を生じさせることで、エラーが起こっています。
なので、そこを \begingroup と \endgroup に差し替えるとうまくいくかも。
とりあえず最初のサンプルではエラーはなくなりました。

%%% エラーの直接的な原因となるサンプルコード
\documentclass{article}

\begin{document}

\begingroup% \tracingall の有効範囲ここから

\makeatletter
%\frozen@everydisplay={}% これは通る
%\frozen@everydisplay={\begingroup\endgroup}% これでも通る
\frozen@everydisplay={\bgroup\egroup}% これだと通らない

\tracingall

$$\halign{#\cr x\cr}$$

\endgroup% \tracingall の有効範囲ココマデ

\end{document}

%%% 最初の質問でエラーが出ないように修正したコード

\RequirePackage[l2tabu, orthodox]{nag}
\documentclass[a4paper, xelatex, ja=standard, everyparhook=compat]{bxjsarticle}
%\documentclass[uplatex]{jsarticle}
\usepackage{amsmath}
\begin{document}
\makeatletter
\def\nag@ifCurrentEnvironment#1#2#3{%
%\bgroup% もとの \bgroup を
\begingroup% \begingroup に差し替え
\def\tmp@a{#1}\ifx\@currenvir\tmp@a#2\else#3\fi
%\egroup% もとの \egroup を
\endgroup% \endgroup に差し替え
}
\makeatother
\footnote{
\begin{align}
x&\\y&
\end{align}
}
\end{document}
北見 けん への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- 北見 けん の投稿
> このTeXの挙動、私は知りませんでした。どこかに書かれているでしょうか?

どこにも書かれていなかったとしたら、まさかの TeX のバグ発見とか???
んなわけないか。
北見 けん への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- Z. R. の投稿
> このTeXの挙動、私は知りませんでした。どこかに書かれているでしょうか?

これは、”alignment display”の文法に由来します。TeXbookだと19章で解説されています。

ディスプレイ数式中に\halignを含める場合は、以下の”alignment display”の文法に従っている必要があります。

$$<assignments>\halign{<alignment>}<assignments>$$

ここで、<assignments>は「math listを発生させてはいけない」という制約があります。数式中の(暗黙も含めて)波括弧によるグルーピングはサブ数式を発生させるので、alignment displayの条件を満たさなくなるわけです。

Z. R. への返信

Re: nagパッケージを使うとfootnote環境でalign環境が使えない

- 北見 けん の投稿
なるほど、ありがとうございます。

エラーが出たときに「h」をタイプしてみると、そこにも説明されていましたね。
「h」をタイプする習慣をすっかり失くしてしまっていたので、気づきませんでした。

## やはりTeXのバグのはずはないですね。