我使用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}
通过此功能,您可以选择通过执行以下操作来自定义这些块的外观:
- 定义您自己的语言并
\lstdefinelanguage
使用默认样式 - 定义默认样式来
\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