Listado de código fuente de LaTeX como en libros profesionales

329

¿Cómo debería ser una lista de código fuente de látex para producir una salida como en libros conocidos, por ejemplo, uno para Spring Framework? He intentado con el paquete de listados de látex, pero no pude producir algo que se viera tan bien como el siguiente. Así que estoy sumamente interesado en las instrucciones de formateo para producir algo como la muestra a continuación (del capítulo de muestra de Manning para Spring in Action ):

De la primavera de Manning en acción

EDITAR Con la ayuda especialmente de Tormod Fjeldskår, aquí está el fragmento completo para producir el aspecto deseado:

\usepackage{listings}
\usepackage{courier}
\lstset{
    basicstyle=\footnotesize\ttfamily, % Default font
    % numbers=left,              % Location of line numbers
    numberstyle=\tiny,          % Style of line numbers
    % stepnumber=2,              % Margin between line numbers
    numbersep=5pt,              % Margin between line numbers and text
    tabsize=2,                  % Size of tabs
    extendedchars=true,
    breaklines=true,            % Lines will be wrapped
    keywordstyle=\color{red},
    frame=b,
    % keywordstyle=[1]\textbf,
    % keywordstyle=[2]\textbf,
    % keywordstyle=[3]\textbf,
    % keywordstyle=[4]\textbf,   \sqrt{\sqrt{}}
    stringstyle=\color{white}\ttfamily, % Color of strings
    showspaces=false,
    showtabs=false,
    xleftmargin=17pt,
    framexleftmargin=17pt,
    framexrightmargin=5pt,
    framexbottommargin=4pt,
    % backgroundcolor=\color{lightgray},
    showstringspaces=false
}
\lstloadlanguages{ % Check documentation for further languages ...
     % [Visual]Basic,
     % Pascal,
     % C,
     % C++,
     % XML,
     % HTML,
     Java
}
% \DeclareCaptionFont{blue}{\color{blue}} 

% \captionsetup[lstlisting]{singlelinecheck=false, labelfont={blue}, textfont={blue}}
\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox[cmyk]{0.43, 0.35, 0.35,0.01}{\parbox{\textwidth}{\hspace{15pt}#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

Úselo con esto en su documento:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
fuente
Por favor sea más preciso. Para mí, el listado que publiqué "se parece a los libros profesionales" y "se ve tan bien" como el que publicaste.
Bastien Léonard
2
Utilice la muestra publicada en forma de captura de pantalla como resultado que quiero archivar.
Mork0075
8
En aras de la integridad, es posible que desee agregar \ usepackage {color} al texto que publicó. Me tomó un momento antes de notar que faltaba.
Robert Massaioli
1
¡Buen trabajo! Sin embargo, tuve que agregar \ usepackage {caption} y \ usepackage {graphics} y parece convertir comillas simples.
Hakunin
Hola mork, ¿dónde tengo que colocar el archivo fuente? En su ejemplo Hello.java
RoflcoptrException

Respuestas:

186

Me parece que lo que realmente quieres es personalizar el aspecto de los subtítulos. Esto se hace más fácilmente usando el captionpaquete. Para obtener instrucciones sobre cómo usar este paquete, consulte el manual (PDF) . Probablemente necesite crear su propio formato de subtítulos personalizado, como se describe en el capítulo 4 del manual.

Editar: Probado con MikTex:

\documentclass{report}

\usepackage{color}
\usepackage{xcolor}
\usepackage{listings}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
public void here() {
    goes().the().code()
}
\end{lstlisting}

\end{document}

Resultado:

Avance

Tormod Fjeldskår
fuente
1
Me gustaría redefinir el formato de subtítulos solo para cosas en la sección \ lstinputlisting (algo así como myCaption). ¿Tienes alguna pista de cómo hacerlo?
Mork0075
1
Try / captionsetup [lstlisting] {your options}
Tormod Fjeldskår
Esto funciona muy bien, gracias. ¿Tienes una idea de cómo realizar el fondo gris detrás del título (como en mi muestra de publicaciones iniciales)? No puedo encontrar nada en la documentación.
Mork0075
Creo que \ colorbox {grey} {\ parbox {\ textwidth} {\ textcolor {white} {text goes here}}} estaría en algún lugar cerca de su muestra de publicación inicial.
Tormod Fjeldskår
2
Esto se ve bien, pero mi cuadro de subtítulos se sangra (no el texto, el cuadro en sí). No sé por qué, ya que el listado tampoco está sangrado.
Johan
49

Estoy contento con el listingspaquete:

Ejemplo de listado

Así es como lo configuro:

\lstset{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=tb,
columns=fullflexible,
showstringspaces=false
}

Lo uso así:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Bastien Léonard
fuente
1
@lamba: si no recuerdo mal, le dice a Latex que lo coloque en la parte superior de la página.
Bastien Léonard
77
Urgh, los listados en fuente proporcional son muy feos. (Además, por razones culturales, son difíciles de leer para algunas personas (al menos para muchos japoneses, tal vez también para otros asiáticos).)
mirabilos
1
@mirabilos: sí, creo que lo cambié más tarde. Se veía bien en este listado, pero no en otros con más sangría / anidamiento.
Bastien Léonard
32

Y por favor, haga lo que haga, configure el paquete de listados para usar una fuente de ancho fijo (como en su ejemplo; encontrará la opción en la documentación). La configuración predeterminada utiliza el tipo de letra proporcional en una cuadrícula, que es, en mi humilde opinión, increíblemente feo e ilegible, como se puede ver en las otras respuestas con imágenes. Personalmente, estoy muy irritado cuando debo leer algunos tipos de códigos en una fuente proporcional.

Intente configurar la fuente de ancho fijo con esto:

\lstset{basicstyle=\ttfamily}
zvrba
fuente
3
Personalmente uso columnas = fullflexible con basicstyle = \ small \ sffamily, como en el ejemplo que publiqué anteriormente. Los personajes no están alineados verticalmente, pero creo que se ven mejor que con \ ttfamily. ¿Le parece fea la muestra que publiqué arriba?
Bastien Léonard el
Su ejemplo particular se ve bien. Sin embargo, lo odiaría con las declaraciones compuestas anidadas donde una sangría adecuada (alineación de columna) es de gran ayuda para ver el alcance de una declaración compuesta (bloque {}).
zvrba el
Estaba pensando lo mismo, pero hasta ahora todos mis listados se veían bien.
Bastien Léonard el
Ok, me has convencido, intentaré tu configuración una vez :-)
zvrba
1
Las declaraciones compuestas anidadas son una pista falsa. Como todas las hendiduras consisten en espacios, las hendiduras se alinearán independientemente del ancho de otros caracteres.
jwg
27

Me pregunto por qué nadie mencionó el paquete Minted . Tiene mucho mejor resaltado de sintaxis que el paquete de listado LaTeX. Utiliza pigmentos .

$ pip install Pygments

Ejemplo en LaTeX:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{minted}

\begin{document}
\begin{minted}{python}
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #to become the incidence matrix
    VT = np.zeros((n*m,1), int)  #dummy variable

    #compute the bitwise xor matrix
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1) 

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{minted}
\end{document}

Lo que resulta en:

ingrese la descripción de la imagen aquí

-shell-escapeDebe usar la bandera con el comando pdflatex.

Para más información: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Hans Ott
fuente
2
+1. Minted es EL paquete para componer el código fuente en LaTeX. No solo es fácil de usar, rico en funciones y bien documentado, sino que tampoco tiene problemas con los caracteres Unicode en el código fuente (a diferencia listings).
ScumCoder
¡Dios mío! ¡Mucho mejor! Muchas gracias por la sugerencia.
Dmitry Zotikov
21

Prueba el listingspaquete. Aquí hay un ejemplo de lo que usé hace algún tiempo para tener una lista de Java en color:

\usepackage{listings}

[...]

\lstset{language=Java,captionpos=b,tabsize=3,frame=lines,keywordstyle=\color{blue},commentstyle=\color{darkgreen},stringstyle=\color{red},numbers=left,numberstyle=\tiny,numbersep=5pt,breaklines=true,showstringspaces=false,basicstyle=\footnotesize,emph={label}}

[...]

\begin{lstlisting}
public void here() {
    goes().the().code()
}

[...]

\end{lstlisting}

Es posible que desee personalizar eso. Hay varias referencias del paquete de listados. Solo googlealos.

Markus
fuente
Gracias. Todavía estoy al tanto del paquete de listados, pero no puedo formatear como mi muestra. Esta es la verdadera pregunta.
Mork0075
9

Eche un vistazo al algorithmspaquete, especialmente al algorithmmedio ambiente.

avakar
fuente
1
Gracias. Este paquete parece ser muy fuerte en una discusión más teórica sobre el algoritmo, lo sé por muchos libros de matemáticas. Pero no voy a enfatizar esto tanto (requisitos previos, si, de lo contrario), me gustaría tener un formato como el anterior.
Mork0075
44
Solo hablaba del algorithmmedio ambiente, no algorithmic. algorithmes un contenedor flotante, que se ve muy bien. Puedes poner lo que quieras dentro, incluso el listinghilo mencionado.
avakar
8

Hay varias otras cosas que puede hacer, como seleccionar nuevas fuentes:

\documentclass[10pt,a4paper]{article}
% ... lots of packages e.g. babel, microtype, fontenc, inputenc &c.
\usepackage{color}    % Leave this out if you care about B/W printing, obviously.
\usepackage{upquote}  % Turns curly quotes in verbatim text into straight quotes. 
                      % People who have to copy/paste code from the PDF output 
                      % will love you for this. Or perhaps more accurately: 
                      % They will not hate you/hate you less.
\usepackage{beramono} % Or some other package that provides a fixed width font. q.v.
                      % http://www.tug.dk/FontCatalogue/typewriterfonts.html
\usepackage{listings} 
\lstset {                 % A rudimentary config that shows off some features.
    language=Java,
    basicstyle=\ttfamily, % Without beramono, we'd get cmtt, the teletype font.
    commentstyle=\textit, % cmtt doesn't do italics. It might do slanted text though.
    \keywordstyle=        % Nor does cmtt do bold text.
        \color{blue}\bfseries,
    \tabsize=4            % Or whatever you use in your editor, I suppose.
}
\begin{document} 
\begin{lstlisting}
public final int ourAnswer() { return 42; /* Our final answer */ }
\end{lstlisting} 
\end{document}
kahen
fuente
2
Creo que en \ keywordstyle y \ tabsize la barra invertida debería eliminarse ya que no funcionaría de esta manera. Sin embargo, muy útil!
Xiphias
2

Para el código R yo uso

\usepackage{listings}
\lstset{
language=R,
basicstyle=\scriptsize\ttfamily,
commentstyle=\ttfamily\color{gray},
numbers=left,
numberstyle=\ttfamily\color{gray}\footnotesize,
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
tabsize=2,
captionpos=b,
breaklines=true,
breakatwhitespace=false,
title=\lstname,
escapeinside={},
keywordstyle={},
morekeywords={}
}

Y se ve exactamente así

ingrese la descripción de la imagen aquí

pachamaltese
fuente