源代码在LaTeX中突出显示

Kon*_*lph 185 latex syntax-highlighting pygments

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

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

要求的结果

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

s = %q!this is a string.!
Run Code Online (Sandbox Code Playgroud)

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

(那listings不能处理Unicode也很烦人,但这是另一个问题.)

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

其他线程建议使用可以产生LaTeX输出的Pygments.甚至有一个包 - texments- 以缓解过渡.

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

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

LaTeX列表示例:侧身添加 [Bit Twiddling Hacks改编的"侧身添加"]

Kon*_*lph 338

把诺曼的建议铭记于心,我已经破解了一个解决方案,该解决方案使用(修补的)Pygments突出显示并推入尽可能多的功能而不爆裂;-)

一旦我的Pygments补丁在版本1.2中发布,我也创建了一个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}
Run Code Online (Sandbox Code Playgroud)

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

xelatex -shell-escape test.tex
Run Code Online (Sandbox Code Playgroud)

(但是,铸造也与工作latexpdflatex...)

minted.sty类似texments.sty但允许其他功能.

怎么弄它

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

  • 经过几个小时的搜索,如何使用LaTeX进行pygments,以及更多时间尝试破解我自己的解决方案,这是我发现的最好的.更好的是,它确实有效.谢谢你. (18认同)
  • @Paul:在Windows上,整个事情确实非常混乱.:-(希望,Pygments的下一个版本会有所缓解,但对于那些不经常使用Python(因此也就是"easy_install")的人来说,这个过程永远不会很顺利. (4认同)
  • 这里只是为了欣赏你以成为一种方式所做的工作;)! (2认同)

Nor*_*sey 5

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

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