LuaTeX es un motor TeX que extiende pdfTeX e incorpora el lenguaje de scripting Lua. Puede llamar a los programas Lua en mitad de la composición tipográfica y acceder directamente al material que TeX ha creado, y es esta apertura lo que hace que sea ampliamente visto como el futuro de TeX. Se invoca como lualatex y maneja las fuentes Unicode y OpenType de forma nativa.
¿Qué es LuaTeX?
LuaTeX fue desarrollado por Taco Hoekwater, Hartmut Henkel, Hans Hagen y otros. Surgió del mundo ConTeXt y TeX oriental, con el objetivo de un TeX “abierto y configurable”, construido sobre pdfTeX preservando al mismo tiempo la compatibilidad con versiones anteriores. Debido a que pdfTeX es su base, genera PDF directamente y hereda las extensiones e-TeX y la mayor parte de la maquinaria tipográfica de pdfTeX.
Gran parte de la herencia de pdfTeX ahora se alcanza a través de tres primitivas de interfaz (\pdfextension, \pdfvariable y \pdffeedback) que toman palabras clave y argumentos para que las funciones se puedan ampliar sin adaptar el motor central. En el uso diario, los paquetes LaTeX suavizan esta diferencia, por lo que rara vez se escriben estas primitivas a mano.
El otro pilar es un intérprete Lua 5.3 integrado. Escriba \directlua{...} dentro de su archivo .tex y el código Lua se ejecutará en el acto. La entrada es UTF-8 de forma nativa. Para las fuentes, seleccione caras del sistema o OpenType directamente con fontspec, al igual que en XeTeX, pero la carga la realiza el propio cargador basado en Lua de LuaTeX (luaotfload).
Incrustar Lua en un documento
\directlua{...} ejecuta el código Lua inmediatamente. Desde Lua llamas a tex.print(...) y su salida se retroalimenta al flujo de entrada de TeX y se escribe como de costumbre. Aquí hay un documento mínimo que puede compilar con lualatex: Lua calcula dos a la décima potencia y coloca el resultado en el texto.
\documentclass{article}
\begin{document}
Two to the tenth power is
\directlua{tex.print(2^10)}.
\end{document}Al compilar esto se establece “Dos elevado a la décima potencia es 1024”. En cambio, un comando hermano, \latelua{...}, se ejecuta cuando se envía la página en la que se encuentra. Esto se adapta al trabajo que debe esperar hasta que se arreglen los números de página y las coordenadas finales: dibujar en PDF o adjuntar anotaciones, por ejemplo.
Debido a que \directlua en bruto es quisquilloso con las llaves y los caracteres especiales, en la práctica, el paquete luacode y su entorno luacode le permiten escribir código Lua más largo palabra por palabra y de forma segura.
Devoluciones de llamada: engancharse a la tipografía
El verdadero poder de LuaTeX son sus devoluciones de llamada. TeX construye su texto a partir de nodos (caracteres, cuadros y pegamento (espacio extensible) encadenados en listas vinculadas) y al registrar una devolución de llamada, tiene su propia función Lua invocada en cada una de esas coyunturas, libre de inspeccionar y reescribir esa lista de nodos. De hecho, llega con seguridad al interior del motor.
Las devoluciones de llamada más utilizadas incluyen las siguientes. process_input_buffer se activa cada vez que TeX lee una línea de entrada, recibe una cadena y devuelve otra. pre_linebreak_filter le entrega la lista de nodos justo antes de que un párrafo se divida en líneas, y post_linebreak_filter la lista justo después. ligaturing y kerning corresponden a las etapas de construcción de ligaduras y kerning.
| devolución de llamada | cuando dispara |
|---|---|
process_input_buffer | A medida que se lee cada línea de entrada; para preprocesamiento |
pre_linebreak_filter | La lista de nodos justo antes de que se rompa un párrafo. |
post_linebreak_filter | La lista de nodos justo después del salto de línea. |
ligaturing / kerning | Las etapas de construcción de ligaduras y kerning |
Estas operaciones se realizan a través de un conjunto de tablas visibles desde Lua. tex es la ventana al estado interno de TeX (registros y dimensiones), node crea, recorre y libera nodos, token maneja tokens (las unidades de significado más pequeñas de TeX), font con datos de fuentes y status con información de tiempo de ejecución. Incluso la maquinaria de fuentes avanzada como luaotfload está escrita en Lua encima de estas.
Fuentes: seleccionándolas con fontspec
Al igual que en XeTeX, cargar el paquete fontspec en LuaTeX le permite nombrar fuentes OpenType / TrueType instaladas en su sistema directamente. \setmainfont elige la fuente del cuerpo, con \setsansfont y \setmonofont para las caras sans-serif y monoespaciadas.
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
This text is set in an OpenType font, with ligatures like ffi.
\end{document}Detrás de escena, luaotfload realiza la carga. Es una adaptación del cargador de fuentes de ConTeXt para Plain TeX y LaTeX, que expone características de OpenType como ligaduras, figuras de estilo antiguo y versalitas; Su objetivo es la compatibilidad con XeTeX y es mantenido por el grupo latex3 del equipo LaTeX.
En las distribuciones actuales, el comando lualatex en realidad invoca LuaHBTeX, una variante de LuaTeX con HarfBuzz integrado (incluido desde TeX Live 2020). Esto coloca la maquinaria de configuración necesaria para escrituras complejas (árabe, índica y similares) dentro del propio motor.
MetaPost integrado
LuaTeX tiene MPlib incorporado (el motor de dibujo MetaPost empaquetado como una biblioteca) por lo que puede generar figuras MetaPost en el mismo proceso de compilación, sin llamar a un programa externo. Desde LaTeX, el paquete luamplib expone esto, permitiéndole escribir código MetaPost directamente dentro de un entorno mplibcode.
japonés — LuaTeX-ja
La composición tipográfica japonesa está a cargo de LuaTeX-ja (paquete luatexja). Reimplementa, en el lado de Lua a través de devoluciones de llamada, el conocimiento de composición tipográfica japonesa que tenía pTeX: escritura vertical, el manejo del espaciado entre caracteres y la puntuación impulsado por JFM (Métricas de fuentes japonesas) y el espaciado entre el texto japonés y occidental. Esto abre una ruta moderna al japonés LaTeX distinta de pLaTeX/upLaTeX.
Con luatexja-fontspec también puedes seleccionar fuentes japonesas en el estilo de fontspec. LuaTeX-ja requiere LuaTeX 1.10.0 o posterior y un luaotfload razonablemente reciente. Si upLaTeX en el lado pdfLaTeX es el "estándar maduro", entonces LuaLaTeX con LuaTeX-ja es la mejor opción al comenzar de nuevo hoy.
Una advertencia: la configuración HarfBuzz de LuaHBTeX y la maquinaria de escritura vertical/CID de LuaTeX-ja deben combinarse con cuidado. El manual LuaTeX-ja advierte que las fuentes japonesas definidas mediante HarfBuzz pueden producir resultados no deseados. Para la prosa japonesa, primero construya el PDF con las fuentes Harano Aji incluidas en el TeX Live y la configuración estándar; Introduzca las características de OpenType o las opciones de HarfBuzz solo en pequeñas pruebas antes de usarlas en el manuscrito.
LuaJITTeX y LuaMetaTeX
LuaJITTeX es una variante que vincula LuaJIT, un compilador justo a tiempo que convierte el código en código de máquina en tiempo de ejecución, en lugar del stock Lua. Lua se ejecuta más rápido, pero LuaJIT permanece fijado al nivel de lenguaje Lua 5.1 (la línea principal LuaTeX está en 5.3) y se mantiene de manera menos activa. Fuera de los casos especiales donde la ejecución de Lua es extremadamente pesada, la mayoría de los usuarios están bien atendidos por LuaTeX ordinario.
El otro sucesor es LuaMetaTeX, una reelaboración más sencilla de LuaTeX (“eficiente y mediocre”) que sustenta el ConTeXt moderno (LMTX / MkXL). Trae nueva composición tipográfica matemática y muchas primitivas nuevas, adopta la línea Lua 5.4 y se envía en TeX Live desde 2023. La división del trabajo: LuaTeX para el trabajo LaTeX, LuaMetaTeX para el último ConTeXt.
Compensaciones
XeTeX y LuaTeX manejan Unicode y OpenType, pero difieren en carácter. Mientras que XeTeX se apoya en la maquinaria de diseño de texto del sistema operativo por conveniencia, LuaTeX es más flexible precisamente porque todo es controlable desde Lua. El costo es que históricamente ha sido algo más lento que XeTeX (la brecha se ha reducido en los últimos años).
- Unicode / OpenType primero. La entrada UTF-8 y
fontspecson la norma. - Programable. Con Lua y devoluciones de llamada puedes entrar en la propia composición tipográfica.
- Autocontenido. MetaPost (MPlib) está integrado, por lo que las figuras no necesitan llamada externa.
- Compatible con japonés. LuaTeX-ja ofrece composición tipográfica japonesa completa, escritura vertical y JFM incluidos.
- Miración hacia el futuro. El equipo de LaTeX apunta a LuaTeX para un nuevo desarrollo.
En general, LuaLaTeX se está convirtiendo en el valor predeterminado para nuevos flujos de trabajo Unicode / OpenType donde la programabilidad importa. La división anterior todavía se mantiene: XeLaTeX si simplemente quieres fuentes fáciles, pdfLaTeX para trabajos rápidos principalmente en inglés. El motor a elegir se indica en la página "Elegir un motor".
Iniciar un documento LuaLaTeX
Si elige LuaLaTeX, comience desde Unicode source, fontspec y, para japonés, luatexja. Migrar dejando pdfLaTeX-era inputenc / fontenc en su lugar crea advertencias y configuración de fuentes duplicadas. Primero haga una pequeña muestra que ejercite las fuentes del cuerpo, las fuentes japonesas, las matemáticas y la bibliografía, luego úsela como plantilla del manuscrito.
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Harano Aji Mincho}
\setsansjfont{Harano Aji Gothic}
\begin{document}
LuaLaTeX で日本語の本文と数式 $E=mc^2$ を同じ経路で組みます。
\end{document}El ejemplo utiliza fuentes Harano Aji incluidas con TeX Live, por lo que no depende de fuentes específicas de OS. Para colaboración y CI, primero asegúrese de que PDF se compila con fuentes empaquetadas como estas, luego cambie a fuentes requeridas por el laboratorio o el editor solo cuando sea necesario.