LaTeX/源代码列表
有很多包提供代码列表和高亮显示,以下是比较流行的
使用 listings 包,您可以像使用 \begin{verbatim}
一样添加非格式化文本,但它的主要目标是在您的文档中包含任何编程语言的源代码。如果您希望包含伪代码或算法,您可能会发现 算法和伪代码 也很有用。
要使用该包,您需要
\usepackage{listings}
|
listings 包支持所有最常用语言的高亮显示,并且高度可定制。如果您只想在文档中编写代码,该包提供了 lstlisting 环境
\begin{lstlisting}
Put your code here.
\end{lstlisting}
|
另一种可能性是,如果您在一个或多个文件中创建了一个程序并且仍在编辑它,那么可以从源代码本身导入代码。这样,如果您修改了源代码,您只需重新编译 LaTeX 代码,您的文档就会更新。命令是
\lstinputlisting{source_filename.py}
|
在示例中,有一个 Python 源代码,但这并不重要:您可以包含任何文件,但必须写出完整的文件名。它将被视为纯文本,并将根据您的设置进行高亮显示,这意味着它不会自动识别编程语言。您可以使用以下命令在包含文件时指定语言
\lstinputlisting[language=Python]{source_filename.py}
|
您也可以指定文件的范围。
\lstinputlisting[language=Python, firstline=37, lastline=45]{source_filename.py}
|
或
\lstinputlisting[language=Python, linerange={37-45,48-50}]{source_filename.py}
|
如果您确定文件不会更改(至少在指定行之前),这将非常方便。您也可以省略 firstline 或 lastline 参数:这意味着从这一点开始或到这一点结束的所有内容。
这是一个关于一些 Pascal 代码的基本示例
\documentclass{article}
\usepackage{listings} % Include the listings-package
\begin{document}
\lstset{language=Pascal} % Set your language (you can change the language for each code-block optionally)
\begin{lstlisting}[frame=single] % Start your code-block
for i:=maxint to 0 do
begin
{ do nothing }
end;
Write('Case insensitive ');
Write('Pascal keywords.');
\end{lstlisting}
\end{document}
它支持以下编程语言
ABAP2,4, ACSL, Ada4, Algol4, Ant, Assembler2,4, Awk4, bash, Basic2,4, C#5, C++4, C4, Caml4, Clean, Cobol4, Comal, csh, Delphi, Eiffel, Elan, erlang, Euphoria, Fortran4, GCL, Go (golang), Gnuplot, Haskell, HTML, IDL4, inform, Java4, JVMIS, ksh, Lisp4, Logo, Lua2, make4, Mathematica1,4, Matlab, Mercury, MetaPost, Miranda, Mizar, ML, Modelica3, Modula-2, MuPAD, NASTRAN, Oberon-2, Objective C5 , OCL4, Octave, Oz, Pascal4, Perl, PHP, PL/I, Plasm, POV, Prolog, Promela, Python, R, Reduce, Rexx, RSL, Ruby, S4, SAS, Scilab, sh, SHELXL, Simula4, SQL, tcl4, TeX4, VBScript, Verilog, VHDL4, VRML4, XML, XSLT.
对于其中一些语言,支持多种方言。有关更多信息,请参阅随包附带的文档,它应该在您的发行版中,名为listings-*.dvi.
- 注意
- 它仅在您使用纯文本格式输入时才支持 Mathematica 代码。您不能像其他编程语言一样使用
\lstinputlisting{...}
包含 *.NB 文件,但 Mathematica 可以导出为漂亮格式的 LaTeX 源代码。 - 对于这些语言,必须指定方言(例如
language={[x86masm]Assembler}
)。 - Modelica 通过 这里 可用的 dtsyntax 包支持。
- 对于这些语言,支持多种方言。例如,C 有 ANSI、Handel、Objective 和 Sharp。请参阅 listings 手册 第 12 页的概述。
- 定义为另一种语言的方言
您可以修改几个参数,这些参数会影响代码的显示方式。您可以在文档中的任何位置放置以下代码(无论是在 \begin{{document}\end{document}
之前还是之后),根据您的需要进行更改。任何行的含义都在旁边解释。
\usepackage{listings}
\usepackage{color}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}
\lstset{
backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}; should come as last argument
basicstyle=\footnotesize, % the size of the fonts that are used for the code
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
breaklines=true, % sets automatic line breaking
captionpos=b, % sets the caption-position to bottom
commentstyle=\color{mygreen}, % comment style
deletekeywords={...}, % if you want to delete keywords from the given language
escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
firstnumber=1000, % start line enumeration with line 1000
frame=single, % adds a frame around the code
keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
keywordstyle=\color{blue}, % keyword style
language=Octave, % the language of the code
morekeywords={*,...}, % if you want to add more keywords to the set
numbers=left, % where to put the line-numbers; possible values are (none, left, right)
numbersep=5pt, % how far the line-numbers are from the code
numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers
rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
showstringspaces=false, % underline spaces within strings only
showtabs=false, % show tabs within strings adding particular underscores
stepnumber=2, % the step between two line-numbers. If it's 1, each line will be numbered
stringstyle=\color{mymauve}, % string literal style
tabsize=2, % sets default tabsize to 2 spaces
title=\lstname % show the filename of files included with \lstinputlisting; also try caption instead of title
}
- escapeinside
escapeinside 行需要解释。选项 escapeinside={A}{B}
将定义转义到 LaTeX 代码的定界符,即,字符串“A”和“B”之间的所有代码都将被解析为当前listings样式上的 LaTeX 代码。在上面的示例中,Octave 的注释以 %
开头,并且它们将被打印在文档中,除非它们以 %*
开头,在这种情况下,它们将被解析为 LaTeX(执行所有 LaTeX 命令),直到它们被另一个 *)
关闭。如果您添加了上面的段落,可以使用以下方法在代码中更改设置
\lstset{language=C,caption={Descriptive Caption Text},label=DescriptiveLabel}
|
还有很多其他选项,请查看官方文档。
该包允许您定义样式,即指定一组设置的配置文件。
示例
\lstdefinestyle{customc}{
belowcaptionskip=1\baselineskip,
breaklines=true,
frame=L,
xleftmargin=\parindent,
language=C,
showstringspaces=false,
basicstyle=\footnotesize\ttfamily,
keywordstyle=\bfseries\color{green!40!black},
commentstyle=\itshape\color{purple!40!black},
identifierstyle=\color{blue},
stringstyle=\color{orange},
}
\lstdefinestyle{customasm}{
belowcaptionskip=1\baselineskip,
frame=L,
xleftmargin=\parindent,
language=[x86masm]Assembler,
basicstyle=\footnotesize\ttfamily,
commentstyle=\itshape\color{purple!40!black},
}
\lstset{escapechar=@,style=customc}
在我们的示例中,我们只全局设置了两个选项:默认样式和转义字符。用法
\begin{lstlisting}
#include <stdio.h>
#define N 10
/* Block
* comment */
int main()
{
int i;
// Line comment.
puts("Hello world!");
for (i = 0; i < N; i++)
{
puts("LaTeX is also great for programmers!");
}
return 0;
}
\end{lstlisting}
\lstinputlisting[caption=Scheduler, style=customc]{hello.c}
C 部分将打印为
如果您有一堆要包含的源文件,您可能会发现自己一遍又一遍地做同样的事情。这就是宏显示其真正力量的地方。
\newcommand{\includecode}[2][c]{\lstinputlisting[caption=#2, escapechar=, style=custom#1]{#2}<!---->}
% ...
\includecode{sched.c}
\includecode[asm]{sched.s}
% ...
\lstlistoflistings
在这个例子中,我们创建一个命令来简化源代码的包含。我们将默认样式设置为customc。所有列表将以其名称作为标题:由于宏的存在,我们不必两次写入文件名。最后,我们使用listings包的此命令列出所有列表。
有关详细信息,请参阅宏。
默认情况下,listings不支持源代码的多字节编码。 extendedchar
选项仅适用于latin1等8位编码。
要处理UTF-8,您应该告诉listings如何解释特殊字符,方法是像这样定义它们
\lstset{literate=
{á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
{Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
{à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
{À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
{ã}{{\~a}}1 {ẽ}{{\~e}}1 {ĩ}{{\~i}}1 {õ}{{\~o}}1 {ũ}{{\~u}}1
{Ã}{{\~A}}1 {Ẽ}{{\~E}}1 {Ĩ}{{\~I}}1 {Õ}{{\~O}}1 {Ũ}{{\~U}}1
{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
{ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1
{ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {Ø}{{\O}}1 {å}{{\r a}}1 {Å}{{\r A}}1
{€}{{\euro}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1
{»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 {¡}{{!`}}1
}
上面的表格将涵盖拉丁语中的大多数字符。有关literate
选项使用情况的更详细说明,请查看Listings 文档中的第5.4节。
另一种方法是将(在前言中)替换为\usepackage{listingsutf8}
,但这仅适用于\lstinputlisting{...}
。
您可以使用caption包为您的列表创建花哨的标题(或标题)。以下是一个针对listings的示例。
\usepackage{caption}
\usepackage{listings}
\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[caption=My caption]{sourcefile.lang}
更多详细信息可以在Carsten Heinz 和 Brooks Moses 编写的 PDF中找到。
有关 Listings 包的详细信息和文档,请访问其 CTAN 网站。