![Expansibilidade: LaTeX3 VS LaTeX](https://rvso.com/image/328469/Expansibilidade%3A%20LaTeX3%20VS%20LaTeX.png)
A capacidade de expansão é o coração das macros/funções. Eu me pergunto:
- Se uma melhor compreensão da expansibilidade
LaTeX3
só puder ser através de um bom histórico de expansibilidade noLaTeX
. Até que ponto eles poderiam ser considerados independentes? - Mais precisamente, se os recursos oferecidos por
l3expan
forem suficientes para atender toda a necessidade de expansibilidade. Em outras palavras, dentro deLaTeX3
, a "LaTeX
expansibilidade" é suportada, mas pode sertotalmentesubstituído. - 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 expl3
fornece 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 \foo
e \baz
, para fazer \foo
uma cópia \baz
você 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 expl3
seria 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 unravel
pacote, 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 expl3
como um novo usuário, isso só pode ser útil em determinadas situações.