Expansibilidade: LaTeX3 VS LaTeX

Expansibilidade: LaTeX3 VS LaTeX

A capacidade de expansão é o coração das macros/funções. Eu me pergunto:

  1. Se uma melhor compreensão da expansibilidade LaTeX3só puder ser através de um bom histórico de expansibilidade no LaTeX. Até que ponto eles poderiam ser considerados independentes?
  2. Mais precisamente, se os recursos oferecidos por l3expanforem suficientes para atender toda a necessidade de expansibilidade. Em outras palavras, dentro de LaTeX3, a " LaTeXexpansibilidade" é suportada, mas pode sertotalmentesubstituído.
  3. Existe uma maneira de verificar as etapas intermediárias enquanto o processo de expansibilidade é executado (ou seja, alguns arquivos de saída, opções de criação de perfil, ...)

Responder1

Não tendo feito isso sozinho, acredito que para um novo programador LaTeX é mais fácil começar com as funções definidas pelo carregamento expl3(também conhecido como kernel LaTeX3, ou l3kernel) do que primeiro aprender a programação básica do TeX e avançar.

A razão para isso é que expl3fornece uma camada de abstração muito boa, poderosa e internamente consistente. Com a programação TeX você rapidamente precisa aprender 'truques' para fazer coisas bastante simples.

Por exemplo, se você está falando sobre dois comandos \fooe \baz, para fazer \foouma cópia \bazvocê escreve

\let\foo\baz

Mas e se você precisar se referir a eles pelo nome em vez da sequência de controle? Por exemplo, você pode estar definindo algo para fazer isso:

\defineacronym{baz}{BAZ}
\useacronym{baz} % => \textsc{\MakeLowercase{BAZ}}

Isto pode ser definido com

\makeatletter
\newcommand\defineacronym[2]{%
  \@namedef{acronym@#1}{\textsc{\MakeLowercase{BAZ}}}%
}
\newcommand\useacronym[1]{%
  \@nameuse{acronym@#1}%
}
\makeatother

Até agora tudo bem. Mas para definir um comando como \copyacronym{foo}{baz}, você deve escrever:

\newcommand\copyacronym[2]{%
  \expandafter\let\csname acronym@#1\expandafter\endcsname\csname acronym@#2\endcsname
}

Isso é fácil de seguir para um programador TeX experiente, mas não é muito bom para um programador novato.

Neste expl3seria escrito como:

\ExplSyntaxOn
\newcommand\copyacronym[2]{
  \cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff

O objetivo expl3é tornar a programação TeX mais estruturada e, portanto, mais fácil. Nóster esperançaque este é o caso ainda mais com os novos programadores TeX do que com os antigos.


Para sua pergunta final, a resposta é mais ou menos. Bruno Le Floch escreveu o unravelpacote, que certamente pode mostrar o que está acontecendo com a expansão. Depois de escrever

\usepackage{unravel}
\def\baz{BAZ}
\unravel{\expandafter\let\csname foo\expandafter\endcsname\csname baz\endcsname}

ele retorna o seguinte:

======== Welcome to the unravel package ========
    "<|" denotes the output to TeX's stomach.
    "||" denotes tokens waiting to be used.
    "|>" denotes tokens that we will act on.
    Press <enter> to continue; 'h' <enter> for help.

|| 
|> \expandafter \let \csname foo\expandafter \endcsname \csname baz\endcsname 

[===== Step 1 =====] \expandafter \let 

[===== Step 2 =====] \csname = \csname
|| \expandafter \let 
|| \csname 
|> foo\expandafter \endcsname \csname baz\endcsname 

[===== Step 3 =====] \expandafter \endcsname 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|> \csname baz\endcsname 

[===== Step 4 =====] \csname = \csname
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|| \csname 
|> baz\endcsname 

[===== Step 5 =====] \endcsname 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|| \csname baz\endcsname 
|> 

[===== Step 6 =====] \csname baz\endcsname =\baz 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|> \baz 

[===== Step 7 =====] back_input: \expandafter \endcsname 
|| \expandafter \let 
|| \csname foo
|> \endcsname \baz 

[===== Step 8 =====] \endcsname 
|| \expandafter \let 
|| \csname foo\endcsname 
|> \baz 

[===== Step 9 =====] \csname foo\endcsname =\foo 
|| \expandafter \let 
|> \foo \baz 

[===== Step 10 =====] back_input: \expandafter \let 
|| 
|> \let \foo \baz 

[===== Step 11 =====] \let \foo 
|| \let \foo 
|> \baz 

[===== Step 12 =====] Set \foo=macro:->BAZ
|| 
|> 

[===== End =====]

Como você pode ver, mesmo com um case simples, você fica bastante satisfeito. (Fácil de digerir, mas ainda assim.) Especialmente ao depurar expl3como um novo usuário, isso só pode ser útil em determinadas situações.

informação relacionada