在Bookdown中,当我尝试使用Pandoc编译epub图书时,无法识别`\ textcolor`

时间:2019-08-18 20:40:10

标签: r-markdown pandoc tex bookdown

在书本中,当我尝试使用进行编译时,似乎无法识别乳胶中的\textcolor

bookdown::render_book('bookdown::epub_book')

即使我已将\usepackage{xcolor}添加到preamble.tex文件中。

这有原因吗?

1 个答案:

答案 0 :(得分:4)

让我们看一下文档的处理方式。我将省略knitr和R Markdown软件包的处理,而将重点放在pandoc上,这是从Markdown转换为其他格式时的最后一步。

Pandoc首先将文档解析为内部中间格式。我们可以通过选择native作为目标格式来检查该格式。因此,当我们将\textcolor{red}{Mars}提供给pandoc时,它将向我们显示本机表示形式:

$ printf '\\textcolor{red}{Mars}' | pandoc --from=markdown --to=native
[Para [RawInline (Format "tex") "\\textcolor{red}{Mars}"]]

这意味着没有过多的细节,pandoc就将\textcolor...识别为Markdown中嵌入的原始LaTeX命令。它不会尝试进一步解析LaTeX,因为它被告知读取Markdown,而不是LaTeX。当生成支持包含LaTeX的格式的输出时,此原始LaTeX片段将包含在输出中。在生成HTML / EPUB时,pandoc会忽略该代码段​​,因为包含该代码段不会产生预期的效果。

那么我们能否说服pandoc继续解析,并且pandoc知道如何将\textcolor从LaTeX转换为HTML吗?

通过pandoc将LaTeX转换为HTML,第二个问题很容易回答:

$ printf '\\textcolor{red}{Mars}' | pandoc --from=latex --to=html
<p><span style="color: red">Mars</span></p>

这看起来不错,所以让我们让pandoc解析原始的LaTeX片段作为下一步。 Pandoc具有一个名为Lua filters的功能,该功能使我们可以通过编程方式修改内部文档的表示形式。这是一个可以解析原始LaTeX命令的过滤器:

function RawInline (el)
  if el.format == 'tex' then
    local blocks = pandoc.read(el.text, 'latex').blocks
    return blocks[1] and blocks[1].content or el
  end
end

将此代码保存到文件parse-latex.lua中,并使您的文档处理管道使用此文件:

---
output:
  bookdown::epub_book:
    pandoc_args: ['--lua-filter=/path/to/your/parse-latex.lua']
---

现在,彩色文字应该会显示在您的epub书中。