Lista kodów źródłowych LaTeX jak w profesjonalnych książkach

329

Jak powinna wyglądać lista kodów źródłowych lateksu, aby generować wyniki jak w znanych książkach, na przykład dla Spring Framework? Próbowałem z pakietem list lateksowych, ale nie byłem w stanie wyprodukować czegoś, co wyglądało tak ładnie, jak to poniżej. Dlatego przede wszystkim interesuję się instrukcjami formatowania, aby utworzyć coś takiego jak przykład poniżej (z przykładowego rozdziału Manninga dla Spring in Action ):

Od wiosny Manninga w akcji

EDYCJA Z pomocą Tormoda Fjeldskåra, oto pełny fragment, który zapewnia pożądany wygląd:

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

Użyj tego w swoim dokumencie:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
źródło
Proszę być bardziej precyzyjnym. Dla mnie opublikowany przeze mnie wpis „wygląda jak w profesjonalnych książkach” i „wygląda równie ładnie” jak ten, który opublikowałeś.
Bastien Léonard,
2
Skorzystaj z próbki opublikowanej w formie zrzutu ekranu, ponieważ chcę zarchiwizować.
Mork0075
8
Dla kompletności możesz dodać \ usepackage {color} do opublikowanego tekstu. Zajęło mi chwilę, zanim zauważyłem, że zaginęło.
Robert Massaioli,
1
Świetna robota! Musiałem jednak dodać \ usepackage {caption} i \ usepackage {graphic} i wydaje się, że konwertuje pojedyncze cudzysłowy.
hakunin
Cześć mork, gdzie muszę umieścić plik źródłowy? W twoim przykładzie Hello.java
RoflcoptrException

Odpowiedzi:

186

Wydaje mi się, że tak naprawdę chcesz dostosować wygląd podpisów. Najłatwiej to zrobić za pomocą captionpakietu. Instrukcje dotyczące korzystania z tego pakietu znajdują się w instrukcji obsługi (PDF) . Prawdopodobnie konieczne będzie utworzenie własnego formatu napisów, jak opisano w rozdziale 4 instrukcji.

Edycja: Testowane z 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}

Wynik:

Zapowiedź

Tormod Fjeldskår
źródło
1
Chciałbym przedefiniować format napisów tylko dla rzeczy w sekcji \ lstinputlisting (coś takiego jak myCaption). Czy masz jakieś wskazówki, jak to zrobić?
Mork0075
1
Spróbuj / captionsetup [lstlisting] {twoje opcje}
Tormod Fjeldskår 12.04.2009
Działa świetnie, dziękuję. Czy masz pomysł, jak zrealizować szare tło za podpisem (jak w mojej początkowej próbce postów)? Nie mogę znaleźć niczego w dokumentacji.
Mork0075
Myślę, że \ colorbox {gray} {\ parbox {\ textwidth} {\ textcolor {white} {text idzie tutaj}}} byłby gdzieś w pobliżu początkowej próbki postu.
Tormod Fjeldskår
2
Wygląda to ładnie, ale moje pole podpisu jest wcięte (nie tekst, samo pole). Nie wiem dlaczego, ponieważ na liście również nie ma wcięć.
Johan
49

Jestem zadowolony z listingspakietu:

Przykład aukcji

Oto jak to skonfigurować:

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

Używam tego w ten sposób:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Bastien Léonard
źródło
1
@lamba: jeśli dobrze pamiętam, mówi Lateksowi, aby umieścił go na górze strony.
Bastien Léonard,
7
Urgh, oferty w proporcjonalnej czcionce są tak brzydkie. (Plus, ze względów kulturowych, są trudne do odczytania dla niektórych (przynajmniej wielu Japończyków, być może również innych azjatyckich) osób).
mirabilos 11.01.15
1
@mirabilos: tak, myślę, że później to zmieniłem. Wyglądało to OK na tej aukcji, ale wcale nie na innych z większym wcięciem / zagnieżdżeniem.
Bastien Léonard,
32

I proszę, cokolwiek zrobisz, skonfiguruj pakiet list, aby używał czcionki o stałej szerokości (jak w twoim przykładzie; znajdziesz tę opcję w dokumentacji). Domyślne ustawienie wykorzystuje proporcjonalny skład czcionki na siatce, który jest, IMHO, niesamowicie brzydki i nieczytelny, jak widać z innych odpowiedzi ze zdjęciami. Osobiście jestem bardzo zirytowany, gdy muszę przeczytać jakiś skład kodu w proporcjonalnej czcionce.

Spróbuj ustawić czcionkę o stałej szerokości za pomocą tego:

\lstset{basicstyle=\ttfamily}
zvrba
źródło
3
Osobiście używam kolumn = pełna elastyczność z basicstyle = \ small \ sffamily, jak w przykładzie, który zamieściłem powyżej. Znaki nie są wyrównane w pionie, ale myślę, że wyglądają lepiej niż w przypadku rodziny. Czy uważasz powyższą próbkę za brzydką?
Bastien Léonard
Twój konkretny przykład wygląda dobrze. Jednak nienawidziłbym tego w zagnieżdżonych instrukcjach złożonych, w których prawidłowe wcięcie (wyrównanie kolumny) jest dużą pomocą w dostrzeżeniu zakresu instrukcji złożonej (blok {}).
zvrba
Myślałem o tym samym, ale jak dotąd wszystkie moje oferty wyglądały dobrze.
Bastien Léonard
Ok, przekonałeś mnie, spróbuję raz :-)
zvrba,
1
Zagnieżdżone instrukcje złożone są czerwonym śledziem. Ponieważ wszystkie wcięcia składają się ze spacji, wcięcia będą ułożone w linii niezależnie od szerokości innych znaków.
jwg
27

Zastanawiam się, dlaczego nikt nie wspomniał o pakiecie Minted . Ma znacznie lepsze wyróżnianie składni niż pakiet listowy LaTeX. Korzysta z Pigmejów .

$ pip install Pygments

Przykład w 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}

Co skutkuje w:

wprowadź opis zdjęcia tutaj

Musisz użyć flagi -shell-escapez poleceniem pdflatex.

Aby uzyskać więcej informacji: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Hans Ott
źródło
2
+1. Minted to pakiet do pisania kodu źródłowego w LaTeX. Jest nie tylko łatwy w użyciu, bogaty w funkcje i dobrze udokumentowany, ale także nie ma problemów ze znakami Unicode w kodzie źródłowym (w przeciwieństwie do listings).
ScumCoder
Mój Boże! O wiele lepiej! Dziękuję bardzo za sugestię.
Dmitry Zotikov
21

Wypróbuj listingspakiet. Oto przykład tego, czego użyłem jakiś czas temu, aby mieć kolorowy wykaz 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}

Możesz to dostosować. Istnieje kilka odniesień do pakietu ofert. Po prostu google.

Markus
źródło
Dzięki. Nadal jestem świadomy pakietu list, ale nie jestem w stanie sformatować jak moja próbka. To jest prawdziwe pytanie.
Mork0075
9

Spójrz na algorithmspakiet, szczególnie algorithmśrodowisko.

avakar
źródło
1
Dzięki. Pakiet ten wydaje się być bardzo mocny w bardziej teoretycznej dyskusji na temat algorytmu, znam go z wielu książek matematycznych. Ale nie podkreślam tego tak bardzo (wymagania wstępne, jeśli inaczej), chciałbym mieć formatowanie takie jak powyższe.
Mork0075
4
Nie mówiłem tylko o algorithmśrodowisku algorithmic. algorithmto pływający pojemnik, który wygląda całkiem nieźle. Możesz włożyć wszystko, co chcesz, nawet listingwspomniany inny wątek.
avakar
8

Istnieje kilka innych rzeczy, które możesz zrobić, na przykład wybierając nowe czcionki:

\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
źródło
2
Uważam, że w \ keywordstyle i \ tabsize ukośnik powinien zostać usunięty, ponieważ nie działałoby w ten sposób. Niemniej jednak bardzo pomocne!
Xiphias
2

Używam kodu 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={}
}

I wygląda dokładnie tak

wprowadź opis zdjęcia tutaj

pachamaltese
źródło