Figuras de química y física

En la forma clásica de dibujar diagramas de Feynman en LaTeX, cada diagrama se convierte en un carácter de una fuente. No es una metáfora. Pasa un diagrama de feynmf por METAFONT en TeX Live 2024 y anuncia "Font metrics written on myfd.tfm" y luego "Output written on myfd.600gf (1 character, 4340 bytes)": un carácter. La imagen de un proceso de dispersión, fundida como tipo, con su tabla de anchos incluida. Las figuras científicas siguen cada una su propia gramática de dibujo, y los paquetes de dominio toman precisamente esa gramática como entrada. Esta página ordena las herramientas de química mhchem, chemfig y XyMTeX; las de física tikz-feynman y feynmf; y modiagram para diagramas de orbitales moleculares, según dos ejes: qué produce cada una y bajo qué motor funciona.

Incluso dentro de las «figuras de química y física», la herramienta se separa con claridad según lo que quieras crear. Primero el mapa general y luego cada una por turno.

PaqueteDominioQué produceMotor / pasadas
mhchemQuímicaFórmulas y ecuaciones compuestas como texto (H2O, 2H2+O2 -> 2H2O)Cualquier motor; una pasada
chemfigQuímicaFórmulas estructurales y esqueléticas, esquemas de reacciónBasado en TikZ; pdf, lua o xe
xymtexQuímicaFórmulas estructurales; anillos y esqueletos invocados como comandosLaTeX estándar, con modos PostScript y PDF
tikz-feynmanFísicaDiagramas de Feynman; basta nombrar los vértices para colocarlosPresupone LuaLaTeX; en otros motores la disposición se degrada
feynmf / feynmpFísicaDiagramas de Feynman; cada uno se vuelve un glifo o una figura MetaPostDos pasadas; ejecutar mf o mpost aparte
modiagramQuímica y físicaDiagramas de orbitales moleculares, es decir de niveles de energíaBasado en TikZ; una pasada

Fórmulas y ecuaciones químicas en el texto: el \ce{} de mhchem

mhchem no sirve para dibujar estructuras, sino para componer fórmulas y ecuaciones químicas como texto. Se carga con \usepackage[version=4]{mhchem} y la expresión se escribe dentro de su comando central, \ce{...} (chemical equation). Su acierto está en que escribir de forma natural produce química correcta: un dígito justo tras un símbolo de elemento se vuelve subíndice (\ce{H2O}), y un número o signo escrito con ^ se vuelve superíndice de carga (\ce{SO4^2-}). Las flechas se teclean literalmente —-> directa, <=> equilibrio, <- inversa— y + se compone como suma de reactivos con el espaciado correcto.

document.tex
\usepackage[version=4]{mhchem}
% ...
\ce{2 H2 + O2 -> 2 H2O}
\ce{CO2 + C ->[\Delta] 2 CO}
\ce{H2O <=> H+ + OH-}
\ce{Ba^2+ + SO4^2- -> BaSO4 v}
\ce{C\bond{-}C}

Estos componen, en orden: la formación de agua (coeficientes y subíndices se alinean solos); el calentamiento, donde ->[\Delta] pone una condición encima de la flecha (escribe ->[arriba][abajo] para dos); la autoionización del agua, con flecha de equilibrio de doble sentido; la precipitación de sulfato de bario, donde la v final se convierte en una flecha hacia abajo (un gas desprendido es ^); y un símbolo de enlace simple mediante \bond. \ce{} funciona tanto en texto corrido como dentro de $...$. Lo que no puede hacer es dibujar estructuras: líneas de enlace y anillos quedan fuera. Para una imagen esquelética toca chemfig. Un paquete posterior con el mismo objetivo, chemformula, ofrece la idea mediante \ch{...}.

Estructuras de un solo trazo: símbolos de enlace y ángulos de chemfig

chemfig es la herramienta habitual para fórmulas estructurales, o esqueléticas, de moléculas; basado en TikZ, describe una molécula mediante un minilenguaje de enlaces y ramas. Cargarlo es solo \usepackage{chemfig} y el comando central es \chemfig{...}. La gramática gira sobre dos cosas: símbolos de enlace y ángulos. Los enlaces —- simple, = doble, ~ triple— van entre átomos, y la dirección de cada uno se fija en los corchetes que lo siguen. Un dígito de 0 a 7 como [2] es una dirección predefinida en pasos de 45°: [0] es este (derecha), y en sentido antihorario [2] arriba, [4] oeste, [6] abajo. Un ángulo arbitrario se escribe con dos puntos como valor absoluto, por ejemplo [:30]. Los paréntesis (...) abren una rama desde la cadena principal.

document.tex
\usepackage{chemfig}
% ...
% methane: hydrogens west, up, down, east
\chemfig{H-C(-[2]H)(-[6]H)-H}

% benzene: alternating bonds, then the inscribed-circle form
\chemfig{*6(=-=-=-)}
\chemfig{**6(------)}

En el ejemplo del metano, H-C coloca primero un hidrógeno al oeste del carbono; las ramas (-[2]H) y (-[6]H) añaden hidrógenos arriba y abajo; y el -H final extiende uno al este (la dirección por defecto), dando el CH4 en cruz. En el benceno, *6(...) significa un anillo de seis miembros y el =-=-=- de dentro alterna enlaces simples y dobles. * da un anillo ordinario y, duplicado como **, da la forma aromática con círculo inscrito. chemfig también dibuja esquemas de reacción: envuélvelos en \schemestart ... \schemestop, dispón las moléculas e inserta flechas con \arrow. \arrow{->[reactivo]} etiqueta una flecha con reactivos o condiciones, y \arrow{<=>} produce una flecha de equilibrio.

latex
\schemestart
  \chemfig{H-C(-[2]H)(-[6]H)-H}
  \arrow{->[\small oxidation]}
  \chemfig{O=C(-[2]H)-[6]H}
\schemestop

Este es un esquema de izquierda a derecha que va de la fórmula estructural del metano, a través de una flecha etiquetada que marca la oxidación, a la fórmula estructural del formaldehído. Como chemfig se apoya en TikZ, funciona con pdfLaTeX, LuaLaTeX o XeLaTeX y normalmente no necesita configuración adicional de controlador (con pLaTeX basado en DVI, especifica dvipdfmx). TeX Live 2024 incluye la versión 1.66, del 28 de diciembre de 2023, de Christian Tellechea.

Invocar anillos enteros como comandos: XyMTeX

La otra herramienta de larga trayectoria para fórmulas estructurales es XyMTeX (de Shinsaku Fujita), cuya premisa es la contraria a la de chemfig. Donde chemfig traza enlaces de un solo trazo, XyMTeX invoca anillos y esqueletos enteros como comandos y recibe los sustituyentes como argumentos. Escribe \bzdrv{1==Cl;4==OH} y sale un anillo de benceno con Cl en la posición 1 y OH en la 4: se declara qué va dónde por número de localizador, igual que hace la nomenclatura química. Su fortaleza es componer de forma fiable policiclos fusionados complejos y patrones de sustitución mediante comandos fijos y estructurados.

document.tex
\usepackage{xymtex}
% ...
% benzene with Cl at position 1 and OH at position 4
\bzdrv{1==Cl;4==OH}

Para trabajo empezado de cero, la mayoría elige chemfig, de notación más intuitiva y mantenimiento activo. XyMTeX sigue siendo útil para mantener manuscritos ya escritos con él y para quien tenga la mano hecha a designar posiciones por localizador. Admite un modo de salida LaTeX estándar además de modos PostScript y PDF.

tikz-feynman presupone LuaLaTeX: los avisos que da pdfLaTeX

Compílalo con LuaLaTeX. Bajo otros motores «funciona», pero la colocación automática deja de operar y las claves de disposición no se ignoran en silencio: cada una se informa como aviso. Probándolo con pdflatex en TeX Live 2024 salió primero "Package tikz-feynman Warning: LuaTeX is required if you wish to have vertices automatically placed." y luego una línea por cada horizontal, node distance, level distance y sibling distance: "The key you tried to use ... requires LuaTeX. It will be ignored." El algoritmo de disposición está escrito en Lua; al cambiar a lualatex no apareció ni un aviso.

Una cosa más: vigila el número de compat. El muy citado \usepackage[compat=1.0.0]{tikz-feynman} provoca un aviso en TeX Live 2024: "Package tikz-feynman Warning: The preamble requested version 1.0.0, but the system version is 1.1.0. This may change some diagrams." Lo que se incluye es la 1.1.0, del 5 de febrero de 2016, así que lo correcto es escribir compat=1.1.0. La clave existe para que te enteres cuando una actualización del paquete cambiaría tus diagramas, de modo que el uso correcto es indicar la versión realmente instalada (un número mayor discordante produce un error, no un aviso).

document.tex
% compile with lualatex
\usepackage[compat=1.1.0]{tikz-feynman}
% ...
% one-shot command: e+ e- -> mu+ mu- via a photon
\feynmandiagram [horizontal=a to b] {
  i1 -- [fermion] a -- [fermion] i2,
  a -- [photon] b,
  f1 -- [fermion] b -- [fermion] f2,
};

La figura es una dispersión de canal s de manual: el par de la izquierda se encuentra en el vértice a, una línea ondulada, es decir un fotón, une a con b, y a la derecha se separa en otro par. Los estilos de línea se fijan con [fermion] (recta con flecha), [photon] (ondulada), [gluon] (espiral), etc., y los vértices se crean implícitamente con solo nombrarlos. horizontal=a to b es una pista de disposición que significa «coloca a y b horizontalmente»: justamente la clave que pdfLaTeX avisaba que iba a ignorar. Para una colocación precisa, abre un entorno feynman dentro de un tikzpicture, coloca vértices con \vertex y conéctalos con \diagram*.

feynmf y feynmp: un método de dos pasadas nacido en 1989

Esta familia compone cada figura fuera de LaTeX e importa el resultado: un método de dos pasadas. feynmf recurre a METAFONT, feynmp a MetaPost. El autor es Thorsten Ohl, y el copyright de feynmf.sty se remonta a 1989, antes que LaTeX2e (1994). TeX Live 2024 incluye la v1.08, cuyas marcas de tiempo internas de revisión siguen siendo de 1996. Dicho de otro modo: casi treinta años sin necesitar cambios.

La escritura es declarativa. Las figuras se agrupan por nombre de archivo en un entorno fmffile; dentro de un fmfgraph (o fmfgraph*), se dan las patas externas a \fmfleft y \fmfright, y las líneas a \fmf{...}. Nunca se escriben coordenadas de vértices: solo se declara qué pata pasa por qué vértice y hacia dónde, y la colocación se hace sola. \fmf{fermion}{i1,v1,o1} significa «traza una línea de fermión de i1 pasando por v1 hasta o1».

document.tex
% feynmp-auto runs MetaPost for you: pdflatex -shell-escape document
\usepackage{feynmp-auto}
% ...
\begin{fmffile}{myfd}
  \begin{fmfgraph*}(120,80)
    \fmfleft{i1,i2}
    \fmfright{o1,o2}
    \fmf{fermion}{i1,v1,o1}
    \fmf{photon}{v1,v2}
    \fmf{fermion}{i2,v2,o2}
  \end{fmfgraph*}
\end{fmffile}

Aquí vuelve el comienzo de la página. En la ruta feynmf, la primera ejecución de LaTeX escribe myfd.mf, una fuente METAFONT; pasarla por mf funde la figura como tipografía. El informe de METAFONT en la ejecución real sobre TeX Live 2024 decía "Font metrics written on myfd.tfm" y "Output written on myfd.600gf (1 character, 4340 bytes)". Un carácter por diagrama. La segunda ejecución de LaTeX no hace más que componer el carácter número uno de esa fuente dentro del texto. La ruta feynmp, vía MetaPost, produce una figura ordinaria en vez de una fuente, y por eso un flujo PDF moderno suele elegirla.

En la práctica, cargar feynmp-auto es más cómodo: automatiza la ejecución de MetaPost. Pero como lanza un programa externo, --shell-escape es obligatorio, y olvidarlo es desagradable: en TeX Live 2024 la ejecución no dio ni aviso ni error y simplemente construyó un PDF sin la figura. Si el lugar de una figura sale en blanco, sospecha primero de un -shell-escape ausente. Con la opción, bastan dos pasadas: mpost se ejecuta y la figura entra.

modiagram para diagramas OM: el entorno MOdiagram está obsoleto

Usa el nombre de entorno en minúsculas, modiagram. Los ejemplos que circulan por la web —y una versión anterior de esta página— muestran ampliamente \begin{MOdiagram}, pero usarlo con modiagram 0.3a en TeX Live 2024 avisa: "Package modiagram Warning: The environment MOdiagram is deprecated. Use modiagram instead." La figura sale igualmente, pero no hay motivo para seguir con un nombre destinado a desaparecer. Cambia a minúsculas y el aviso desaparece.

Un diagrama de orbitales moleculares (diagrama OM) se sitúa en la frontera entre química y física: muestra cómo los orbitales atómicos (OA) se combinan en orbitales moleculares (OM) enlazantes y antienlazantes, apilados verticalmente según la energía. El paquete construido justo para esto es modiagram (de Clemens Niederberger; versión 0.3a en TeX Live 2024), asentado sobre TikZ. Cárgalo con \usepackage{modiagram} y, dentro del entorno, escribe los orbitales atómicos izquierdo y derecho con \atom y los orbitales moleculares que los unen con \molecule.

document.tex
\usepackage{modiagram}
% ...
% lower-case environment name: MOdiagram is deprecated
\begin{modiagram}
  \atom{left}{ 1s = {0; up} }
  \atom{right}{ 1s = {0; up} }
  \molecule{ 1sMO = {1; pair, } }
\end{modiagram}

Este es el diagrama OM más simple que existe, el de la molécula de hidrógeno H2. \atom{left} y \atom{right} colocan cada uno un electrón con espín hacia arriba en un orbital 1s (el 0 de {0; up} es el nivel de energía), y \molecule funde ambos en un orbital enlazante que aloja un par de electrones (pair). Basta con dar la ocupación —up, down, pair— y las alturas de nivel como argumentos para que un diagrama de niveles, hecho de líneas horizontales y flechas de espín, se monte solo. Tales diagramas también pueden dibujarse en TikZ puro, pero como modiagram se especializa en las convenciones OM, compone estas figuras estándar de forma más breve y más correcta.

Cómo elegir y dónde suele atascarse la compilación

La elección se sigue directamente de lo que quieras crear. Fórmulas y ecuaciones químicas dentro de la prosa: mhchem. Estructuras y esquemas de reacción: chemfig (o XyMTeX cuando un enfoque basado en comandos convenga a anillos fusionados complejos). Diagramas de Feynman: tikz-feynman (o feynmf / feynmp para entornos antiguos y manuscritos heredados). Diagramas OM: modiagram. mhchem y chemfig no compiten sino que se complementan, y lo habitual es emplear ambos en un mismo documento: mhchem para las ecuaciones del texto y chemfig para los esqueletos mostrados aparte.

Por experiencia, los atascos de compilación se reducen a unas tres causas. El motor equivocado: la disposición de tikz-feynman necesita LuaLaTeX. Un --shell-escape ausente: feynmp-auto deja caer la figura sin decir nada. Y el número de pasadas: feynmf / feynmp requieren dos ejecuciones antes de que aparezca la figura. A eso se suma que chemfig y modiagram se basan en TikZ, de modo que el cálculo se vuelve pesado a medida que se multiplican las figuras. Guardar las figuras en caché con tikzexternalize, o compilarlas aparte con la clase standalone, recorta de forma visible la espera mientras editas.