LaTeX/源代码列表
许多包提供代码列表和突出显示,以下是最受欢迎的包
使用listings包
[edit | edit source]使用包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}
支持的语言
[edit | edit source]它支持以下编程语言
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 代码。您无法包含 *.NB 文件
\lstinputlisting{...}
,就像您可以使用任何其他编程语言一样,但 Mathematica 可以导出为格式精美的 LaTeX 源代码。 - 对于这些语言,必须指定方言(例如,
language={[x86masm]Assembler}
)。 - Modelica 通过 此处提供的 dtsyntax 包支持。
- 对于这些语言,支持多种方言。例如,C 有 ANSI、Handel、Objective 和 Sharp。有关概述,请参阅 listings 手册 的第 12 页。
- 定义为另一种语言的方言
设置
[edit | edit source]您可以修改影响代码显示方式的多个参数。您可以将以下代码放在文档中的任何位置(无论是在 \beginspan class="nb">{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}
|
还有更多选项,请查看官方文档。
样式定义
[edit | edit source]该包允许您定义样式,即 指定一组设置的配置文件。
示例
\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 部分将打印为
自动包含文件
[edit | edit source]如果您有一堆要包含的源文件,您可能会发现自己一遍又一遍地做着同样的事情。这就是宏真正发挥作用的地方。
\newcommand{\includecode}[2][c]{\lstinputlisting[caption=#2, escapechar=, style=custom#1]{#2}<!---->}
% ...
\includecode{sched.c}
\includecode[asm]{sched.s}
% ...
\lstlistoflistings
在这个例子中,我们创建了一个命令来简化源代码的包含。我们将默认样式设置为customc。所有列表都将使用其名称作为标题:由于宏的存在,我们不必两次编写文件名。最后,我们使用来自listings包的此命令列出所有列表。
有关更多详细信息,请参见宏。
编码问题
[edit | edit source]默认情况下,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{listings}
(在序言中)替换为\usepackage{listingsutf8}
,但这只对\lstinputlisting{...}
有效。
自定义标题
[edit | edit source]您可以使用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}
参考文献
[edit | edit source]更多详细的信息可以在Carsten Heinz 和 Brooks Moses 编写的 PDF中找到。
关于 Listings 包的详细信息和文档可以在其 CTAN 网站上找到。