【发布时间】:2019-12-24 04:05:20
【问题描述】:
在bookdown中,当我尝试使用编译时,似乎无法识别乳胶中的\textcolor
bookdown::render_book('bookdown::epub_book')
即使我已将 \usepackage{xcolor} 添加到 preamble.tex 文件中。
这是有原因的吗?
【问题讨论】:
标签: r-markdown pandoc tex bookdown
在bookdown中,当我尝试使用编译时,似乎无法识别乳胶中的\textcolor
bookdown::render_book('bookdown::epub_book')
即使我已将 \usepackage{xcolor} 添加到 preamble.tex 文件中。
这是有原因的吗?
【问题讨论】:
标签: r-markdown pandoc tex bookdown
让我们看看文档的处理方式。我将省略 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 sn-p 将包含在输出中。 pandoc 在生成 HTML/EPUB 时忽略了 sn-p,因为包含它不会产生预期的效果。
那么我们能否说服 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 sn-ps。 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 图书中。
【讨论】:
"attempt to index a nil value (field '?')" 错误。我相信其中一个字段可能为零。我试图将 if 语句更改为if el.format and el.format == 'tex' and el.text then,但仍然出现错误。你有什么建议吗?再次非常感谢!
\newcommand{\foo}{bar},解析后没有产生任何输出。我已经调整了过滤器以防止它在这种情况下失败。