Ejecute which context en TeX Live 2024 y luego ls -l sobre la ruta que imprime: obtendrá context -> luametatex. La orden que invoca ConTeXt resulta ser luametatex en persona, el motor que los desarrolladores de ConTeXt construyeron para sí mismos. Esa sola línea resume toda la empresa: ConTeXt no es un paquete que se añade a LaTeX sino un sistema de preparación de documentos que se usa en lugar de LaTeX, y lleva su propio motor debajo. Esta página recorre su sintaxis centrada en \setup..., las tres generaciones MkII / MkIV / LMTX, por qué la primerísima pasada es lenta y — leyendo los registros reales — quién debería planteárselo de verdad.
ConTeXt no es un paquete de LaTeX
No existe ninguna orden \usepackage{context}, y escribir \usepackage dentro de un documento ConTeXt detiene la compilación con Undefined control sequence. LaTeX y ConTeXt son formatos hermanos sobre el mismo TeX, y ninguno entiende una palabra del otro. El archivo sigue terminando en .tex, pero lo procesa la orden context, no pdflatex ni lualatex. Colaboradores y cadenas de integración continua echan mano de una orden LaTeX y fallan con regularidad, así que una línea en el README — «compilar este documento con context main.tex» — se amortiza sola.
$ cat up.tex
\usepackage{amsmath}
\starttext
Hi
\stoptext
$ context up.tex
tex error > tex error on line 1 in file ./up.tex: Undefined control sequence
mtx-context | fatal error: return code: 1ConTeXt lo ha escrito el neerlandés Hans Hagen con su empresa PRAGMA ADE (Advanced Document Engineering). El nombre viene de «text with TeX» — con-tex-t. No creció como subproducto académico sino como herramienta de producción para los encargos de la propia empresa, y eso moldea su carácter: encaja en trabajos donde uno diseña la página, como material didáctico, manuales y catálogos. Su antigüedad se ve también en las fuentes: la cabecera de cont-nl.mkxl distribuido con TeX Live 2024 sigue diciendo version=1997.08.19, author=Hans Hagen, copyright={PRAGMA ADE & ConTeXt Development Team}.
ConTeXt frente a LaTeX: \setup... y \start…/\stop…
La mayor diferencia: todos los ajustes de apariencia se concentran en una sola familia de órdenes. En LaTeX los márgenes vienen de geometry, el color de xcolor, el aspecto de las notas de otra cosa distinta, cada cual con su sintaxis. En ConTeXt el papel es \setuppapersize, la fuente del cuerpo \setupbodyfont, el espaciado de párrafo \setupwhitespace — todo empieza por \setup y todo admite key=value. ¿Son muchas? Realmente: un barrido de las fuentes LMTX de TeX Live 2024 (tex/context/base/mkxl) arroja 498 órdenes distintas que empiezan por \setup. El diseño pide aprender la regla de nombres, no los nombres.
El marcado también es regular. Donde LaTeX escribe un entorno como \begin{env}…\end{env}, ConTeXt usa pares casados \start… y \stop…: el cuerpo es \starttext … \stoptext, una sección \startsection … \stopsection, una fórmula aparte \startformula … \stopformula. Y no hay declaración obligatoria equivalente al \documentclass de LaTeX. Se abre el archivo con \setuppapersize[A4] y se entra directamente en el texto. La costumbre latexiana de elegir primero una clase y luego buscar paquetes que le encajen desaparece sin más.
% first-context.tex -- compile with: context first-context.tex
\setuppapersize[A4]
\setupbodyfont[12pt]
\starttext
\startsection[title=Introduction]
Hello, \ConTeXt!
\startformula
E = mc^2
\stopformula
\stopsection
\stoptext| LaTeX | ConTeXt | Lo que se quiere |
|---|---|---|
\documentclass{article} | (nada) | no hace falta declarar clase; la apariencia va en \setup... |
\begin{document} | \starttext | inicio del cuerpo; termina con \stoptext |
\section{...} | \startsection[title=...] | una sección; \section a secas también existe para el título |
\[ ... \] | \startformula … \stopformula | una fórmula aparte |
\usepackage{geometry} | \setuppapersize y demás \setup... | papel, márgenes, diseño de página; no hay paquete que añadir |
pdflatex | context | la orden de procesado; una orden LaTeX no sirve, ni siquiera para un .tex |
Qué es LMTX: las generaciones MkII, MkIV y LMTX
LMTX es la generación actual. ConTeXt se divide en tres líneas según la generación del motor de debajo: MkII, la más antigua, corre sobre pdfTeX (y XeTeX); MkIV es la reescritura de la era Lua sobre LuaTeX; y LMTX — MkXL en el interior — corre sobre LuaMetaTeX. En TeX Live 2024, context --version informa de context.mkiv y context.mkxl con la misma fecha: MkIV sigue distribuyéndose. Pero la orden context es a su vez un enlace simbólico a luametatex, de modo que una ejecución sin más da LMTX. La primera línea del registro lo dice sin rodeos: ConTeXt ver: 2024.02.27 09:18 LMTX.
$ ls -l $(which context)
context -> luametatex
$ luametatex --version
This is LuaMetaTeX, Version 2.11.02
Functionality : level 20240226
$ context --version
mtx-context | ConTeXt Process Management 1.06
mtx-context | main context file: .../tex/context/base/mkiv/context.mkiv
mtx-context | current version: 2024.02.27 09:18
mtx-context | main context file: .../tex/context/base/mkxl/context.mkxl
mtx-context | current version: 2024.02.27 09:18La pieza clave es LuaMetaTeX. Hans Hagen y los desarrolladores de ConTeXt lo reconstruyeron como un motor ligero hecho para ConTeXt, sucesor de LuaTeX, y lo audaz no es lo que se añadió sino lo que se quitó: el backend de salida PDF, el tratamiento de fuentes y muchas primitivas se eliminaron a propósito de LuaTeX y se reimplementaron en Lua del lado de ConTeXt. El resultado no depende de bibliotecas externas, no necesita un ecosistema de compilación complicado y se traslada fácilmente entre sistemas operativos. El registro de LMTX sí imprime used backend: pdf — pero ese PDF lo escribe la implementación en Lua. Conviene decir aquí una cosa con franqueza: ConTeXt es en la práctica lo único que da uso serio a LuaMetaTeX. Se acerca más a la verdad verlo como parte de ConTeXt que como motor de propósito general.
Dónde sobreviven las generaciones antiguas también se ve en la configuración. El fmtutil.cnf de TeX Live contiene dos líneas, cont-en pdftex - -8bit *cont-en.mkii y cont-en xetex - -8bit *cont-en.mkii, que son las definiciones de formato de MkII. Así que MkII todavía puede grabarse sobre pdfTeX y sobre XeTeX. LMTX no usa ese mecanismo en absoluto; como se verá, construye su formato en una caché propia. Si empieza de cero, use LMTX sin dudarlo, y tome MkII y MkIV como lo que queda porque quedan documentos antiguos.
Por qué solo la primera pasada es lenta: mtxrun --generate y la caché
ConTeXt graba su formato en una caché por sí mismo, así que solo la primera pasada cuesta tiempo. Medido desde un estado limpio, la primera pasada informa total runtime: 3.559 seconds y la segunda sobre el mismo archivo 0.248 seconds — un factor de catorce. Lo que apareció en la caché durante esa primera pasada es un cont-en.fmt de unos 19 MB; después solo se lee. Un paso más atrás está la base de datos de archivos, que construye mtxrun --generate. Invoque context --version en un entorno donde eso no se haya hecho y obtendrá un error desconcertante a primera vista.
# before the file database exists
$ context --version
mtxrun | unknown script 'mtx-context.lua' or 'mtx-mtx-context.lua'
$ mtxrun --generate # builds the file database
mtxrun | elapsed lua time: 3.034 seconds
$ context first.tex # run 1: also dumps ~19 MB cont-en.fmt
system | total runtime: 3.559 seconds
$ context first.tex # run 2: format is cached
system | total runtime: 0.248 secondsEl mensaje no dice que falte mtx-context.lua, sino que la lista de archivos aún no está construida y por eso no lo encuentra. Una pasada de mtxrun --generate lo resuelve. Superado eso, ConTeXt tiene otra costumbre que sorprende a quien viene de LaTeX: se vuelve a ejecutar tantas veces como exijan las referencias cruzadas y el índice. Teclee context toc.tex una sola vez sobre un documento con índice y el registro anota dos invocaciones internas, --c:currentrun=1 y --c:currentrun=2, junto al techo --c:maxnofruns=9. Lo que en LaTeX obliga a acordarse de compilar dos veces o a recurrir a latexmk aquí es el comportamiento por omisión. El archivo auxiliar se llama además .tuc y no .aux.
MetaPost corre dentro de la misma compilación
Uno de los rasgos estelares de ConTeXt es que el lenguaje de dibujo MetaPost está integrado en el sistema y produce las figuras en el sitio, sin lanzar ningún programa externo. Escriba \startMPcode … \stopMPcode dentro del documento y la figura se genera durante la compilación. El registro muestra This is MPLIB for LuaMetaTeX, version 3.14, running in double mode junto a loading metafun for lmtx — prueba de que MetaPost habita dentro del motor como la biblioteca MPlib, que Taco Hoekwater y Hans Hagen extrajeron de MetaPost en 2007. Como MetaPost hereda su forma de describir figuras del METAFONT de Knuth, líneas y curvas se enuncian como restricciones y no como coordenadas.
\starttext
\startMPcode
fill fullcircle scaled 3cm withcolor .6red;
draw fullcircle scaled 3cm withpen pencircle scaled 1mm;
\stopMPcode
\stoptext
% one run of `context` produces the PDF; no external MetaPost binary is calledLa diferencia es mayor de lo que parece. Como la figura forma parte de la misma ejecución y no de un proceso aparte, puede leer las dimensiones del texto: una figura exactamente del ancho de la caja, adornos ligados al número de sección, filetes y fondos generados a partir de datos — todo sin paso de posprocesado. Por eso quienes usan ConTeXt dibujan hasta los filetes y los fondos de página en MetaPost. No es del todo la costumbre de TikZ heredada de LaTeX; aquí MetaPost sirve de herramienta para dibujar los propios elementos de la página.
Quién debería elegir realmente ConTeXt: una respuesta honesta
La respuesta: quienes controlan el diseño de la página. Material didáctico, manuales, catálogos, publicaciones internas, composición generada en masa a partir de XML o de una base de datos — allí donde las decisiones de maquetación son suyas, el modelo integrado de ConTeXt, con los ajustes reunidos en \setup..., rinde. En cambio no encaja en un artículo o una tesis cuyo destino imponga una plantilla LaTeX. Plantillas de congreso, clases como revtex, las instalaciones de los coautores, la cadena de procesado de arXiv: todo presupone LaTeX, y ninguna ganancia compensa el esfuerzo de migrar. La línea no separa lo mejor de lo peor, sino que depende de quién decide sobre la página.
- Buen encaje: folletos, material didáctico, catálogos, manuales — todo aquello cuyo diseño de página es suyo. Los ajustes se reúnen en
\setup..., así que cambiar la maqueta más tarde significa mirar en un solo sitio. - Buen encaje: composición generada automáticamente a partir de XML o de datos. ConTeXt sabe leer y componer XML directamente, y el procesado puede escribirse en Lua.
- Buen encaje: documentos donde figuras y prosa deben vivir en una sola fuente. MetaPost está dentro de la misma ejecución, así que no hay posprocesado ni archivos de imagen que gestionar.
- Buen encaje: diapositivas. TeX Live 2024 trae más de veinte estilos de presentación —
s-present-boring,s-present-dark,s-present-punky otros — y MetaPost puede componer su ornamentación. - Mal encaje: artículos y tesis cuyo destino impone una clase LaTeX. Seguir la plantilla es más rápido y más seguro.
- Mal encaje: manuscritos cuyos coautores solo usan LaTeX. Sobre ConTeXt se ha escrito mucho menos que sobre LaTeX, y hay menos gente a quien preguntar cuando uno se atasca.
La documentación también se agrupa de otro modo. El saber de LaTeX está disperso en libros, sitios de preguntas y respuestas y manuales de paquetes de todo el mundo, mientras que ConTeXt está comparativamente concentrado: la wiki oficial contextgarden y manuales como ConTeXt: an excursion, con una reunión anual de ConTeXt que junta a desarrolladores y usuarios. Menos material, pero un centro más nítido — la imagen es bastante fiel. Un último detalle característico: el sistema ofrece interfaces en las que los propios nombres de las órdenes están traducidos. Junto al inglés, las fuentes LMTX de TeX Live 2024 traen definiciones de formato para checo, alemán, francés, italiano, neerlandés, persa, rumano e inglés británico. Que el cont-nl neerlandés siga ahí se lee como un monumento al lugar donde nació el sistema.
Para terminar, el arranque práctico. ConTeXt se distribuye con TeX Live, así que en una instalación normal basta con context first.tex. Si quiere seguir las versiones más recientes, la vía habitual es la distribución LMTX del propio grupo — antes llamada ConTeXt Standalone —, un paquete ligero, solo de ConTeXt, que se actualiza con frecuencia. La costumbre que conviene dejar al empezar a escribir es el reflejo latexiano de buscar un paquete cada vez que falta algo. Levante primero el armazón con \starttext, \startsection y \startitemize, y reúna márgenes y fuentes en órdenes \setup... al principio. Añada estilo según crezca el capítulo: los ajustes se mantienen fuera de la prosa y, el día que quiera cambiar la maqueta, habrá exactamente un sitio donde mirar.