像专业书籍中一样列出LaTeX源代码


329

乳胶源代码清单应如何产生类似于已知书籍的输出,例如Spring框架的输出?我已经尝试过使用乳胶列表包,但是无法生成看起来像下面这样的东西。所以我primarely感兴趣的格式化指令,产生类似下面的样品(来自曼宁的样章春天在行动):

从曼宁的春天行动

编辑 特别是在TormodFjeldskår的帮助下,这是产生所需外观的完整代码段:

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

在文档中与此一起使用:

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

请更精确。对我来说,我发布的清单“看起来像是专业书籍”,“看起来也不错”,就像您发布的清单一样。
BastienLéonard'09 -4-12

2
请使用以屏幕快照形式发布的示例,作为我想存档的结果。
Mork0075

8
为了完整起见,您可能想在发布的tex上添加\ usepackage {color}。我花了片刻才发现它不见了。
罗伯特·马赛利

1
做得好!我不得不添加\ usepackage {caption}和\ usepackage {graphics},它似乎可以转换单引号。
hakunin

嗨,mork,我必须在哪里放置源文件?在您的示例Hello.java
RoflcoptrException'Apr 4'11

Answers:


186

在我看来,您真正想要的是自定义字幕的外观。使用caption软件包最容易做到这一点。有关如何使用此软件包的说明,请参见手册(PDF)。您可能需要创建自己的自定义标题格式,如手册第4章中所述。

编辑:测试与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}

结果:

预习


1
我只想为\ lstinputlisting部分中的内容(例如myCaption之类)重新定义标题格式。你有任何提示怎么做吗?
Mork0075

1
尝试/
captionsetup

效果很好,谢谢。您是否知道如何实现标题后面的灰色背景(例如在我的初始帖子示例中)?无法在文档中找到任何内容。
Mork0075

我认为\ colorbox {gray} {\ parbox {\ textwidth} {\ textcolor {white} {文本在这里}}}}会接近您最初的帖子样本。
TormodFjeldskår,2009年

2
这看起来不错,但是我的字幕框缩进了(不是文本,而是框本身)。我也不知道为什么,因为列表也没有缩进。
约翰

49

我对listings包裹满意:

清单示例

这是我的配置方式:

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

我这样使用它:

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

1
@lamba:如果我没记错的话,它会告诉Latex将其放在页面顶部。
巴斯蒂安·莱昂纳德

7
嗯,比例字体列表非常丑陋。(此外,出于文化原因,对于某些人(至少许多日本人,也许还有其他亚洲人),他们很难阅读。)
mirabilos 2015年

1
@mirabilos:是的,我想我稍后再更改。在此清单上看起来不错,但在其他具有更多缩进/嵌套的清单上则完全没有。
巴斯蒂安·莱纳德

32

并且,无论您做什么,都请配置商品包以使用固定宽度的字体(如您的示例;您会在文档中找到该选项)。默认设置是在网格上使用成比例的字体排版,恕我直言,这很难看且难以理解,从其他带有图片的答案中可以看出。当我必须阅读比例字体的某些代码排版时,我个人非常恼火。

尝试使用此设置固定宽度的字体:

\lstset{basicstyle=\ttfamily}

3
我个人使用column = fullflexible和basicstyle = \ small \ sffamily,如我上面发布的示例所示。字符不是垂直对齐的,但是我认为它们看起来比\ ttfamily更好。您是否发现我上面丑陋发布的样本?
BastienLéonard'09

您的特定示例看起来不错。但是,我讨厌嵌套的复合语句,在这种情况下,适当的缩进(列对齐)对于查看复合语句({}块)的程度有很大帮助。
zvrba

我当时在想同样的事情,但是到目前为止,我所有的清单看起来都不错。
BastienLéonard'09

好的,您已经说服了我,我将尝试设置一次:-)
zvrba

1
嵌套的复合语句是一个红鲱鱼。由于缩进全部由空格组成,因此无论其他字符的宽度如何,缩进都会对齐。
jwg 2013年

27

我不知道为什么没人提到Minted软件包。它比LaTeX列表包具有更好的语法突出显示。它使用Pygments

$ pip install Pygments

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}

结果是:

在此处输入图片说明

您需要将标志-shell-escape与pdflatex命令一起使用。

有关更多信息:https : //www.sharelatex.com/learn/Code_Highlighting_with_minted


2
+1。Minted是用于在LaTeX中排版源代码的THE软件包。它不仅易于使用,功能丰富且有据可查,而且在源代码中的Unicode字符方面也没有问题(不同于listings)。
ScumCoder '16

我的天啊!好多了!非常感谢您的建议。
德米特里·佐蒂科夫

21

试试看listings包装。这是我前段时间使用彩色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}

您可能要自定义它。清单包有几个参考。只是谷歌他们。


谢谢。我仍然知道列表包,但是无法像我的示例一样格式化。这是真正的问题。
Mork0075

9

看一看algorithms包装,尤其是algorithm环境。


1
谢谢。我从许多数学书籍中都知道,该软件包在更理论的算法讨论中似乎非常强大。但是我不会太强调这一点(如果合适的话,我会非常喜欢),我希望有一种像上面的格式。
Mork0075

4
我只是在谈论algorithm环境,而不是在谈论algorithmicalgorithm是一个浮动容器,看起来很不错。您可以将任何您想要的内容放入其中,甚至listing提到的elsethread。
avakar

8

您还可以执行其他几项操作,例如选择新字体:

\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
我相信在\ keywordstyle和\ tabsize中,应删除反斜杠,因为它不能以这种方式工作。尽管如此,还是很有帮助的!
Xiphias

2

对于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={}
}

它看起来像这样

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.