
Relacionado à perguntaO que \makeatletter e \makeatother fazem?para LaTeX2e, aqui relacionado ao LaTeX3
O que fazer \ExplSyntaxOn
e \ExplSyntaxOff
fazer?
Responder1
A linguagem de codificação LaTeX3 expl3
usa :
e _
como 'letras' em nomes de funções e variáveis. Isso permite o uso de expl3
material 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 \ExplSyntaxOn
comando 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 expl3
nomes, mas os dois estão intimamente ligados, pois a combinação permite uma programação 'mais clara' em expl3
.
\ExplSyntaxOff
inverte isso, retornando :
, _
e ~
aos seus valores anteriores \ExplSyntaxOn
e 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. \ExplSyntaxOn
també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^^64
notação de estilo|
— um caracter 'outro', necessário paraexpl3
expressões booleanas
Responder2
Quero adicionar algumas informações sobre a combinação de macros do kernel LaTeX2e e funções expl3. O comando \ExplSyntaxOn
nã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…