Algoritmos (algorithm2e/algpseudocode)

Hay más de una forma de poner código en una página. verbatim reproduce lo escrito; listings y minted muestran código fuente real con color y números de línea; y una tercera vía muestra un procedimiento independiente del lenguaje en una caja numerada “Algorithm 1”: pseudocódigo. A diferencia del código real, el pseudocódigo se compone como un *flotante*: se desplaza por la página como una figura o tabla y lleva leyenda, número consecutivo, referencias cruzadas y lista de algoritmos. Esta página se centra en presentar ese pseudocódigo como un *objeto listado*, sobre todo en leyendas y numeración. El tratamiento completo comando por comando está en /learn/math/algorithms; aquí damos el mapa de los dos ecosistemas y un ejemplo mínimo de cada uno.

El pseudocódigo se compone como flotante

Mientras verbatim y listings colocan el código en el flujo del texto, el pseudocódigo se presenta normalmente dentro de un flotante. Un flotante es una caja, como figure o table, que LaTeX posiciona automáticamente evitando cortes de página incómodos. Esto aporta dos ventajas. Primero, una leyenda numerada “Algorithm 1” que puedes referenciar desde el texto con \ref. Segundo, un algoritmo largo no se parte torpemente en un salto de página: el entorno interno puede partirse si se coloca en línea, pero la caja flotante permanece completa y se mueve a la página siguiente como unidad.

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í. Pero esa división solo se aplica a uno de los dos campos. En la práctica hay dos opciones amplias.

  • Dos capas: algorithm (contenedor) + algpseudocode (contenido). El flotante algorithm proporciona la caja flotante, la leyenda y el número; algpseudocode (el diseño estándar de algorithmicx) proporciona el cuerpo del pseudocódigo: \State, \For, \If y similares.
  • Un paquete: algorithm2e. Autónomo: trae su propio flotante, leyenda y comandos de cuerpo (\KwIn/\KwOut, \eIf, …). No añadas algorithm (cargar ambos choca en el nombre del entorno flotante).

La regla más importante, desde el principio: elige un campo para todo el documento. algpseudocode y algorithm2e difieren por completo en sintaxis y filosofía, y cargarlos juntos choca en comandos compartidos como \For y \If. Elijas lo que elijas, compila el documento dos veces como de costumbre para fijar números, referencias cruzadas y lista de algoritmos.

Leyendas, números, referencias y lista de algoritmos

La presentación es el foco de esta página. En cualquiera de los dos campos, \caption{…} produce un encabezado “Algorithm N”, con N numerado automáticamente según el orden de aparición. Si colocas \label{key} justo después, el texto puede recuperar ese número con \ref{key} (o la página con \pageref{key}), exactamente igual que con una figura o tabla.

Otro beneficio de un flotante numerado es la lista de algoritmos. Junto a \listoffigures y \listoftables, escribir \listofalgorithms genera una lista similar a un índice que recoge el número y la leyenda de cada algoritmo. Allí aparece el texto dado a \caption, y funciona igual con el flotante algorithm que con algorithm2e. Ten en cuenta que algorithm2e también ofrece macros de solo título distintas de \caption; esas no añaden entradas a la lista de algoritmos.

La posición de la leyenda cambia según la convención. Con el flotante algorithm, puedes colocar \caption antes o después del cuerpo, como en una figura (muchos la ponen arriba). Con algorithm2e, lo habitual es poner \caption al final del entorno, y esa leyenda también actúa como nombre de referencia en la lista de algoritmos.

Campo 1: algorithm + algpseudocode

Envuelve el exterior en un flotante algorithm y escribe el pseudocódigo en el entorno interno algorithmic (el paquete se llama algpseudocode, pero el entorno se llama algorithmic). Todos los comandos del cuerpo van con mayúscula inicial (\State, \While, …), lo que los distingue del antiguo algorithmic en mayúsculas (\STATE). Los comandos más usados son:

  • \State — comienzo de una instrucción (línea); uno por instrucción.
  • \For{…}\EndFor / \While{…}\EndWhile — bucles.
  • \If{…}\ElsIf{…}\Else\EndIf — ramas.
  • \Function{name}{args}\EndFunction, más \Return — funciones y valores de retorno.
  • \Require / \Ensure — precondiciones y postcondiciones (con etiqueta en negrita).
  • \Comment{…} — comentario al final de línea.

El argumento opcional [1] controla la numeración de líneas: 1 numera todas, n numera cada n líneas, y omitirlo no numera. Este es un ejemplo mínimo que calcula la potencia y = xⁿ; observa el \label justo después de \caption.

document.tex
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}

\listofalgorithms

\begin{algorithm}
  \caption{Calculate $y = x^n$}\label{alg:power}
  \begin{algorithmic}[1]
    \Require $n \geq 0$
    \State $y \gets 1$
    \While{$n \neq 0$}
      \State $y \gets y \times x$
      \State $n \gets n - 1$ \Comment{count down}
    \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, encabezada por “Algorithm 1 Calculate y = xⁿ” (el número es automático). Cada línea se numera 1, 2, 3 … en el margen izquierdo, y \ref{alg:power} en el texto se resuelve a ese número (aquí 1). El \listofalgorithms del comienzo produce una entrada como “1 Calculate y = xⁿ … page”. Para la salida de cada comando, incluidos \ElsIf y \Function, consulta /learn/math/algorithms.

Campo 2: algorithm2e

algorithm2e es un ecosistema aparte, autónomo en un solo paquete (versión actual 5.2, 2017). Cárgalo con \usepackage[…]{algorithm2e} antes de \begin{document}; su entorno algorithm es el propio flotante. El aspecto se elige con opciones de carga: ruled (reglas arriba y abajo), boxed (caja alrededor de todo), vlined/lined (líneas verticales en bloques), plain (por defecto, sin decoración); linesnumbered añade números de línea. Tres puntos de sintaxis importan:

  • Entrada/salida usan comandos dedicados \KwIn{…}/\KwOut{…} (o \KwData{…}/\KwResult{…}), compuestos como “Input:”, “Output:” y similares en negrita.
  • Ramas y bucles toman su cuerpo como argumento entre llaves. Un if–then–else es \eIf{cond}{then}{else}; los bucles son \For{…}{body} y \While{…}{body} (con \KwTo para “to”).
  • Cada instrucción termina con \\; (barra invertida y punto y coma). Si lo olvidas, la instrucción siguiente continúa en la misma línea. Para ocultar el “;” en la salida, usa \DontPrintSemicolon.
document.tex
\documentclass{article}
\usepackage[ruled,linesnumbered]{algorithm2e}
\begin{document}

\listofalgorithms

\begin{algorithm}
  \caption{Sum of positive entries}\label{alg:sum}
  \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}

アルゴリズム~\ref{alg:sum} は正の要素を合計する。

\end{document}

La opción ruled dibuja reglas arriba y abajo con una línea de leyenda arriba, y linesnumbered numera cada línea. 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 ifthen encima del bloque falso else. En cada \; hay un salto de línea, y la última línea dice return s. El texto de \caption aparece tal cual en \listofalgorithms. Para control más fino, [H] para fijarlo en el sitio, \SetAlgoLined para dibujar líneas verticales de bloque y demás, consulta /learn/math/algorithms.

Cuál usar

Ambos se usan mucho; es una cuestión de estilo, no de que uno sea mejor. Usa la guía rápida siguiente para acotar la elección.

Aspectoalgorithm + algpseudocodealgorithm2e
構成Dos capas, dos paquetesUn paquete autónomo
本体の書き方Comandos simples guiados por \StateCuerpo de bloque pasado entre llaves
入出力\Require / \Ensure\KwIn / \KwOut (explícito)
行末No requerido\\; requerido
向く人Aspecto tradicional; plantillas que lo asumenE/S explícita, líneas verticales, palabras clave multilingües

En ambos casos, la presentación es la misma: \caption da un encabezado numerado, \label/\ref lo referencian, y \listofalgorithms construye la lista. De nuevo: elige un solo paquete de cuerpo; si usas algorithm2e, no cargues el contenedor algorithm. La referencia exhaustiva de comandos y ejemplos más largos está en /learn/math/algorithms. Si quieres código fuente real con color y números de línea, no pseudocódigo, usa listings/minted en /learn/code-verbatim/code-listings.