Escribir algoritmos en LaTeX

Como parte de mi pro­yecto fin de carrera tengo que escri­bir un cierto número de algo­rit­mos. Si no se hace del modo ade­cuado, crear el código LaTeX para mos­trar pseu­do­có­digo puede ser una tarea suma­mente tediosa y exas­pe­rante. Para incluir código fuente, con colo­reado de sin­ta­xis y sus tabu­la­cio­nes y todo, hay herra­mien­tas que gene­ran el código nece­sa­rio a par­tir de los archi­vos fuente, como por ejem­plo High­light que es el que yo uso. Sin embargo, el pseu­do­có­digo hay que escri­birlo a mano, teniendo en cuenta las tabu­la­cio­nes, las pala­bras clave, etc. para que quede bien pre­sen­tado y orde­nado. Es desea­ble ade­más con­tar con una nume­ra­ción de algo­rit­mos a lo largo del docu­mento, tal y como se hace para las tablas o las imá­ge­nes, y tam­bién con la posi­bi­li­dad de usar refe­ren­cias cru­za­das mediante \caption, \label y \ref.

Todo esto es muy sen­ci­llo de con­se­guir mediante el paquete algo­rithms. Hay un par de paque­tes más que apor­tan más fle­xi­bi­li­dad o entor­nos dis­tin­tos según el len­guaje… pero para lo que yo hago me sobra con el algo­rithms. La pega que tiene es que el código que genera está en inglés y en el paquete babel no hay tra­duc­ción, así que para escri­bir algo­rit­mos en espa­ñol es nece­sa­rio rede­fi­nir los coman­dos. Es lo que he hecho en este archivo, spanishAlgorithmic.tex, que se puede bajar y guar­dar en el direc­to­rio donde estén nues­tros fiche­ros .tex. Para poder usar todo basta con incluir en el preám­bulo del docu­mento lo siguiente:

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

Y bueno, a con­ti­nua­ción unas peque­ñas indi­ca­cio­nes de los coman­dos y opcio­nes que apor­tan 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 des­cri­bir el algo­ritmo en sí, mediante coman­dos muy sim­ples. Pode­mos acti­var opcio­nal­mente la nume­ra­ción de líneas, diciendo cada cuán­tas líneas que­re­mos un número. Aquí tenéis un pequeño resu­men que creo que es sufi­ciente para escri­bir cual­quier algo­ritmo no dema­siado esotérico.

Comando ¿Para qué sirve?
\STATE <instruccion> El más sim­ple. Se usa para las ins­truc­cio­nes en sí. Cual­quier cosa que no sea un bucle, un if, un return… debe ir pre­ce­dido de este comando.
\IF{<condicion>} <instrucciones> \ENDIF
\IF{<condicion>} <instrucciones1> \ELSE <instrucciones2> \ENDIF
\IF{<condicion1>} <instrucciones1> \ELSIF{<condicion2>} <instruccion2> \ELSE <instrucciones3> \ENDIF
Cons­truc­cio­nes if-then-else. En el último caso se pue­den usar todos los \ELSIF que se desee. Es obli­ga­to­rio espe­ci­fi­car las con­di­cio­nes entre llaves.
\FOR{<condicion>} <instrucciones> \ENDFOR
\FORALL{<condicion>} <instrucciones> \ENDFOR
Bucles for. En la con­di­ción se puede poner cual­quier cosa, teniendo en cuenta que lo que se genera es para y para todo. Por ejem­plo: \FOR {$i=0$ hasta $10$}
\WHILE{<condicion>} <instrucciones> \ENDWHILE Bucle while. Bas­tante pre­de­ci­ble, ¿no?
\REPEAT <instruccion> \UNTIL{<condicion>} Bucle repeat-until. Otra forma de expre­sar los bucles que se usa bas­tante en pseudocódigo.
\LOOP <instrucciones> \ENDLOOP Con esto escri­bi­mos bucles infi­ni­tos, es decir, es un repe­tir a secas.
\REQUIRE <instruccion>
\ENSURE <instruccion>
Pre­con­di­ción y post­con­di­ción. En reali­dad, yo uso estos dos coman­dos para espe­ci­fi­car la entrada y la salida del algo­ritmo. Si echáis un ojo a mi archivo de tra­duc­ció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 úti­les, como la ins­truc­ción de return, los valo­res true y false y un par de coman­dos para impri­mir y poner comentarios.

La apa­rien­cia del algo­ritmo que se genera se puede cam­biar un poco mediante el comando \algsetup{opciones}, que se pone antes del \begin{algorithmic}. Se puede cam­biar la inden­ta­ción (con indent=length), el tamaño de la nume­ra­ción de las líneas (con lineosize=font_size) y el deli­mi­ta­dor de dichos núme­ros de línea (con lineodelimiter=delimiter), que por defecto es “:”.

El entorno algorithm

\begin{algorithm}[opciones]
...
\end{algorithm}

Si el ante­rior era como el entorno tabular, éste sería como el entorno table. Sirve para encap­su­lar un algo­ritmo como un objeto, para per­mi­tir la nume­ra­ción de éstos, el uso de \caption y la posi­bi­li­dad de asig­nar­les eti­que­tas (para pos­te­rio­res refe­ren­cias) y para poder hacer índi­ces o lis­tas de algo­rit­mos auto­má­ti­ca­mente, mediante el comando \listofalgorithms

Hay que tener en cuenta que el objeto algo­rithm que con­tiene nues­tro algo­ritmo se com­porta como un objeto flo­tante, al igual que las imá­ge­nes o las tablas. Eso sig­ni­fica que no tiene por qué apa­re­cer exac­ta­mente donde noso­tros lo hemos escrito, en el docu­mento final. Para inten­tar for­zar a LaTeX a que lo colo­que donde que­re­mos, pode­mos usar las opcio­nes h (here),b (bot­tom),t (top) y H (put this float HERE), des­pués de \begin{algorithm}.

Ade­más de poder usar eti­que­tas en los algo­rit­mos, es posi­ble usar­las tam­bién en las líneas. De este modo, si des­pués del algo­ritmo inclui­mos la típica expli­ca­ción de lo que hace y que­re­mos hacer refe­ren­cias a líneas con­cre­tas no lo tene­mos que hacer a lo burro.

Dicen que un trozo de código vale más que mil pala­bras, así que aquí va un ejem­plo 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 resul­tado queda así:

Ejemplo Algoritmo

Si no nos gusta el diseño con las líneas esas hori­zon­ta­les que pone por defecto, hay otros dos esti­los que se pue­den fijar cuando se incluye el paquete algo­rithm. El de las líneas, que se usa por defecto es ruled y los otros dos son plain y boxed. Es cues­tión de probarlos.

52 comentarios en Escribir algoritmos en LaTeX

  1. Paula dice:

    Uhmmmmm… me encanta no enten­der nada en abso­luto. ¿Podrías expli­car sim­pli­fi­ca­da­mente para qué sirve Latex, qué tiene de nove­doso? Bueno, de hecho… ¿podrías expli­car qué es latex?

  2. adobo dice:

    Aquí otro que está LaTeX’eando para su pro­yecto. Es muy cómodo no tener que preo­cu­parte de si el clip del Office te mueve el capí­tulo 3 dos líneas más abajo por­que ese día se ha levan­tado un poco más ani­mado o si aque­lla ima­gen ha des­a­pa­re­cido por­que pul­saste enter donde no era.

    En mi pro­yecto no tengo que incluir algo­rit­mos de manera teó­rica, pero si algún día tuviera que hacerlo me acor­daré de que aquí tengo una chuleta :)

  3. Hernan dice:

    Rosa, esta bueno tu idea de dar a cono­cer esto del LATEX, pero no sería que dejes un link donde poda­mos bajar tus ejem­plos.
    salu­dos
    Hernan

  4. Milton Inostroza Aguilera dice:

    Hola rosita:

    Exce­lente tu tuto­rial pero sabes, el archivo para espa­ño­li­zar las pala­bras no está dis­po­ni­ble y aun­que he logrado cam­biar todas las pala­bras que van den­tro del pseu­do­có­digo no con­sigo cam­biar la pala­bra Algorithm..podrías com­par­tir cual es el comando para cam­biar esa pala­bra que está en inglés al espa­ñol, gra­cia por tu ayuda

  5. Rosa dice:

    Hola Mil­ton,

    Siento que el archivo no estu­viese dis­po­ni­ble. En la última actua­li­za­ción de Word­Press pensé que no había roto nada del blog pero como ves, no fue así y me car­gué el archivo ése. Ahora está de nuevo disponible.

    En cuanto a tra­du­cir “Algo­rithm”, basta con incluir en el preám­bulo:
    \floatname{algorithm}{Algoritmo}

    Espero que te sirva de ayuda :)

  6. Rafael Mira dice:

    Nece­sito que en el for­mato IFAC, cuando se tra­baja en espa­ñol, apa­rezca refe­ren­cia en Espa­ñol, no en Inglés, no se cómo hacerlo.

  7. Rosa dice:

    ¿Qué es el for­mato IFAC? ¿A qué te refie­res con “referencia”?

  8. pablo dice:

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

  9. Marlene dice:

    Me fue muy útil. Está bien expli­cado y es fácil de enten­der.
    gracias!!!

  10. rigo dice:

    hola:
    no tengo mucho que decir, solo GRACIAS.

  11. Johanna dice:

    Muy útil, prác­tico y sin mucha lata :). Gra­cias yo estoy haciendo mi tesis y nece­si­taba estruc­tu­rar varios algoritmos.

  12. Bruno Menis dice:

    Hola, me agra­da­ría que alguien por favor me pueda ayu­dar a dibu­jar mapas de kar­naugh en latex , cir­cui­tos lógi­cos, por favor.
    Mi correo es suigeneris_188@hotmail.com, si alguien pudiera ayu­darme gracias.

  13. dobled dice:

    Sabes, te agra­dezco mucho he estado bus­cando infor­ma­ción para esta clase de latex ni en la mis­mí­sima web del paquete encon­tré tanta docu­men­ta­ción, muchas gracias.

  14. piponazo dice:

    Muchas gra­cias por el spanishAlgorithmic.tex :D

  15. Alvar dice:

    Hola,

    Muchas gra­cias por el tuto­rial, en mi pro­yecto lo voy a dejar en inglés. Hay cosas que es mejor no traducir.

    Un saludo,

  16. Rubén dice:

    Hola, no pues que padre Blog.
    Efec­ti­va­mente, estaba tra­tando de hacer un algo­ritmo, y no que­ria usar lis­tings de latex.
    Bus­cando y bus­cando y bus­cando, di con tu blog y me callo de pelos.
    La tra­duc­ción es per­fecta, amo el espa­ñol y se ve tan bonito en latex… le da tanto estilo… aaaa se tan bonito… tan per­fecto, tan defi­nido, aunq latex me ha dadi dolo­res de cabeza, sobre todoe n linux… en fin.…,se que debo apren­der ingles.
    En fin. Veo que estu­dias el mas­ter en Lógica e IA, ooooooo­rale, pues yo estu­dio sola­mente la maes­tría en IA, no se si los mas­ters de alla de Lon­dres sean igual que las maes­trías de México, pero pues aqui son Maestrías.

    No acos­tum­bro, al menos infor­mal­mente, poner cui­dado a mis fal­tas ohrt­ho­graf­hi­kas asi que ruego me disculpes.

    Un saludo… y… pása­tela bien…

    p.d.1 Enton­ces eres Fan de Pro­log y Lisp???
    p.d.2 Si es asi… q bien… y si no es asi… regre­rese a p.d.1
    p.d.3 Si paso 1 ves por p.d.1 enton­ces ha lle­gado al fin de mensaje

  17. jael15 dice:

    Muchas gra­cias por com­par­tir. el spa­nis­hAl­go­rith­mic. Lo he usado y seguro que lo seguiré usando. Gra­cias a gente como tú los no-expertos lo tene­mos un poco menos difí­cil.
    Un saludo.

  18. Romeo dice:

    Me han sido de mucha ayuda tanto tus expli­ca­cio­nes como el archivo que has hecho. Gracias!

  19. MigDus dice:

    Gra­cias!

  20. ADELMO dice:

    EXCELENTE POR COMPARTIR LA INFORMACIÓN, ESO TE HACE GRANDE. GRACIAS MUCHAS GRACIAS

  21. cybdevtec dice:

    Exce­lente tu ayuda…gracias me sal­vaste.
    Salu­dos
    Washignton

  22. Mariangela dice:

    gra­cias por el tuto­rial… va para mi tesis ;)

  23. Edmundo dice:

    Hola rosa­po­lis.

    EStoy muy agra­de­cido, sola­mente tengo un incon­ve­niente, se nece­sito gene­rar un archivo *.pdf me da error. A qué se debe? ayuda!

  24. Pablo dice:

    ¡Hola Rosa! ¡No tengo pala­bras para agra­de­certe! Tam­bién yo estaba lidiando con LaTeX con la inten­ción de crear mi pro­pio entorno para intro­du­cir algo­rit­mos. Lo nece­si­taba para un informe obli­ga­to­rio de la mate­ria Méto­dos Numé­ri­cos (estu­dio inge­nie­ría en la Ude­laR, Uru­guay). Bus­cando en goo­gle me apa­re­ció el link a tu blog, y este mini­tu­to­rial me vino fan­tás­tico. ¡Muchí­si­mas gra­cias! ¡Has ayu­dado a un mon­tón de gente de dis­tin­tas uni­ver­si­da­des del mundo! El archivo de tra­duc­ción ya no está dis­po­ni­ble, pero pude crearme uno sin pro­blema gra­cias a las pis­tas que has dejado aquí. Sin duda es mejor que los pseu­do­có­di­gos se vean en espa­ñol (al menos a mi gusto). A raíz de esto, he estado entrando a tu blog rosa­po­lis y está muy bueno!!! Salu­dos desde Uruguay

  25. Felipe dice:

    Muy bueno!!!
    pero esta roto el link
    pue­des arre­glarlo?
    nece­sito esto y se ve bien expli­cado
    :S!!

  26. Rosa dice:

    ¡Ya está arre­glado! Me lo volví a car­gar en la última actua­li­za­ción y redi­seño del theme ^^
    Muchí­si­mas gra­cias por vues­tros comen­ta­rios, me ale­gro mucho de que os sea útil :)

  27. Lili dice:

    Que genial esto. Muchi­si­mas gra­cias. Que­ria pre­gun­tar si sabes como picar el algo­ritmo en dos, ya que si es muy largo, queda cor­tado :(. Qui­siera poder cor­tarlo y con­ti­nuar con la numeracion.

    gra­cias de antemano.

  28. jarr5 dice:

    Exce­lente! me fun­ciona para una tarea final! Gracias.

  29. Iván dice:

    Estoy tra­ba­jando en una beca de inves­ti­ga­ción y no te ima­gi­nas cuánto me aca­bas de ayu­dar para empe­zar a escri­bir artícu­los en LaTeX (es algo­rit­mos de opti­mi­za­ción de rutas para una empresa :) ) . Muchas gracias!!

  30. Adalys dice:

    Gra­cias valiosa tu ayuda!!!!

  31. Juampa dice:

    Exce­lente, muchí­si­mas gra­cias!!!
    Besos

  32. karina dice:

    Hola, muchas gra­cias me sir­vio de mucho tu infor­ma­ción, pero tengo un pequeño pro­blema cuando escribo un algo­ritmo que tiene solo \state, sin if, ni for, ni while al com­pi­larlo me enu­mera solo los pasos pares, como hago para que me enu­mere los impa­res? mucha gracias…

  33. sergio dice:

    Oye muchas gra­cias, exce­lente ayuda y gra­cias por las tra­duc­cio­nes al español.

    un saludo.

  34. JJ Noguera dice:

    Gra­cias por tu aporte!!
    Me estaba cos­tando encon­trar como tra­du­cir todo a espa­ñol hasta que me topé con tu blog.

    Salu­dos

  35. Carlos Herrera dice:

    Muchas gra­cias, esta info me fue de mucha uti­li­dad :D

  36. kikewaa dice:

    Hola, Rosa. Muchas gra­cias por postear esto. Justo ano­che estaba redac­tando un capí­tulo de la tesis y nece­si­taba meter un algo­ritmo, pero igual, me dí cuenta de que no se tra­duce, por el babel. Tu archivo de tra­duc­ción me ha caído como la bote­lla de suero en manos del des­hi­dra­tado. ¡¡Lo tomo!! Espero no ten­gas pro­blema, como quiera, veré la manera de darte cré­dito en el tra­bajo por tu apor­ta­ción desinteresada.

    Por cierto, veo a un Rubén que estu­dió la maes­tría en IA. Supongo que es el mismo que conozco y fui­mos com­pa­ñe­ros… Salu­dos a ambos y de nuevo, gra­cias por postear tu archivo que es utilísimo.

  37. carlos dice:

    Gra­cias.…. fun­ciono de mara­vi­lla.… exce­lente tuto.… solo que no pude ponerle en espa­ñol… pero gracias

  38. Rodrigo dice:

    Pequeño pero gran aporte. Muchas gracias!

  39. Gilmer dice:

    muchi­si­mas gra­cias por tu aporte me es de gran ayuda para hacer los pseu­do­co­di­gos.
    qui­siera saber si hay algun truco para poder cor­tar y luego con­ti­nuar en la siguiente pagina y asi mismo como puedo sacar las lineas ver­ti­ca­les para que esten conec­ta­dos con cada codigo

  40. Alexander dice:

    Muchas gra­cias por com­par­tir tan útil código, estoy en un momento de apuro y no podría haber modi­fi­cado a tiempo la libre­ría. Un abrazo desde Lima!

  41. auraham dice:

    Muy buen aporte, justo lo que buscaba.

  42. slm dice:

    Gra­cias!

  43. Rigo dice:

    Muchas gra­cias!!! toda­vía sigue siendo muy útil.

  44. Diego dice:

    Muchas Gra­cias!!! Exce­lente expli­ca­ción, solo que tengo un pro­blema, mi tutor quiere la nume­ra­ción empiece con el numero del capi­tulo corres­pon­diente. Alguien sabe si es posi­ble rea­li­zar eso?

  45. Antonio dice:

    Muchas gra­cias por el aporte y por tu archivo de traducción.

    Salu­dos.

  46. Ronald dice:

    Hola Rosa, tengo una difi­cul­tad, tengo un código bas­tante extenso y este no cabe en una pagina del docu­mento, debido a la for­mato exi­gido. Me gus­ta­ría saber que fun­ción de Latex puedo usar para dis­mi­nuir el tamaño de mi algo­ritmo, o que auto­má­ti­ca­mente este corte el algo­ritmo en la pagina para con­ti­nuarlo en la siguiente.

    Gra­cis

  47. tu entrada me cae como ani­llo al dedo, muchas gra­cias por el aporte!

  48. Dev Saéz Ayala dice:

    Tengo una duda res­pecto a la refe­ren­cia del número de linea del código. En tu ejem­plo
    \ref{lin:lineaRara} al com­pi­lar tiene pro­ble­mas con el package hype­rref, y no se mues­tra el numero de refe­ren­cia (en tu ejem­plo es el numero 1.3).
    Gra­cias por tu aporte sobre LaTeX, sobre todo para cam­biar de idioma.

  49. Mario dice:

    Gra­cias por el archivo de traducción :)…

  50. Angela dice:

    Hola, estoy muy agra­de­cida por este tuto­rial que has creado de cómo hacer los algo­rit­mos en Latex, ha fun­cio­nado per­fec­ta­mente, ha sido muy claro, muchas gra­cias espe­cial­mente por el script *.tex que tra­duce al español :)