Daftar kode sumber LaTeX seperti dalam buku profesional

329

Bagaimana seharusnya daftar kode sumber lateks terlihat menghasilkan output seperti di buku-buku yang dikenal, misalnya satu untuk Kerangka Kerja Spring? Saya sudah mencoba dengan paket daftar lateks tetapi tidak dapat menghasilkan sesuatu yang terlihat sama bagusnya dengan yang di bawah ini. Jadi saya sangat tertarik dengan instruksi pemformatan untuk menghasilkan sesuatu seperti contoh di bawah ini (dari bab sampel Manning untuk Spring in Action ):

Dari Manning's Spring in Action

EDIT Dengan bantuan terutama dari Tormod Fjeldskår inilah potongan lengkap untuk menghasilkan tampilan yang diinginkan:

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

Gunakan dengan ini di dokumen Anda:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
sumber
Harap lebih tepat. Bagi saya daftar yang saya poskan “terlihat seperti di buku profesional” dan “terlihat sama bagusnya” dengan yang Anda posting.
Bastien Léonard
2
Silakan gunakan sampel yang diposting dalam bentuk tangkapan layar sebagai hasil yang ingin saya arsipkan.
Mork0075
8
Demi kelengkapan, Anda mungkin ingin menambahkan \ usepackage {color} ke tex yang Anda poskan. Butuh waktu beberapa saat sebelum saya perhatikan itu hilang.
Robert Massaioli
1
Kerja bagus! Saya harus menambahkan \ usepackage {caption} dan \ usepackage {graphics} dan sepertinya mengonversi satu tanda kutip.
hakunin
Hai mork, di mana saya harus meletakkan file sumber? Dalam contoh Anda Hello.java
RoflcoptrException

Jawaban:

186

Menurut saya, yang Anda inginkan adalah menyesuaikan tampilan teksnya. Ini paling mudah dilakukan dengan menggunakan captionpaket. Untuk instruksi bagaimana menggunakan paket ini, lihat manual (PDF) . Anda mungkin perlu membuat format teks sendiri, seperti yang dijelaskan dalam bab 4 dalam manual.

Sunting: Diuji dengan 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}

Hasil:

Pratinjau

Tormod Fjeldskår
sumber
1
Saya ingin mendefinisikan kembali format teks hanya untuk hal-hal di bagian \ lstinputlisting (seperti myCaption). Apakah Anda punya petunjuk bagaimana melakukan itu?
Mork0075
1
Coba / captionsetup [lstlisting] {your options}
Tormod Fjeldskår
Ini bekerja dengan baik, terima kasih. Apakah Anda punya ide bagaimana mewujudkan latar belakang abu-abu di belakang keterangan (seperti dalam contoh posting awal saya)? Tidak dapat menemukan apa pun di dokumentasi.
Mork0075
Saya pikir \ colorbox {grey} {\ parbox {\ textwidth} {\ textcolor {white} {text di sini}}} akan berada di dekat sampel posting awal Anda.
Tormod Fjeldskår
2
Ini terlihat bagus, tetapi kotak tulisan saya mendapat lekukan (bukan teks, kotak itu sendiri). Saya tidak tahu mengapa, karena cantuman itu juga bukan indentasi.
Johan
49

Saya senang dengan listingspaketnya:

Contoh daftar

Inilah cara saya mengonfigurasinya:

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

Saya menggunakannya seperti ini:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Bastien Léonard
sumber
1
@amba: jika saya ingat dengan benar, ia memberitahu Latx untuk meletakkannya di bagian atas halaman.
Bastien Léonard
7
Urgh, daftar dalam font proporsional sangat jelek. (Plus, karena alasan budaya, mereka sulit dibaca untuk beberapa (setidaknya banyak orang Jepang, mungkin juga orang Asia lainnya).)
mirabilos
1
@mirabilos: yeah, saya pikir saya mengubahnya nanti. Itu terlihat OK pada daftar ini tetapi tidak sama sekali pada orang lain dengan lebih banyak lekukan / bersarang.
Bastien Léonard
32

Dan tolong, apa pun yang Anda lakukan, konfigurasikan paket cantuman untuk menggunakan font dengan lebar tetap (seperti pada contoh Anda; Anda akan menemukan opsi dalam dokumentasi). Pengaturan default menggunakan jenis huruf proporsional pada kisi, yang, IMHO, sangat jelek dan tidak dapat dibaca, seperti yang dapat dilihat dari jawaban lain dengan gambar. Saya pribadi sangat jengkel ketika saya harus membaca beberapa kode kode dalam font yang proporsional.

Coba atur font lebar tetap dengan ini:

\lstset{basicstyle=\ttfamily}
zvrba
sumber
3
Saya pribadi menggunakan kolom = fullflexible dengan basicstyle = \ small \ sffamily, seperti pada contoh yang saya posting di atas. Karakternya tidak sejajar secara vertikal, tapi saya pikir mereka terlihat lebih baik daripada dengan \ ttfamily Apakah Anda menemukan sampel yang saya posting di atas jelek?
Bastien Léonard
Contoh khusus Anda terlihat baik-baik saja. Namun, saya akan membencinya dengan pernyataan majemuk bersarang di mana lekukan yang tepat (perataan kolom) adalah bantuan besar untuk melihat sejauh mana pernyataan gabungan ({} blok).
zvrba
Saya memikirkan hal yang sama, tetapi sejauh ini semua daftar saya terlihat bagus.
Bastien Léonard
Ok, Anda telah meyakinkan saya, saya akan mencoba setup Anda sekali :-)
zvrba
1
Pernyataan gabungan bersarang adalah herring merah. Karena semua lekukan terdiri dari spasi, lekukan akan berbaris terlepas dari lebar karakter lainnya.
jwg
27

Saya heran mengapa tidak ada yang menyebutkan paket Minted . Ini memiliki penyorotan sintaks yang jauh lebih baik daripada paket daftar LaTeX. Ini menggunakan Pygments .

$ pip install Pygments

Contoh di 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}

Yang mengakibatkan:

masukkan deskripsi gambar di sini

Anda perlu menggunakan flag -shell-escapedengan perintah pdflatex.

Untuk informasi lebih lanjut: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Hans Ott
sumber
2
+1. Minted adalah paket untuk kode sumber penyusunan huruf di LaTeX. Tidak hanya mudah digunakan, kaya fitur dan didokumentasikan dengan baik, tetapi juga tidak memiliki masalah dengan karakter Unicode dalam kode sumber (tidak seperti listings).
ScumCoder
Ya ampun! Jauh lebih baik! Terima kasih banyak atas sarannya.
Dmitry Zotikov
21

Selamat mencoba listingspaketnya. Berikut adalah contoh dari apa yang saya gunakan beberapa waktu lalu untuk memiliki daftar Java berwarna:

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

Anda mungkin ingin menyesuaikannya. Ada beberapa referensi dari paket listing. Hanya google mereka.

Markus
sumber
Terima kasih. Saya masih mengetahui paket cantuman, tetapi tidak dapat memformat seperti sampel saya. Ini pertanyaan sesungguhnya.
Mork0075
9

Lihatlah algorithmspaket, terutama algorithmlingkungan.

avakar
sumber
1
Terima kasih. Paket ini tampaknya sangat kuat dalam diskusi algirthm yang lebih teoretis, saya tahu itu dari banyak buku matematika. Tetapi saya tidak akan terlalu menekankan hal ini (prerequsit, jika, yang lain), saya ingin memiliki format seperti yang di atas.
Mork0075
4
Saya hanya berbicara tentang algorithmlingkungan, bukan algorithmic. algorithmadalah wadah mengambang, yang terlihat cukup bagus. Anda dapat memasukkan apa pun yang Anda suka di dalam, bahkan listingelsethread yang disebutkan.
avakar
8

Ada beberapa hal lain yang dapat Anda lakukan, seperti memilih font baru:

\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
sumber
2
Saya percaya bahwa dalam \ gaya kata kunci dan \ tabsi garis miring terbalik harus dihapus karena tidak akan bekerja dengan cara ini. Meskipun demikian sangat membantu!
Xiphias
2

Untuk kode R saya gunakan

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

Dan terlihat persis seperti ini

masukkan deskripsi gambar di sini

pachamaltese
sumber