pandoc 代码块中的用户定义语言

User defined language in pandoc code-block

我正在尝试在 pandoc.

中的 Coq(长话短说 :))中编写代码块
$ pandoc --list-highlight-languages | grep coq | wc -l
0

因为它不存在,我想知道是否有一个选项可以编写我自己的用户定义代码块语言?

可以使用自定义过滤器扩展 pandoc 可执行文件:https://pandoc.org/filters.html


而对于直接在 Haskell 中转换 Pandoc 文档(不经过过滤器),一个有用的东西是遍历 Text.Pandoc.Walk.walkMpandoc-types 中的其他相关函数。

例如,我在 hakyll-alectryon 中使用它在 Hakyll 中使用 pandoc 处理 Coq 代码块。

答案在一定程度上取决于目标输出格式。最通用的解决方案是定义语法定义。 Pandoc 可以为 Kate 编辑器解析 XML 语法定义,有关格式的更多信息,请参阅 https://docs.kde.org/stable5/en/kate/katepart/highlight.html。如果你有这样一个 XML 文件,然后通过 --syntax-definition 命令行选项将它传递给 pandoc。

如果输出格式是 LaTeX(或通过 LaTeX 的 PDF),那么使用带有 --listing 选项的 pandoc 应该可以,尤其是。结合此处提到的提示时: https://tex.stackexchange.com/q/434523/

同样,minted 可用于突出显示,请参阅 minted.lua 过滤器。

最后但同样重要的是,可以通过过滤器使用外部语法荧光笔。 Lua filters 非常适合该任务,因为它们不需要安装额外的 tool-chain。

出于完整性原因,我正在为从 markdown 文件html 幻灯片 生成的最小 xml 语法文件pandoc。它是为任何编写 dsl and wants to easily mark specific words in a code block. See here 许多完整语法示例

的人准备的框架
<?xml version="1.0" encoding="UTF-8"?>
<language name="coq" extensions="*.v" indenter="haskell">
  <highlighting>
  <list name="kw_major">
    <item>induction</item>
    <item>Fixpoint</item>
    <item>Theorem</item>
    <item>Qed</item>
  </list>
  <list name="kw_minor">
    <item>exists</item>
    <item>forall</item>
    <item>nat</item>
  </list>
  <contexts>
    <context name="Normal" attribute="Normal" lineEndContext="#stay">
      <keyword    attribute="KwMajor" context="#stay" String="kw_major" />
      <keyword    attribute="KwMinor" context="#stay" String="kw_minor" />
      <Int        attribute="Decimal" context="#stay" />
      <DetectChar attribute="String"  context="String" char="&quot;" />
    </context>
    <context name="String" attribute="String" lineEndContext="StringSyntaxError" >
      <DetectChar attribute="String" context="#pop"  char="&quot;"       />
      <RegExpr    attribute="String" context="#stay" String="[^&quot;]*" />
    </context>
  </contexts>
  <itemDatas>
    <itemData name="KwMajor" defStyleNum="dsDataType"/>
    <itemData name="KwMinor" defStyleNum="dsKeyword"/>
    <itemData name="Decimal" defStyleNum="dsDecVal"/>
    <itemData name="String"  defStyleNum="dsString"/>
  </itemDatas>
  </highlighting>
  <general><keywords casesensitive="1" /></general>
</language>