Listagem de código fonte LaTeX como em livros profissionais

329

Como uma listagem de código-fonte em látex deve produzir uma saída como nos livros conhecidos, por exemplo, um para o Spring Framework? Eu tentei com o pacote de listas de látex, mas não foi capaz de produzir algo que parecia tão bom quanto o abaixo. Portanto, estou interessado principalmente nas instruções de formatação para produzir algo como a amostra abaixo (do capítulo de amostra de Manning para o Spring in Action ):

Da primavera em ação de Manning

EDITAR Com a ajuda especialmente de Tormod Fjeldskår, aqui está o trecho completo para produzir a aparência desejada:

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

Use-o com isso no seu documento:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
fonte
Por favor, seja mais preciso. Para mim, a listagem que publiquei “parece em livros profissionais” e “parece tão legal” quanto a que você postou.
Bastien Léonard
2
Por favor, use a amostra publicada em forma de captura de tela como o resultado que eu quero arquivar.
Mork0075 12/04/09
8
Por uma questão de integridade, você pode adicionar \ usepackage {color} ao texto que publicou. Demorei um momento antes de perceber que estava faltando.
1213 Robert Massaioli
1
Ótimo trabalho! Eu tive que adicionar \ usepackage {caption} e \ usepackage {graphics} e parece converter aspas simples.
precisa saber é o seguinte
Oi mork, onde devo colocar o arquivo fonte? No seu exemplo Hello.java
RoflcoptrException

Respostas:

186

Parece-me que o que você realmente deseja é personalizar a aparência das legendas. Isso é feito com mais facilidade usando o captionpacote. Para obter instruções sobre como usar este pacote, consulte o manual (PDF) . Você provavelmente precisaria criar seu próprio formato de legenda personalizado, conforme descrito no capítulo 4 do manual.

Edit: Testado com 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}

Resultado:

Pré-visualização

Tormod Fjeldskår
fonte
1
Gostaria de redefinir o formato da legenda apenas para itens na seção \ lstinputlisting (algo como myCaption). Você tem alguma dica de como fazer isso?
Mork0075 12/04/09
1
Try / captionsetup [lstlisting] {suas opções}
Tormod Fjeldskår 12/04/2009
Isso funciona muito bem, obrigado. Você tem uma idéia de como realizar o plano de fundo cinza por trás da legenda (como no meu exemplo inicial de postagens)? Não consigo encontrar nada na documentação.
Mork0075 13/04/09
Eu acho que \ colorbox {gray} {\ parbox {\ textwidth} {\ textcolor {white} {o texto aparece aqui}}} estaria em algum lugar próximo ao seu exemplo inicial de postagem.
Tormod Fjeldskår
2
Parece bom, mas minha caixa de legenda é recuada (não o texto, a própria caixa). Não sei por que, já que a listagem também não é recuada.
Johan
49

Estou feliz com o listingspacote:

Exemplo de listagem

Aqui está como eu o configuro:

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

Eu uso assim:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Bastien Léonard
fonte
1
@lamba: se bem me lembro, ele diz ao Latex para colocá-lo no topo da página.
Bastien Léonard
7
Urgh, listagens em fonte proporcional são muito feias. (Além disso, por razões culturais, eles são difíceis de ler por algum (pelo menos muitos japoneses, talvez também outros asiáticos) pessoas.)
mirabilos
1
@mirabilos: sim, acho que mudei mais tarde. Parecia bom nesta lista, mas não em outras pessoas com mais indentação / aninhamento.
Bastien Léonard 12/01
32

E, por favor, faça o que fizer, configure o pacote de listagens para usar fonte de largura fixa (como no seu exemplo; você encontrará a opção na documentação). A configuração padrão usa fonte proporcional tipográfica em uma grade, que é, IMHO, incrivelmente feia e ilegível, como pode ser visto nas outras respostas das figuras. Eu sou pessoalmente muito irritado quando preciso ler algum código digitado em uma fonte proporcional.

Tente definir a fonte de largura fixa com este:

\lstset{basicstyle=\ttfamily}
zvrba
fonte
3
Pessoalmente, uso column = fullflexible com basicstyle = \ small \ sffamily, como no exemplo que publiquei acima. Os caracteres não estão alinhados verticalmente, mas acho que parecem melhores do que com a família. Você acha a amostra que eu postei acima feia?
Bastien Léonard
Seu exemplo em particular parece bom. No entanto, eu detestaria isso com instruções compostas aninhadas em que um recuo adequado (alinhamento de coluna) é uma grande ajuda para ver a extensão de uma instrução composta (bloco {}}).
Zvrba 13/04/09
Eu estava pensando a mesma coisa, mas até agora todas as minhas listas pareciam boas.
Bastien Léonard
Ok, você me convenceu, vou tentar a sua configuração, uma vez :-)
zvrba
1
Instruções compostas aninhadas são um arenque vermelho. Como todos os recuos consistem em espaços, os recuos serão alinhados independentemente da largura dos outros caracteres.
Jwg 14/05/2019
27

Eu me pergunto por que ninguém mencionou o pacote Minted . Possui realce de sintaxe muito melhor que o pacote de listagem LaTeX. Ele usa pigmentos .

$ pip install Pygments

Exemplo no 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}

O que resulta em:

insira a descrição da imagem aqui

Você precisa usar a bandeira -shell-escape com o comando pdflatex.

Para mais informações: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Hans Ott
fonte
2
+1. Minted é o pacote para escrever o código fonte no LaTeX. Além de ser fácil de usar, rico em recursos e bem documentado, também não há problemas com caracteres Unicode no código-fonte (ao contrário listings).
ScumCoder
Minha nossa! Muito melhor! Muito obrigado pela sugestão.
Dmitry Zotikov
21

Experimente o listingspacote. Aqui está um exemplo do que eu usei há algum tempo para ter uma lista Java colorida:

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

Você pode personalizar isso. Existem várias referências do pacote de listagens. Basta pesquisar no Google.

Markus
fonte
Obrigado. Ainda estou ciente do pacote de listagens, mas não consigo formatar como meu exemplo. Essa é a verdadeira questão.
Mork0075 12/04/09
9

Dê uma olhada no algorithmspacote, especialmente no algorithmambiente.

avakar
fonte
1
Obrigado. Este pacote parece ser muito forte em uma discussão mais teórica sobre álgebra, eu sei disso em muitos livros de matemática. Mas não enfatizo muito isso (pré-requisitos, se houver), gostaria de ter uma formatação como a acima.
Mork0075 12/04/09
4
Eu estava falando apenas sobre o algorithmmeio ambiente, não algorithmic. algorithmé um contêiner flutuante, que parece muito bom. Você pode colocar o que quiser dentro, mesmo os listingmencionados.
avakar
8

Existem várias outras coisas que você pode fazer, como selecionar novas fontes:

\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
fonte
2
Acredito que em \ keywordstyle e \ tabsize a barra invertida deve ser removida, pois não funcionaria dessa maneira. No entanto, muito útil!
Xiphias
2

Para código R eu 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 parece exatamente assim

insira a descrição da imagem aqui

pachamaltese
fonte