Caracteres especiales

LaTeX reserva exactamente diez caracteres especiales —# $ % & ~ _ ^ \ { }—, y la lista no la eligió nadie. TeX asigna a cada carácter un código de categoría; los caracteres corrientes son «letra» (11) u «otro» (12). Exactamente diez caracteres ASCII imprimibles llevan otro número, y esos diez son los reservados. Así que la respuesta a «¿por qué estos diez?» no está en la historia ni en el gusto: está en la tabla de configuración del procesador de entrada de TeX. Esta página explica cómo imprimir cada uno de ellos literalmente, cómo poner acentos y cómo teclear texto no ASCII ahora que UTF-8 es el valor por defecto de LaTeX.

Los diez caracteres reservados y sus códigos de categoría

Un carácter reservado es aquel que LaTeX usa como parte de su propia sintaxis: teclearlo no lo imprime, sino que dispara un comportamiento. Escriba % y desaparece el resto de la línea; escriba $ y entra en modo matemático; escriba & y se separa una columna de la tabla. Dicho en códigos de categoría: \ es 0 (inicio de comando), { es 1 y } es 2 (abrir y cerrar grupo), $ es 3 (cambio a matemáticas), & es 4 (tabulador de alineación), # es 6 (número de argumento), ^ es 7 (superíndice), _ es 8 (subíndice), ~ es 13 (carácter activo) y % es 14 (comentario). a es 11, y 1 o + son 12: caracteres que no hacen más que imprimirse.

Lo que ocurre al teclearlos en crudo varía según el carácter. El más peligroso con diferencia es %, que no produce error alguno y se come en silencio el resto de la línea. & da ! Misplaced alignment tab character &.; _ y ^ en el cuerpo dan ! Missing $ inserted.; } da ! Too many }'s.; y \ lee lo que sigue como nombre de comando y produce ! Undefined control sequence. Solo # tiene un mensaje peculiar: empieza ! You can't use y sigue con macro parameter character #' in horizontal mode. ~ es el único que no da ni error ni aviso: se compone sin más como un espacio indivisible.

CarácterCódigo de categoríaFunciónTecleado en crudo
\0Inicia un comando! Undefined control sequence.
{1Abre un grupo o argumentoSin cerrar, da error al final del archivo
}2Cierra un grupo o argumento! Too many }'s.
$3Abre y cierra el modo matemáticoSin pareja, da ! Missing $ inserted.
&4Separador de columnas en tablas y alineaciones! Misplaced alignment tab character &.
#6Número de argumento en una definición de macro (#1, #2, …)! You can't usein horizontal mode.
^7Superíndice en modo matemáticoEn el texto da ! Missing $ inserted.
_8Subíndice en modo matemáticoEn el texto da ! Missing $ inserted.
~13Carácter activo; espacio indivisibleSin error; se convierte en un espacio indivisible
%14Comentario; se ignora el resto de la líneaSin error; el resto de la línea desaparece en silencio

Imprimirlos literalmente: siete solo necesitan escaparse

Siete de los diez son fáciles: basta una barra invertida delante —\#, \$, \%, \&, \_, \{, \}—. Escriba \$1.23 y obtendrá $1.23. La barra señala «el carácter siguiente es él mismo, no el comienzo de un comando». La mecánica también es sencilla: dentro del núcleo, \%, \& y \# están escritos como \chardef, una definición que no dice más que «imprime el carácter de esta posición». Solo \$, \{ y \} comprueban si están en modo matemático y se adaptan, y por eso la misma grafía sirve también dentro de una fórmula.

Se tecleaSe obtieneNotas
\##Una sola barra invertida delante
\$$Funciona también en modo matemático
\%%Para porcentajes, como 50\%
\&&Para el ampersand en nombres de empresas y títulos
\__En la codificación por defecto se dibuja con un filete, no con un glifo
\{{Funciona también en modo matemático
\}}Funciona también en modo matemático
\textasciitilde~\~{} hace lo mismo; un \~ suelto es un comando de acento
\textasciicircum^\^{} hace lo mismo; un \^ suelto es un comando de acento
\textbackslash\\\ es el comando de salto de línea y no imprime nada

Los tres difíciles: tilde, circunflejo y barra invertida

Solo ~, ^ y \ necesitan algo más que escaparse, y la razón es sencilla: la forma escapada ya significa otra cosa. \~ y \^ son comandos de acento que colocan una tilde o un circunflejo sobre la letra siguiente: \~n da ñ y \^o da ô. Cuando se quiere la marca sola, se le da al acento un argumento vacío para que no tenga sobre qué posarse: \~{} y \^{}. De hecho, las definiciones por defecto del núcleo para \textasciitilde y \textasciicircum son literalmente esas dos. Las formas con nombre dejan más clara la intención, así que en el manuscrito conviene \textasciitilde{} y \textasciicircum{}.

Para la barra invertida misma se usa \textbackslash. No use \\: no son dos barras, sino el comando de salto de línea, y no imprime nada. Lo curioso es que la fuente de texto por defecto no contiene barra invertida alguna. El núcleo declara que \textbackslash debe tomarse de la codificación de símbolos matemáticos y, en efecto, un PDF de una página cuyo único contenido es \textbackslash incrusta CMSY10, la fuente de símbolos matemáticos. Por la misma razón, el \_ por defecto no es un carácter sino un filete fino dibujado a mano: una página que solo contiene \_ no incrusta ninguna fuente. Añada \usepackage[T1]{fontenc} y ambos pasan a ser glifos propios de la fuente de texto. De paso: <, > y | no son caracteres reservados y, aun así, en la codificación por defecto salen como ¡ ¿ — . fontenc también lo arregla.

latex
\usepackage[T1]{fontenc}   % real glyphs for \, _, < > |

100\% \& \$5 cost \#1

A Windows path: C:\textbackslash Users\textbackslash doc

Standalone marks: \textasciitilde{} and \textasciicircum{}

Poner acentos

El TeX de los primeros tiempos solo leía ASCII de 7 bits. Para obtener é había que ordenarle que colocara un acento agudo sobre una e, y esas órdenes siguen ahí. El patrón es comando de acento más letra: \'e da é, \"o da ö, \^e da ê, \~n da ñ, \c{c} da ç, \v{s} da š, \r{a} da å. Merece mención una trampa: al acentuar la i o la j el punto estorba, así que se usan las versiones sin punto \i y \j y se escribe \'{\i}.

ComandoEjemploNombre
\'éAcento agudo
\`èAcento grave
\^êCircunflejo
\"öDiéresis
\~ñTilde (virgulilla)
\=ōMacrón
\.żPunto suscrito arriba
\uğBreve
\všCarón (háček)
\HőDoble acento agudo
\cçCedilla
\råAnillo encima
\dPunto debajo
\bBarra debajo
\to͡oLigadura sobre dos letras

Algunas letras no pueden construirse con un acento. La eszett alemana \ss (ß), las nórdicas \aa (å) y \o (ø), la polaca \l (ł) y las ligaduras \ae (æ) y \oe (œ) son letras por derecho propio y tienen comandos propios. Las mayúsculas salen de escribir el nombre en mayúsculas: \AA, \O, \L, \AE, \OE. Todo esto es LaTeX estándar y no requiere ningún paquete adicional.

Escribir directamente en UTF-8

En el LaTeX actual, café, Grüße y naïve se pueden teclear sin más. Desde la versión de abril de 2018 —LaTeX News 28 incluye la sección «UTF-8: the new default input encoding»—, UTF-8 es la codificación de entrada por defecto del núcleo, así que \usepackage[utf8]{inputenc} ya no hace falta (no estorba, y los documentos antiguos siguen compilando). Aun así, \usepackage[T1]{fontenc} merece la pena: cambia el lado de la salida a una codificación de fuente de 8 bits, de modo que las palabras acentuadas se dividen bien y el texto copiado del PDF vuelve intacto. Con XeLaTeX y LuaLaTeX todo es más sencillo todavía: se elige una fuente OpenType con fontspec y entrada y salida son Unicode desde el principio.

latex
% pdfLaTeX: UTF-8 input is the default; T1 fixes output and hyphenation
\usepackage[T1]{fontenc}

café, Gr\"u\ss e, na\"{\i}ve, \AA ngstr\"om, \oe uvre, a\~no

% XeLaTeX / LuaLaTeX: Unicode all the way through
% \usepackage{fontspec}
% \setmainfont{TeX Gyre Pagella}

Cuando hay muchos especiales: \verb y \url

Escapar un fragmento cargado de símbolos carácter a carácter es laborioso, y la probabilidad de olvidar uno sube deprisa. Para eso está el mecanismo verbatim. En línea se escribe \verb|...|, cercando el texto con cualquier carácter que no aparezca dentro (aquí |); dentro del cerco todos los caracteres reservados pierden su significado especial y el texto se compone en tipografía monoespaciada. Para varias líneas, el entorno verbatim. Una restricción: \verb no puede ir dentro de un argumento —\section{... \verb|x| ...} da ! LaTeX Error: \verb illegal in argument.—. Para cadenas propensas a contener ~, #, % o _ —las URL sobre todo— la mejor respuesta es \url{...} del paquete url o hyperref: gestiona automáticamente los caracteres reservados que contiene, los compone en monoespaciada y parte las direcciones largas por lugares razonables.

latex
\usepackage{hyperref}   % provides \url as well

Use \verb|a_b^c & d%| to show specials literally.

\begin{verbatim}
foo_bar = 100% & #1   % every character printed as-is
\end{verbatim}

See \url{https://example.com/path?id=1#sec_2~ok}

Cuando los datos pegados rompen una tabla

En un manuscrito real, los caracteres especiales rara vez entran porque uno los teclee: llegan pegados desde un CSV, una página web, un correo, un PDF. Donde más duele es en las tablas. Como & separa columnas, un solo ampersand desnudo en el nombre de una empresa o en el título de un artículo descuadra el número de columnas y produce ! Misplaced alignment tab character &. o se traga en silencio la segunda mitad de la fila. La defensa más rápida es clasificar el material entrante en tres tipos antes de pegarlo: texto que se leerá como prosa, código que se mostrará tal cual y URL que se procesarán como enlaces. Hecha la clasificación, la estrategia de escapado se elige sola.

latex
% before pasting into a table, search the pasted region for & % _ #
\begin{tabular}{ll}
  Smith \& Wesson & company name \\
  95\%            & reported rate \\
\end{tabular}

% do not escape URLs by hand; hand them to \url
\url{https://example.com/report?id=95#table_1}

En resumen, la decisión tiene unos tres pasos. Uno o dos símbolos dentro de la prosa: escápelos como indica la tabla. Un bloque de código o salida de terminal: entrégueselo a \verb o verbatim. Una URL: déjesela a \url{}. Después, cuando aparezcan los síntomas —una tabla desplazada una columna, la segunda mitad de una fila desaparecida, un repentino ! Missing $ inserted.— busque solo en la región pegada y clasifique cada &, %, _ y # como «prosa» o «sintaxis de LaTeX». Ahí está casi siempre la causa.