En la raíz de cada motor TeX-based se encuentra el TeX original de Knuth y su superconjunto estricto, e-TeX. Esta página cubre qué es realmente “el programa TeX”, qué es plain TeX, por qué casi nadie lo escribe directamente hoy en día, pero todavía importa, y las extensiones e-TeX, agregadas en la década de 1990, que ahora son la base sobre la que se basa todo motor moderno.
Qué es “el programa TeX”
De manera confusa, la palabra TeX nombra dos cosas. Uno es el programa de composición tipográfica en sí, escrito por Donald Knuth. El otro es el sistema de comandos que interpreta el programa. El programa propiamente dicho es un motor implacable de bajo nivel: empaqueta caracteres y cuadros en líneas y párrafos, optimiza los saltos de línea y escribe el resultado en un archivo de salida, y poco más.
Insatisfecho con la calidad tipográfica disponible para su libro *The Art of Computer Programming*, Knuth comenzó el primer TeX en 1978. Esa versión inicial fue un prototipo exploratorio; fue reescrito por completo en 1982 y esa reescritura se conoce como TeX82. “TeX” hoy significa efectivamente este linaje TeX82. El conjunto mínimo de comandos integrado por Knuth se llama primitivos: \def, \hbox, \vbox y similares.
Escribir un documento en primitivos básicos no es práctico, por lo que normalmente se utiliza un formato: una capa de macros construida sobre ellos. Al cargar plain.tex se obtiene plain TeX; cargar un conjunto de macros mucho más grande te da LaTeX. Los formatos se expanden previamente y se guardan como un archivo .fmt en el momento de la compilación, por lo que el motor no necesita volver a leerlos desde cero en cada ejecución.
Plain TeX
Plain TeX es el formato estándar que Knuth presenta en *The TeXbook*. Recopila un conjunto de herramientas mínimo (configuración de fuentes, símbolos matemáticos básicos, macros de conveniencia como \bye) en plain.tex, que se envía con TeX. Antes de LaTeX, esta era la única forma práctica de utilizar TeX.
La notación difiere notablemente de LaTeX. Las matemáticas en línea son $...$ (lo mismo que LaTeX). Un cuadro horizontal es \hbox{...}, un cuadro vertical \vbox{...}, la alineación tabular se realiza con \halign, un comando se define con \def, el ancho del texto es \hsize y un documento termina con \bye. No existe \documentclass ni \begin{document}; todas esas son cosas que LaTeX construye a partir de macros.
% plain TeX — tex hello.tex で処理 / process with: tex hello.tex
\hsize=10cm
\font\big=cmr10 at 17pt
{\big Hello, plain \TeX!}
\medskip
This paragraph is set in the default font.
Inline math works too: $E = mc^2$.
\byeProcesar el ejemplo con tex hello.tex produce un archivo DVI (no un PDF; consulte más abajo). Las macros de logotipo como \TeX y las macros de espaciado como \medskip (un salto vertical medio) también están definidas por plain TeX. Ubicado junto a un documento LaTeX \documentclass, muestra cuán delgada es la piel plain TeX sobre el motor desnudo.
Programación alfabetizada y WEB.
El propio TeX está escrito en WEB, el propio sistema de Knuth y la práctica fundacional de la programación alfabetizada. Una fuente WEB es un documento único en el que se entrelazan una explicación humana y el código Pascal; Luego, dos herramientas extraen derivados de él: tangle produce Pascal compilable y weave produce el comentario tipográfico (el libro *TeX: The Program*).
El idioma de destino original era Pascal; En distribuciones modernas, una herramienta llamada web2c traduce WEB (a través de Pascal) a C para su compilación. Entonces, el pdfTeX o el LuaTeX que se ejecutan en su máquina hoy en día todavía se remontan, en última instancia, a esa única fuente alfabetizada.
Un número de versión que converge a π
La numeración de versiones de TeX es idiosincrásica. Desde la versión 3, cada actualización agrega un dígito más, por lo que el número asintóticamente se aproxima a π. La versión actual es 3.141592653, establecida por la puesta a punto de 2021 en febrero de ese año y intacta desde entonces, un símbolo de que el programa está esencialmente terminado y es excepcionalmente estable.
Knuth ha declarado que el “cambio final”, realizado póstumamente, establecerá la versión exactamente en π, momento en el cual los errores restantes se convertirán en características permanentes. De hecho, TeX no ha incorporado nuevas funciones durante años y los problemas reportados representan solo pequeñas correcciones. Esta estabilidad congelada es precisamente la razón por la que un archivo .tex de hace décadas todavía produce el mismo resultado hoy.
METAFONT y DVI
TeX tiene un compañero gemelo, METAFONT (mf): un sistema que describe una fuente no como formas fijas sino como un *programa para dibujar* los glifos. Knuth diseñó con él toda la familia tipográfica Computer Modern para TeX. La división del trabajo es que TeX decide dónde van los personajes, mientras que METAFONT produce las formas de los propios personajes.
Lo que el TeX de Knuth emite directamente no es PDF sino un archivo DVI (DeVice Independent). Un DVI contiene solo instrucciones independientes del dispositivo («coloque este carácter en esta posición») que luego se convierten a PostScript mediante dvips o a PDF mediante dvipdfmx. Una diferencia importante entre los pdfTeX, XeTeX y LuaTeX, ampliamente utilizados en la actualidad, es que omiten este paso y producen PDF directamente.
Por qué todavía importa
En la práctica, casi nadie escribe plain TeX sin formato para nuevos trabajos: la maquinaria práctica (numeración, referencias cruzadas, archivos de clase) vive en la capa LaTeX superior, y la escritura diaria ocurre con esa comodidad. Sin embargo, existe un valor real en conocer los primitivos descritos aquí.
- La base de cada formato. Tanto LaTeX como ConTeXt se basan en última instancia en estas primitivas.
- Puedes ver el final de los errores. Los errores enredados y los ajustes de bajo nivel se vuelven legibles una vez que conoces el vocabulario de
\hboxy\vbox. - La visión del mundo de cajas y pegamento. La idea de TeX de construir una página a partir de *cajas* y *pegamento* extensible es el lenguaje compartido para usar LaTeX profundamente.
- Universalidad y reproducibilidad. Debido a que el motor está congelado, los documentos pasados siguen produciendo el mismo resultado en el futuro.
¿Qué es e-TeX?
Debido a que Knuth congeló TeX, las nuevas funciones tuvieron que venir de otras manos. Entonces, en la década de 1990, del proyecto europeo NTS (New Typesetting System) surgió e-TeX, siendo Peter Breitenlohner el principal desarrollo. e-TeX no reemplaza a TeX; está diseñado como un superconjunto estricto del mismo: la entrada existente se ejecuta sin cambios, con una salida idéntica.
e-TeX tiene dos modos. En modo de compatibilidad se comporta exactamente como el clásico TeX; sólo en modo extendido (ingresado iniciándolo con *) las primitivas agregadas están disponibles. Cuando un formato se construye en modo extendido, el usuario no necesita pensar en ello en absoluto.
Ahora la línea de base
Hoy en día simplemente se supone que las extensiones e-TeX están presentes. TeX Live tiene por defecto e-TeX desde 2003, y LaTeX ha requerido oficialmente las primitivas e-TeX desde 2017. Más importante aún, todos los motores actuales incluyen e-TeX: pdfTeX, XeTeX y LuaTeX incorporan las extensiones e-TeX y agregan sus propias características.
En otras palabras, cuando escribes con pdfLaTeX o LuaLaTeX, estás ejecutando e-TeX sin darte cuenta. Muchos paquetes modernos, empezando por expl3, la capa de programación LaTeX3, simplemente no podrían existir sin las primitivas e-TeX.
Las primitivas e-TeX agregan
Las adiciones de e-TeX son más importantes para las personas que escriben macros. El más grande es aritmética sobre números enteros, dimensiones y pegamento. En TeX básico, tenías que mezclar registros reutilizables para calcular; e-TeX proporciona \numexpr, \dimexpr y \glueexpr, que evalúan expresiones como (a+b)*c/d en el momento, en un formato ampliable.
% 拡張モードの e-TeX 系エンジンで / on any e-TeX engine in extended mode
\count0=\numexpr (3+4)*2/7 \relax % 2 が入る / yields 2
% プリミティブが「定義済みか」を安全に分岐 / branch safely on whether a name is defined
\ifdefined\foo \message{foo exists}\else \message{no foo}\fi
% 制御綴を作らずに名前の存在を確かめる / test a control sequence without creating it
\ifcsname chapter\endcsname \message{chapter is defined}\fi
% \unless で「if の否定」を直接書く / negate a conditional directly
\unless\ifnum\count0>10 \message{count0 is not greater than 10}\fiUn segundo pilar es manipulación de condicionales y tokens. \ifdefined prueba si una secuencia de control está definida y \ifcsname...\endcsname prueba la existencia de una ensamblada a partir de un nombre, ambos sin efectos secundarios (el viejo truco \ifx en TeX simple podría convertir silenciosamente una secuencia indefinida en \relax). \unless invierte cualquier condicional y \detokenize convierte una lista de tokens en su forma de cadena (caracteres del código de categoría 12).
También se refuerza el control de la expansión. \unexpanded deja su contenido en su lugar sin expandirlo, y \protected crea una macro definida que *no* se expandirá por sí sola en contextos de expansión como \edef y \write: la clave para implementar \protect de LaTeX correctamente en un nivel bajo.
| Primitivo | que hace |
|---|---|
\numexpr / \dimexpr / \glueexpr | Evaluar expresiones de número entero/dimensión/pegamento en su lugar (ampliable) |
\ifdefined / \ifcsname | Probar si está definida/existe una secuencia de control, sin efectos secundarios |
\unless | Invertir el sentido del siguiente condicional |
\protected | Definir una macro que no se expandirá dentro de contextos de expansión. |
\detokenize / \unexpanded | Convierta los tokens en una cadena/mantenga los tokens sin expandir |
\scantokens / \readline | Volver a leer una cadena como tokens/leer una línea de entrada palabra por palabra |
\middle | Coloque un delimitador elástico en medio de \left … \right |
\currentgrouplevel / \interactionmode | Inspeccionar la profundidad del grupo actual/obtener y configurar el modo de interacción |
Más allá de estos hay \middle para un delimitador elástico en medio de matemáticas como \left( … \middle| … \right); \scantokens para volver a leer una cadena como tokens; \readline para leer una línea de entrada palabra por palabra; \currentgrouplevel devuelve la profundidad del grupo actual; y \interactionmode para leer y cambiar el modo de interacción. e-TeX también introdujo ganchos para composición tipográfica bidireccional (de derecha a izquierda), que se utilizaron en trabajos posteriores en XeTeX, LuaTeX y procesamiento japonés.
Una extensión silenciosa pero trascendental es un gran aumento en los registros. El TeX desnudo tenía solo 256 de cada uno de \count, \dimen, \skip, \toks, etc.; e-TeX elevó esto a 32768 (asignado como matrices dispersas). Los registros ya no se agotan tan fácilmente incluso cuando se cargan muchas clases y paquetes grandes, un soporte no reconocido en las pesadas configuraciones LaTeX actuales.
Cómo ayuda esto en los documentos LaTeX
No es necesario escribir una tesis o documento técnico en plain TeX. Aún así, conocer el vocabulario \hbox, \vbox, \count, \dimen y \def le permite leer la capa inferior de mensajes de error. Overfull \hbox, por ejemplo, dice que el material sobresale de un cuadro de línea; Missing number, treated as zero dice que TeX esperaba algo legible como un número o dimensión y no lo encontró.
Comprender la capa es diferente a escribir prosa directamente en ella. Deje que los comandos estructurales de LaTeX manejen encabezados, listas, referencias cruzadas y entornos de teoremas; mantenga comandos de bajo nivel para leer por qué algo se rompió o para arreglar una clase por poco. Incluso al definir un nuevo comando, los documentos ordinarios se sirven mejor con \newcommand o \NewDocumentCommand que con \def sin formato, porque LaTeX puede verificar los recuentos de argumentos y las colisiones con los comandos existentes.
- Al escribir prosa, utilice comandos estructurales LaTeX y mantenga las primitivas de bajo nivel raras.
- Al arreglar una clase o paquete, las herramientas e-TeX como
\ifdefinedy\numexprson más seguras que los trucos más antiguos de TeX. - Al leer registros, traducir las advertencias al lenguaje de cajas, pegamento y registros de TeX; la causa se vuelve visible.