¿Qué hacen ExplSyntaxOn y ExplSyntaxOff?

¿Qué hacen ExplSyntaxOn y ExplSyntaxOff?

Relacionado con la pregunta¿Qué hacen \makeatletter y \makeatother?para LaTeX2e, aquí relacionado con LaTeX3

¿Qué hacer \ExplSyntaxOny \ExplSyntaxOffhacer?

Respuesta1

El lenguaje de codificación LaTeX3, expl3utiliza :y _como 'letras' en los nombres de funciones y variables. Esto permite el uso de expl3material a nivel de código en un documento.

\cs_new:Npn .... % fails: command \cs followed by characters '_', 'n', 'e', 'w', etc.
\ExplSyntaxOn
\cs_new:Npn .... % works here: command name \cs_new:Npn

El \ExplSyntaxOncomando activa esto y también altera el tratamiento de los espacios y finales de línea para que se ignoren, lo que significa que

\ExplSyntaxOn
\cs_new:Npn \my_function:nn #1#2
  {
    % Code hre
  }

no requiere %al final de cada línea (compárese con el código LaTeX2e "normal"). Para permitir la inclusión de espacios en la salida, ~se convierte en un espacio "normal" mediante \ExplSyntaxOn. Tenga en cuenta que este cambio en el comportamiento de los espacios no es esencial para acceder a expl3los nombres, pero los dos están estrechamente relacionados ya que la combinación permite una programación más "clara" en expl3.

\ExplSyntaxOffinvierte esto, regresando :y a sus valores anteriores y haciendo que los espacios vuelvan _a ser "importantes".~\ExplSyntaxOn

A nivel técnico, la idea de códigos de categoría en los nombres de comandos es exactamente la misma que en¿Qué hacen \makeatletter y \makeatother?, aunque los \ExplSyntax...interruptores hacen más.


Un par de puntos a tener en cuenta sobre el tratamiento ~dentro de un bloque de código. Primero, como ~es un 'espacio' dentro de un bloque de código, ~TeX ignora un al comienzo de una línea.

\ExplSyntaxOn
~ \cs_new:Npn .... 

es exactamente igual que

\ExplSyntaxOn
\cs_new:Npn .... 

ya que se ignora el 'espacio'.

En segundo lugar, while ~es un 'espacio' dentro de un bloque de código, \␣sigue \~siendo distinto y tiene las definiciones de LaTeX2e.


Hay algunos detalles más para discutir para que esté completo. \ExplSyntaxOntambién establece catcodes apropiadamente para otros caracteres que implícitamente son parte de su sintaxis:

  • TAB: ignorado (al igual que los espacios)
  • "— un carácter 'otro', necesario para la entrada hexadecimal como \int_eval:n { "F }(= 15)
  • &— carácter de alineación para material tabular
  • ^— carácter de superíndice para ^^64notación de estilo
  • |— un carácter 'otro', necesario para expl3expresiones booleanas

Respuesta2

Quiero agregar información sobre la combinación de macros del kernel de LaTeX2e y funciones expl3. El comando \ExplSyntaxOnno cambia el código cat del token especial @. Entonces, para combinar las macros del kernel de LaTeX2e y las funciones expl3, también debes llamar \makeatletter:

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

información relacionada