LaTeX中突出显示的源代码


196

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

但是,现在我需要更大的灵活性。通常,我要寻找的是一个真正的词法分析器。特别是,我需要(用于自己的语言定义)定义(并突出显示!)自己的数字样式。listings不允许突出显示代码中的数字。但是,我需要产生以下内容:

所需结果

listings也不能应付字符串的任意定界符。考虑以下有效的Ruby代码:

s = %q!this is a string.!

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

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

理想情况下,我正在寻找扩展名,listings以便允许我提供更复杂的词汇规则。但是除非如此,我也在寻找可行的替代方案。

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

但是,这非常缺乏功能。我尤其对listings-style行编号,源代码行引用以及将LaTeX嵌入源代码(选项texclmathescapelistings)的可能性感兴趣。

例如,这是源代码类型集,listings其中显示了替代品还应提供的一些内容:

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


如果您不愿意引入外部工具(例如pygments),那为什么不只为文档编写一个makefile?
云母

6
这不应该迁移到tex.stackexchange.com吗?^^
Matthias

1
@Matthias不确定。当我发布它时,没有tex.se,但现在在这里似乎很有用–这个问题引起了极大反响,而在TeX.SE上,到目前为止还没有人发布类似的问题。此外,它实际上实际上与编程和编程工具有关,因此我想程序员是从中受益的人。
Konrad Rudolph 2012年

1
对于那些可能忘记LaTeX的人来说,他们正在编写的文档:请注意,使用Office Word或LibreOffice Writer,您只需将代码从Eclipse复制/粘贴到那里,并保留颜色!
MohamedEzz 2014年

3
@MemoryLeaks我不确定该建议对谁有用吗:Office软件不是LaTeX的有效替代品(LaTeX 不是办公软件,它是台式机发布系统,简而言之,这意味着它可以提供出色的排版,以及与办公软件相比的所有其他优势)。
康拉德·鲁道夫2014年

Answers:


352

牢记Norman的建议,我找到了一个解决方案,该解决方案使用(修补的)Pygments进行突出显示,并尽可能多地引入功能而不会破裂;-)

1.2版中发布我的Pygments补丁程序后,我还创建了LateX包...

呈现薄荷糖

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

(但铸造也可用于latexpdflatex...)

minted.sty的工作原理与之相似,texments.sty但允许附加功能。

如何获得

再次感谢Norman激励我生产此包装。


19
经过数小时的关于如何在LaTeX中使用pygments的搜索,以及花费大量时间尝试破解自己的解决方案之后,这是我发现的最好的。更好的是,它实际上有效。谢谢你
sykora

2
在这里只是为了欣赏您以逐渐的方式完成的工作;)!
FilipDupanović10年

4
@Paul:的确,在Windows上整个过程很混乱。:-(希望Pygments来做的下一个版本将有所缓解的,但对人谁不经常使用Python(因此工作easy_install)的过程中永远不会很顺利。
康拉德·鲁道夫

1
现在在TeX SE网站上,您的软件包很多问题,我只是提出了一种功能要求(隐藏在注释中)。您可能想看看。
圣保罗Ebermann

1
@Paŭlo谢谢。我尝试阅读该软件包的所有提及内容(我有Google提醒),但我并不总是成功。您提到的问题我已经读过(很明显:我赞成,但我不记得了),但这根本不简单。“ Ab”为此使用TikZ似乎是个坏习惯……
Konrad Rudolph

6

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

我不太了解为什么您不愿意在工具链中引入外部工具,但是由于您的实际情况,您将不得不做额外的工作。看看源代码后,我期望,修改listings应该是可能的,但我个人会选择预处理我的乳胶来代替。


我一点也不愿意介绍外部工具-实际上,我认为使用Pygments可能是最好的解决方案。问题是如何以一种聪明的方式做到这一点,这样我仍然可以\label在代码内转义到LaTeX和s。
康拉德·鲁道夫2009年

至于更改listings,我已经查看了它的来源-不幸的是,我一点都不了解。我的TeX技能远没有达到那个水平。到目前为止,无论如何,我只使用过TeX的LaTeX子集。
康拉德·鲁道夫

1
我要说的是,引入外部工具的最大问题是您是否要发布。许多期刊出版商(咳嗽咳嗽者SPRINGER等)都需要在原始LaTex中进行提交,然后在其服务器上进行编译。不用说,如果您的第三方工具不在他们的服务器上,则除非您进行了预处理(否则这使Tex驱动器无法使用大多数工具),否则您就是SOL。
Namey 2012年

如果文档正确无误,则仍会维护列表包-但是维护者已更改,并且已收到错误修正:ctan.org/pkg/listings?lang=zh
DetlevCM

1
@Namey,这只是一个数据点:我minted通过Springer的LNCS发布过程成功地成功完成了一篇论文。
Volker Stolz

3

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

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

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


1
highlight共享Pygments的所有问题。特别地,尽管它有描述,但它不是LaTeX软件包。它只是一个独立程序。就像Pygments一样,问题是如何从LaTeX内部有意义地使用它,并提供所有不错的东西listings
Konrad Rudolph,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.