El pseudocódigo enmarcado y numerado “Algorithm 1” que se ve en artículos y libros no es una función incorporada de LaTeX: viene de paquetes. El primer tropiezo es que existen varios paquetes con nombres parecidos. La clave es una división del trabajo: un paquete suministra el contenedor, una caja flotante numerada, y otro suministra el contenido, el pseudocódigo en sí. Esta página ordena ese panorama y luego cubre la pareja clásica, el flotante algorithm envolviendo un cuerpo algpseudocode, y su rival autónomo algorithm2e, con código que puedes compilar. Como aquí no hay renderizador en vivo, el texto describe qué produce cada uno.
Dos capas: contenedor y contenido
La composición de pseudocódigo se divide en dos capas con trabajos distintos. La primera es el contenedor: una caja que flota en la página como figure o table, con una leyenda “Algorithm 1”, número consecutivo, referencias cruzadas e incluso una lista de algoritmos si la quieres. La proporciona el paquete algorithm (\usepackage{algorithm}), que añade el entorno \begin{algorithm} … \end{algorithm}.
La segunda capa es el contenido: comandos como \State (una línea), \While (un bucle) y \If (una rama) componen el pseudocódigo en sí, con sangría y números de línea. Aquí se abren las opciones: el antiguo paquete algorithmic; su sucesor más personalizable algorithmicx (en la práctica se usa el diseño algpseudocode construido sobre él); y el ecosistema separado algorithm2e.
El punto crucial: para el cuerpo, elige exactamente un paquete. algpseudocode y algorithm2e difieren por completo en sintaxis y filosofía, y mezclarlos causa choques. El contenedor algorithm, en cambio, está pensado para emparejarse con algpseudocode; algorithm2e trae su propio contenedor y cuerpo, así que no necesita algorithm (y combinarlos no se recomienda). La tabla muestra el panorama.
| Paquete | Capa | Papel |
|---|---|---|
algorithm | Contenedor | Caja flotante + leyenda/número “Algorithm N”; se empareja con un paquete de cuerpo |
algorithmic | Cuerpo (antiguo) | El entorno original de pseudocódigo; comandos en mayúsculas (\STATE …); apenas personalizable |
algpseudocode | Cuerpo (moderno) | Diseño estándar de algorithmicx; parece algorithmic pero es mucho más flexible |
algorithm2e | Ambos | Autónomo e independiente; sintaxis propia (\KwIn, \eIf, final de línea \\;); usar solo |
Ten en cuenta que algorithm se distribuye en el bundle algorithms, que también contiene algorithmic. algorithmicx se distribuye aparte, pero al cargar algpseudocode se incorpora automáticamente, así que nunca necesitas hacer \usepackage de algorithmicx directamente.
Los comandos de algpseudocode
El pseudocódigo de algpseudocode se escribe dentro del entorno \begin{algorithmic} … \end{algorithmic}. Observa que el nombre del entorno difiere del nombre del paquete (algpseudocode): el entorno se llama simplemente algorithmic. El argumento opcional [1] controla la numeración de líneas: 0 para ninguna, 1 para todas, n para cada n líneas. Todos los comandos van con mayúscula inicial (\State, \While, …), la forma más fácil de distinguirlos del antiguo algorithmic en mayúsculas (\STATE, \WHILE).
El comando de base es \State, que marca el inicio de cada línea de pseudocódigo: pones un \State por instrucción, como una asignación o llamada de procedimiento. No pongas \State antes de un comando que abre bloque como \While o \If (estos empiezan una línea nueva por sí mismos). El contenido de un bloque se indenta automáticamente, y la sangría del código fuente no afecta a la salida. Los comandos principales son:
\State— comienzo de una instrucción (línea); se usa como\State $x \\gets 1$.\For{cond}…\EndFor— bucle for; la salida empieza con “for … do” y cierra con “end for”. También existe\ForAll{cond}.\While{cond}…\EndWhile— bucle while; “while … do” / “end while”.\If{cond}…\ElsIf{cond}…\Else…\EndIf— rama; “if … then”, “else if … then”, “else”, “end if”.\ElsIfy\Elseson opcionales.\Function{name}{args}…\EndFunction— función; “function name(args)” / “end function”. La forma de procedimiento\Procedure{name}{args}…\EndProceduretiene la misma forma.\Return— valor de retorno, compuesto como “return …” con palabra clave recta y en negrita.\Comment{...}— comentario al final de línea, colocado tras un triángulo hacia la derecha ▷.\Require/\Ensure— precondiciones y postcondiciones, cada una con una etiqueta en negrita “Require:” / “Ensure:” delante.
Estas palabras clave pueden reemplazarse. Si prefieres que las etiquetas digan “Input:” y “Output:” en lugar de “Require:” y “Ensure:”, redefínelas en el preámbulo: \renewcommand{\algorithmicrequire}{\textbf{Input:}} y \renewcommand{\algorithmicensure}{\textbf{Output:}}. Del mismo modo, reescribir \algorithmicwhile, \algorithmicdo y similares permite cambiar las palabras de bucles y ramas a voluntad.
Ejemplo completo: algorithm + algpseudocode
Al combinar las dos capas se obtiene esto: el exterior se envuelve en un flotante algorithm, se le da \caption{…} y \label{…} para referenciarlo, y el pseudocódigo se escribe en el entorno interno algorithmic. Este es el algoritmo clásico para calcular la potencia y = xⁿ.
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{Calculate $y = x^n$}\label{alg:power}
\begin{algorithmic}[1]
\Require $n \geq 0$
\Ensure $y = x^n$
\State $y \gets 1$
\State $X \gets x$
\State $N \gets n$
\While{$N \neq 0$}
\If{$N$ is even}
\State $X \gets X \times X$
\State $N \gets N / 2$ \Comment{even case}
\Else
\State $y \gets y \times X$
\State $N \gets N - 1$
\EndIf
\EndWhile
\State \Return $y$
\end{algorithmic}
\end{algorithm}
アルゴリズム~\ref{alg:power} は累乗を計算する。
\end{document}Al compilar, se coloca una caja con reglas arriba y abajo flotando en la página, con el encabezado “Algorithm 1 Calculate y = xⁿ” arriba (el número es automático). Dentro, cada línea se numera 1, 2, 3 … a la izquierda, y las dos primeras líneas muestran la precondición y el resultado tras “Require:” y “Ensure:” en negrita. La línea \While se compone con while en negrita y un do final, y su cuerpo se indenta un nivel. La nota \Comment queda al final de la línea tras un triángulo hacia la derecha, y la última línea dice return seguido de y. En el texto, \ref{alg:power} se resuelve al número de la caja (aquí 1), así que se lee “Algorithm 1 is…”.
Las matemáticas dentro del pseudocódigo ($N \\neq 0$, $y \\gets 1$) se envuelven en $…$ exactamente como en el modo matemático ordinario. \gets es una flecha hacia la izquierda (←), la notación convencional de asignación. Como siempre, compila dos veces un documento que usa algorithm para fijar números y referencias cruzadas.
El rival: algorithm2e
La otra opción importante es algorithm2e. Es un ecosistema aparte, autónomo en un solo paquete, con contenedor y contenido, que se carga con \usepackage[...]{algorithm2e} antes de \begin{document}. Su entorno algorithm es el propio flotante, así que no hay entorno interno que anidar. Su sintaxis también difiere mucho de algpseudocode.
Destacan dos diferencias. Primero, entrada y salida usan comandos dedicados \KwIn{…} y \KwOut{…} (o \KwData{…} y \KwResult{…}), compuestos como “Input:”, “Output:”, “Data:” o “Result:” en negrita. Segundo, ramas y bucles toman su cuerpo como argumento entre llaves. Un if–then–else se escribe \eIf{cond}{then part}{else part}, pasando el contenido del bloque en { } (la e significa “con else”). \For{cond}{body} y \While{cond}{body} funcionan igual.
Otra regla que vigilar: cada instrucción debe terminar con \\; (barra invertida y punto y coma). Si lo olvidas, la instrucción siguiente continúa en la misma línea. Este es un ejemplo breve.
\documentclass{article}
\usepackage[ruled,linesnumbered]{algorithm2e}
\begin{document}
\begin{algorithm}[H]
\caption{Sum of positive entries}
\KwIn{an array $a[1..n]$}
\KwOut{the sum $s$ of its positive entries}
$s \gets 0$\;
\For{$i \gets 1$ \KwTo $n$}{
\eIf{$a[i] > 0$}{
$s \gets s + a[i]$\;
}{
skip\;
}
}
\Return $s$\;
\end{algorithm}
\end{document}Aquí la opción ruled dibuja reglas arriba y abajo con una línea de leyenda arriba, y linesnumbered numera cada línea. [H] es un especificador de posición como en las figuras: fija el algoritmo en el sitio en lugar de dejarlo flotar (h, t, b, p también están disponibles). Observa que algorithm2e implementa [H] por sí mismo, así que no necesitas cargar el paquete float aparte (a diferencia del paquete antiguo algorithm, donde [H] requiere \usepackage{float}). La caja empieza con “Input:” y “Output:” en negrita; la línea \For se lee for i ← 1 to n do con el cuerpo indentado; y \eIf coloca el bloque verdadero if … then encima del bloque falso else. En cada \; hay salto de línea, y la última línea muestra return s.
Algunos comandos ajustan el aspecto. \SetAlgoLined (antes \SetLine) dibuja líneas verticales que marcan la estructura de bloques, y \DontPrintSemicolon evita que el \\; final aparezca en la salida. \KwTo compone “to” y \Return compone “return” como palabras clave incorporadas; también pueden redefinirse, por ejemplo al japonés. Los comentarios se insertan con \tcc{…} (forma /* … */) o \tcp{…} (forma //).
Cuál usar
Ambos se usan mucho; es una cuestión de estilo más que de superioridad. algorithm + algpseudocode ofrece un conjunto de comandos directo basado en \State, adecuado para quien prefiere el aspecto tradicional del pseudocódigo (palabras clave al inicio de la línea, envueltas con do, then, end …) o para plantillas de congresos que lo asumen. algorithm2e es popular entre quienes prefieren declaraciones explícitas de entrada/salida, bloques pasados entre llaves, diseño con líneas verticales, y mucho uso de palabras clave multilingües y personalización fina.
De nuevo: la regla práctica es quedarse con un solo paquete de cuerpo. Cargar a la vez algpseudocode y algorithm2e choca en nombres compartidos como \For y \If y da errores. Estandariza uno en todo el documento. Si usas algorithm2e, no necesitas el contenedor algorithm: algorithm2e define su propio entorno algorithm, así que cargar ambos colisiona en el nombre del entorno.