
Es scheint, dass \csname
die betreffende Steuersequenz automatisch definiert wird, wenn sie nicht bereits definiert ist. Der folgende Code erstellt ein Dokument, das „ab c“ erstellt; das Vertauschen von \csname
Zeile und \foo
Zeile führt zu einem Fehler. Ich hätte erwartet, \csname
dass bei Verwendung mit einer undefinierten Steuersequenz einfach ein Fehler ausgegeben wird, aber stattdessen scheint es, als würde die Sequenz auf etwas Leeres definiert?
\documentclass{article}
\begin{document}
a
\csname foo\endcsname
b
\foo
c
\end{document}
Es verhält sich in pdflatex und lualatex genau gleich, und mit einigen syntaktischen Unterschieden tritt das gleiche Verhalten auch in pdftex und luatex auf. Ist das das erwartete Verhalten (und wenn ja, wo ist es dokumentiert) und wie kann ich es umgehen?
Antwort1
Nein, die Wirkungsweise \csname
ist anders als Sie glauben.
Wenn die Steuersequenz \foo
definiert ist, \csname foo\endcsname
ist dies gleichbedeutend mit \foo
.
Andernfalls \csname foo\endcsname
würde es (lokal) \foo
als gleichwertig definiert \relax
und als solches verarbeitet.
Das relevante Zitat aus „TeX by Topic“ (Seite 131):
Du kannst tun
\ifcsname foo\endcsname\csname foo\endcsname\else\ERROR\fi
um das gewünschte Verhalten zu erhalten.