web-dev-qa-db-fra.com

Liste de code source LaTeX comme dans les livres professionnels

Comment une liste de code source en latex devrait-elle ressembler pour produire une sortie comme dans des livres connus, par exemple une pour Spring Framework? J'ai essayé avec le package latex listings mais je n'ai pas été en mesure de produire un produit 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 (tiré de Manning chapitre d'échantillonnage pour Spring in Action ):

From Manning's Spring in Action

EDIT Avec l'aide en particulier de Tormod Fjeldskår , voici l'extrait complet permettant d'obtenir l'aspect 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}
320
Mork0075

Il me semble que ce que vous voulez vraiment, c'est personnaliser l'apparence des légendes. Cela se fait plus facilement en utilisant le paquetage caption. Pour obtenir des instructions sur l'utilisation de ce package, voir le manuel (PDF) . Vous aurez probablement besoin de créer votre propre format de légende personnalisé, comme décrit au 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:

Preview

184
Tormod Fjeldskår

Je suis content du package listings:

Listing example

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 ça:

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

Et quoi que vous fassiez, configurez le paquet listing de manière à utiliser une police à largeur fixe (comme dans votre exemple; vous trouverez l'option dans la documentation). Le paramètre par défaut utilise des polices proportionnelles sur une grille, ce qui est, à mon humble avis, incroyablement moche et illisible, comme le montrent les autres réponses illustrées. Je suis personnellement très irrité lorsque je dois lire un code composé dans une police de caractères proportionnelle.

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

\lstset{basicstyle=\ttfamily}
31
zvrba

Je me demande pourquoi personne n'a mentionné le paquet frappée . La mise en évidence de la syntaxe est bien meilleure que celle du package de liste LaTeX. Il utilise 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 résulte en:

enter image description here

Vous devez utiliser l'indicateur -Shell-escape avec la commande pdflatex.

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

23
Hans Ott

Essayez le paquetage listings. Voici un exemple de ce que j’avais utilisé il ya quelque temps pour avoir une liste colorée Java:

\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 listings. Il suffit de les google.

21
Markus Lux

Examinez algorithms package, en particulier l'environnement algorithm.

9
avakar

Il y a plusieurs autres choses que vous pouvez faire, 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}
8
kahen

J'utilise le code R

\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

enter image description here

2
pachamaltese