210

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

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

所需结果

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

s = %q!this is a string.!

在这里,!几乎可以用任何分隔符代替。

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

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

其他线程建议使用可以产生 LaTeX 输出的Pygments 。甚至还有一个包 – texments– 来简化过渡。

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

例如,这是一个源代码排版,listings其中显示了替换还应提供的一些内容:

LaTeX 列表示例:横向添加 [从Bit Twiddling Hacks修改的“横向加法”]

4

3 回答 3

377

将 Norman 的建议铭记于心,我拼凑了一个解决方案,该解决方案使用(修补的)Pygments 来突出显示并尽可能多地推送功能而不会爆裂 ;-)

我还创建了一个 LateX 包,一旦我的 Pygments 补丁在1.2 版中发布……</p>

呈现铸造

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

花哨的 LaTeX 示例

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

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[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}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

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

xelatex -shell-escape test.tex

(但minted也适用于latexpdflatex……)

minted.sty工作原理类似于texments.sty但允许附加功能。

如何得到它

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

于 2009-12-31T13:02:32.530 回答
8

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

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

于 2009-12-29T03:42:42.110 回答
3

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

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

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

于 2009-12-27T23:15:42.757 回答