\usepackage{listings}

Bloques de código en LaTeX con listings

El paquete listings es la forma estándar de componer código fuente en LaTeX. Ofrece resaltado de sintaxis para más de 80 lenguajes, números de línea, marcos personalizados, colores de fondo y estilos con nombre, sin salir de su documento.

Uso básico de listings

El siguiente ejemplo muestra una configuración mínima pero completa: cargar el paquete, configurarlo globalmente con \lstset{…} y colocar el código dentro de un entorno lstlisting con un lenguaje y un título.

basic-listings.tex
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

% Global listings configuration
\lstset{
  basicstyle=\ttfamily\small,
  keywordstyle=\color{blue}\bfseries,
  commentstyle=\color{gray}\itshape,
  stringstyle=\color{orange},
  breaklines=true,
  showstringspaces=false,
  frame=single,
  rulecolor=\color{black!20},
  tabsize=2,
}

\begin{document}

\begin{lstlisting}[language=Python, caption={Hello World in Python}]
def greet(name: str) -> None:
    # Print a personalised greeting
    message = f"Hello, {name}!"
    print(message)

greet("World")
\end{lstlisting}

\end{document}

Configuración básica

Add \usepackage{listings} and optionally \usepackage{xcolor} to your preamble. Wrap code in a \begin{lstlisting}…\end{lstlisting} environment.

Compatibilidad con lenguajes

Especifique el lenguaje con la opción language=: Python, C++, Java, Bash, SQL, HTML y más de 80 están integrados y aplican el color de las palabras clave automáticamente.

Título y etiqueta

Use caption={…} to add a numbered caption below the listing, and label={lst:name} for cross-references with \ref{lst:name} anywhere in your document.

Configuración global

\lstset{} applies settings globally to all listings. Place it in your preamble after \usepackage{listings} to avoid repeating options on every environment.

Opciones de estilo

Defina un estilo con nombre con \lstdefinestyle{name}{…} y actívelo globalmente con \lstset{style=name}. El siguiente ejemplo crea colores personalizados para el fondo, los comentarios, las palabras clave y las cadenas, y luego los muestra con una implementación de búsqueda binaria en C++.

La opción frame=tb dibuja una línea horizontal encima y debajo del listado, mientras que numbers=left añade números de línea en el margen izquierdo.

styled-listings.tex
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

% Custom colour definitions
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{mystyle}{
  backgroundcolor=\color{backcolour},
  commentstyle=\color{codegreen},
  keywordstyle=\color{magenta}\bfseries,
  numberstyle=\tiny\color{codegray},
  stringstyle=\color{codepurple},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,
  breaklines=true,
  captionpos=b,
  keepspaces=true,
  numbers=left,
  numbersep=5pt,
  showspaces=false,
  showstringspaces=false,
  showtabs=false,
  tabsize=2,
  frame=tb,
}
\lstset{style=mystyle}

\begin{document}

\begin{lstlisting}[language=C++, caption={Binary search}, label={lst:binsearch}]
#include <iostream>
using namespace std;

int binarySearch(int arr[], int n, int target) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1; // not found
}
\end{lstlisting}

\end{document}

Color de fondo

Use backgroundcolor=\color{name} inside \lstdefinestyle{} to apply a tinted background. Define custom colours first with \definecolor{name}{rgb}{r,g,b}.

Números de línea

Enable with numbers=left (or right). Control the font size and colour with numberstyle=\tiny\color{gray} and adjust the gutter width via numbersep=5pt.

Marcos

La opción frame= dibuja bordes: single (recuadro completo), tb (solo líneas superior e inferior), lines (líneas superior e inferior) o none. Combínela con rulecolor= para líneas con estilo.

Lenguajes admitidos

listings incluye conjuntos de palabras clave integrados para más de 80 lenguajes de programación y de marcado. Especifique uno con language= en el entorno o globalmente en \lstset{}.

PythonCC++JavaJavaScriptBashSQLHTMLLaTeXMatlabRFortranPHPRubySwiftGo

¿No aparece en la lista? Defina el suyo con \lstdefinelanguage; consulte la sección siguiente.

Definición de un lenguaje personalizado

Cuando su lenguaje no está integrado, use \lstdefinelanguage{name}{…} para declarar las palabras clave, la sintaxis de los comentarios y los delimitadores de cadenas. Colóquelo en el preámbulo antes del primer uso.

\lstdefinelanguage{MyLang}{
  keywords={let, const, fn, return, if, else},
  keywordstyle=\color{blue}\bfseries,
  sensitive=true,
  comment=[l]{//},
  commentstyle=\color{gray}\itshape,
  string=[b]",
  stringstyle=\color{orange},
}

\begin{lstlisting}[language=MyLang]
fn add(a: Int, b: Int) -> Int {
    return a + b  // sum of two integers
}
\end{lstlisting}

listings frente a minted

Ambos paquetes componen código, pero lo hacen con enfoques muy distintos. Elija según su entorno de compilación y sus necesidades de resaltado.

listings

  • + LaTeX puro, sin dependencias externas
  • + Funciona con pdfLaTeX, XeLaTeX y LuaLaTeX
  • + Se incluye en todas las distribuciones estándar
  • − Compatibilidad limitada con Unicode en el contenido del código
  • − El resaltado usa expresiones regulares, no un analizador léxico real

minted

  • + Basado en Pygments: resaltado completo mediante analizador léxico
  • + Resaltado preciso para sintaxis compleja
  • + Compatibilidad total con UTF-8 / Unicode en el código
  • − Requiere tener instalados Python y Pygments
  • − Necesita la opción de compilador --shell-escape

Pruébelo en el playground

Abra el ejemplo de listings con estilo (con colores personalizados, números de línea y una búsqueda binaria en C++) directamente en el playground de FormaTeX. Edite y compile a PDF en segundos, sin instalación.

Preguntas frecuentes

¿Está listings incluido en LaTeX estándar?

Yes. The listings package ships with every major LaTeX distribution (TeX Live, MiKTeX, MacTeX). You do not need to install anything extra — just add \usepackage{listings} to your preamble.

¿Cómo añado números de línea?

Pass numbers=left or numbers=right to \lstset{} or directly on the environment as an option. Control the style with numberstyle=\tiny\color{gray} and the gap width with numbersep=5pt.

¿Puedo usar caracteres UTF-8 en listings?

Not directly — listings processes its content as plain ASCII by default. For accented characters (é, ü, etc.) add inputencoding=utf8 and define each character with \lstset{literate={é}{{\'{e}}}1 ...}. For full Unicode support, consider the minted package with LuaLaTeX.

¿Cuál es la diferencia entre verbatim y listings?

El entorno verbatim reproduce el texto carácter por carácter sin ningún formato. listings parte de esa base y añade resaltado de sintaxis, números de línea, títulos, marcos, referencias cruzadas y detección de palabras clave según el lenguaje, lo que lo hace mucho más adecuado para componer código fuente real.

\end{document}

Compile su documento con listings

Use la API de FormaTeX o el playground para compilar documentos con el paquete listings. No necesita instalación local de TeX: envíe su código fuente y reciba un PDF.