LaTeX 中的源代码高亮显示

Posted

技术标签:

【中文标题】LaTeX 中的源代码高亮显示【英文标题】:Source code highlighting in LaTeX 【发布时间】:2010-12-30 07:12:55 【问题描述】:

我需要在 LaTeX 中突出显示源代码。 listings 包似乎是大多数用例的最佳选择,对我来说,直到现在。

但是,现在我需要更大的灵活性。一般来说,我正在寻找的是一个真正的词法分析器。特别是,我需要(对于自己的语言定义)定义(并突出显示!)自己的数字样式。 listings 不允许在代码中突出显示数字。但是,我需要制作这样的东西:

listings 也无法处理字符串的任意分隔符。考虑以下有效的 Ruby 代码:

s = %q!this is a string.!

这里,! 几乎可以替换为任何分隔符。

listings 无法处理 Unicode 也很麻烦,但这是另一个问题。)

理想情况下,我正在寻找listings 的扩展,它允许我提供更复杂的词法规则。但除此之外,我还在寻找可行的替代方案。

Other threads 建议使用可以产生 LaTeX 输出的Pygments。甚至还有一个包 - texments - 来简化过渡。

但是,这非常缺乏功能。特别是,我对listings 样式的行编号、源代码行引用以及在源代码中嵌入 LaTeX 的可能性感兴趣(listings 中的选项texclmathescape)。

例如,这里有一个带有listings 的源代码排版,它显示了替换还应该提供的一些东西:

[从Bit Twiddling Hacks修改的“横向加法”]

【问题讨论】:

如果你不想引入外部工具,比如 pygments,那么为什么不为你的文档编写一个 makefile 呢? 这个不应该迁移到tex.stackexchange.com吗?^^ @Matthias 不确定。当我发布它时,没有 tex.se,但现在它在这里似乎很有用——这个问题引起了巨大的反响,而在 TeX.SE 上到目前为止没有人发布类似的问题。此外,它实际上与编程和编程工具有关,所以我猜 程序员 是从中受益的人。 对于那些可能忘记 LaTeX 的人来说他们当前正在编写的文档:请注意,使用 Office Word 或 LibreOffice Writer,您只需将代码从 Eclipse 复制/粘贴到那里并获取您的颜色保存!! @MemoryLeaks 我不确定这个建议对谁非常有用:办公软件不是 LaTeX 的有效替代品(它不是办公软件,它是桌面出版系统,简而言之,这意味着除了与办公软件相比的所有其他优势之外,它还提供了更出色的排版)。 【参考方案1】:

将 Norman 的建议铭记于心,我编写了一个解决方案,该解决方案使用 (a patched) Pygments 来突出显示并在不爆裂的情况下尽可能多地推送功能 ;-)

我还创建了一个 LateX 包,一旦我的 Pygments 补丁在version 1.2 发布......

呈现铸造

minted 是一个包,它使用 Pygments 在 LaTeX 中提供一流的语法突出显示。例如,它允许以下输出。

这是重现上述代码的最小文件(请注意,包括 Unicode 字符可能需要 XeTeX)!

\documentclass[a4paper]article
\usepackagefontspec
\usepackageminted

\setsansfontCalibri
\setmonofontConsolas

\begindocument
\renewcommand\theFancyVerbLine
  \sffamily\textcolor[rgb]0.5,0.5,0.5\scriptsize\arabicFancyVerbLine

\beginminted[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]csharp
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_n\to\infty\fracP_nd$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\endminted
\enddocument

这可以使用以下命令进行排版:

xelatex -shell-escape test.tex

(但 minted 也适用于 latexpdflatex ...)

minted.sty 的工作方式与texments.sty 类似,但允许附加功能。

如何获得

铸造是listed on CTAN (package info)

文档当然包括在内。

minted 现在由 Geoffrey Poore 维护。开发版本,包括最新的.sty file,可在github.com/gpoore/minted 获得,并且可以从那里克隆。

再次感谢 Norman 激励我制作这个包。

【讨论】:

经过数小时搜索如何将 pygments 与 LaTeX 结合使用,以及更多小时尝试破解我自己的解决方案后,这是我找到的最好的解决方案。更好的是,它确实有效。谢谢你。 在这里只是为了欣赏您以一种有成就的方式所做的工作;)! @Paul:确实,整个事情在 Windows 上相当混乱。 :-( 希望 Pygments 的下一个版本能在一定程度上缓解这种情况,但对于不经常使用 Python(因此easy_install)的人来说,这个过程永远不会很顺利。 在 TeX SE 网站上现在有quite some questions about your package,我刚刚点击了one with a kind of feature request (hidden in the comments)。你可能想看看。 @Paŭlo 谢谢。我试着阅读所有提到的包裹(我有一个谷歌警报),但我并不总是成功。你提到的问题我实际上已经读过(显然:我赞成但我不记得了)但这一点都不简单。 “Ab”为此使用 TikZ 似乎是一个糟糕的 hack……【参考方案2】:

TeX 是(著名的)图灵完备的,但我很确定你将不得不自己编写这个扩展。该文档清楚地表明 listings 的原始作者在 2004 年将其孤立,并且自 2006 年以来一直没有更新。该包并非旨在覆盖数字文字的格式,但您可以修改它通过更改\lst@ProcessDigit 的定义。如果这不起作用,则必须详细了解“标识符样式”选项的工作原理,并且必须为数字文字复制该机制。

我不太明白为什么您如此不愿意将外部工具引入您的工具链,但因为您是,所以您必须做额外的工作。查看源代码后,我希望修改listings 应该是可能的,但我个人会选择预处理我的LaTeX。

【讨论】:

我一点也不不愿意引入外部工具——事实上,我认为使用 Pygments 可能是最好的解决方案。问题是如何以一种聪明的方式做到这一点,以便我仍然可以在代码中转义到 LaTeX 和 \labels。 至于更改listings,我已经看过它的来源——不幸的是,我一点也不明白。我的 TeX 技能远不及那个水平。到目前为止,我只使用过 TeX 的 LaTeX 子集。 我想说引入外部工具的最大问题是,如果您要发布。许多期刊出版商(cough-cough SPRINGER 等)要求以原始 LaTex 提交,然后在他们的服务器上编译。不用说,如果您的第 3 方工具不在他们的服务器上,那么您就是 SOL,除非您进行预处理(这会破坏让 Tex 驱动的大部分实用程序)。 如果文档是正确的,listings 包仍然被维护——但是维护者改变了并且它已经收到了错误修正:ctan.org/pkg/listings?lang=en @Namey,只是一个数据点:我刚刚成功地通过 Springer 的 LNCS 发布流程使用 minted 偷偷写了一篇论文。【参考方案3】:

This 是一个将源代码转换为带有语法高亮显示的 TeX 和 LaTeX 的包。可以轻松添加自定义编程语言定义。

Highlight 支持 100 种编程语言并包括 50 个颜色主题。它具有代码重新格式化和缩进功能。

我没有使用它来了解它的工作原理,但我认识的其他人说它工作得很好。如果有机会,我会亲自尝试看看。

【讨论】:

不过,highlight 分享了 Pygments 的所有问题。特别是,它不是 LaTeX 包,尽管它的描述是这样的。它只是一个独立的程序。与 Pygments 一样,问题在于如何在 LaTeX 中有意义地使用它并提供 listings 拥有的所有好东西。

以上是关于LaTeX 中的源代码高亮显示的主要内容,如果未能解决你的问题,请参考以下文章

org-mode 缓冲区 Latex 语法高亮

同一文件中多种语言的语法高亮显示:StatWeave/SAS/LaTeX

.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示

Latex 对修改内容进行高亮显示

LATEX 列表中的 Objective C 代码

codemirror 怎么对java高亮