LuaLaTeX の不審な挙動について

LuaLaTeX の不審な挙動について

- 匿 名 の投稿
返信数: 4
デビ丸といいます。もともとは日本語TeXだったのですが、最小なサンプルにして行く
うちに日本語とは無関係らしいことが分ったのでこちらで良いか心配ですが。
環境は Debian Gnu Linux/testing です。詳しいバージョンなど必要でしたら
ご指摘ください。

下のファイルを lualatex で処理するとエラーなく PDF が生成されました。
試しに uplatex/platex で処理してみようと思ったら
! Limit controls must follow a math operator.
とエラーになりました。言われてみれば真っ当なエラーに思え、むしろ lualatex
でエラーにならないのが素人には怪しく思えました。latex/pdflatex でも同じ
エラーになるようです。
% コメントアウトしてる \DeclareMathOperator* を設定すれば全ての LaTeX
% で問題ないようで、その意味では解決してはいますが。

問題ありそうなファイルが LuaLaTeX では何故エラーにならないのか、またそれは
それで LuaLaTeX の問題ではないのかなどについてご教示いただければ幸いです。

\ifdefined\kanjiskip
\ifdefined\ucs
%! uplatex + dvipdfmx
\documentclass[12pt]{ujarticle}
\else
%! platex + dvipdfmx
\documentclass[12pt]{jarticle}
\fi
\else
\ifdefined\directlua
%! lualatex
\documentclass[12pt]{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont[BoldFont=IPAexGothic]{IPAexMincho}
\setsansjfont{IPAexGothic}
\else
%! latex/pdflatex
\documentclass[12pt]{article}
\fi
\fi
\usepackage{amsmath}
%\DeclareMathOperator*{\Tord}{T}
\newcommand{\Tord}{\text{T}}
\begin{document}
\Huge
$\sideset{}{_{\leftarrow}}\Tord$

\end{document}
匿 名 への返信

Re: LuaLaTeX の不審な挙動について

- 北川 弘典 の投稿
> 下のファイルを lualatex で処理するとエラーなく PDF が生成されました。

%! lualatex
\documentclass[12pt]{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont[BoldFont=IPAexGothic]{IPAexMincho}
\setsansjfont{IPAexGothic}

とある通り,このソースだと LuaTeX-ja パッケージを使っています.
本来なら,Lua(La)TeX 本体の問題なのか,LuaTeX-ja の問題なのか
ここから更に切り分ける必要があります.


……さて,以下のソースでも同様の症状を起こすようです.
(こちらの環境は TeX Live 2014, x86_64-linuxです)

%! tex/ptex/pdftex/ ...
$A\limits$\end

tex, pdftex, ptex, uptex, eptex, euptex, xetex ではみな
! Limit controls must follow a math operator.
が発生しましたが,
luatex (rev 5024) ではエラーは発生しませんでした.
北川 弘典 への返信

Re: LuaLaTeX の不審な挙動について

- 北川 弘典 の投稿
> $A\limits$\end

ですが,\showlists を 2 箇所につけて

\tracingonline1\showboxdepth1000\showboxbreadth1000
$A\showlists
\limits\showlists$\end

としてみると,1回目の \showlists では

### math mode entered at line 2
\mathord
.\fam1 A

なのに対し,2回目 では

### math mode entered at line 2
\mathop\limits
.\fam1 A

となっており,「A」が普通の文字 (\mathord) から
演算子 (\mathop) に変わっています.

----
LuaTeX のソース tex/texmath.w を見ると

void math_limit_switch(void)
{
    const char *hlp[] = {
        "I'm ignoring this misplaced \\limits or \\nolimits command.",
        NULL
    };
    if (head != tail) {
        if (type(tail) == simple_noad) {
            subtype(tail) = (quarterword) cur_chr;
            return;
        }
    }
    tex_error("Limit controls must follow a math operator", hlp);
}

となっています.試していませんが,これでは条件が緩すぎで,
type(tail) 以外にも,
「subtype(tail) が op_noad_type_normal, op_noad_type_limits,
op_noad_type_no_limits のいずれかである」
という制約が必要ではないか,と思います.
北川 弘典 への返信

Re: LuaLaTeX の不審な挙動について

- Akira Kakuto の投稿
仰られたとおり,

if (head != tail) {
if (type(tail) == simple_noad &&
((subtype(tail) == op_noad_type_normal ||
subtype(tail) == op_noad_type_limits ||
subtype(tail) == op_noad_type_no_limits))) {
subtype(tail) = (quarterword) cur_chr;
return;
}
}

で簡単なテストをしてみると,TeX と同じ振る舞いをするようです。(r5041)
Akira Kakuto への返信

Re: LuaLaTeX の不審な挙動について

- 匿 名 の投稿
デビ丸です。北川様、Kakuto様、ご検討ありがとうございました。
プログラム的には理解できかねてますが LuaTeX のバグっぽいという
感じでしょうか。
もともとはかなり古い LuaTeX-ja のファイルで、ちょっと修正する
必要があって、ふと upTeX/pTeX を使ってみたらエラーになった訳です。
何故間違ってる構文を使ったのか、全く記憶はないのですが
当時は(今でも) lualatex で処理できてしまったということです。
本当にありがとうございました。