
Parece que \csname
define automaticamente a sequência de controle em questão, caso ainda não esteja definida. O código abaixo cria um documento criando "ab c"; trocar a \csname
linha e \foo
a linha dá um erro. Eu esperava \csname
simplesmente dar um erro se usado com uma sequência de controle indefinida, mas em vez disso parece que define a sequência para algo vazio?
\documentclass{article}
\begin{document}
a
\csname foo\endcsname
b
\foo
c
\end{document}
Ele se comporta exatamente da mesma forma em pdflatex e lualatex, e com algumas diferenças sintáticas o mesmo comportamento acontece em pdftex e luatex também. Esse comportamento é esperado (e, em caso afirmativo, onde está documentado) e como posso contornar isso?
Responder1
Não, o funcionamento \csname
é diferente daquilo que você acredita.
Se a sequência de controle \foo
for definida, \csname foo\endcsname
será equivalente a \foo
.
Caso contrário, \csname foo\endcsname
definiria (localmente) \foo
como equivalente \relax
e o processaria como tal.
A citação relevante de “TeX por Tópico” (página 131):
Você pode fazer
\ifcsname foo\endcsname\csname foo\endcsname\else\ERROR\fi
para obter o comportamento desejado.