截至 2013 年 3 月的比较(见下文更新)

截至 2013 年 3 月的比较(见下文更新)

关于语法颜色源代码的排版,我知道listings因为它没有使用完整的词法分析器,所以效果较差。建议使用基于 Python 的解决方案。似乎有三个包可以使用 Python 库pygmentsmintedtexmentsverbments

大多数人似乎都minted在这里使用。verbments文档说它旨在修复 的问题minted

那么,它们之间有什么重要的区别呢?有人尝试过所有这些方法吗?

答案1

截至 2013 年 3 月的比较(见下文更新)

我对所有使用 Pygments 的常见包都比较熟悉。作为编写我的pythontex包,我研究了以前所做的事情。

  • texments非常基础。它不提供对 Pygments 或fancyvrb的大部分功能的访问。
  • minted提供对 Pygments 和 的更完整的访问fancyvrb,并添加了背景颜色等附加功能。
  • verbments比 更新minted,这可能解释了为什么它似乎不那么受欢迎。verbments文档说“该minted包无法将突出显示的源代码拆分到页面上”。从技术上讲,minted可以很好地做到这一点——问题在于提供的listing浮动minted。(编辑:使用背景色时也会出现分页问题,​​但可以通过不使用包的bgcolor选项并使用mdframed或类似的包来克服这些问题。)verbments解决方案是允许列出编号和标题——但不提供真实的浮动(这必须解决分页符问题)。 verbments还提供了单独的突出显示样式(您可以为每个环境使用不同的 Pygments 样式)和一些minted缺少的附加选项。
  • pygmentex是另一个 Pygments 包(2012-02-12)。它包括 Pygments 的自定义补丁,允许在任何地方转为 LaTeX。这很好,但随着 Pygments 的不断发展,也可能使维护变得困难。(该功能已被请求自 2010 年初以来,Pygments 一直仍然open.) pygmentex提供了一个内联命令。并且它缓存了输出。

  • 最后,这是我的pythontex软件包。(首次发布于 2012/04/27,但前一年已开始开发。)其主要目的是允许将 Python 代码包含在 LaTeX 文档中,并能执行代码并返回输出。添加 Pygments 突出显示实际上是事后才想到的。 pythontex提供 的大部分minted功能,除了背景颜色等少数功能(因为可以使用 等软件包轻松添加这些功能mdframed)。它使用我已经创建的机制来缓存已执行代码的输出,从而缓存所有突出显示的内容。它还提供内联命令,允许在同一语言的环境之间自动延续行号,并允许fancyvrb基于每种语言进行设置。pdfTeX 引擎支持 Unicode。

因此,这给我们留下了许多 Pygments 突出显示选项。缓存对于性能非常重要,但缺点是我的方法和方法都pygmentex需要编译(将代码保存到辅助文件)、运行 Python 脚本(使用 Pygments 进行突出显示,然后保存输出)和第二次编译(带回突出显示的输出)。其他\write18软件包使用的方法的一个真正优点是突出显示始终是最新的,只需要一次编译。使用 LuaTeX 缓存并保持所有内容最新可能并不难。否则,我会考虑\pdfmdfivesum(可能使用临时文件),但我不相信 XeTeX 有等效方法。可能没有一个好的跨引擎替代方案来替代这三个步骤。

pythontex正在积极开发中,在可预见的未来应该会继续提供 Pygments 突出显示功能。虽然重点是访问 Python,但我正在进行重大重构,应该允许将包扩展到任意语言,每个扩展只需要几十行代码。所有这些的缺点是它pythontex不像仅突出显示的包那样灵活。

编辑:与 Konrad Rudolph 通信后,我决定保留minted。开发将在https://github.com/gpoore/minted

2016 年 7 月更新

截至 2016 年中,minted这通常是最佳选择,除非您需要pythontex其他软件包中的特定功能。

自 2013 年以来,texments并且verbments至少在 CTAN 上保持不变。 pygmentex已于 2015 年 5 月更新;基于提交历史,看上去并没有什么重大的变化。

自接手minted开发以来,我已经添加了几个主要功能。

  • 缓存。minted在一次编译中执行所有突出显示,缓存突出显示的代码以供将来运行。只要文件.aux未被删除,缓存就会自动清除。缓存可以“冻结”以供在-shell-escape不可用的情况下使用(minted在这种情况下,许多相关内容不应编辑,因为无法更新缓存)。

  • 内联代码的命令\mintinline

  • 使用 pdfTeX 提供 Unicode 支持。

  • 使用 Pygments 2.0+ 中的选项任意转义为 LaTeX escapeinside(但请注意,这可能很脆弱取决于 Pygments 如何标记)。

  • 在空格处、所有字符之间、用户指定字符之前或之后、空格分隔的标记之间或所有标记之间自动换行。

  • bgcolor与分页符兼容。

我最近将大部分换行代码和一些额外的扩展分离到fancyvrb一个名为的新包中fvextraminted。和的下一个版本pythontex都需要fvextra;这些版本将在 2016 年 7 月底之前在 CTAN 上发布。这将保留mintedpythontex的大部分相同功能,尽管在不久的将来minted仍将具有bgcolor基于标记的换行符和一些 Pygments 选项的优势。 pythontex在某些情况下可能仍然具有速度优势,主要是在编译之间修改了大量突出显示的代码时,但这通常应该是最小的。

答案2

目前状态:minted维护工作已移交给 Geoffrey Poore。

minted目前基本上没有得到维护。我尝试修复尽可能多的错误,但有两件事阻碍了我:

  1. 我再也没有时间从事副业了。这很不幸。事实上,我开发 minted 主要是为了我自己的硕士论文,但最终没有在那里使用它,因为有些繁琐的事情还没有解决。
  2. 许多有趣的变化,其中最重要的两个(内联代码突出显示,通过缓存和变化跟踪提高性能)理想情况下需要在上游 Pygments 代码库中进行更改,到目前为止,这些更改(已作为补丁提交给 Pygments)尚未集成。

我不知道如何(如果)verbments解决这个限制——也许他们正在维护自己的 Pygments 项目分支,并不关心兼容性,或者他们在 LaTeX 本身中执行一些有趣的解析工作。无论如何,我都对这种努力表示赞赏。我更希望他们在它的基础上进行构建minted(以避免重复工作和让几个项目做同样的事情),但我也开始了自己的包,而不是在它的基础上构建,texments所以我理解这背后的动机。

相关内容