A veces necesitas que un texto aparezca en la página exactamente como lo escribiste: comandos, comentarios y caracteres especiales desactivados, en una fuente monoespaciada de máquina de escribir. Ese mecanismo se llama verbatim. Esta página recorre \verb en línea, el entorno de bloque verbatim, \verbatiminput para archivos completos, la limitación importante de que nada de esto puede ir dentro del argumento de otro comando, con sus soluciones, la variante alltt que mantiene algunos comandos activos, y por último fancyvrb para números de línea y marcos.
El entorno verbatim y \verb
La base de la salida literal es el entorno verbatim, incorporado en LaTeX desde el principio. Todo lo que coloques entre \begin{verbatim} y \end{verbatim} se imprime tal como se escribió: una barra inversa ya no inicia un comando sino que se imprime como \; % no inicia un comentario; espacios y saltos de línea se conservan literalmente; y todo el bloque se compone en fuente de máquina de escribir (\tt). Es ideal para código fuente o para mostrar cadenas llenas de $ y &.
\begin{verbatim}
for i in range(3):
print("100% & $5") # nothing here is interpreted
\end{verbatim}Solo hay una regla que respetar: la cadena \end{verbatim} no debe aparecer dentro del entorno, porque LaTeX la interpreta como el final del entorno en cuanto la ve. Si de verdad necesitas mostrar el texto \end{verbatim}, cambia el terminador con fancyvrb, más abajo, o escapa ese fragmento con \verb.
Para insertar un pequeño fragmento verbatim en mitad de una línea, usa la forma en línea \verb. La receta: coloca un carácter delimitador justo después de \verb, luego el texto literal y después el mismo delimitador. El delimitador puede ser cualquier carácter no alfabético que no aparezca en el texto. Lo común es \verb|...|, pero si | aparece dentro, elige otro, como \verb!...! o \verb+...+. No pongas un espacio entre \verb y su delimitador.
The macro \verb|\textbf{...}| sets bold text, and
the pipe itself is shown with \verb!a|b! instead.La forma con estrella \verb* imprime los espacios internos como un carácter de espacio visible (␣), útil en ejemplos de código donde importa el número exacto de espacios. Del mismo modo, el entorno verbatim* muestra los espacios del bloque como ␣.
Dicho esto, si solo necesitas una cadena que suele contener ~, #, % o _, como una URL, \url{...} del paquete url o hyperref puede ser más cómodo, porque además corta la línea en puntos razonables.
Componer un archivo completo (\verbatiminput)
Para pegar tal cual el contenido de un archivo externo, el paquete verbatim (parte de las herramientas requeridas de LaTeX) ofrece \verbatiminput{filename}. Carga \usepackage{verbatim} en el preámbulo y escribe \verbatiminput{program.py} en el cuerpo; cada línea de ese archivo se compondrá verbatim. A diferencia de copiarlo a mano en el manuscrito, al editar el archivo fuente la salida se actualiza automáticamente, sin mantener código y documento sincronizados a mano.
\usepackage{verbatim}
% ...
\verbatiminput{hello.py}El mismo paquete verbatim añade también un entorno comment que omite todo entre \begin{comment} y \end{comment}. No es para salida literal, sino para *no imprimir* nada, útil para apartar temporalmente un borrador.
No puede ir dentro del argumento de un comando
Este es el tropiezo más común con verbatim. \verb y el entorno verbatim no pueden aparecer dentro del argumento de otro comando, por ejemplo en \section{\verb|code|}, una \footnote{...}, una celda de tabla o una \caption{...}. La razón son los códigos de categoría, catcodes, es decir, el papel asignado a cada carácter. \verb cambia los catcodes justo antes de leer su argumento, pero el argumento de un comando ya se convirtió en una lista de tokens con los catcodes normales en el momento de llamar al comando; la interpretación ya terminó antes de que \verb pueda cambiar nada. Escribirlo así normalmente da error.
Hay dos soluciones. Una es el paquete cprotect: basta con anteponer \cprotect al comando problemático y el verbatim dentro de su argumento pasa. Por ejemplo, escribe \cprotect\section{\verb"foo"}. También existe \cprotEnv para proteger el \begin de un entorno.
La otra es \SaveVerb / \UseVerb de fancyvrb, más abajo: un método en dos pasos donde primero guardas el texto verbatim con un nombre y luego solo llamas ese nombre dentro del argumento. Guarda con \SaveVerb{label}|verbatim text| y compón con \UseVerb{label}.
% Workaround 1: cprotect
\usepackage{cprotect}
\cprotect\section{The \verb|\foo| command}
% Workaround 2: fancyvrb SaveVerb / UseVerb
\usepackage{fancyvrb}
\SaveVerb{cmd}|\foo|
\section{The \UseVerb{cmd} command}Mantener comandos activos con alltt
En verbatim ordinario no puedes resaltar ni colorear solo una parte de un ejemplo de código, porque los comandos están desactivados. El paquete alltt (también parte de la distribución estándar de LaTeX) y su entorno alltt resuelven esto. alltt compone el texto monoespaciado y tal como se escribió, casi como verbatim, salvo que la barra inversa \ y las llaves { y } conservan su significado normal. Así obtienes un aspecto verbatim y aun puedes ejecutar comandos LaTeX dentro.
\usepackage{alltt}
% ...
\begin{alltt}
def \textbf{greet}(name):
return "Hi, " + name \textit{# a comment}
\end{alltt}En este ejemplo, el nombre de función greet se vuelve negrita y el comentario cursiva, mientras todo lo demás permanece exactamente como se escribió. La contrapartida es que, para imprimir literalmente los tres caracteres \, {, }, debes escribirlos como \textbackslash, \{, \}; el entorno verbatim los imprimiría directamente. Usa alltt cuando quieras añadir formato ligero a mano, y verbatim cuando todo deba salir realmente tal cual.
Números de línea y marcos con fancyvrb
El verbatim incorporado no ofrece ni números de línea ni marcos. La opción más capaz es el paquete fancyvrb, centrado en el entorno Verbatim con V mayúscula, distinto de verbatim en minúsculas. Puedes poner opciones por entorno como \begin{Verbatim}[key=value, ...], o globalmente desde el preámbulo con \fvset{key=value, ...}.
Las opciones más habituales: numbers=left o right añade números de línea, frame=single dibuja un marco alrededor de todo el bloque y fontsize=\small fija el tamaño de letra. Además, commandchars permite mantener algunos comandos activos dentro del texto que por lo demás es verbatim.
| Opción | Valores típicos | Qué hace |
|---|---|---|
numbers | none / left / right | Posición de los números de línea (por defecto none) |
frame | none / single / lines / leftline / topline / bottomline | Tipo de marco (por defecto none) |
fontsize | \small, \footnotesize, etc. | Tamaño de letra (por defecto igual al cuerpo) |
commandchars | p. ej. \\\{\} | Nombra el carácter de escape y los dos de agrupación, habilitando comandos |
El ejemplo siguiente es un bloque Verbatim con números de línea a la izquierda, un marco simple y una fuente algo más pequeña.
\usepackage{fancyvrb}
% ...
\begin{Verbatim}[numbers=left, frame=single, fontsize=\small]
def greet(name):
return "Hello, " + name
\end{Verbatim}Con commandchars=\\\{\}, los caracteres \, {, } actúan dentro del texto verbatim como escape y delimitadores de grupo, lo que permite insertar comandos de forma parecida a alltt. También existe \VerbatimInput[options]{filename} para incluir un archivo completo; a diferencia de \verbatiminput, acepta las opciones anteriores. Y mediante \SaveVerb / \UseVerb, visto antes, verbatim funciona incluso dentro de argumentos de comandos.
Una advertencia final: todo lo tratado aquí sirve para imprimir texto tal cual, no para resaltado sintáctico como colorear palabras clave. Para presentar código fuente con colores y formato, las herramientas adecuadas son el paquete especializado listings o minted, que usa Pygments de Python; se cubren en la página “Code listings”.