Escribir código en Latex (y que quede bonito)

Desde hace unos días estoy tan enfrascado en el proyecto Adelia que apenas tengo tiempo para pensar en otra cosa que no sea PHP, MySQL y CSS. Voy algo lento, no sólo porque soy amateur en esto de programar, sino porque estoy documentando mientras programo. Por ejemplo, cómo hago tal o cual función, cómo conseguir efectos con cierta librería en Javascript, etc. Por lo general, son trucos (tips and tricks, de los americanos) que consiguen efectos muy “apañaos”. Estos trucos los suelo escribir en la página del proyecto Adelia, que básicamente es un blog de desarrollo, pero para documentar cosas que me parecen más complicadas, prefiero hacerme manuales de consumo propio, como los referentes a implantar características de AJAX (que no se me da muy bien).

Estos mini-manuales los hago en Latex (bueno, los hago en Lyx, pero en ocasiones debo recurrir al código de Latex). Me he dado cuenta que no pocas veces la configuración más avanzada de las características del documento se queda muy corta si nos constreñimos a Lyx, como los gráficos de la portada, hacer marcos, encabezados y pies de página, etc.

Una de esas cosas que faltan en Lyx es escribir código de cualquier lenguaje para que sea explicativo y estético, que conserve las sangrías, que resalte las líneas y las numere, etc. En Lyx sólo hay dos opciones:

  • Marcar el entorno como “Código Lyx”, que lo único que hace es poner todo el bloque sangrado en Typewriter.
  • Insertar una caja de “Código Tex”, que básicamente hace lo mismo.

Mientras intentaba buscar cómo se podía identificar el lenguaje (PHP, C, etc), encontré algunas cosas que hacía Latex.

El formateo más sencillo ya estaba incluido dentro de Latex (built-in), y es lo siguiente:

\begin{verbatim}

Escribes tu código aquí

\end{verbatim}

Sin embargo, el resultado es idéntico a lo que propone Lyx: el tamaño de letra es el mismo y el tipo de letra:

El sangrado no lo hace automáticamente, sino que lo tenemos que hacer nosotros. No es una opción que se diferencie nada de las opciones que nos ofrece  Lyx. Sólo si se declaran en el preámbulo los paquetes color y fancyvrb e pueden hacer cosas como lo siguiente, siempre que nosotros mismos apliquemos el color al código:

Seguí buscando alternativas, y encontré en Stack Overflow que si se declara en el preámbulo el paquete listings (\usepackage{listings}) se pueden hacer cosas como ésta:

con sólo escribir esto en el código (sólo es declarar el comienzo y el final del enviroment, y ya está):

\begin{lstlisting}

Escribir aquí el código

\end{lstlisting}

Esto que parece tan sencillo realmente es muy potente, según Stack Overflow se puede configurar enormemente con declaraciones en el preámbulo del documento: tipo de letra, color, interlineado, sangrado de los comentarios, numeración de las líneas, remarcado de los espacios en blanco, etc.

Así que este paquete listings prometía. Mientras buscaba alguna página sencilla donde se explicase la configuración sin tener que pasarme horas leyendo documentación, encontré la página que mejor explicaba esto del paquete listings: Crysol.

En Crysol proponen que se puede añadir la configuración [language=C] (o el lenguaje que queramos, siempre que esté soportado), para que este código de Latex:

\usepackage{listings}
\begin{document}

\begin{lstlisting}[language=C]
#include <stdio.h>
int main(int argc, char* argv[]) {
puts("Hola mundo!");
}
\end{lstlisting}

\end{document}

nos quede así de bonito:

Como se ve, añadir la definición del lenguaje hace que el código sea más sencillo de leer. ¿Y eso es todo? Pues no. En Crysol van más allá, configuran las opciones del paquete, y demuestran todo lo que se puede hacer con él:

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\usepackage{times}

\usepackage{color}
\definecolor{gray97}{gray}{.97}
\definecolor{gray75}{gray}{.75}
\definecolor{gray45}{gray}{.45}

\usepackage{listings}
\lstset{ frame=Ltb,
framerule=0pt,
aboveskip=0.5cm,
framextopmargin=3pt,
framexbottommargin=3pt,
framexleftmargin=0.4cm,
framesep=0pt,
rulesep=.4pt,
backgroundcolor=\color{gray97},
rulesepcolor=\color{black},
%
stringstyle=\ttfamily,
showstringspaces = false,
basicstyle=\small\ttfamily,
commentstyle=\color{gray45},
keywordstyle=\bfseries,
%
numbers=left,
numbersep=15pt,
numberstyle=\tiny,
numberfirstline = false,
breaklines=true,
}

% minimizar fragmentado de listados
\lstnewenvironment{listing}[1][]
{\lstset{#1}\pagebreak[0]}{\pagebreak[0]}

\lstdefinestyle{consola}
{basicstyle=\scriptsize\bf\ttfamily,
backgroundcolor=\color{gray75},
}

\lstdefinestyle{C}
{language=C,
}

\begin{document}

\noindent
Escribe el siguiente código en un fichero llamado \texttt{hello.c}:

\begin{lstlisting}[style=C]
#include <stdio.h>
int main(int argc, char* argv[]) {
puts("Hola mundo!");
}
\end{lstlisting}

\noindent
Ahora compila usando \texttt{gcc}:

\begin{listing}[style=consola, numbers=none]
$ gcc  -o hello hello.c
\end{listing}

\end{document}

De manera que el código quedaría así (ellos dicen que es más “apañao”,pero yo digo que es simplemente brillante):

¿Y cómo me ha quedado a mi, tras usar la definición [language=PHP]? Pues así de bonito:

Como se puede ver, me ha resaltado el código y me ha puesto en gris los comentarios. Estoy seguro de que se puede configurar más, con más colores, márgenes, sangrado, comentarios en diferente tipo de letra, etc.

Fuentes:

Hala, a distrutar.

Publicado en: General, Latex, Recetas
9 comments on “Escribir código en Latex (y que quede bonito)
  1. coromoto dice:

    Hola esta muy fino, lo realize sin ningún problema, estoy realizando mi tesis con latex pero no se como reducir las letras del codigo para que se pueda ver mejor agradeceria tu ayuda

  2. ferran dice:

    Mooooolt bo!! Bo de veritat!
    Bueno de verdad y muy de agradecer.

    Permiteme:
    Codi font amb LaTeX
    Llenguatge C inclos al LaTeX
    Incloure codi Python al LaTeX
    LaTeX per programadors
    LaTeX i programacio

    • Muchas gracias por la aportación. En cuanto tenga tiempo, les echo un vistazo. Moltes gracies!

    • josema_valencia dice:

      Hola, esta muy xulo el codigo ya que me ha servido para introducir código Java en la memoria del proyecto. Pero queria saber que parametro hay que cambiar para modificar el color de las palabras reservadas (que no sea siempre el negro).

      Muchas gracias

  3. LUIS ROCA dice:

    creo que la opcion es basicstyle=\small, puede verlo en http://en.wikibooks.org/wiki/LaTeX/Packages/Listings

  4. David dice:

    Hola.
    Te dejo un comentario porque ha sido muy útil. ¡Muchas gracias!
    Saludos

  5. Gonzalo dice:

    He llegado hasta aquí buscando información sobre LaTeX, pero ya me quedo como asiduo al blog. Muy útil información.

    Gracias y Saludos!!!!

  6. PERCY dice:

    Hola, es un gusto saludarlo, por favor algunos de ustedes que me puedan proporcionar algun ejemplo de los codigos de como realizar mi tesis en latex, gracias.
    Saludos

  7. Daniela dice:

    Tengo un problema descargue el paquete pero el puts me lo manda como error, utilizo texmaker.
    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>