
Parece que \csname
define automáticamente la secuencia de control en cuestión si aún no está definida. El siguiente código crea un documento que crea "ab c"; intercambiar \csname
línea y \foo
línea da un error. Esperaba \csname
simplemente dar un error si se usaba con una secuencia de control indefinida, pero en lugar de eso parece que define la secuencia como algo vacío.
\documentclass{article}
\begin{document}
a
\csname foo\endcsname
b
\foo
c
\end{document}
Se comporta exactamente igual en pdflatex y lualatex, y con algunas diferencias sintácticas, el mismo comportamiento ocurre también en pdftex y luatex. ¿Es este el comportamiento esperado (y, de ser así, dónde está documentado) y cómo puedo solucionarlo?
Respuesta1
No, el funcionamiento de \csname
es diferente de lo que crees.
\foo
Si se define la secuencia de control , \csname foo\endcsname
será equivalente a \foo
.
De lo contrario, \csname foo\endcsname
lo definiría (localmente) \foo
como equivalente \relax
y lo procesaría como tal.
La cita relevante de “TeX by Topic” (página 131):
Tu puedes hacer
\ifcsname foo\endcsname\csname foo\endcsname\else\ERROR\fi
para obtener el comportamiento que desea.