Alinear*, & y \futurelet

Alinear*, & y \futurelet

¿Alguien puede explicar el futuro?dentro¿Alinear entornos?

Ejemplo:

El comando \A debería dar una "A" si el siguiente carácter es un {, una "B" si es & y una "C" en cualquier otro caso.

\gdef\A{\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}

y en caso de texto normal o matemáticas en línea, funciona bastante bien:

\A{a},\A&,\A a       % -> "A,B,C"
$\A{a}$,$\A&$,$\A a$ % -> "A,B,C"

peroen el momento en que lo uso dentro de un entorno align* (amsmath) aparece un error "Incompleto \ifx":

\begin{align*} \A{a},\A&,\A a \end{align*}% --> error.

¿Alguien puede explicármelo? ¡Gracias!

cris

PD: Hay más cosas sobre Futurelet en un entorno de alineación que no entiendo: si definimos

\gdef\A{\futurelet\thesymbol\alpha}
\gdef\D#1{\detokenize{#1}}

entonces

\begin{align*}
 \D&,\A a    % -> "&,alpha a" (okay)
 \A a,\D{&}  % -> "alpha a,&" (okay)
 \A a,\D&    % -> error: "Argument of D has an extra }." (???)
\end{align*}

Respuesta1

\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}

cuando TeX ve el &intercambio en el resto de la plantilla por el \haligncaso especificado en látex por c retc., \ifxcomparará los dos primeros tokens de la plantilla (probablemente \unskipy \hfilluego la celda (y por lo tanto el grupo) terminará, las cosas saldrán mal .

Si desea ocultarse &al iniciar un grupo antes del futuro y finalizarlo después de la prueba, necesita el

{\ifnum0=`}
...
\ifnum0=`{\fi}

formulario que aparece en cualquier código tabular.

Esto produce A, B, C, que creo que es el resultado deseado.

\documentclass{article}
\usepackage{amsmath}

\gdef\A{{\ifnum0=`}\fi\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi \ifnum0=`{\fi}}

\begin{document}

\begin{align*} \A{a},\A&,\A a \end{align*}


\end{document}

Para su segundo ejemplo, tenga en cuenta que &finaliza un grupo de modo que

a,\D&es como {\D}y ambos dan el mismo error:

! Argument of \D has an extra }.
<inserted text> 
                \par 
l.15 {\D}

Allí no está tan claro cuál es la solución como tampoco está claro qué quiere {\D}hacer.

Respuesta2

No puedo competir con la comprensión de David sobre el código TeX, por lo que no intentaré arreglar tus macros (aunque mi opinión es que lo que estás haciendo es fundamentalmente imprudente). Sin embargo, su comentario sobre "cuando TeX ve el &" se puede ampliar de la siguiente manera. Al escanear una alineación, TeX actúa de una manera que está algo en desacuerdo con el modelo mental que la mayoría de los usuarios (incluso los usuarios experimentados y conocedores) tienen sobre su ejecución. Es decir, nosotrosimaginarque TeX siempre está haciendo una de tres cosas:

  1. Escanear la entrada para tokenizar los caracteres y proporcionar alimento a la "boca" del analizador de macros;

  2. Macros en expansión;

  3. Ejecutar tokens no expandibles: ya sea directivas de programación como \defo \hbox, o comandos de composición tipográfica como caracteres.

Bajo este modelo, todos esperan que dentro de una alineación (las primitivas TeX \haligno \valign) el carácter de tabulación &realice su acción en el punto 3: ejecución. Sin embargo, este no es realmente el caso; de hecho, TeX "nota" los caracteres de tabulación en el punto 1. si texalguna vez leeun signo comercial (o una categoría de carácter equivalente), finalizará inmediatamente la celda actual, cerrará un grupo, insertará la " vparte" de la plantilla, etc.

(Editar:Estaba hojeando errorlog.pdf(es decir texdoc errorlog) y encontré el comentario relevante de una sesión de depuración el 18 de marzo de 1978:

Haga la siguiente rutina para interceptar &y \crtokens. Pensé que podría simplemente poner &y \crdentro big_switch[es decir, en el estómago de TeX, no en los ojos]; Ese fue un gran error.

Esta es una visión parcial interesante de lo que llevó a Knuth a realizar la elección de comportamiento aparentemente extraña anterior de estos tokens de matriz, así como una confirmación de que este es realmente el comportamiento).

La excepción, por supuesto, es cuando TeX está dentro de un grupo de llaves sin terminar (y deben ser caracteres de llaves reales, no implícitos o \begingroup, los que inician este grupo), lo que lleva a la construcción }` de David {\ifnum0=que es expandiblemente equivalente a una llave abierta. sin crear llaves desequilibradas dentro de una definición de macro donde podría colocarse.

El resultado de esta extraña regla de análisis es que hay que tener mucho cuidado con lo que lee una macro en una celda de una tabla o lo que encierra un entorno. Las macros como la suya, que efectivamente leen su argumento a través de una asignación en lugar de un análisis de macroargumentos, son aún más precarias, ya que sin las llaves adjuntas requeridas, la pestaña que podría leerse seríanoestar protegido. Los entornos compatibles con tablas incluyen \ifnumelementos para proteger cualquier carácter de pestaña que pueda aparecer dentro; los más ingenuos se dividirán en celdas y, por lo tanto, probablemente fallarán.

información relacionada