源代码在LaTeX中突出显示

时间:2009-12-27 17:07:55

标签: latex syntax-highlighting pygments

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

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

Required result

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

s = %q!this is a string.!

此处,!可以替换为任何分隔符。

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

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

Other threads建议使用Pygments来生成LaTeX输出。甚至还有一个包 - texments - 来缓解过渡。

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

举个例子,这是一个带有listings的源代码排版,它显示了替代品应该提供的一些内容:

LaTeX listings example: Sideways addition [“Sideways add”改编自Bit Twiddling Hacks]

3 个答案:

答案 0 :(得分:336)

将诺曼的建议铭记于心,我已经将一个使用(patched)Pygments进行突出显示的解决方案整合在一起并尽可能多地推入了没有爆破的特征; - )

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

介绍铸造

minted 是一个使用Pygments在LaTeX中提供顶级语法高亮显示的软件包。例如,它允许以下输出。

fancy LaTeX example

这是一个重现上述代码的最小文件(注意包含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.stytexments.sty类似,但允许使用其他功能。

如何获得

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

我还没有用它来知道它是如何工作的,但我认识的其他人说它工作得很好。如果我有机会,我会亲自尝试看看。