![Capacidad de expansión: LaTeX3 VS LaTeX](https://rvso.com/image/328469/Capacidad%20de%20expansi%C3%B3n%3A%20LaTeX3%20VS%20LaTeX.png)
La capacidad de expansión es el corazón de las macros/funciones. Me pregunto saber:
- Si una mejor comprensión de la capacidad de expansión en
LaTeX3
solo puede ser a través de una buena experiencia en capacidad de expansión enLaTeX
. ¿Hasta qué punto podrían considerarse independientes? - Más precisamente, si las funciones que ofrece
l3expan
son suficientes para satisfacer todas las necesidades de ampliación. En otras palabras, dentro deLaTeX3
, se admite la "LaTeX
capacidad de expansión", pero se puedetotalmentesustituido. - ¿Hay alguna manera de verificar los pasos intermedios mientras se realiza el proceso de expansión (es decir, algunos archivos de salida, opciones de creación de perfiles, ...)?
Respuesta1
Al no haberlo hecho yo mismo, creo que para un nuevo programador de LaTeX es más fácil comenzar con las funciones definidas mediante la carga expl3
(también conocida como núcleo LaTeX3 o l3kernel
) que aprender primero la programación básica de TeX y avanzar.
La razón de esto es que expl3
le brinda una capa de abstracción muy agradable que es poderosa e internamente consistente. Con la programación TeX, muy rápidamente tienes que aprender "trucos" para hacer cosas bastante simples.
Por ejemplo, si estás hablando de dos comandos \foo
y \baz
, para hacer \foo
una copia \baz
escribes
\let\foo\baz
Pero, ¿qué pasa si necesita referirse a ellos por su nombre en lugar de por la secuencia de control? Por ejemplo, podrías estar definiendo algo para hacer esto:
\defineacronym{baz}{BAZ}
\useacronym{baz} % => \textsc{\MakeLowercase{BAZ}}
Esto se puede definir con
\makeatletter
\newcommand\defineacronym[2]{%
\@namedef{acronym@#1}{\textsc{\MakeLowercase{BAZ}}}%
}
\newcommand\useacronym[1]{%
\@nameuse{acronym@#1}%
}
\makeatother
Hasta ahora, todo bien. Pero para definir un comando como \copyacronym{foo}{baz}
, debes escribir:
\newcommand\copyacronym[2]{%
\expandafter\let\csname acronym@#1\expandafter\endcsname\csname acronym@#2\endcsname
}
Esto es fácil de seguir para un programador TeX experimentado, pero no es muy agradable para uno nuevo.
En expl3
esto se escribiría como:
\ExplSyntaxOn
\newcommand\copyacronym[2]{
\cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff
El objetivo expl3
es hacer que la programación TeX sea más estructurada y, por tanto, más fácil. Nosotrosesperanzaque este es el caso aún más con los nuevos programadores TeX que con los antiguos.
Para su pregunta final, la respuesta es más o menos. Bruno Le Floch ha escrito el unravel
paquete, que sin duda puede mostrarle lo que está pasando con la expansión. despues de escribir
\usepackage{unravel}
\def\baz{BAZ}
\unravel{\expandafter\let\csname foo\expandafter\endcsname\csname baz\endcsname}
devuelve lo siguiente:
======== 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 ves, incluso con un caso sencillo te da bastante bocado. (Uno fácil de digerir, pero aún así). Especialmente al depurar expl3
como un nuevo usuario, esto puede ser útil solo en ciertas situaciones.