LaTeX-Quellcode-Auflistung wie in professionellen Büchern

329

Wie sollte eine Latex-Quellcodeliste aussehen, um eine Ausgabe wie in bekannten Büchern zu erzeugen, beispielsweise eine für das Spring Framework? Ich habe es mit dem Latex-Listing-Paket versucht, konnte aber nichts produzieren, das so gut aussah wie das folgende. Daher interessieren mich vor allem die Formatierungsanweisungen, um so etwas wie das folgende Beispiel zu erstellen (aus Mannings Beispielkapitel für Spring in Action ):

Aus Mannings Frühling in Aktion

BEARBEITEN Mit Hilfe von Tormod Fjeldskår finden Sie hier den vollständigen Ausschnitt, um den gewünschten Look zu erzielen:

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

Verwenden Sie es damit in Ihrem Dokument:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
quelle
Bitte seien Sie genauer. Für mich sieht die Liste, die ich gepostet habe, "sieht aus wie in professionellen Büchern" und "sieht genauso gut aus" wie die, die Sie gepostet haben.
Bastien Léonard
2
Bitte verwenden Sie das Beispiel in Form eines Screenshots als Ergebnis, das ich erzielen möchte.
Mork0075
8
Der Vollständigkeit halber möchten Sie möglicherweise \ usepackage {color} zu dem von Ihnen geposteten Text hinzufügen. Es dauerte einen Moment, bis ich bemerkte, dass es fehlte.
Robert Massaioli
1
Gute Arbeit! Ich musste jedoch \ usepackage {caption} und \ usepackage {graphics} hinzufügen und es scheint einfache Anführungszeichen zu konvertieren.
Hakunin
Hallo Mork, wo muss ich die Quelldatei ablegen? In Ihrem Beispiel Hello.java
RoflcoptrException

Antworten:

186

Es scheint mir, dass Sie wirklich das Aussehen der Bildunterschriften anpassen möchten. Dies ist am einfachsten mit dem captionPaket möglich. Anweisungen zur Verwendung dieses Pakets finden Sie im Handbuch (PDF) . Sie müssten wahrscheinlich Ihr eigenes benutzerdefiniertes Beschriftungsformat erstellen, wie in Kapitel 4 im Handbuch beschrieben.

Edit: Getestet mit 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}

Ergebnis:

Vorschau

Tormod Fjeldskår
quelle
1
Ich möchte das Beschriftungsformat nur für Dinge im Abschnitt \ lstinputlisting neu definieren (so etwas wie myCaption). Hast du einen Hinweis, wie das geht?
Mork0075
1
Try / captionsetup [lstlisting] {Ihre Optionen}
Tormod Fjeldskår
Das funktioniert super, danke. Haben Sie eine Idee, wie Sie den grauen Hintergrund hinter der Beschriftung erkennen können (wie in meinem Beispiel für die ersten Beiträge)? Kann nichts in der Dokumentation finden.
Mork0075
Ich denke, \ colorbox {grey} {\ parbox {\ textwidth} {\ textcolor {white} {Text geht hierher}}} würde sich irgendwo in der Nähe Ihres ersten Post-Beispiels befinden.
Tormod Fjeldskår
2
Das sieht gut aus, aber mein Beschriftungsfeld wird eingerückt (nicht der Text, das Feld selbst). Ich weiß nicht warum, da die Auflistung auch nicht eingerückt ist.
Johan
49

Ich bin mit dem listingsPaket zufrieden :

Listing Beispiel

So konfiguriere ich es:

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

Ich benutze es so:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Bastien Léonard
quelle
1
@lamba: Wenn ich mich richtig erinnere, weist es Latex an, es oben auf der Seite zu platzieren.
Bastien Léonard
7
Urgh, Einträge in proportionaler Schrift sind so massiv hässlich. (Außerdem sind sie aus kulturellen Gründen für einige (zumindest viele Japaner, vielleicht auch andere Asiaten) schwer zu lesen.)
mirabilos
1
@mirabilos: Ja, ich glaube ich habe es später geändert. In dieser Auflistung sah es in Ordnung aus, aber in anderen mit mehr Einrückung / Verschachtelung überhaupt nicht.
Bastien Léonard
32

Und bitte konfigurieren Sie das Listings-Paket für die Verwendung von Schriftarten mit fester Breite (wie in Ihrem Beispiel; die Option finden Sie in der Dokumentation). Die Standardeinstellung verwendet einen proportionalen Schriftsatz in einem Raster, der meiner Meinung nach unglaublich hässlich und unlesbar ist, wie aus den anderen Antworten mit Bildern hervorgeht. Ich persönlich bin sehr irritiert, wenn ich einen Code-Satz in einer proportionalen Schriftart lesen muss.

Versuchen Sie, die Schriftart mit fester Breite folgendermaßen einzustellen:

\lstset{basicstyle=\ttfamily}
zvrba
quelle
3
Ich persönlich benutze Spalten = vollflexibel mit basicstyle = \ small \ sffamily, wie in dem Beispiel, das ich oben gepostet habe. Die Zeichen sind nicht vertikal ausgerichtet, aber ich denke, sie sehen besser aus als mit \ ttfamily. Finden Sie das Beispiel, das ich oben gepostet habe, hässlich?
Bastien Léonard
Ihr spezielles Beispiel sieht gut aus. Ich würde es jedoch mit verschachtelten zusammengesetzten Anweisungen hassen, bei denen ein korrekter Einzug (Spaltenausrichtung) eine große Hilfe ist, um das Ausmaß einer zusammengesetzten Anweisung ({} Block) zu erkennen.
Zvrba
Ich dachte das Gleiche, aber bisher sahen alle meine Angebote gut aus.
Bastien Léonard
Ok, du hast mich überzeugt, ich werde dein Setup einmal versuchen :-)
zvrba
1
Verschachtelte zusammengesetzte Aussagen sind ein roter Hering. Da die Einrückungen alle aus Leerzeichen bestehen, werden die Einrückungen unabhängig von der Breite anderer Zeichen ausgerichtet.
JWG
27

Ich frage mich, warum niemand das Minted- Paket erwähnt hat. Es hat eine weitaus bessere Syntaxhervorhebung als das LaTeX-Listenpaket. Es verwendet Pylements .

$ pip install Pygments

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

Was in ... resultiert:

Geben Sie hier die Bildbeschreibung ein

Sie müssen das Flag -shell-escapemit dem Befehl pdflatex verwenden.

Für weitere Informationen: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Hans Ott
quelle
2
+1. Minted ist DAS Paket zum Setzen von Quellcode in LaTeX. Es ist nicht nur einfach zu bedienen, reich an Funktionen und gut dokumentiert, sondern es hat auch keine Probleme mit Unicode-Zeichen im Quellcode (im Gegensatz zu listings).
ScumCoder
Meine Güte! So viel besser! Vielen Dank für den Vorschlag.
Dmitry Zotikov
21

Probieren Sie das listingsPaket aus. Hier ist ein Beispiel dafür, was ich vor einiger Zeit verwendet habe, um eine farbige Java-Liste zu erstellen:

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

Vielleicht möchten Sie das anpassen. Es gibt mehrere Referenzen des Listings-Pakets. Google sie einfach.

Markus
quelle
Vielen Dank. Ich kenne das Listings-Paket immer noch, kann es aber nicht wie mein Beispiel formatieren. Das ist die eigentliche Frage.
Mork0075
9

Schauen Sie sich das algorithmsPaket an, insbesondere die algorithmUmwelt.

Avakar
quelle
1
Vielen Dank. Dieses Paket scheint sehr stark in der theoretischen Algirthm-Diskussion zu sein, ich kenne es aus vielen Mathematikbüchern. Aber ich werde dies nicht so sehr betonen (Voraussetzungen, wenn sonst), ich hätte gerne eine Formatierung wie die oben.
Mork0075
4
Ich habe nur über die algorithmUmwelt gesprochen, nicht algorithmic. algorithmist ein schwimmender Container, der ziemlich gut aussieht. Sie können alles listinghineinstecken , was Sie möchten , sogar den erwähnten elsethread.
Avakar
8

Sie können verschiedene andere Dinge tun, z. B. die Auswahl neuer Schriftarten:

\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
quelle
2
Ich glaube, dass in \ keywordstyle und \ tabsize der Backslash entfernt werden sollte, da dies nicht funktionieren würde. Trotzdem sehr hilfreich!
Xiphias
2

Für R-Code verwende ich

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

Und genau so sieht es aus

Geben Sie hier die Bildbeschreibung ein

Pachamaltese
quelle