Capacidad de expansión: LaTeX3 VS LaTeX

Capacidad de expansión: LaTeX3 VS LaTeX

La capacidad de expansión es el corazón de las macros/funciones. Me pregunto saber:

  1. Si una mejor comprensión de la capacidad de expansión en LaTeX3solo puede ser a través de una buena experiencia en capacidad de expansión en LaTeX. ¿Hasta qué punto podrían considerarse independientes?
  2. Más precisamente, si las funciones que ofrece l3expanson suficientes para satisfacer todas las necesidades de ampliación. En otras palabras, dentro de LaTeX3, se admite la " LaTeXcapacidad de expansión", pero se puedetotalmentesustituido.
  3. ¿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 expl3le 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 \fooy \baz, para hacer \foouna copia \bazescribes

\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 expl3esto se escribiría como:

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

El objetivo expl3es 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 unravelpaquete, 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 expl3como un nuevo usuario, esto puede ser útil solo en ciertas situaciones.

información relacionada