首页 文章

源代码在LaTeX中突出显示

提问于
浏览
182

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

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

Required result

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

s = %q!this is a string.!

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

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

Ideally, I am looking for an extension of listings that allows me to provide more complex lexing rules. But barring that, I am also searching for viable alternatives.

Other threads建议使用Pygments,它可以产生LaTeX输出 . 甚至有一个包 - texments - 来缓解过渡 .

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

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

LaTeX listings example: Sideways addition
[“斜向加法”改编自Bit Twiddling Hacks]

3 回答

  • 329

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

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

    介绍铸造

    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
    

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

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

    如何获得它

    _999_铸造由Geoffrey Poore维护 . 开发版本,包括最新的.sty file,可在github.com/gpoore/minted获得,可以从那里克隆 .

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

  • 2

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

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

  • 5

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

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

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

相关问题