Danh sách mã nguồn LaTeX như trong sách chuyên nghiệp


329

Làm thế nào một danh sách mã nguồn latex trông giống như để tạo ra một đầu ra như trong các cuốn sách đã biết, ví dụ như một danh sách cho Spring Framework? Tôi đã thử với gói danh sách latex nhưng không thể tạo ra thứ gì đó trông đẹp như cái dưới đây. Vì vậy, tôi chủ yếu quan tâm đến các hướng dẫn định dạng để tạo ra một cái gì đó giống như mẫu bên dưới (từ chương mẫu của Manning cho Spring in Action ):

Từ mùa xuân hành động của Manning

EDIT Với sự giúp đỡ đặc biệt của Tormod Fjeldskår đây là đoạn trích hoàn chỉnh để tạo ra giao diện mong muốn:

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

Sử dụng nó với điều này trong tài liệu của bạn:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}

Xin hãy chính xác hơn. Đối với tôi, danh sách mà tôi đã đăng tải trông giống như trong những cuốn sách chuyên nghiệp.
Bastien Léonard

2
Vui lòng sử dụng mẫu được đăng dưới dạng ảnh chụp màn hình như kết quả tôi muốn lưu trữ.
Mork0075

8
Để hoàn thiện, bạn có thể muốn thêm \ usepackage {color} vào tex bạn đã đăng. Mất một lúc trước khi tôi nhận thấy nó bị mất tích.
Robert Massaioli

1
Công việc tuyệt vời Tôi đã phải thêm \ usepackage {caption} và \ usepackage {Graphics} và nó dường như chuyển đổi các trích dẫn đơn.
hakunin

Xin chào tôi phải đặt tập tin nguồn ở đâu? Trong ví dụ của bạn Hello.java
RoflcoptrException

Câu trả lời:


186

Dường như với tôi rằng những gì bạn thực sự muốn, là tùy chỉnh giao diện của chú thích. Điều này được thực hiện dễ dàng nhất bằng cách sử dụng captiongói. Để biết hướng dẫn cách sử dụng gói này, xem hướng dẫn (PDF) . Bạn có thể sẽ cần phải tạo định dạng chú thích tùy chỉnh của riêng bạn, như được mô tả trong chương 4 trong hướng dẫn.

Chỉnh sửa: Đã thử nghiệm với 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}

Kết quả:

Xem trước


1
Tôi muốn xác định lại định dạng chú thích chỉ cho những thứ trong phần \ lstinputlisting (giống như myCaption). Bạn có bất cứ gợi ý làm thế nào để làm điều đó?
Mork0075

1
Dùng thử / captionsetup [lstlisting] {tùy chọn của bạn}
Tormod Fjeldskår

Điều này làm việc tuyệt vời, cảm ơn bạn. Bạn đã có ý tưởng làm thế nào để nhận ra nền màu xám đằng sau chú thích (như trong mẫu bài viết ban đầu của tôi) chưa? Không thể tìm thấy bất cứ điều gì trong tài liệu.
Mork0075

Tôi nghĩ \ colorbox {grey} {\ parbox {\ text thong} {\ textcolor {trắng} {văn bản ở đây}}} sẽ ở đâu đó gần mẫu bài đăng ban đầu của bạn.
Tormod Fjeldskår

2
Điều này có vẻ tốt, nhưng hộp chú thích của tôi được thụt lề (không phải văn bản, chính hộp). Tôi không biết tại sao, vì danh sách cũng không được thụt lề.
Johan

49

Tôi hài lòng với listingsgói:

Danh sách ví dụ

Đây là cách tôi cấu hình nó:

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

Tôi sử dụng nó như thế này:

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

1
@lamba: nếu tôi nhớ chính xác, nó bảo latex đặt nó ở đầu trang.
Bastien Léonard

7
Urgh, danh sách trong phông chữ tỷ lệ là rất xấu xí. (Ngoài ra, vì lý do văn hóa, chúng khó đọc đối với một số người (ít nhất là nhiều người Nhật, cũng có thể là người châu Á khác).
mirabilos

1
@mirabilos: yeah, tôi nghĩ rằng tôi đã thay đổi nó sau này. Nó trông ổn trong danh sách này nhưng hoàn toàn không phải trên những người khác có thụt / lồng nhiều hơn.
Bastien Léonard

32

Và xin vui lòng, dù bạn làm gì, hãy định cấu hình gói danh sách để sử dụng phông chữ có chiều rộng cố định (như trong ví dụ của bạn; bạn sẽ tìm thấy tùy chọn trong tài liệu). Cài đặt mặc định sử dụng bộ phông chữ tỷ lệ trên lưới, IMHO, cực kỳ xấu và không thể đọc được, như có thể nhìn thấy từ các câu trả lời khác bằng hình ảnh. Cá nhân tôi rất khó chịu khi tôi phải đọc một số loại mã trong một phông chữ tỷ lệ.

Hãy thử đặt phông chữ có chiều rộng cố định bằng cách này:

\lstset{basicstyle=\ttfamily}

3
Cá nhân tôi sử dụng các cột = fullflexible với basicstyle = \ small \ sff Family, như trong ví dụ tôi đã đăng ở trên. Các ký tự không được căn chỉnh theo chiều dọc, nhưng tôi nghĩ rằng chúng trông đẹp hơn so với \ ttf Family. Bạn có thấy mẫu tôi đăng ở trên xấu xí không?
Bastien Léonard

Ví dụ cụ thể của bạn có vẻ tốt. Tuy nhiên, tôi sẽ ghét nó với các câu lệnh ghép lồng nhau trong đó một vết lõm thích hợp (căn chỉnh cột) là một trợ giúp lớn để thấy phạm vi của câu lệnh ghép (khối {}).
zvrba

Tôi đã suy nghĩ điều tương tự, nhưng cho đến nay tất cả các danh sách của tôi đều tốt.
Bastien Léonard

Ok, bạn đã thuyết phục tôi, tôi sẽ thử thiết lập của bạn một lần :-)
zvrba

1
Báo cáo hợp chất lồng nhau là một cá trích đỏ. Vì các vết lõm đều bao gồm các khoảng trắng, nên các vết lõm sẽ xếp thành hàng bất kể chiều rộng của các ký tự khác.
jwg

27

Tôi tự hỏi tại sao không ai đề cập đến gói Minted . Nó có cú pháp tô sáng tốt hơn nhiều so với gói danh sách LaTeX. Nó sử dụng Pygments .

$ pip install Pygments

Ví dụ trong 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}

Kết quả nào trong:

nhập mô tả hình ảnh ở đây

Bạn cần sử dụng cờ -shell-escapevới lệnh pdflatex.

Để biết thêm thông tin: https://www.sharelatex.com/learn/Code_Highlighting_with_minted


2
+1. Minted là gói để sắp xếp mã nguồn trong LaTeX. Nó không chỉ dễ sử dụng, giàu tính năng và được ghi chép tốt mà còn không có vấn đề gì với các ký tự Unicode trong mã nguồn (không giống như listings).
ScumCoder

Trời ơi! Tốt hơn rất nhiều! Cảm ơn bạn rất nhiều vì gợi ý.
Dmitry Zotikov

21

Có một thử trên listingsgói. Đây là một ví dụ về những gì tôi đã sử dụng một thời gian trước đây để có một danh sách Java được tô màu:

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

Bạn có thể muốn tùy chỉnh đó. Có một số tài liệu tham khảo của gói danh sách. Chỉ cần google chúng.


Cảm ơn. Tôi vẫn biết về gói danh sách, nhưng không thể định dạng như mẫu của tôi. Đây là câu hỏi thực sự.
Mork0075

9

Hãy xem algorithmsgói, đặc biệt là algorithmmôi trường.


1
Cảm ơn. Gói này dường như rất mạnh trong các cuộc thảo luận về đại số lý thuyết, tôi biết nó từ nhiều sách toán. Nhưng tôi sẽ không nhấn mạnh điều này rất nhiều (prerequsites, nếu, khác), tôi muốn có một định dạng như ở trên.
Mork0075

4
Tôi chỉ nói về algorithmmôi trường, không phải algorithmic. algorithmlà một container nổi, trông khá đẹp. Bạn có thể đặt bất cứ thứ gì bạn thích vào bên trong, thậm chí cả listingelsethread đã đề cập.
avakar

8

Có một số điều khác bạn có thể làm, chẳng hạn như chọn phông chữ mới:

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

2
Tôi tin rằng trong \ keywordstyle và \ tabize dấu gạch chéo ngược sẽ bị xóa vì nó sẽ không hoạt động theo cách này. Tuy nhiên rất hữu ích!
Xiphias

2

Đối với mã R tôi sử dụng

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

Và nó trông giống hệt như thế này

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.