Liste de code source LaTeX comme dans les livres professionnels


329

À quoi devrait ressembler une liste de code source en latex pour produire une sortie comme dans les livres connus, par exemple une pour Spring Framework? J'ai essayé avec le package d'annonces en latex, mais je n'ai pas pu produire quelque chose d'aussi beau que celui ci-dessous. Je suis donc principalement intéressé par les instructions de formatage pour produire quelque chose comme l'exemple ci-dessous (à partir du chapitre d'exemple de Manning pour Spring in Action ):

Du printemps de Manning en action

EDIT Avec l'aide en particulier de Tormod Fjeldskår, voici l'extrait complet pour produire le look souhaité:

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

Utilisez-le avec ceci dans votre document:

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

Veuillez être plus précis. Pour moi, la liste que j'ai publiée «ressemble à des livres professionnels» et «est aussi belle» que celle que vous avez publiée.
Bastien Léonard

2
Veuillez utiliser l'exemple publié sous forme de capture d'écran comme résultat que je souhaite archiver.
Mork0075

8
Par souci d'exhaustivité, vous souhaiterez peut-être ajouter \ usepackage {color} au texte que vous avez publié. Cela m'a pris un moment avant de remarquer qu'il manquait.
Robert Massaioli

1
Bon travail! J'ai toutefois dû ajouter \ usepackage {caption} et \ usepackage {graphics} et il semble convertir des guillemets simples.
hakunin

Salut mork où dois-je placer le fichier source? Dans votre exemple Hello.java
RoflcoptrException

Réponses:


186

Il me semble que ce que vous voulez vraiment, c'est personnaliser l'apparence des légendes. Cela est plus facile à faire en utilisant le captionpackage. Pour obtenir des instructions sur l'utilisation de ce package, consultez le manuel (PDF) . Vous devrez probablement créer votre propre format de légende personnalisé, comme décrit dans le chapitre 4 du manuel.

Edit: Testé avec 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}

Résultat:

Aperçu


1
Je voudrais redéfinir le format des sous-titres uniquement pour les éléments de la section \ lstinputlisting (quelque chose comme myCaption). Avez-vous une idée de comment faire cela?
Mork0075

1
Essayez / captionsetup [lstlisting] {vos options}
Tormod Fjeldskår

Cela fonctionne très bien, merci. Avez-vous une idée de la façon de réaliser le fond gris derrière la légende (comme dans mon échantillon de messages initial)? Impossible de trouver quoi que ce soit dans la documentation.
Mork0075

Je pense que \ colorbox {gray} {\ parbox {\ textwidth} {\ textcolor {white} {text va ici}}} serait quelque part près de votre échantillon de publication initial.
Tormod Fjeldskår

2
Cela a l'air bien, mais ma zone de légende est en retrait (pas le texte, la zone elle-même). Je ne sais pas pourquoi, car la liste n'est pas non plus en retrait.
Johan

49

Je suis content du listingspackage:

Exemple de listing

Voici comment je le configure:

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

Je l'utilise comme ceci:

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

1
@lamba: si je me souviens bien, il dit à Latex de le placer en haut de la page.
Bastien Léonard

7
Urgh, les listes en police proportionnelle sont tellement laides. (De plus, pour des raisons culturelles, ils sont difficiles à lire pour certaines personnes (au moins beaucoup de japonais, peut-être aussi d'autres asiatiques).)
mirabilos

1
@mirabilos: oui, je pense que je l'ai changé plus tard. Cela semblait correct sur cette liste, mais pas du tout sur les autres avec plus d'indentation / d'imbrication.
Bastien Léonard

32

Et s'il vous plaît, quoi que vous fassiez, configurez le package d'annonces pour utiliser une police à largeur fixe (comme dans votre exemple; vous trouverez l'option dans la documentation). Le paramètre par défaut utilise un jeu de polices proportionnel sur une grille, ce qui est, à mon humble avis, incroyablement laid et illisible, comme on peut le voir dans les autres réponses avec des images. Je suis personnellement très irrité quand je dois lire un type de code dans une police proportionnelle.

Essayez de définir une police à largeur fixe avec ceci:

\lstset{basicstyle=\ttfamily}

3
J'utilise personnellement colonnes = fullflexible avec basicstyle = \ small \ sffamily, comme dans l'exemple que j'ai posté ci-dessus. Les personnages ne sont pas alignés verticalement, mais je pense qu'ils sont plus beaux qu'avec \ ttfamily. Trouvez-vous que l'échantillon que j'ai publié ci-dessus est moche?
Bastien Léonard

Votre exemple particulier semble bien. Cependant, je détesterais cela avec des instructions composées imbriquées où une indentation appropriée (alignement des colonnes) est d'une grande aide pour voir l'étendue d'une instruction composée (bloc {}).
zvrba

Je pensais la même chose, mais jusqu'à présent, toutes mes annonces étaient bonnes.
Bastien Léonard

Ok, vous m'avez convaincu, je vais essayer votre configuration une fois :-)
zvrba

1
Les instructions composites imbriquées sont un hareng rouge. Étant donné que les indentations sont toutes constituées d'espaces, les indentations s'alignent quelle que soit la largeur des autres caractères.
jwg

27

Je me demande pourquoi personne n'a mentionné le paquet Minted . Il a une bien meilleure mise en évidence de la syntaxe que le package de listes LaTeX. Il utilise des Pygments .

$ pip install Pygments

Exemple dans 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}

Ce qui se traduit par:

entrez la description de l'image ici

Vous devez utiliser l'indicateur -shell-escapeavec la commande pdflatex.

Pour plus d'informations: https://www.sharelatex.com/learn/Code_Highlighting_with_minted


2
+1. Minted est LE package pour la composition du code source dans LaTeX. Non seulement il est facile à utiliser, riche en fonctionnalités et bien documenté, mais il n'a également aucun problème avec les caractères Unicode dans le code source (contrairement listings).
ScumCoder

Mon Dieu! Tellement mieux! Merci beaucoup pour la suggestion.
Dmitry Zotikov

21

Essayez le listingspackage. Voici un exemple de ce que j'ai utilisé il y a quelque temps pour avoir une liste Java colorée:

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

Vous voudrez peut-être personnaliser cela. Il existe plusieurs références du package d'annonces. Il suffit de les rechercher sur Google.


Merci. Je suis toujours au courant du package d'annonces, mais pas en mesure de formater comme mon échantillon. Telle est la vraie question.
Mork0075

9

Jetez un oeil à l' algorithmsemballage, en particulier l' algorithmenvironnement.


1
Merci. Ce paquet semble être très fort dans la discussion d'algirthm plus théorique, je le connais de nombreux livres de mathématiques. Mais je ne soulignerai pas tellement cela (pré-sites, si, sinon), je voudrais avoir un formatage comme celui ci-dessus.
Mork0075

4
Je ne parlais que de l' algorithmenvironnement, non algorithmic. algorithmest un conteneur flottant, qui a l'air plutôt joli. Vous pouvez mettre tout ce que vous voulez à l'intérieur, même le listingfil Elsa mentionné.
avakar

8

Vous pouvez effectuer plusieurs autres actions, telles que la sélection de nouvelles polices:

\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
Je crois que dans \ keywordstyle et \ tabsize, la barre oblique inverse devrait être supprimée car cela ne fonctionnerait pas de cette façon. Néanmoins très utile!
Xiphias

2

Pour le code R que j'utilise

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

Et ça ressemble exactement à ça

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.