我需要在 LaTeX 中突出显示源代码。包 listings
似乎是大多数用例的最佳选择,对我来说,直到现在。
但是,现在我需要更多的灵活性。一般来说,我正在寻找的是一个 real 词法分析器。特别是,我需要(对于自己的语言定义)定义(并突出显示!)自己的数字样式。 listings
不允许在代码中突出显示数字。但是,我需要制作这样的东西:
https://i.stack.imgur.com/Hh4W1.png
listings
也无法处理字符串的任意分隔符。考虑以下有效的 Ruby 代码:
s = %q!this is a string.!
在这里,!
几乎可以替换为 any 分隔符。
(listings
不能处理 Unicode 也很麻烦,但这是另一个问题。)
理想情况下,我正在寻找 listings
的扩展,它允许我提供更复杂的词法规则。但除此之外,我还在寻找可行的替代方案。
Other threads 建议使用可以产生 LaTeX 输出的 Pygments。甚至还有一个包 - texments
- 来简化过渡。
但是,这非常缺乏功能。特别是,我对 listings
样式的行编号、源代码行引用以及在源代码中嵌入 LaTeX 的可能性(listings
中的选项 texcl
和 mathescape
)感兴趣。
例如,这是一个带有 listings
的源代码排版,它显示了替换还应该提供的一些内容:
https://i.stack.imgur.com/9Guwv.png
将 Norman 的建议牢记在心,我编写了一个解决方案,该解决方案使用 (a patched) Pygments 来突出显示并尽可能多地推送功能而不会爆裂 ;-)
我还创建了一个 LateX 包,一旦我的 Pygments 补丁在 version 1.2 中发布……
呈现铸造
minted 是一个包,它使用 Pygments 在 LaTeX 中提供一流的语法突出显示。例如,它允许以下输出。
https://i.stack.imgur.com/OLUjl.png
这是重现上述代码的最小文件(请注意,包括 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 也适用于 latex
和 pdflatex
...)
minted.sty
的工作方式与 texments.sty
类似,但允许附加功能。
如何得到它
minted 在 CTAN 上列出(包信息)
文档当然包括在内。
minted 现在由 Geoffrey Poore 维护。开发版本,包括最新的 .sty 文件,可在 github.com/gpoore/minted 获得,并且可以从那里克隆。
再次感谢 Norman 激励我制作这个包。
TeX 是(著名的)图灵完备的,但我很确定你将不得不自己编写这个扩展。文档清楚地表明 listings
的原始作者在 2004 年将其孤立,并且自 2006 年以来未更新。该包并非旨在覆盖数字文字的格式,但您可以修改它通过改变 \lst@ProcessDigit
的定义。如果这不起作用,您必须详细了解“标识符样式”选项的工作原理,并且您必须为您的数字文字复制该机制。
我不太明白为什么您如此不愿意将外部工具引入您的工具链,但是因为您是,所以您必须做额外的工作。查看源代码后,我希望修改 listings
应该是可能的,但我个人会选择预处理我的 LaTeX。
\label
。
listings
,我已经看过它的来源——不幸的是,我一点也不明白。我的 TeX 技能远不及那个水平。到目前为止,我只使用过 TeX 的 LaTeX 子集。
minted
偷偷写了一篇论文。
This 是一个将源代码转换为带有语法高亮显示的 TeX 和 LaTeX 的包。可以轻松添加自定义编程语言定义。
Highlight 支持 100 种编程语言,包括 50 个颜色主题。它具有代码重新格式化和缩进的功能。
我没有用它来了解它的工作原理,但我认识的其他人说它工作得很好。如果有机会,我会亲自试一试看看。
highlight
分享了 Pygments 的所有问题。特别是,它不是 LaTeX 包,尽管它的描述是这样的。它只是一个独立的程序。与 Pygments 一样,问题是如何在 LaTeX 中有意义地使用它并提供 listings
所拥有的所有好东西。
easy_install
)的人来说,这个过程永远不会很顺利。