Was machen ExplSyntaxOn und ExplSyntaxOff?

Was machen ExplSyntaxOn und ExplSyntaxOff?

Im Zusammenhang mit der FrageWas machen \makeatletter und \makeatother?für LaTeX2e, hier bezogen auf LaTeX3

Was tun \ExplSyntaxOnund \ExplSyntaxOfftun?

Antwort1

Die Programmiersprache LaTeX3 expl3verwendet :und _als „Buchstaben“ in Funktions- und Variablennamen. Dies ermöglicht die Verwendung von expl3Code-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 \ExplSyntaxOnBefehl 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 expl3Namen zuzugreifen. Die beiden sind jedoch eng miteinander verbunden, da die Kombination eine „klarere“ Programmierung in ermöglicht expl3.

\ExplSyntaxOffkehrt dies um, indem :und _auf ~ihre vorherigen Werte zurückgesetzt werden \ExplSyntaxOnund 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. \ExplSyntaxOnlegt 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 ^^64Stilnotation
  • |— ein 'anderes' Zeichen, notwendig für expl3boolesche 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 \makeatletterauch aufrufen:

\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…

verwandte Informationen