
Im Zusammenhang mit der FrageWas machen \makeatletter und \makeatother?für LaTeX2e, hier bezogen auf LaTeX3
Was tun \ExplSyntaxOn
und \ExplSyntaxOff
tun?
Antwort1
Die Programmiersprache LaTeX3 expl3
verwendet :
und _
als „Buchstaben“ in Funktions- und Variablennamen. Dies ermöglicht die Verwendung von expl3
Code-Level-Material in einem Dokument.
\cs_new:Npn .... % fails: command \cs followed by characters '_', 'n', 'e', 'w', etc.
\ExplSyntaxOn
\cs_new:Npn .... % works here: command name \cs_new:Npn
Der \ExplSyntaxOn
Befehl aktiviert dies und ändert auch die Behandlung von Leerzeichen und Zeilenenden, so dass diese ignoriert werden, was bedeutet, dass
\ExplSyntaxOn
\cs_new:Npn \my_function:nn #1#2
{
% Code hre
}
erfordert nicht %
am Ende jeder Zeile (im Vergleich zu „normalem“ LaTeX2e-Code). Um Leerzeichen in die Ausgabe aufnehmen zu können, ~
wird durch in ein „normales“ Leerzeichen umgewandelt \ExplSyntaxOn
. Beachten Sie, dass diese Änderung des Verhaltens von Leerzeichen nicht unbedingt erforderlich ist, um auf expl3
Namen zuzugreifen. Die beiden sind jedoch eng miteinander verbunden, da die Kombination eine „klarere“ Programmierung in ermöglicht expl3
.
\ExplSyntaxOff
kehrt dies um, indem :
und _
auf ~
ihre vorherigen Werte zurückgesetzt werden \ExplSyntaxOn
und Leerzeichen wieder „wichtig“ werden.
Auf technischer Ebene ist die Idee der Kategoriecodes in Befehlsnamen genau die gleiche wie inWas machen \makeatletter und \makeatother?, obwohl die \ExplSyntax...
Schalter mehr können.
Ein paar Punkte ~
, die bei der Behandlung von innerhalb eines Codeblocks zu beachten sind. Erstens wird ein am Anfang einer Zeile von TeX genauso ignoriert wie ~
ein 'Leerzeichen' innerhalb eines Codeblocks.~
\ExplSyntaxOn
~ \cs_new:Npn ....
ist genau das gleiche wie
\ExplSyntaxOn
\cs_new:Npn ....
da das „Leerzeichen“ ignoriert wird.
Zweitens ~
ist „while“ ein „Leerzeichen“ innerhalb eines Codeblocks, \␣
und \~
beide sind immer noch verschieden und haben die LaTeX2e-Definitionen.
Der Vollständigkeit halber müssen noch einige weitere Details besprochen werden. \ExplSyntaxOn
legt auch die Catcodes entsprechend für andere Zeichen fest, die implizit Teil seiner Syntax sind:
- TAB — wird ignoriert (genau wie Leerzeichen)
"
— ein „anderes“ Zeichen, das für hexadezimale Eingaben wie\int_eval:n { "F }
(= 15) erforderlich ist&
— Ausrichtungszeichen für tabellarisches Material^
— hochgestelltes Zeichen für^^64
Stilnotation|
— ein 'anderes' Zeichen, notwendig fürexpl3
boolesche Ausdrücke
Antwort2
Ich möchte noch ein paar Informationen zur Kombination von LaTeX2e-Kernelmakros und expl3-Funktionen hinzufügen. Der Befehl \ExplSyntaxOn
ändert den Catcode des speziellen Tokens nicht @
. Daher muss man bei der Kombination von LaTeX2e-Kernelmakros und expl3-Funktionen \makeatletter
auch aufrufen:
\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…