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 |
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 |
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> |
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> |
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í:
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.
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?
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 :)
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
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
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 :)
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.
¿Qué es el formato IFAC? ¿A qué te refieres con “referencia”?
chapó.
O no. Da igual.
Lo que quiero decir es: gracias.
Me fue muy útil. Está bien explicado y es fácil de entender.
gracias!!!
hola:
no tengo mucho que decir, solo GRACIAS.
Muy útil, práctico y sin mucha lata :). Gracias yo estoy haciendo mi tesis y necesitaba estructurar varios algoritmos.
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.
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.
Muchas gracias por el spanishAlgorithmic.tex :D
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,
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
Muchas gracias por compartir. el spanishAlgorithmic. Lo he usado y seguro que lo seguiré usando. Gracias a gente como tú los no-expertos lo tenemos un poco menos difícil.
Un saludo.
Me han sido de mucha ayuda tanto tus explicaciones como el archivo que has hecho. Gracias!
Gracias!
EXCELENTE POR COMPARTIR LA INFORMACIÓN, ESO TE HACE GRANDE. GRACIAS MUCHAS GRACIAS
Excelente tu ayuda…gracias me salvaste.
Saludos
Washignton
gracias por el tutorial… va para mi tesis ;)
Hola rosapolis.
EStoy muy agradecido, solamente tengo un inconveniente, se necesito generar un archivo *.pdf me da error. A qué se debe? ayuda!
Definitivamente!!!
http://code.google.com/p/tpso1c2010/source/browse/trunk/Informe/src/spanishAlgorithmic.tex?spec=svn2&r=2
¡Hola Rosa! ¡No tengo palabras para agradecerte! También yo estaba lidiando con LaTeX con la intención de crear mi propio entorno para introducir algoritmos. Lo necesitaba para un informe obligatorio de la materia Métodos Numéricos (estudio ingeniería en la UdelaR, Uruguay). Buscando en google me apareció el link a tu blog, y este minitutorial me vino fantástico. ¡Muchísimas gracias! ¡Has ayudado a un montón de gente de distintas universidades del mundo! El archivo de traducción ya no está disponible, pero pude crearme uno sin problema gracias a las pistas que has dejado aquí. Sin duda es mejor que los pseudocódigos se vean en español (al menos a mi gusto). A raíz de esto, he estado entrando a tu blog rosapolis y está muy bueno!!! Saludos desde Uruguay
Muy bueno!!!
pero esta roto el link
puedes arreglarlo?
necesito esto y se ve bien explicado
:S!!
¡Ya está arreglado! Me lo volví a cargar en la última actualización y rediseño del theme ^^
Muchísimas gracias por vuestros comentarios, me alegro mucho de que os sea útil :)
Que genial esto. Muchisimas gracias. Queria preguntar si sabes como picar el algoritmo en dos, ya que si es muy largo, queda cortado :(. Quisiera poder cortarlo y continuar con la numeracion.
gracias de antemano.
te amo
Excelente! me funciona para una tarea final! Gracias.
Estoy trabajando en una beca de investigación y no te imaginas cuánto me acabas de ayudar para empezar a escribir artículos en LaTeX (es algoritmos de optimización de rutas para una empresa :) ) . Muchas gracias!!
Gracias valiosa tu ayuda!!!!
Excelente, muchísimas gracias!!!
Besos
Hola, muchas gracias me sirvio de mucho tu información, pero tengo un pequeño problema cuando escribo un algoritmo que tiene solo \state, sin if, ni for, ni while al compilarlo me enumera solo los pasos pares, como hago para que me enumere los impares? mucha gracias…
Oye muchas gracias, excelente ayuda y gracias por las traducciones al español.
un saludo.
Gracias por tu aporte!!
Me estaba costando encontrar como traducir todo a español hasta que me topé con tu blog.
Saludos
Muchas gracias, esta info me fue de mucha utilidad :D
Hola, Rosa. Muchas gracias por postear esto. Justo anoche estaba redactando un capítulo de la tesis y necesitaba meter un algoritmo, pero igual, me dí cuenta de que no se traduce, por el babel. Tu archivo de traducción me ha caído como la botella de suero en manos del deshidratado. ¡¡Lo tomo!! Espero no tengas problema, como quiera, veré la manera de darte crédito en el trabajo por tu aportación desinteresada.
Por cierto, veo a un Rubén que estudió la maestría en IA. Supongo que es el mismo que conozco y fuimos compañeros… Saludos a ambos y de nuevo, gracias por postear tu archivo que es utilísimo.
Gracias.…. funciono de maravilla.… excelente tuto.… solo que no pude ponerle en español… pero gracias
Pequeño pero gran aporte. Muchas gracias!
muchisimas gracias por tu aporte me es de gran ayuda para hacer los pseudocodigos.
quisiera saber si hay algun truco para poder cortar y luego continuar en la siguiente pagina y asi mismo como puedo sacar las lineas verticales para que esten conectados con cada codigo
Muchas gracias por compartir tan útil código, estoy en un momento de apuro y no podría haber modificado a tiempo la librería. Un abrazo desde Lima!
Muy buen aporte, justo lo que buscaba.
Gracias!
Muchas gracias!!! todavía sigue siendo muy útil.
Muchas Gracias!!! Excelente explicación, solo que tengo un problema, mi tutor quiere la numeración empiece con el numero del capitulo correspondiente. Alguien sabe si es posible realizar eso?
Muchas gracias por el aporte y por tu archivo de traducción.
Saludos.
Hola Rosa, tengo una dificultad, tengo un código bastante extenso y este no cabe en una pagina del documento, debido a la formato exigido. Me gustaría saber que función de Latex puedo usar para disminuir el tamaño de mi algoritmo, o que automáticamente este corte el algoritmo en la pagina para continuarlo en la siguiente.
Gracis
tu entrada me cae como anillo al dedo, muchas gracias por el aporte!
Tengo una duda respecto a la referencia del número de linea del código. En tu ejemplo
\ref{lin:lineaRara} al compilar tiene problemas con el package hyperref, y no se muestra el numero de referencia (en tu ejemplo es el numero 1.3).
Gracias por tu aporte sobre LaTeX, sobre todo para cambiar de idioma.
Gracias por el archivo de traducción :)…
Hola, estoy muy agradecida por este tutorial que has creado de cómo hacer los algoritmos en Latex, ha funcionado perfectamente, ha sido muy claro, muchas gracias especialmente por el script *.tex que traduce al español :)