跳至内容

LaTeX/源代码列表

来自维基教科书,开放世界中的开放书籍

LaTeX

入门
  1. 简介
  2. 安装
  3. 安装额外的包
  4. 基础
  5. 如何获得帮助

常用元素

  1. 文档结构
  2. 文本格式
  3. 段落格式
  4. 颜色
  5. 字体
  6. 列表结构
  7. 特殊字符
  8. 国际化
  9. 旋转
  10. 表格
  11. 标题创建
  12. 页面布局
  13. 自定义页面页眉和页脚‎
  14. 导入图形
  15. 浮动体、图形和标题
  16. 脚注和边注
  17. 超链接
  18. 标签和交叉引用
  19. 首字母

机制

  1. 错误和警告
  2. 长度
  3. 计数器
  4. 方框
  5. 规则和支撑线

技术文本

  1. 数学
  2. 高级数学
  3. 定理
  4. 化学图形
  5. 算法
  6. 源代码列表
  7. 语言学

特殊页面

  1. 索引
  2. 词汇表
  3. 参考文献管理
  4. 更多参考文献

特殊文档

  1. 科学报告(学士报告、硕士论文、博士论文)
  2. 信件
  3. 演示文稿
  4. 教师专区
  5. 简历
  6. 学术期刊(MLA、APA 等)

创建图形

  1. 介绍程序化图形
  2. MetaPost
  3. 图片
  4. PGF/TikZ
  5. PSTricks
  6. Xy-pic
  7. 创建 3D 图形

编程

  1. 纯 TeX
  2. 创建包
  3. 创建包文档
  4. 主题

其他

  1. 模块化文档
  2. 协作编写 LaTeX 文档
  3. 导出到其他格式

帮助和建议

  1. 常见问题解答
  2. 技巧和窍门

附录

  1. 作者
  2. 链接
  3. 包参考
  4. LaTeX 文档示例
  5. 索引
  6. 命令词汇表

编辑此框编辑目录


许多包提供代码列表和突出显示,以下是最受欢迎的包

  • listings
    • 非常有用且功能丰富,
  • minted
    • minted 是 listings 的一种替代方案,它越来越受欢迎。它使用外部 Python 库 Pygments 进行代码突出显示,截至 2021 年 2 月,它支持超过 537 种语言和文本格式。由于该包依赖于外部 Python 代码,因此其设置步骤比普通的 LaTeX 包要多一些,所以请查看他们的 GitHub 仓库 和他们的 手册

使用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}

这在您确信文件不会更改(至少在指定行之前)时非常有用。您也可以省略 firstlinelastline 参数:这意味着从这行开始或到这行结束的所有内容

这是一个关于一些 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.

注释
  1. 它仅在您使用纯文本格式键入时才支持 Mathematica 代码。您无法包含 *.NB 文件 \lstinputlisting{...},就像您可以使用任何其他编程语言一样,但 Mathematica 可以导出为格式精美的 LaTeX 源代码。
  2. 对于这些语言,必须指定方言(例如,language={[x86masm]Assembler})。
  3. Modelica 通过 此处提供的 dtsyntax 包支持。
  4. 对于这些语言,支持多种方言。例如,C 有 ANSI、Handel、Objective 和 Sharp。有关概述,请参阅 listings 手册 的第 12 页。
  5. 定义为另一种语言的方言

设置

[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 网站上找到。


上一个:算法 索引 下一个:语言学
华夏公益教科书