
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
\scantokens
manual 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
,\dimexpr
etc. que facilitan las operaciones aritméticas \unless
como negated\if
, especialmente en conjunto con\loop
s 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
,\beginR
etc. - consultas de estado como
\currentgrouptype
,\currentiftype
,\lastnodetype
etc. - 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
\interlinepenalties
y similares
Respuesta1
Tomando los artículos más caros en e-TeX:
\protected
nos permite crear macros que no se expandan dentro de una\edef
o 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\protect
mecanismo LaTeX2e, lo anterior es unalote más fácil de usar y más confiable:\protected
macrosnuncaexpandir dentro dex
la definición de tipo, mientras que con el enfoque LaTeX2e uno necesita\protected@edef
, etc.\unexpanded
nos 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 elexpl3
tl
tipo de datos).\detokenize
es 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 atbegshi
paquete muestra un ingenioso truco sobre cómo se puede redefinir una primitiva que toma un cuadro como argumento ( \shipout
en este caso), teniendo en cuenta que si el argumento va a ser interceptado con \setbox
y \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 box0
o 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 \currentgrouplevel
para determinar si \@test
aterrizó dentro de la caja (que abrió un grupo), en cuyo caso la \output
operación subsiguiente se pospone hasta después de la caja.
Otro hecho útil es que \lastnodetype
es menor que 11 para todos los elementos no descartables y -1 si la lista actual todavía está vacía (consulte, por ejemplo, setouterhbox
aplicaciones de estos).
Como señala egreg en los comentarios, \currentgrouptype
se puede consultar en modo matemático para decidir si se usa una \middle
variante delimitadora o no, como lo \currentgrouptype
es 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 bidi
paquete proporciona una interfaz para estas características. También para algunos paquetes estándar de LaTeX como babel-hebrew
este parece ser el camino a seguir. Sin embargo, LuaTeX ha abandonado las primitivas \beginL
, \beginR
etc. 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 unravel
paquete, 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 \pagediscards
funcionalidad y la línea específica \{inter,club,widow}linepenalties
.