O que ExplSyntaxOn e ExplSyntaxOff fazem?

O que ExplSyntaxOn e ExplSyntaxOff fazem?

Relacionado à perguntaO que \makeatletter e \makeatother fazem?para LaTeX2e, aqui relacionado ao LaTeX3

O que fazer \ExplSyntaxOne \ExplSyntaxOfffazer?

Responder1

A linguagem de codificação LaTeX3 expl3usa :e _como 'letras' em nomes de funções e variáveis. Isso permite o uso de expl3material em nível de código em um 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

O \ExplSyntaxOncomando ativa isso e também altera o tratamento de espaços e finais de linha para que sejam ignorados, o que significa que

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

não requer %no final de cada linha (compare com o código LaTeX2e 'normal'). Para permitir a inclusão de espaços na saída, ~é transformado em espaço 'normal' por \ExplSyntaxOn. Observe que essa mudança no comportamento dos espaços não é essencial para acessar expl3nomes, mas os dois estão intimamente ligados, pois a combinação permite uma programação 'mais clara' em expl3.

\ExplSyntaxOffinverte isso, retornando :, _e ~aos seus valores anteriores \ExplSyntaxOne tornando os espaços 'importantes' novamente.

A nível técnico, a ideia de códigos de categoria em nomes de comandos é exatamente a mesma que emO que \makeatletter e \makeatother fazem?, embora os \ExplSyntax...switches façam mais.


Alguns pontos a serem observados sobre o tratamento ~dentro de um bloco de código. Primeiro, assim como ~um 'espaço' dentro de um bloco de código, um ~no início de uma linha é ignorado pelo TeX

\ExplSyntaxOn
~ \cs_new:Npn .... 

é exatamente igual a

\ExplSyntaxOn
\cs_new:Npn .... 

já que o 'espaço' é ignorado.

Em segundo lugar, while ~é um 'espaço' dentro de um bloco de código, \␣e \~ainda são distintos e possuem as definições do LaTeX2e.


Existem mais alguns detalhes a serem discutidos para completar. \ExplSyntaxOntambém define catcodes apropriadamente para outros caracteres que implicitamente fazem parte de sua sintaxe:

  • TAB – ignorado (assim como espaços)
  • "— um caracter 'outro', necessário para entrada hexadecimal como \int_eval:n { "F }(= 15)
  • &— caractere de alinhamento para material tabular
  • ^— caractere sobrescrito para ^^64notação de estilo
  • |— um caracter 'outro', necessário para expl3expressões booleanas

Responder2

Quero adicionar algumas informações sobre a combinação de macros do kernel LaTeX2e e funções expl3. O comando \ExplSyntaxOnnão altera o catcode do token especial @. Portanto, combinando macros do kernel LaTeX2e e funções expl3, você também deve chamar \makeatletter:

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

informação relacionada