! Undefined control sequence es el primer error de LaTeX con el que se topa casi todo el mundo y, en rigor, ni siquiera es un error de LaTeX: el TeX puro imprime exactamente esas tres palabras sin ningún LaTeX cargado. Control sequence es el término propio de TeX para «una barra invertida seguida de un nombre», y el mensaje solo dice que ese nombre no está en su diccionario. Lo que lo convierte en el error más buscado es lo que ocurre después: TeX no se detiene. Descarta en silencio el comando desconocido, sigue leyendo y entrega un PDF en el que los argumentos del comando se han convertido en texto corriente. Esta página cubre las tres causas que explican casi todos los casos —una errata, un paquete que nunca se cargó y una macro usada antes de existir— y la trampa del número de línea, que señala dónde TeX se dio cuenta, no siempre dónde está el fallo.
Leer el mensaje: el corte de la línea señala al culpable
El comando al final de la primera de las dos líneas es el indefinido. Cuando TeX informa de un error, parte la línea culpable en lo que ya ha leído y lo que aún no ha leído, y apila ambas mitades. Dejó de leer justo en el instante en que apareció el problema, así que el corte señala directamente al culpable. Abajo hay salida de log real de \textbf escrito por error como \textbnf.
! Undefined control sequence.
l.4 This is \textbnf
{bold} text.l.4 significa línea 4. Si el problema surge dentro de una fórmula, puede aparecer sobre l.4 una línea como <recently read> \fra, que nombra el comando por separado. En cualquier caso, el primer paso es buscar ese nombre de comando en tus fuentes. Si la ortografía es correcta, pasa a la sección siguiente. Ojo: equivocarse en el nombre del paquete produce un error distinto, ! LaTeX Error: File seguido del nombre del .sty que no se encuentra.
Solo hay tres causas: ortografía, paquetes y orden de definición
En la práctica, las causas se reducen a tres: una errata, un paquete que olvidaste cargar y una macro usada antes de su definición. El orden también importa: recorrer la lista de arriba abajo es lo más rápido, porque comprobar la ortografía lleva segundos, comprobar el preámbulo un vistazo, y solo el caso de la macro exige trabajo de verdad.
- Una errata —
\frapor\frac,\textbnfpor\textbf,\begnipor\begin. Los nombres de comando distinguen mayúsculas, así que\Latexpor\LaTeXtambién queda indefinido. - Un paquete nunca cargado — la ortografía es correcta, pero el paquete que define el comando nunca se pasó a
\usepackageen el preámbulo. Véase la tabla de la sección siguiente. - Una macro usada antes de definirla — un
\newcommandolvidado, un uso por encima de la línea que la define, o una definición dentro de llaves o de un entorno, que desaparece fuera de ellos.
¿Qué paquete define el comando?
La tabla siguiente empareja los comandos que más a menudo quedan indefinidos por este motivo con el paquete que los define (comprobado con \ifdefined en TeX Live 2024). La confusión más frecuente es amsmath frente a amssymb. \lVert está en amsmath y no en amssymb; \mathbb y \therefore están en amssymb y no en amsmath. Si un comando matemático sigue indefinido pese a que «el paquete está cargado», sospecha de esto primero. Para lo que no aparezca en la tabla, texdoc PACKAGE abre el manual de ese paquete.
| Comando | Paquete | Nota |
|---|---|---|
\includegraphics | graphicx | inclusión de imágenes; sin él, las opciones se imprimen como texto |
\toprule | booktabs | lo mismo para \midrule y \bottomrule |
\lVert | amsmath | no está en amssymb; lo mismo para \rVert |
\mathbb | amssymb | amsmath por sí solo no basta (viene de amsfonts) |
\therefore | amssymb | lo mismo para \because; no está en amsmath |
\bm | bm | negrita matemática; \boldsymbol es de amsmath |
\coloneqq | mathtools | cargar solo amsmath no basta |
\multirow | multirow | fusión vertical de celdas de tabla |
\FloatBarrier | placeins | impide que los flotantes pasen de este punto |
\href | hyperref | para \url solo, basta el paquete url |
\textcolor | xcolor | lo mismo para \definecolor y \colorbox |
\SI | siunitx | la grafía más nueva es \qty; mismo paquete |
El \newcommand que no surtió efecto: orden y alcance
TeX lee de arriba abajo, una sola vez, así que la definición debe ir antes del uso. Las personas miran un fichero fuente como un todo; TeX lo lee línea a línea y solo inscribe un nombre en su diccionario en el momento en que llega al \newcommand. Una macro definida en la línea 200 y usada en la 40 queda indefinida. La otra trampa es el alcance: una macro definida entre llaves o dentro de un entorno desaparece en la llave de cierre. Ambos accidentes se evitan si las definiciones viven en el preámbulo. El funcionamiento de \newcommand en sí —argumentos, valores por defecto, diferencia con \renewcommand— corresponde a la página «Definir macros».
\documentclass{article}
\begin{document}
% too early: \R is not in the dictionary yet
$\R$
\newcommand{\R}{\mathbb{R}}
% scoped: \tmp dies at the closing brace
{\newcommand{\tmp}{scoped}\tmp}
\tmp
\end{document}Cuando la línea indicada no es donde está el fallo
Si sobre l.NN aparece una línea con ->, el fallo está dentro de la macro que ahí se nombra. l.NN solo marca dónde se dio cuenta TeX, es decir, la línea donde la macro se usó. La definición puede estar cientos de líneas más allá, o dentro de un paquete. En el ejemplo de abajo, \mysq llama a \mynorm, que usa \lVert, y nunca se cargó amsmath. La línea del log \mynorm #1->\lVert es la única pista.
! Undefined control sequence.
\mynorm #1->\lVert
#1 \rVert
l.5 The value $\mysq{x}
$ is here.Fíjate en que \mysq no aparece por ninguna parte en ese log. LaTeX fija \errorcontextlines en -1 (línea 535 de latex.ltx), de modo que solo se muestra el nivel más interno de la cadena de llamadas. Eso no basta cuando el fallo ocurre dentro de un paquete. Pon \errorcontextlines=999 en el preámbulo y recompila: aparece la línea \mysq #1->\mynorm {#1} y todo el camino de llamadas queda a la vista. Quítalo una vez hecho el diagnóstico; en el día a día un log tranquilo se lee mejor.
El PDF se genera igualmente, y ahí está el verdadero peligro
Un comando indefinido no detiene la composición. TeX descarta ese único comando y compone el resto como caracteres corrientes. Olvida graphicx y escribe \includegraphics[width=3cm]{example-image}: no solo falta la imagen, sino que el PDF sale con las opciones y el nombre del fichero impresos como texto del cuerpo. Los editores y las herramientas de compilación funcionan por defecto con -interaction=nonstopmode, así que la pasada ignora los errores y entrega un fichero; así es exactamente como se acaba enviando un PDF roto. Si queda aunque sea un comando indefinido en el log, no te fíes del PDF.
% graphicx was never loaded
\includegraphics[width=3cm]{example-image}
% the run still succeeds, and this is what lands on the page:
% [width=3cm]example-image