跳转到内容

LaTeX/源代码列表

来自维基教科书,开放的书籍,开放的世界
(重定向自 LaTeX/Packages/Listings)

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. 规则和支撑

技术文本

  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

[编辑 | 编辑源代码]

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

支持的语言

[编辑 | 编辑源代码]

它支持以下编程语言

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 代码。您不能像其他编程语言一样使用 \lstinputlisting{...} 包含 *.NB 文件,但 Mathematica 可以导出为漂亮格式的 LaTeX 源代码。
  2. 对于这些语言,必须指定方言(例如 language={[x86masm]Assembler})。
  3. Modelica 通过 这里 可用的 dtsyntax 包支持。
  4. 对于这些语言,支持多种方言。例如,C 有 ANSI、Handel、Objective 和 Sharp。请参阅 listings 手册 第 12 页的概述。
  5. 定义为另一种语言的方言

您可以修改几个参数,这些参数会影响代码的显示方式。您可以在文档中的任何位置放置以下代码(无论是在 \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 网站


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