1. 使用 --listings 选项调用 pandoc

1. 使用 --listings 选项调用 pandoc

我使用rmarkdown来生成 pdf 文件(它使用pandoc,而后者又使用pdflatex)。通过启用keep_tex选项,我注意到没有语言类型的代码块总是变成verbatim,例如:

```
my code block
```

变成:

\begin{verbatim}
my code block
\end{verbatim}

是否可以改变转换规则(例如,如果我想改变这些块的背景颜色)?

答案1

感谢@AlanMunn,我找到了至少 2 个适用于未定义语言的代码块的解决方案。两者都是pandoc特定的,实际上并不需要rmarkdown(两者的示例都可以找到这里):

1. 使用 --listings 选项调用 pandoc

在 中rmarkdown,可以像这样传递:

---
output:
  pdf_document:
    pandoc_args: [ "--listings" ]
---

lstlisting这将使得所有代码块(包括没有定义语言的代码块)都像这样包装:

\begin{lstlisting}
my code block
\end{lstlisting}

通过此功能,您可以选择通过执行以下操作来自定义这些块的外观:

  1. 定义您自己的语言并\lstdefinelanguage使用默认样式
  2. 定义默认样式来\lstset改变未指定语言的块的外观

2. 使用 pandoc 过滤器

在 中rmarkdown,可以像这样传递:

---
output:
  pdf_document:
    pandoc_args: [ "--filter", "./my-cool-filter" ]
---

“过滤器”是用任何可以处理 JSON 的语言编写的可执行文件。pandoc它将整个文档转换为 JSON 字典,并通过过滤器进行传输,然后处理结果。因此,过滤器可以以任意方式修改输出。

在这种特殊情况下,您基本上需要找到所有具有“CodeBlock”类型的元素,并将它们转换为具有“tex”子类型的“RawBlock”,并将文本值包装到LaTeX您喜欢的任何宏中。

更新:它甚至更容易(而且显然更快,根据文档),使用--lua-filter选项。过滤器的全部代码如下:

function CodeBlock(elem)
  return pandoc.RawBlock('tex', '\\begin{my-cool-macro}\n' .. elem.text .. '\n\\end{my-cool-macro}')
end

相关内容