Cuando TeX lee tu fuente, ¿por qué \ inicia una orden y { abre un grupo? La respuesta es el código de categoría (catcode): un número asignado a cada carácter de entrada que dice al tokenizador qué papel cumple. El mismo mecanismo explica el misterioso @ que aparece en comandos internos de LaTeX, y por qué debes envolver su uso en \makeatletter … \makeatother cuando los usas en el preámbulo. Esta página cubre ambas cosas.
Qué son los códigos de categoría
El procesamiento de TeX comienza con la tokenización: convertir un flujo de caracteres en un flujo de tokens. Al leer cada carácter, TeX consulta su código de categoría (catcode), un número de 0 a 15 que determina su papel tipográfico. Por ejemplo, \ tiene catcode 0 (escape, inicio de orden), { catcode 1 (inicio de grupo) y $ catcode 3 (cambio a matemáticas). La idea clave es que el papel lo decide el catcode, no el carácter en sí. $ entra en modo matemático no “por ser un dólar”, sino por tener catcode 3.
La tabla muestra los códigos de categoría por defecto. En el uso diario notarás sobre todo 0 (inicia órdenes), 1/2 (agrupación), 3 (matemáticas), 4 (separador de columnas), 5 (fin de línea que forma párrafos), 6 (marcador de argumento), 7/8 (superíndice y subíndice), las categorías de texto 10/11/12, y 14 (comentarios).
| catcode | Papel | Carácter por defecto |
|---|---|---|
0 | Escape (inicia una orden) | Barra invertida \ |
1 | Inicio de grupo | Llave izquierda { |
2 | Fin de grupo | Llave derecha } |
3 | Cambio a matemáticas | Signo dólar $ |
4 | Tabulación de alineación | Ampersand & |
5 | Fin de línea | Retorno / salto de línea |
6 | Parámetro (argumento de macro) | Almohadilla # |
7 | Superíndice | Acento circunflejo ^ |
8 | Subíndice | Guion bajo _ |
9 | Carácter ignorado | Carácter nulo |
10 | Espacio | Espacio y tabulador |
11 | Letra (forma nombres de comandos) | a–z, A–Z |
12 | Otro | Dígitos, puntuación y todo lo demás |
13 | Carácter activo (actúa como orden) | Tilde ~ |
14 | Comentario | Porcentaje % |
15 | Carácter inválido | Carácter delete |
Catcode 11 (letra) y nombres de comandos
Entre las categorías, 11 (letra) es especial porque está conectada directamente con el funcionamiento de las órdenes. Una palabra de control de TeX, una orden con nombre como \section, se reconoce como un carácter de catcode 0, normalmente \, seguido de una secuencia de caracteres de catcode 11. En otras palabras, solo los caracteres de catcode 11 pueden formar normalmente el nombre de una orden. \section termina en section porque el siguiente carácter, un espacio o {, no es catcode 11. Las consecuencias para el usuario —el espacio tras una palabra de control desaparece, \LaTeXlogo se lee como otra orden— se trataron en la página de sintaxis; aquí miramos la maquinaria catcode.
También importa que los dígitos y la puntuación tengan catcode 12 (otro). Como solo las letras pueden ser parte de un nombre de comando, \a2 se lee como la orden \a seguida del carácter 2. Dicho al revés: si cambias el catcode de un carácter a 11, ese carácter puede usarse dentro de nombres de comandos. Ese movimiento es la clave de la historia de @.
Cambiar categorías con \catcode
La correspondencia entre caracteres y categorías no es fija: la primitiva \catcode puede reescribirla. La sintaxis es ` \catcode⟨char⟩=⟨number⟩ `: una comilla invertida ` seguida del carácter objetivo, luego = y el nuevo catcode. Por ejemplo, \catcode@=11 ` dice: “a partir de aquí, trata @` como una letra (catcode 11)”.
% catcode を直接いじる(上級・壊れやすい)/ Touching catcodes directly (advanced, fragile)
\catcode`@=11 % @ を英字に / make @ a letter
\catcode`@=12 % @ を「その他」に戻す / put @ back to “other”Es potente pero frágil, y usarlo en crudo es cosa de usuarios avanzados. Reescribir una categoría cambia cómo se interpreta todo lo que sigue; olvidar restaurarla rompe cosas inesperadas. Pero el mismo mecanismo sostiene funciones familiares: \verb y el entorno verbatim pueden imprimir fuente literalmente porque internamente bajan temporalmente a 12 (otro) los catcodes de caracteres especiales (\, {, $, etc.), para que no se lean como comandos o agrupación. \makeatletter, en la sección siguiente, se entiende como una envoltura segura y con nombre para exactamente ese movimiento de \catcode.
\makeatletter y \makeatother
Muchas órdenes internas del núcleo LaTeX y de paquetes llevan @ en el nombre: \@startsection, que monta títulos de sección; \@ifnextchar, que mira el siguiente token para ramificar; \p@, la longitud 0pt; etc. Pueden definirse y usarse dentro de archivos .sty/.cls sin problemas porque allí @ tiene catcode 11 (letra) y cuenta como parte del nombre. De hecho, mientras \usepackage y \documentclass leen un paquete o clase, cambian @ a catcode 11.
En el cuerpo ordinario de un documento, sin embargo, @ tiene catcode 12 (otro). Así que si escribes \p@ directamente en el texto o preámbulo, TeX lo lee como la orden \p seguida del carácter @, y nunca llega a la orden interna pretendida. La declaración \makeatletter convierte @ de nuevo en letra solo en el tramo donde usas o redefinces comandos internos; su pareja \makeatother restaura el catcode 12. Como dicen los nombres, “make @ a letter” y “make @ other”; internamente son exactamente ` \catcode@=11 ` y \catcode@=12 ``.
¿Por qué existe esta convención? Para separar los comandos internos de los usuarios ordinarios. Con @ como catcode 12 por defecto, alguien que solo escribe un documento no puede sobrescribir por accidente un nombre como \@startsection. Un nombre con @ señala “uso interno”, y para tocarlo hay que “abrir la puerta” explícitamente con \makeatletter.
Ejemplo y trampas
El uso típico es ajustar ligeramente en el preámbulo un comando interno definido por tu clase o paquete. En el ejemplo, la macro interna \@maketitle, que controla la disposición del bloque de título, se redefine dentro de \makeatletter … \makeatother. Solo dentro de esa envoltura @ es letra, así que \@maketitle se reconoce correctamente como un solo comando.
\documentclass{article}
\makeatletter
% 内部命令 \@maketitle を再定義する / redefine the internal \@maketitle
\renewcommand{\@maketitle}{%
\begin{center}
{\LARGE\bfseries \@title}\par
\vspace{1ex}{\large \@author}\par
\end{center}%
}
\makeatother
\title{カテゴリコード入門}
\author{名前}
\begin{document}
\maketitle
\end{document}La mayor trampa es olvidar \makeatother. Si lo dejas fuera, @ sigue siendo letra en lo que venga después, rompiendo texto posterior que contenga @, como una dirección de correo, o el comportamiento de paquetes que tratan @ de forma especial. Siempre que abras con \makeatletter, cierra con \makeatother; trátalos como una pareja inseparable.
Otro malentendido es escribir \makeatletter dentro de un archivo .sty/.cls. Como se dijo, mientras se lee un paquete o clase, @ ya es catcode 11, así que ahí no hace falta; un \makeatother sobrante incluso puede perturbar procesamiento posterior. \makeatletter … \makeatother se usa dentro de un documento .tex, normalmente en el preámbulo, cuando se tocan comandos internos. Si puedes evitar tocar internals, redefiniendo una orden pública con \renewcommand o usando un paquete apropiado, es más seguro. La autoría seria de macros y paquetes se trata en otra página.