\csname はエラーを黙らせる

\csname はエラーを黙らせる

\csname問題の制御シーケンスがまだ定義されていない場合は、自動的に定義されるようです。以下のコードは、「ab c」を作成するドキュメントを作成します。\csname行と\foo行を入れ替えるとエラーが発生します。未定義の制御シーケンスで使用すると、単にエラーが発生すると予想していました\csnameが、代わりにシーケンスが空に定義されているようです。

\documentclass{article}
\begin{document}
a
\csname foo\endcsname
b
\foo
c
\end{document}

pdflatex と lualatex ではまったく同じように動作し、構文上の違いはあるものの、pdftex と luatex でも同じ動作が起こります。これは想定された動作ですか (想定されている場合、どこに文書化されていますか)。また、どうすれば回避できますか。

答え1

いいえ、 の仕組みは\csnameあなたが信じているものとは異なります。

制御シーケンス\fooが定義されている場合、 は\csname foo\endcsnameと同等になります\foo

それ以外の場合は、\csname foo\endcsname(ローカルに)\fooを と同等として定義し\relax、そのように処理します。

「TeX by Topic」(131ページ)からの関連引用:

ここに画像の説明を入力してください

できるよ

\ifcsname foo\endcsname\csname foo\endcsname\else\ERROR\fi

希望する動作を実現します。

関連情報