\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 по теме» (стр. 131):

введите описание изображения здесь

Ты можешь сделать

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

чтобы добиться желаемого поведения.

Связанный контент