Manual de LaTeX/Listados de código/Listados con minted

De Wikilibros, la colección de libros de texto de contenido libre.

El paquete minted, modo de uso[editar]

El paquete minted está ganando impulso para el resaltado de código fuente. Para ello, se basa en potente librería Pygments de Python, por lo que resulta necesario que esta esté instalada para su correcto funcionamiento.

Con esta librería de Python es posible resaltar más de 300 lenguajes de programación y de markup, con un nivel de personalización de cada uno de ellos muy potente. La creciente lista se puede ver en la página del proyecto Pygments.


Instalación de Pygments[editar]

Para poder utilizar el paquete minted es necesario disponer en el sistema del lenguaje de programación Python, en su versión 2.6 o superior. En los sistemas linux y OSX, por ejemplo, suele estar instalado, basta comprobarlo en un terminal de comandos escribiendo:

$ python --version
Python 2.7.10

En los sistemas Windows será necesario instalarlo con casi total seguridad. Dicha instalación va más allá de este documento, existiendo diversas formas de hacerlo. El mejor punto de referencia para ello es la página del proyecto Python.

Una vez instalado python, lo siguiente que se debe hacer es asegurar que la librería Pygments se haya instalado. Para ello, basta con ejecutar el siguiente comando en el terminal:

$ python -c 'import pygments'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named pygment

Cuando el paquete pygments no está instalado devuelve el mensaje anterior, mientras que cuando sí lo está, simplemente finaliza sin dar ningún mensaje:

$ python -c 'import pygments'
$

En caso de que no esté instalado, se pueden utilizar diversos métodos. Aquí se da una breve indicación de los dos más sencillos:

  1. En Linux, suele venir con el sistema de distribución de aplicaciones correspondiente. Basta con buscar (utilizando la herramienta del instalación de aplicaciones, que depende de la distro Linux que se esté usando: apt-get, yum, rpm,...) pygments o python-pygments e instalarlo.
  1. En la mayoría de sistemas operativos basta con utilizar pip que es la herramienta estándar de distribución de paquetes de Python. Para ello se habrá tenido que instalar previamente esta herramienta si no se dispone de ella (las últimas distribuciones de Python la traen instalada). En cualquier caso, se puede obtener más información en la página oficial de pip.
$ pip install Pygments

Instalación de minted[editar]

En lo que respecta a minted suele estar instalado en la mayoría de distribuciones de TeX. En cualquier caso, para experimentar, basta con descargar el fichero minted.sty de la página del proyecto y ubicarlo en el mismo directorio en que esté el fichero de TeX (o instalarlo en el lugar correcto de la propia distribución de TeX).

Por último indicar que, dado que se utiliza Pygments, que es una herramienta externa a LaTeX, es necesario pasar un parámetro adicional al comando de generación de los documentos para que pueda acceder a recursos externos.

$ pdflatex -shell-escape nombre_de_fichero_tex

A continuación se muestra un ejemplo simple que debería funcionar con una línea de comando pdflatex similar a la anterior y que contiene tanto acentos españoles y aperturas de exclamación.

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{minted}

\begin{document}
	\begin{minted}{C}
		#include <stdio.h>
		#define N 10
		/* Comentario en un
		* bloque*/
		
		int main()
		{
			int i;
			
			// Line comment.
			puts("¡Hola Mundo!");
			
			for (i = 0; i < N; i++)
			{
				puts("¡LaTeX también es genial para los programadores!");
			}
			
			return 0;
		}
	\end{minted}
\end{document}

Cuyo resultado será el siguiente:

Resultado de utilizar minted con un trozo de código C

Comandos y entornos básicos[editar]

Para el resaltado de código fuente con minte se utilizan normalmente los siguientes comandos y entornos.

nombre tipo Uso Significado
minted entorno \begin{minted}[opciones]{lenguaje}código fuente\end{minted} Esta sintaxis es la más simple cuando se desean resaltar varias líneas de código. Las opciones son opcionales.
\mint comando \mint[opciones]{lenguaje}<carácter delimitador>código fuente<carácter delimitador> Útil para formatear una única línea de código en su propia línea física de LaTeX. No inserta el código fuente dentro de un párrafo (ver siguiente comando).
\mintinline comando \mintinline[opciones]{lenguaje}<carácter delimitador>{código fuente}<carácter delimitador>} Inserta una línea de código entre el texto de un párrafo. El carácter delimitador puede ser cualquiera que no forme parte del propio código fuente.
\inputminted comando \inputminted[opciones]{lenguaje}{nombre de fichero} Se utiliza para insertar el texto completo de un fichero.


El siguiente ejemplo muestra el funcionamiento de estos comandos:

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{minted}

\begin{document}
	\begin{enumerate}
	\item Lo siguiente es una muestra del entorno \emph{minted}.
	\begin{minted}{Python}
		if x == "amanece":
			print("¡Hola mundo!")
		else:
			print("¡Adiós mundo!")
	\end{minted}
	
	\item Lo siguiente es una muestra del comando \emph{mint} \mint{Python}|print("¡Hola mundo!")| Que, como se ve, no se muestra en la misma línea.

	\item Lo siguiente muestra el comando \emph{mintinline} \mintinline{Python}{print("¡Hola mundo!")}. En este caso sí que aparece en el mismo párrafo.
	
	\item Lo siguiente es una muestra de la inserción de un fichero
	\inputminted{Python}{fich_python.py}
	\end{enumerate}
	
\end{document}

Ejemplos de uso de los diversos comandos y entornos de minted

Lenguajes y estilos de Pygments[editar]

Dado que minted se basa en Pygments y este último reconoce muchos lenguajes y soporta diferentes estilos de presentación, conviene conocer tanto si el lenguaje que se necesita está soportado, como qué estilos predefinidos existen por si se desea utilizarlos. Para todo ello, se debe utilizar el comando pygmentize en el terminal de comandos del sistema operativo. Por ejemplo:

$pygmentize -L lexers

Devuelve la lista de los más de 300 lenguajes que reconoce Pygments.

Para ver los estilos predefinidos que están disponibles podemos usar:

$pygmentize -L styles

Para aplicar un estilo se utiliza el comando \usemintedstyle. Por ejemplo:

	\usemintedstyle[Python]{friendly} 
	\begin{minted}{Python}
		if x == "amanece":
			print("¡Hola mundo!")
		else:
			print("¡Adiós mundo!")
	\end{minted}

Da como resultado lo siguiente:

Ejemplo de aplicación de un estilo de Pygment en minted


Otras posibilidades[editar]

El paquete minted tiene múltiples posibilidades adicionales que conviene conocer por si se requieren:

  • Permite que el código fuente sea flotante. Para ello proporciona un entorno denominado listing. A este entorno se le pueden incorporar \caption y \label como a cualquier otro componente flotante. Se puede generar una lista con todos los listados de código flotantes con \listoflistings.
  • Existe un amplio conjunto de opciones que se pueden utilizar para personalizar la salida de código, por ejemplo, si se desean líneas de código numeradas se puede proporcionar la opción linenos (\begin[linenos=true]{Python}).
  • Este amplio conjunto de opciones se puede configurar para que afecte a todo el documento (evitando tener que teclearlas paquete de código) utilizando el comando \setminted y \setmintedinline, que afectan al código insertado en sus propias líneas y al código insertado inline, respectivamente.
  • Es posible, incluso, crear alias para un conjunto de opciones y aplicarlas a discreción. Para ello, se utiliza el comando \newminted, que crea un nuevo entorno que se utilizaría en lugar de minted.
  • De forma equivalente a \newminted, existen \newmint, \newmintinline y \newmintedfile.

Para conocer en detalle estas funciones avanzadas, se recomienda consultar la documentación oficial el mismo que se encuentra en la página del proyecto.


Referencias[editar]

La versión vigente y su documentación asociada en la página de CTAN del proyecto.

Página de proyecto de Pygments