Elenco dei codici sorgente LaTeX come nei libri professionali


329

Come dovrebbe apparire un elenco di codici sorgente in lattice per produrre un output come nei libri noti, ad esempio uno per il Spring Framework? Ho provato con il pacchetto di elenchi in lattice ma non sono stato in grado di produrre qualcosa che fosse bello come quello qui sotto. Quindi sono principalmente interessato alle istruzioni di formattazione per produrre qualcosa di simile all'esempio seguente (dal capitolo di esempio di Manning per Spring in Action ):

Dalla primavera in azione di Manning

EDIT Con l'aiuto soprattutto di Tormod Fjeldskår ecco lo snippet completo per produrre l'aspetto desiderato:

\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}}

Usalo con questo nel tuo documento:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}

Per favore, sii più preciso. Per me la lista che ho pubblicato "sembra nei libri professionali" e "sembra bella" come quella che hai pubblicato.
Bastien Léonard,

2
Si prega di utilizzare l'esempio pubblicato sotto forma di uno screenshot come risultato che voglio archiviare.
Mork0075,

8
Per completezza, potresti voler aggiungere \ usepackage {color} al tex che hai pubblicato. Mi ci è voluto un attimo prima di notare che mancava.
Robert Massaioli,

1
Ottimo lavoro! Ho dovuto aggiungere \ usepackage {caption} e \ usepackage {graphics} e sembra convertire le virgolette singole.
Hakunin,

Ciao mork, dove devo posizionare il file sorgente? Nel tuo esempio Hello.java
RoflcoptrException

Risposte:


186

Mi sembra che quello che vuoi davvero sia personalizzare l'aspetto delle didascalie. Questo è più facile usando il captionpacchetto. Per istruzioni su come utilizzare questo pacchetto, consultare il manuale (PDF) . Probabilmente dovrai creare il tuo formato di didascalia personalizzato, come descritto nel capitolo 4 del manuale.

Modifica: testato 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}

Risultato:

Anteprima


1
Vorrei ridefinire il formato della didascalia solo per le cose nella sezione \ lstinputlisting (qualcosa come myCaption). Hai qualche idea su come farlo?
Mork0075,

1
Try / captionsetup [lstlisting] {your options}
Tormod Fjeldskår

Funziona benissimo, grazie. Hai idea di come realizzare lo sfondo grigio dietro la didascalia (come nell'esempio dei miei post iniziali)? Non riesco a trovare nulla nella documentazione.
Mork0075,

Penso che \ colorbox {gray} {\ parbox {\ textwidth} {\ textcolor {white} {il testo va qui}}} sarebbe da qualche parte vicino al tuo campione iniziale di post.
Tormod Fjeldskår,

2
Sembra carino, ma la mia casella della didascalia viene indentata (non il testo, la casella stessa). Non so perché, dal momento che l'elenco non è nemmeno rientrato.
Johan

49

Sono contento del listingspacchetto:

Esempio di elenco

Ecco come lo configuro:

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

Lo uso così:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}

1
@lamba: se ricordo bene, dice a Latex di posizionarlo nella parte superiore della pagina.
Bastien Léonard,

7
Urgh, gli elenchi in carattere proporzionale sono così brutti in modo massiccio. (Inoltre, per motivi culturali, sono difficili da leggere per alcuni (almeno molti giapponesi, forse anche altri asiatici).)
mirabilos,

1
@mirabilos: sì, penso di averlo cambiato in seguito. Sembrava OK su questo elenco, ma non su altri con più rientri / annidamenti.
Bastien Léonard,

32

E per favore, qualunque cosa tu faccia, configura il pacchetto di elenchi per usare caratteri a larghezza fissa (come nel tuo esempio; troverai l'opzione nella documentazione). L'impostazione predefinita utilizza un tipo di carattere proporzionale su una griglia, che è, IMHO, incredibilmente brutta e illeggibile, come si può vedere dalle altre risposte con le immagini. Personalmente sono molto irritato quando devo leggere alcuni tipi di codice in un carattere proporzionale.

Prova a impostare caratteri a larghezza fissa con questo:

\lstset{basicstyle=\ttfamily}

3
Personalmente uso le colonne = fullflessible con basicstyle = \ small \ sffamily, come nell'esempio che ho pubblicato sopra. I personaggi non sono allineati verticalmente, ma penso che abbiano un aspetto migliore rispetto a \ ttfamily. Trovi brutto il campione che ho pubblicato sopra?
Bastien Léonard,

Il tuo esempio particolare sembra a posto. Tuttavia, lo odierei con istruzioni composte nidificate in cui una corretta rientranza (allineamento delle colonne) è di grande aiuto per vedere l'estensione di un'istruzione composta (blocco {}).
zvrba,

Stavo pensando la stessa cosa, ma finora tutte le mie inserzioni sembravano buone.
Bastien Léonard,

Ok, mi hai convinto, proverò il tuo setup una volta :-)
zvrba

1
Le istruzioni composte nidificate sono un'aringa rossa. Poiché le rientranze sono tutte costituite da spazi, le rientranze si allineeranno indipendentemente dalla larghezza degli altri caratteri.
jwg

27

Mi chiedo perché nessuno abbia menzionato il pacchetto Minted . Ha una migliore evidenziazione della sintassi rispetto al pacchetto di elenchi LaTeX. Usa Pygments .

$ pip install Pygments

Esempio in 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}

Che si traduce in:

inserisci qui la descrizione dell'immagine

Devi usare il flag -shell-escapecon il comando pdflatex.

Per maggiori informazioni: https://www.sharelatex.com/learn/Code_Highlighting_with_minted


2
+1. Minted è IL pacchetto per la composizione del codice sorgente in LaTeX. Non solo è facile da usare, ricco di funzionalità e ben documentato, ma non ha problemi con i caratteri Unicode nel codice sorgente (a differenza listings).
ScumCoder

Mamma mia! Molto meglio! Grazie mille per il suggerimento.
Dmitry Zotikov il

21

Prova il listingspacchetto. Ecco un esempio di quello che ho usato qualche tempo fa per avere un elenco Java colorato:

\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}

Potresti volerlo personalizzare. Esistono diversi riferimenti al pacchetto di elenchi. Basta cercarli su Google.


Grazie. Sono ancora a conoscenza del pacchetto di elenchi, ma non riesco a formattare come il mio campione. Questa è la vera domanda.
Mork0075,

9

Dai un'occhiata al algorithmspacchetto, in particolare l' algorithmambiente.


1
Grazie. Questo pacchetto sembra essere molto forte in discussioni algirthm più teoriche, lo so da molti libri di matematica. Ma non lo sottolineerò così tanto (prerequsites, if, else), vorrei avere una formattazione come quella sopra.
Mork0075,

4
Stavo solo parlando algorithmdell'ambiente, non algorithmic. algorithmè un contenitore galleggiante, che sembra piuttosto carino. Puoi inserire qualsiasi cosa desideri, anche il listingcitato elsethread.
avakar,

8

Ci sono molte altre cose che puoi fare, come la selezione di nuovi caratteri:

\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}

2
Credo che in \ keywordstyle e \ tabsize la barra rovesciata debba essere rimossa perché non funzionerebbe in questo modo. Tuttavia molto utile!
Xifia,

2

Per il codice R che 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={}
}

E sembra esattamente così

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.