Missing $ inserted

! Missing $ inserted es el error más frecuente de LaTeX, y el texto de ayuda que aparece debajo termina con las palabras Proceed, with fingers crossed («seguimos, cruzando los dedos»). La frase es de Donald Knuth, escrita en el propio TeX en los años ochenta, y sigue apareciendo cada día en la pantalla de alguien. El mensaje significa una sola cosa: algo que solo es válido dentro de las matemáticas ha aparecido en el texto corriente. El culpable suele ser un guion bajo _ que se quería literal, un superíndice ^, un \alpha extraviado o un $ mucho más arriba que nunca se cerró. Esta página explica cómo leer el mensaje, por qué el número de línea que indica suele estar después del error real y qué escribir en los tres lugares donde la respuesta cambia: el texto normal, \verb y \url.

De qué se queja realmente ! Missing $ inserted

Significa que llegó un token que solo existe en modo matemático mientras TeX componía texto horizontal corriente, nada más. TeX supone que olvidaste abrir las matemáticas, inserta un $ en silencio y sigue componiendo. Por eso la corrección cabe en una frase: si querías matemáticas, enciérralo ($x_1$); si querías el carácter en sí, escápalo (\_). Un nivel más abajo, el mecanismo son los códigos de categoría. TeX asigna un número a cada carácter de entrada: _ tiene catcode 8 (subíndice), ^ tiene 7 (superíndice), $ tiene 3 (cambio a matemáticas). Y los catcodes 7 y 8 solo son legales dentro de las matemáticas. \alpha y \frac fallan por la misma razón: internamente piden caracteres de clase matemática.

latex
% "$" is not sacred: it is just the character whose catcode is 3.
% Give catcode 3 to "!" and it opens and closes math exactly like $.
\catcode`\!=3
Then !x_1! typesets as math.   % compiles with zero errors

El fragmento anterior parece una broma, pero compila sin un solo error bajo TeX Live 2024. $ no es sagrado: es sencillamente el carácter cuyo catcode vale 3. En cuanto eso encaja, el error deja de ser misterioso: se trata de una confusión sobre el papel de un carácter. De ahí se sigue también que _ y ^ no son los únicos caracteres especiales que se portan mal en el texto, pero un carácter distinto da un error distinto, así que use la tabla siguiente para situar su síntoma. Un malentendido habitual: escribir & en texto normal no produce ! Missing $ inserted.

CarácterCatcodeQué ocurre si se escribe en el texto
_8! Missing $ inserted. Para un guion bajo literal, escriba \_
^7! Missing $ inserted. El signo literal es \textasciicircum
$3Abre/cierra matemáticas. Si va solo, deja las matemáticas abiertas hasta el fin del párrafo
&4Otro error: ! Misplaced alignment tab character &. Signo literal: \&
%14Ningún error. Se come el resto de la línea, incluido un $ de cierre
#6! You can’t use ‘macro parameter character #’ in horizontal mode
~13Sin error; se convierte en espacio irrompible (signo literal: \textasciitilde)

Cómo leer <inserted text> y la línea l.3

El $ que aparece bajo <inserted text> lo añadió TeX por su cuenta; no está en su archivo. La línea l.3, en cambio, es la escena del crimen: TeX imprime la línea culpable partida en dos, y el punto de corte es exactamente hasta dónde había leído. Abajo está la salida real de pdfLaTeX (TeX Live 2024) para un archivo de cuatro líneas cuyo cuerpo es solo The value x_1 is here. El corte cae justo después de x_: TeX se detuvo en el instante en que leyó el guion bajo. Esta presentación en dos partes es lo más útil de un informe de error de TeX, porque señala la posición dentro de una línea larga.

log
! Missing $ inserted.
<inserted text>
                $
l.3 The value x_
                1 is here.
I've inserted a begin-math/end-math symbol since I think
you left one out. Proceed, with fingers crossed.

El mismo mensaje, palabra por palabra, sale también de plain TeX. No es, por tanto, un mensaje de LaTeX sino del propio motor TeX, y aparece incluso sin una sola línea \usepackage en el archivo. Por eso, al buscar la causa conviene sospechar de lo que uno escribió antes que de un paquete. La frase final del texto de ayuda, Proceed, with fingers crossed, permanece esencialmente igual desde que TeX se congeló en 1990.

Por qué el número de línea indicado es posterior al error

TeX informa de la línea donde lo notó, no de la línea donde usted se equivocó. Para algo ilegal en el instante de leerlo, como _, ambas coinciden. Pero en los errores que dejan las matemáticas abiertas —un $ que nunca se cierra—, TeX solo lo advierte al terminar el párrafo, es decir, en la siguiente línea en blanco. Como una fórmula no puede atravesar un cambio de párrafo, llegar a la línea en blanco es el primer momento en que TeX puede concluir que las matemáticas siguen abiertas. En el archivo siguiente el error está en la línea 3, pero se informa en la línea 4, la línea en blanco.

document.tex
\documentclass{article}
\begin{document}
The rate is $x% of the total$ per year.

Next paragraph.
\end{document}
log
! Missing $ inserted.
<inserted text>
                $
l.4

I've inserted a begin-math/end-math symbol since I think
you left one out. Proceed, with fingers crossed.

La trampa es el % de la línea 3. Un signo de porcentaje sin escapar comenta el resto de esa línea —incluido el $ de cierre—, de modo que las matemáticas siguen abiertas en la línea siguiente. A la derecha de l.4 no aparece nada porque la línea 4 es la línea en blanco. Cuando la línea del error está vacía, léala como «las matemáticas llevan abiertas desde algún punto anterior». En la práctica, lo más rápido es ir al párrafo inmediatamente anterior a la línea indicada y contar allí los $. Los editores emparejan llaves, pero no $; ese paso le toca a usted. Por el mismo mecanismo, una línea donde se escribió 50% en lugar de 50\% producirá un error desconcertante varias líneas después.

Imprimir un guion bajo literal: \_, \textunderscore y _ dentro de \verb

Si solo quiere un nombre de archivo como data_set.csv, la respuesta es data\_set.csv. Pero conviene conocer la relación entre \_ y \textunderscore. En el archivo del núcleo latex.ltx, \_ se define como «\nfss@text{\textunderscore} en modo matemático, si no \textunderscore»: son lo mismo. En el texto ambos son exactamente equivalentes; \_ es solo la forma corta que además sobrevive al modo matemático. Lo que sigue importa más: con la codificación OT1 por defecto, el guion bajo se dibuja como un filete, no se compone como carácter. La definición del núcleo es \leavevmode \kern.06em\vbox{\hrule\@width.3em}, un filete horizontal de 0,3 em. En consecuencia, no se puede copiar ese guion bajo desde el PDF y la búsqueda en el PDF no lo encuentra. Añada \usepackage[T1]{fontenc} y entra en juego \DeclareTextSymbol{\textunderscore}{T1}{95} de t1enc.def, con un glifo real que se copia y se busca. Pasado por pdftotext, el mismo documento da data set en OT1 y data_set en T1.

Lo que se escribeResultadoCuándo usarlo
\__forma estándar; sirve en texto y en matemáticas
\textunderscore_aquello en lo que se expande \_; en texto no hay diferencia
\verb|a_b|a_bsin escapes; escribir \_ dentro imprime también la barra
underscore_un paquete; al cargarlo, un _ desnudo es seguro en el texto
\textasciicircum^un circunflejo literal, no un superíndice
latex
% math, when you mean math
The value $x_1$ and $\alpha$ are positive, and $x^2 \ge 0$.

% characters, when you mean characters
Open data\_set.csv, then press \textasciicircum{}C to stop.

% verbatim, when the string is code
Run \verb|make data_set^2| in the shell.

Dentro de \url y siunitx la respuesta se invierte

No escape _ dentro de \url{...}. \url{https://example.com/a_b} compila correctamente tal cual, mientras que \url{a\_b} imprime a\_b, barra incluida. La razón es que el paquete url reescribe los códigos de categoría antes de leer su argumento y devuelve a _ y a sus compañeros la condición de carácter ordinario. Lo mismo ocurre con siunitx: \num y \qty abren por su cuenta el modo matemático, de modo que \qty{2.5}{\micro\metre} puede escribirse directamente en el texto corriente. Dicho de otro modo, lo que hay que teclear depende del argumento en el que uno se encuentre. La regla práctica es simple: si el comando trata su contenido de forma literal, use el carácter desnudo; si no, escápelo. \verb, \url y \lstinline de listings son del primer tipo; \section, \caption y \footnote, del segundo.

latex
\usepackage{url}       % or hyperref, which loads url
\usepackage{siunitx}
...
\url{https://example.com/a_b}    % right: bare underscore
\url{https://example.com/a\_b}   % wrong: prints the backslash
\qty{2.5}{\micro\metre}          % siunitx opens math for you

Una línea en blanco dentro de \[ … \] y ! Display math should end with $$

Una sola línea en blanco dentro de una fórmula en display produce tres errores. Uno parte la fórmula en dos líneas para que se lea mejor y el documento se rompe. Ponga una línea en blanco entre \[ E = mc^2 y F = ma y TeX Live 2024 emite, por orden, ! Missing $ inserted, ! Display math should end with $$ y ! LaTeX Error: Bad math environment delimiter. Las tres descienden de una única regla: una fórmula no puede atravesar un cambio de párrafo. Para partir una fórmula use el entorno align o \\, nunca una línea en blanco; para intercalar prosa entre dos líneas de un display existe \intertext de amsmath. Observe que ! Display math should end with $$ aparece también cuando el número de dólares de apertura y cierre no concuerda, como en $$ … $. En LaTeX lo idiomático es \[ … \] y no $$, porque $$ ignora los parámetros de espaciado como \abovedisplayskip.

log
! Missing $ inserted.
<inserted text>
                $
l.5

! Display math should end with $$.
<to be read again>
                   \tex_par:D
l.5

! LaTeX Error: Bad math environment delimiter.
l.7 \]

Cuando un solo error se convierte en cinco

Cuando los errores llegan en avalancha, corrija solo el primero. Los demás son casi siempre daños colaterales del $ que TeX insertó. Compile un archivo cuyo cuerpo sea únicamente \frac{1}{2} en texto normal y obtendrá una cadena de tres: ! Missing $ inserted (en \frac), ! Extra }, or forgotten $. (por la llave de cierre del \over de la definición de \frac) y otra vez ! Missing $ inserted en \end{document}. Tras el primer error TeX sigue todavía en modo matemático, de modo que el texto posterior se interpreta como matemáticas: aparecen huecos extraños dentro de las palabras, el espaciado de la puntuación se rompe y llueven más errores. El procedimiento queda fijado: corrija el primer error y vuelva a compilar. Leer el segundo mensaje y los siguientes antes de eso es tiempo perdido.

  • Vaya a la línea l.N indicada y léala hasta el corte; el carácter justo después del corte es el culpable.
  • Si el corte cae en una línea en blanco, cuente los $ del párrafo anterior: un número impar señala uno sin cerrar.
  • Repase esa misma línea hasta el final: ¿hay un % no pretendido como comentario que se traga el $ de cierre?
  • Si quería matemáticas, escriba $ … $; si quería caracteres, \_, \%, \&, \#, \textasciicircum{}.
  • Para mostrar código o identificadores tal cual, use \verb o listings en lugar de razonar escape por escape.
  • Tras la corrección, recompile antes de leer el siguiente error.