lunes, 16 de abril de 2012

Código de programación en nuestro documento LaTeX

Ya que LaTeX es una herramienta específica para textos técnicos y científicos, es muy común que queramos añadir unas líneas de programación. Para ello, podemos utilizar el paquete listings. En primer lugar, nuestro archivo .tex será parecido al siguiente:

\documentclass[a4paper,onecolumn,10pt]{article}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{listings}

\begin{document}

\end{document}



Escribimos nuestras líneas de código entre \begin{lstlisting} \end{lstlisting}, como se muestra en el ejemplo siguiente. Además, podemos definir una serie de propiedades: 
  • language=..., define el lenguaje de programación. No es fundamental elegirlo, pero el formato del texto se ajusta al código usado.
  • breaklines=true, para que si una línea es muy larga, la pase automáticamente al siguiente renglón.
  • basicstyle=..., define el tamaño del texto. 
  • frame=single, encierra el código en una caja. 

Ejemplo con C:

\lstset{language=C, breaklines=true, basicstyle=\footnotesize}
\begin{lstlisting}[frame=single]
#include <stdio.h>
#include <stdlib.h>
// programa muy positivo

void main{
  system("clear");
  printf("Hola mundo!\n");
}
\end{lstlisting}




Podemos numerar las líneas de nuestro código con el comando "stepnumber=x", (donde x significa cada cuántas líneas numeramos) como se muestra a continuación:

Ejemplo con Matlab:

\lstset{language=Matlab, breaklines=true, basicstyle=\footnotesize}
\lstset{numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=-2pt}
\begin{lstlisting}[frame=single]
  % suma de los elementos de un vector

  z = 0;
  n = length(v);
  for i=1:1:n
    z = z + v[i];
  end
\end{lstlisting}


Además, hemos definido la posición de la numeración con "numbers", el tamaño con "numberstyle", y la sangría con "numbersep".



Las propiedades definidas dentro de \lstset{}, valen para todo nuestro documento. Es decir, solo es necesario definirlas una vez, a no ser que queramos usar distintas propiedades cada vez que añadimos el código de programación. Por ejemplo, si a continuación, queremos dejar de numerar las líneas, habría que escribir: "stepnumber=0". Nótese también que, aunque hay muchos lenguajes incorporados a lstlisting, no están todos. Cuando escribimos en un lenguaje que no está definido, lo mejor es poner "language=", para que no use ninguno.

Ejemplo con Modelica:

\lstset{language=,breaklines=true, basicstyle=\footnotesize}
\lstset{stepnumber=0}
\begin{lstlisting}[frame=single]
model test
 Real x(start=5) "variable";

equation
 der(x) = -0.1*x;
end test;
\end{lstlisting}

\end{document}

7 comentarios:

Dadá dijo...

Listings está bastante bien. Pero se puede mejorar.

¿Has probado Pygments?

Colorea las palabras reservadas del lenguaje de programación en uso, de forma que el resultado es prácticamente como visualizar el código en un editor de texto. También tiene un montón de opciones de personalización.

La pega (no muy problemática en realidad) es que funciona con Python, así que este lenguaje tiene que estar activo.

En fin, una idea, nada más.

Un buen blog, felicidades.

Luis dijo...

Hola Dadá, ¿qué tal?

Muchas gracias por la información. No conocía Pygments, pero suena genial. Le echaré un vistazo.

Hasta luego

Yani Morales dijo...

Muy buen Blog! Tengo un problema cdo genero un código muy largo que no entra en la hoja, si a continuación del código viene una tabla pone la tabla en medio del código y continua mas abajo, existe alguna forma de evitar esto?

Luis dijo...

Hola Yani, gracias.

Tienes razón, cuando LaTeX mueve las tablas o imágenes, no lo hace demasiado bien. Yo prefiero forzar a LaTeX a que las ponga exactamente donde lo he dicho. Para eso, usa el paquete {float} y cuando crees la tabla, usa \begin{table}[H].

Hasta luego

martin laguna altamirano dijo...

Una preguntita por que latex no puede compilar este lenguaje programación
«  f a b
«
{X1 X2 X3}
b a - 2 / ABS 'J' STO
X J * b a + 2 / + 'CV' STO
f X CV = SUBST J * SIMPLIFY DUP 'F' STO MAP
1 « XNUM » DOSUBS DUP { C1 C2 C3 } * DUP …LIST

»
»


antes de f de la primera linea existe una fecha y donde esta la septima linea en ...LIST es una sumatoria y la compila me sale error

martin laguna altamirano dijo...

Una preguntita por que latex no puede compilar este lenguaje programación
«  f a b
«
{X1 X2 X3}
b a - 2 / ABS 'J' STO
X J * b a + 2 / + 'CV' STO
f X CV = SUBST J * SIMPLIFY DUP 'F' STO MAP
1 « XNUM » DOSUBS DUP { C1 C2 C3 } * DUP …LIST

»
»


antes de f de la primera linea existe una fecha y donde esta la septima linea en ...LIST es una sumatoria y la compila me sale error

PAUL Andres Acuña dijo...

Por qué será que los números me aparecen muy pegados al código.. he modificado la sangría con "numbersep" pero no ha dado efecto.