Escribir algoritmos en LaTeX

Como parte de mi proyecto fin de carrera tengo que escribir un cierto número de algoritmos. Si no se hace del modo adecuado, crear el código LaTeX para mostrar pseudocódigo puede ser una tarea sumamente tediosa y exasperante. Para incluir código fuente, con coloreado de sintaxis y sus tabulaciones y todo, hay herramientas que generan el código necesario a partir de los archivos fuente, como por ejemplo Highlight que es el que yo uso. Sin embargo, el pseudocódigo hay que escribirlo a mano, teniendo en cuenta las tabulaciones, las palabras clave, etc. para que quede bien presentado y ordenado. Es deseable además contar con una numeración de algoritmos a lo largo del documento, tal y como se hace para las tablas o las imágenes, y también con la posibilidad de usar referencias cruzadas mediante \caption, \label y \ref.

Todo esto es muy sencillo de conseguir mediante el paquete algorithms. Hay un par de paquetes más que aportan más flexibilidad o entornos distintos según el lenguaje… pero para lo que yo hago me sobra con el algorithms. La pega que tiene es que el código que genera está en inglés y en el paquete babel no hay traducción, así que para escribir algoritmos en español es necesario redefinir los comandos. Es lo que he hecho en este archivo, spanishAlgorithmic.tex, que se puede bajar y guardar en el directorio donde estén nuestros ficheros .tex. Para poder usar todo basta con incluir en el preámbulo del documento lo siguiente:


\usepackage{algorithm}
\usepackage{algorithmic}
\input{spanishAlgorithmic} % mi archivo de traducción

Y bueno, a continuación unas pequeñas indicaciones de los comandos y opciones que aportan estos dos paquetes.

El entorno algorithmic


\begin{algorithmic}[numeracion_lineas]

\end{algorithmic}

Esto sería algo así como el tabular de toda la vida. Es un entorno para describir el algoritmo en sí, mediante comandos muy simples. Podemos activar opcionalmente la numeración de líneas, diciendo cada cuántas líneas queremos un número. Aquí tenéis un pequeño resumen que creo que es suficiente para escribir cualquier algoritmo no demasiado esotérico.

Comando ¿Para qué sirve?
\STATE <instruccion> El más simple. Se usa para las instrucciones en sí. Cualquier cosa que no sea un bucle, un if, un return… debe ir precedido de este comando.
\IF{<condicion>} <instrucciones> \ENDIF
\IF{<condicion>} <instrucciones1> \ELSE <instrucciones2> \ENDIF
\IF{<condicion1>} <instrucciones1> \ELSIF{<condicion2>} <instruccion2> \ELSE <instrucciones3> \ENDIF
Construcciones if-then-else. En el último caso se pueden usar todos los \ELSIF que se desee. Es obligatorio especificar las condiciones entre llaves.
\FOR{<condicion>} <instrucciones> \ENDFOR
\FORALL{<condicion>} <instrucciones> \ENDFOR
Bucles for. En la condición se puede poner cualquier cosa, teniendo en cuenta que lo que se genera es para y para todo. Por ejemplo: \FOR {$i=0$ hasta $10$}
\WHILE{<condicion>} <instrucciones> \ENDWHILE Bucle while. Bastante predecible, ¿no?
\REPEAT <instruccion> \UNTIL{<condicion>} Bucle repeat-until. Otra forma de expresar los bucles que se usa bastante en pseudocódigo.
\LOOP <instrucciones> \ENDLOOP Con esto escribimos bucles infinitos, es decir, es un repetir a secas.
\REQUIRE <instruccion>
\ENSURE <instruccion>
Precondición y postcondición. En realidad, yo uso estos dos comandos para especificar la entrada y la salida del algoritmo. Si echáis un ojo a mi archivo de traducción lo podréis ver. Cada uno puede poner lo que mejor se adapte a sus algoritmos.
\RETURN <instruccion>
\TRUE y \FALSE
\PRINT <instruccion>
\COMMENT{<comentario>}
Varias cosas útiles, como la instrucción de return, los valores true y false y un par de comandos para imprimir y poner comentarios.

La apariencia del algoritmo que se genera se puede cambiar un poco mediante el comando \algsetup{opciones}, que se pone antes del \begin{algorithmic}. Se puede cambiar la indentación (con indent=length), el tamaño de la numeración de las líneas (con lineosize=font_size) y el delimitador de dichos números de línea (con lineodelimiter=delimiter), que por defecto es ":".

El entorno algorithm


\begin{algorithm}[opciones]

\end{algorithm}

Si el anterior era como el entorno tabular, éste sería como el entorno table. Sirve para encapsular un algoritmo como un objeto, para permitir la numeración de éstos, el uso de \caption y la posibilidad de asignarles etiquetas (para posteriores referencias) y para poder hacer índices o listas de algoritmos automáticamente, mediante el comando \listofalgorithms

Hay que tener en cuenta que el objeto algorithm que contiene nuestro algoritmo se comporta como un objeto flotante, al igual que las imágenes o las tablas. Eso significa que no tiene por qué aparecer exactamente donde nosotros lo hemos escrito, en el documento final. Para intentar forzar a LaTeX a que lo coloque donde queremos, podemos usar las opciones h (here),b (bottom),t (top) y H (put this float HERE), después de \begin{algorithm}.

Además de poder usar etiquetas en los algoritmos, es posible usarlas también en las líneas. De este modo, si después del algoritmo incluimos la típica explicación de lo que hace y queremos hacer referencias a líneas concretas no lo tenemos que hacer a lo burro.

Dicen que un trozo de código vale más que mil palabras, así que aquí va un ejemplo de todo.


\begin{algorithm}
\begin{algorithmic}[1]
\REQUIRE Complejo simplicial $K=\{\sigma_1, \dots, \sigma_n \}$ no vacío. \label{lin:lineaRara}
\ENSURE \TRUE si $K$ es contráctil y \FALSE en caso contrario.
\WHILE {$K \neq \{ \langle v \rangle \}$}
\STATE Elegir un símplice $\sigma_i$ de $K$ que sea maximal y que contenga una cara libre $\delta\sigma_i$.
\IF{no hay ningún símplice de esas características}
\RETURN \FALSE
\ELSE
\STATE $K \leftarrow K \setminus \{\sigma_i, \delta\sigma_i\}$
\ENDIF
\ENDWHILE
\RETURN \TRUE
\end{algorithmic}
\caption{Contracción de caras libres maximales}\label{alg:algoritmoRaro}
\end{algorithm}
El algoritmo~\ref{alg:algoritmoRaro} es bastante raro, ¿qué diablos significa la línea~\ref{lin:lineaRara}?

Y el resultado queda así:

Ejemplo Algoritmo

Si no nos gusta el diseño con las líneas esas horizontales que pone por defecto, hay otros dos estilos que se pueden fijar cuando se incluye el paquete algorithm. El de las líneas, que se usa por defecto es ruled y los otros dos son plain y boxed. Es cuestión de probarlos.

16 respuestas a “Escribir algoritmos en LaTeX”

Gravatar

Uhmmmmm… me encanta no entender nada en absoluto. ¿Podrías explicar simplificadamente para qué sirve Latex, qué tiene de novedoso? Bueno, de hecho… ¿podrías explicar qué es latex?

Gravatar

Aquí otro que está LaTeX’eando para su proyecto. Es muy cómodo no tener que preocuparte de si el clip del Office te mueve el capítulo 3 dos líneas más abajo porque ese día se ha levantado un poco más animado o si aquella imagen ha desaparecido porque pulsaste enter donde no era.

En mi proyecto no tengo que incluir algoritmos de manera teórica, pero si algún día tuviera que hacerlo me acordaré de que aquí tengo una chuleta :)

Gravatar

Rosa, esta bueno tu idea de dar a conocer esto del LATEX, pero no sería que dejes un link donde podamos bajar tus ejemplos.
saludos
Hernan

Gravatar

Hola rosita:

Excelente tu tutorial pero sabes, el archivo para españolizar las palabras no está disponible y aunque he logrado cambiar todas las palabras que van dentro del pseudocódigo no consigo cambiar la palabra Algorithm..podrías compartir cual es el comando para cambiar esa palabra que está en inglés al español, gracia por tu ayuda

Gravatar

Hola Milton,

Siento que el archivo no estuviese disponible. En la última actualización de Wordpress pensé que no había roto nada del blog pero como ves, no fue así y me cargué el archivo ése. Ahora está de nuevo disponible.

En cuanto a traducir “Algorithm”, basta con incluir en el preámbulo:
\floatname{algorithm}{Algoritmo}

Espero que te sirva de ayuda :)

Gravatar

Necesito que en el formato IFAC, cuando se trabaja en español, aparezca referencia en Español, no en Inglés, no se cómo hacerlo.

Gravatar

¿Qué es el formato IFAC? ¿A qué te refieres con “referencia”?

Gravatar

chapó.
O no. Da igual.
Lo que quiero decir es: gracias.

Gravatar

Me fue muy útil. Está bien explicado y es fácil de entender.
gracias!!!

Gravatar

hola:
no tengo mucho que decir, solo GRACIAS.

Gravatar

Muy útil, práctico y sin mucha lata :). Gracias yo estoy haciendo mi tesis y necesitaba estructurar varios algoritmos.

Gravatar

Hola, me agradaría que alguien por favor me pueda ayudar a dibujar mapas de karnaugh en latex , circuitos lógicos, por favor.
Mi correo es suigeneris_188@hotmail.com, si alguien pudiera ayudarme gracias.

Gravatar

Sabes, te agradezco mucho he estado buscando información para esta clase de latex ni en la mismísima web del paquete encontré tanta documentación, muchas gracias.

Gravatar

Muchas gracias por el spanishAlgorithmic.tex :D

Gravatar

Hola,

Muchas gracias por el tutorial, en mi proyecto lo voy a dejar en inglés. Hay cosas que es mejor no traducir.

Un saludo,

Gravatar

Hola, no pues que padre Blog.
Efectivamente, estaba tratando de hacer un algoritmo, y no queria usar listings de latex.
Buscando y buscando y buscando, di con tu blog y me callo de pelos.
La traducción es perfecta, amo el español y se ve tan bonito en latex… le da tanto estilo… aaaa se tan bonito… tan perfecto, tan definido, aunq latex me ha dadi dolores de cabeza, sobre todoe n linux… en fin….,se que debo aprender ingles.
En fin. Veo que estudias el master en Lógica e IA, ooooooorale, pues yo estudio solamente la maestría en IA, no se si los masters de alla de Londres sean igual que las maestrías de México, pero pues aqui son Maestrías.

No acostumbro, al menos informalmente, poner cuidado a mis faltas ohrthografhikas asi que ruego me disculpes.

Un saludo… y… pásatela bien…

p.d.1 Entonces eres Fan de Prolog y Lisp???
p.d.2 Si es asi… q bien… y si no es asi… regrerese a p.d.1
p.d.3 Si paso 1 ves por p.d.1 entonces ha llegado al fin de mensaje

Deja tu comentario:

El e-mail nunca se mostrará ni te mandaré cosas raras.

XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>