
複雑なコードを開発しているときに、次のような不可解なエラーが発生しました。
./[email protected]:5: Undefined control sequence.
\GenericError ...
#4 \errhelp \@err@ ...
l.5 ...w@thmref@thm:defi:DistRn\endcsname{$\mathbb
{R}$}
「バイナリ検索」によって、次のことが原因であることがわかりました。
\documentclass[a4paper]{report}
\usepackage{amsfonts}
\begin{document}
\expandafter\xdef\csname mw@thmref@thm:defi:DistRn\endcsname{$\mathbb{R}$}
\end{document}
\xdef
に変わると\gdef
消えました。それで私は興味を持ち、ここに来て尋ねました。ここで何が起こっているのですか、そしてそのエラーはどういう意味ですか?
答え1
このコマンドが LaTeX でサポートされていないのには理由があります。\xdef
ほとんどの TEX 構造は EDEF で機能しなくなります。 脆弱なコマンドにはを使用し\protected@edef
、その後 を使用してください。\protect
もしあなたが行くなら
\edef\foo{\def\zzz{hello}}
次に、トークン (のみ) を定義中に展開しようとしますが\foo
、 .\def
は展開できないためそのまま残され、展開を試みた\zzz
後、通常は undefined コマンド エラーが発生します (または、\zzz
すでに定義されている場合は、その定義を展開すると任意のエラーが発生します)。これが LaTeX メカニズムの理由であり\protect
、\xdef
直接使用すると、そのメカニズムに穴が開きます。
ログ出力が少し奇妙に見える理由は、興味深い名前の内部トークンを明らかにしている(または明らかにしようとしている)ためです。
\@err@ %
これは名前に65個ほどのスペースがあるトークンです。