Insertar código en este documento LaTeX con sangría

427

¿Cómo inserto código en un documento de LaTeX? ¿Hay algo como:

\begin{code}## Heading ##
...
\end{code}

Lo único que realmente necesito es una sangría y una fuente de ancho fijo. El resaltado de sintaxis podría ser bueno, aunque definitivamente no es obligatorio.

Sixtyfootersdude
fuente
No es un duplicado exacto, pero las respuestas cubren el mismo terreno: consulte stackoverflow.com/questions/741985/…
Charles Stewart el
También tengo una pregunta de seguimiento aquí: stackoverflow.com/questions/3408996/…
sixtyfootersdude

Respuestas:

631

Usar listingspaquete.

Configuración simple para el encabezado LaTeX (antes \begin{document}):

\usepackage{listings}
\usepackage{color}

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\lstset{frame=tb,
  language=Java,
  aboveskip=3mm,
  belowskip=3mm,
  showstringspaces=false,
  columns=flexible,
  basicstyle={\small\ttfamily},
  numbers=none,
  numberstyle=\tiny\color{gray},
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  breaklines=true,
  breakatwhitespace=true,
  tabsize=3
}

Puede cambiar el idioma predeterminado en el medio del documento con \lstset{language=Java}.

Ejemplo de uso en el documento:

\begin{lstlisting}
// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;

public class Hello extends JApplet {
    public void paintComponent(Graphics g) {
        g.drawString("Hello, world!", 65, 95);
    }    
}
\end{lstlisting}

Aquí está el resultado:

Imagen de ejemplo

Cloudanger
fuente
3
Tengo una pregunta de seguimiento relacionada con su código. Echa un vistazo si tienes la oportunidad: stackoverflow.com/questions/3408996/…
sixtyfootersdude
1
¿Hay alguna manera de reducir el espacio entre líneas de código?
sukhvir el
¿Es posible agregar texto pequeño debajo del fragmento de código, similar al texto escrito debajo de una figura en Latex?
Brian J
@ Brian, no estoy al tanto de eso. Quizás tener el código dentro de a figurepodría lograr el efecto.
Cloudanger
¡Escuché que este paquete ahora está obsoleto!
xxx ---
165

También podría usar el entorno literal

\begin{verbatim}
your
code
example
\end{verbatim}
midtiby
fuente
57
Hay un problema con el uso de pestañas dentro del entorno literal. Si las pestañas se convierten en "espacio", el problema desaparece.
midtiby
1
Esto es bueno para mostrar contenidos de archivos de texto de ejemplo (por ejemplo, datos textuales para ser leídos / procesados ​​por un programa).
nalyd88
Para el artículo de dos columnas, no maneja bien los márgenes.
Sazzad Hissain Khan
115

Aquí se explica cómo agregar código en línea:

Puede agregar código en línea con {\tt code }o \texttt{ code }. Si desea formatear el código en línea, entonces sería mejor hacer su propio comando

\newcommand{\code}[1]{\texttt{#1}}

Además, tenga en cuenta que los bloques de código se pueden cargar desde otros archivos con

\lstinputlisting[breaklines]{source.c}

breaklinesno es obligatorio, pero lo encuentro útil. Tenga en cuenta que tendrá que especificar \usepackage{ listados } para este.

Actualización: el paquete de listados también incluye el \lstinlinecomando, que tiene las mismas características de resaltado de sintaxis que los comandos \lstlistingy \lstinputlisting(consulte la respuesta de Cloudanger para obtener detalles de configuración). Como se menciona en algunas otras respuestas, también está el paquete acuñado, que proporciona el \mintinlinecomando. Al igual que \lstinline, \mintinlineproporciona el mismo resaltado de sintaxis que un bloque de código acuñado regular:

\documentclass{article}

\usepackage{minted}

\begin{document}
  This is a sentence with \mintinline{python}{def inlineCode(a="ipsum)}
\end{document}
alan
fuente
1
¿Hay alguna forma mejor para el código en línea que activa los colores de palabras clave, etc.?
nano
Si. He actualizado mi respuesta para discutirlos.
alan
¿Cómo insertar espaciado / pestañas para que parezca más legible?
Charlie Parker
32

Los paquetes especializados como minted, que se basa en Pygments para realizar el formateo, ofrecen varias ventajas sobre el listingspaquete. Para citar del mintedmanual,

Pygments proporciona resaltado de sintaxis muy superior en comparación con los paquetes convencionales. Por ejemplo, los listados básicamente solo resaltan cadenas, comentarios y palabras clave. Los pigmentos, por otro lado, se pueden personalizar completamente para resaltar cualquier tipo de token que el idioma de origen pueda admitir. Esto podría incluir secuencias de formato especiales dentro de cadenas, números, diferentes tipos de identificadores y construcciones exóticas como etiquetas HTML.

Philipp
fuente
1
He intentado acuñar, la documentación es bastante sencilla. El estilo predeterminado es bastante bueno.
user2262504
55
Esta puede ser una solución insatisfactoria para muchos usuarios, debido a la llamada externa requerida a Pygmentsic. En particular, el requisito de llamar al látex con la -shell-escapedirectiva es, en el mejor de los casos, una modificación menor a los sistemas de compilación existentes y, en el peor, incompatible con las preferencias de seguridad de algunos usuarios.
KDN
12

Use Minted .

Es un paquete que facilita el resaltado de sintaxis expresiva en LaTeX utilizando la potente biblioteca Pygments . El paquete también proporciona opciones para personalizar la salida del código fuente resaltado usando fancyvrb .

¡Es mucho más evolucionado y personalizable que cualquier otro paquete!

Oussama L.
fuente
Sin embargo, como ya se mencionó en una respuesta similar, -shell-escapepodría ser una mierda para algunas personas.
Egor Hans
8

Trabajos acuñados en Overleaf , TeX Live y MiKTeX.

Ejemplo:

\documentclass{article}
\usepackage{minted}
\begin{document}

\begin{minted}[mathescape, linenos]{python}

# Note: $\pi=\lim_{n\to\infty}\frac{P_n}{d}$
title = "Hello World"

sum = 0
for i in range(10):
 sum += i

\end{minted}

\end{document}

Salida:

ingrese la descripción de la imagen aquí

Shital Shah
fuente
6

Como todavía no se mencionó aquí, puede valer la pena agregar una opción más, paquete spverbatim(sin resaltado de sintaxis):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

\begin{spverbatim}
  Your code here
\end{spverbatim}

\end{document}

Además, si no se requiere resaltar la sintaxis, empaquete alltt:

\documentclass{article}
\usepackage{alltt}

\begin{document}

\begin{alltt}
  Your code here
\end{alltt}

\end{document}
MattAllegro
fuente
1
Esto es más o menos lo que quiero, pero parece que no puedo sangrar con pestañas. ¿Cómo sangra / hay un paquete similar que permita una sangría más fácil?
Darokrithia
1
@Darokrithia Edité mi respuesta: ¿puedes verificar / confrontar la sangría? :)
MattAllegro
1
No parece funcionar. Puedo enviarle el código que estoy usando, pero el formato se destruye en los comentarios. Por cierto, utilicé una respuesta diferente y funcionó bien, pero siento que esto aún debería repararse para futuros lectores.
Darokrithia