
Кажется, что \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
чтобы добиться желаемого поведения.