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 ):
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}
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:
Je suis content du package listings
:
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}
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}
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:
Vous devez utiliser l'indicateur -Shell-escape
avec la commande pdflatex.
Pour plus d'informations: https://www.sharelatex.com/learn/Code_Highlighting_with_minted
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.
Examinez algorithms
package, en particulier l'environnement algorithm
.
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}
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