\csname silencia erros

\csname silencia erros

Parece que \csnamedefine 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 \csnamelinha e \fooa linha dá um erro. Eu esperava \csnamesimplesmente 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 \foofor definida, \csname foo\endcsnameserá equivalente a \foo.

Caso contrário, \csname foo\endcsnamedefiniria (localmente) \foocomo equivalente \relaxe o processaria como tal.

A citação relevante de “TeX por Tópico” (página 131):

insira a descrição da imagem aqui

Você pode fazer

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

para obter o comportamento desejado.

informação relacionada