Técnicas macro usando e-TeX

Técnicas macro usando e-TeX

Las extensiones e-TeX estaban destinadas a abordar algunas de las deficiencias del TeX original de Knuth, y dado que LaTeX2e las requiere desde hace un tiempo, la mayoría de los autores de paquetes pueden confiar en su presencia. Ahora bien, si bien hay algunos recursos disponibles para aprender modismos macro TeX puros, incluidosesta discusiónen este sitio, y también en elbeneficios de e-TeXEn general, me gustaría ver algunos ejemplos concretos de cómo las extensiones e-TeX pueden facilitar la vida de un escritor de macros.

En particular, se agradecerían mucho algunos consejos/trucos prácticos sobre el uso de los comandos relacionados con la expansión y el análisis \protected. Me parecen útiles, pero nunca me doy cuenta de cuándo podría usarlos para simplificar las cosas (el\unexpanded\detokenize\scantokensmanual e-TeXtambién es muy conciso con ellos).


El alcance de la pregunta es bastante amplio, pero me interesarían más las extensiones enumeradas anteriormente. A continuación se presentan algunas ideas adicionales sobre otras extensiones que también me encantaría analizar.

Para algunas de las extensiones, su utilidad es inmediatamente evidente para mí, incluyendo

  • no tener que preocuparse por asignar nuevos registros debido al mayor número de 32767 espacios por tipo
  • los comandos de expresión convenientes \numexpr, \dimexpretc. que facilitan las operaciones aritméticas
  • \unlesscomo negated \if, especialmente en conjunto con \loops donde, de lo contrario, se tendrían que haber definido nuevos condicionales si se iba a ejecutar un bucle siempre que las condiciones fueran falsas
  • varios comandos y opciones de rastreo nuevos, que ayudan con el diagnóstico

Pero entonces, algunas características me hacen preguntarme si realmente son utilizadas por paquetes que existen o si han sido reemplazadas por enfoques más "modernos", como

  • composición tipográfica de dirección mixta con \beginL, \beginRetc.
  • consultas de estado como \currentgrouptype, \currentiftype, \lastnodetypeetc.
  • la posibilidad de guardar elementos descartados desde la parte superior de las páginas que se están construyendo\pagediscards
  • alinear sanciones específicas con \interlinepenaltiesy similares

Respuesta1

Tomando los artículos más caros en e-TeX:

  • \protectednos permite crear macros que no se expandan dentro de una \edefo similar:

    \protected\def\foo{\let\baz\bong}
    \edef\test{Some text\foo}
    

    normalmente daría un error (asumiendo que no hay definición para \baz/ \bong), pero aquí es "seguro". Si nos fijamos en el \protectmecanismo LaTeX2e, lo anterior es unalote más fácil de usar y más confiable: \protectedmacrosnuncaexpandir dentro de xla definición de tipo, mientras que con el enfoque LaTeX2e uno necesita \protected@edef, etc.

  • \unexpandednos permite proteger tokens arbitrarios de la expansión sin necesidad de usar toks

    \edef\test{Some text\unexpanded{lots of \textbf{stuff}}}
    

    lo cual es muy útil con entradas arbitrarias del usuario. También permite cosas como

    \edef\demo{\unexpanded{tokens #}}
    

    lo que significa que se puede almacenar fácilmente #dentro de una macro (consulte el expl3 tltipo de datos).

  • \detokenizees bueno para hacer que las cosas sean "seguras", por ejemplo, si pueden tener caracteres activos

    \csname Tokens\detokenize{&_~^\foo}\endcsname
    

    lo cual es particularmente cierto, por ejemplo, si se utilizan caracteres activos para la entrada UTF-8 en LaTeX

  • \numexpr, etc., funcionan muy bien para realizar cálculos ampliables fácilmente

Respuesta2

Al revisar los archivos fuente en TeX Live, puedo agregar algunas ideas sobre el uso de las características, al menos en mi percepción, menos extendidas de e-TeX.

Para algunos de losconsulta de estadoprimitivos, los paquetes de Heiko Oberdiek proporcionan algunos ejemplos para su aplicación. El atbegshipaquete muestra un ingenioso truco sobre cómo se puede redefinir una primitiva que toma un cuadro como argumento ( \shipouten este caso), teniendo en cuenta que si el argumento va a ser interceptado con \setboxy \afterassignment, el token que se insertará después de la asignación puede o puede No aterriza dentro de la caja dependiendo de si la caja se da como box0o como \hbox{...}. Se parece más o menos a esto:

\def\shipout{%
  \edef\saved@grouplevel{\number\currentgrouplevel}
  \afterassignment\@test 
  \setbox\mybox=}

\def\@test{%
  \ifnum\saved@grouplevel<\currentgrouplevel
    \expandafter\aftergroup
  \fi
    \output
}

Utiliza e-TeX \currentgrouplevelpara determinar si \@testaterrizó dentro de la caja (que abrió un grupo), en cuyo caso la \outputoperación subsiguiente se pospone hasta después de la caja.

Otro hecho útil es que \lastnodetypees menor que 11 para todos los elementos no descartables y -1 si la lista actual todavía está vacía (consulte, por ejemplo, setouterhboxaplicaciones de estos).

Como señala egreg en los comentarios, \currentgrouptypese puede consultar en modo matemático para decidir si se usa una \middlevariante delimitadora o no, como lo \currentgrouptypees 16 en un grupo abierto por \left(por ejemploaquí).

e-TeXcomposición bidireccionalcapacidades en forma de TeX--XeT es lo que utiliza XeTeX, para lo cual el bidipaquete proporciona una interfaz para estas características. También para algunos paquetes estándar de LaTeX como babel-hebreweste parece ser el camino a seguir. Sin embargo, LuaTeX ha abandonado las primitivas \beginL, \beginRetc. e integra la extensión Omega TeX en su lugar.

Por otra parte, para varias funciones no he encontrado ninguna aplicación real. Los únicos lugares donde aparecen son donde probablemente aparecerán todas las primitivas, como el kernel LaTeX3, ConTeXt MkIV y el unravelpaquete, y en algunos otros lugares donde los autores intentaron aumentar la compatibilidad con otros paquetes usándolos. Estas características incluyen las \currentif{type,branch,level}consultas, la \pagediscardsfuncionalidad y la línea específica \{inter,club,widow}linepenalties.

información relacionada