【问题标题】:In Bookdown, `\textcolor` is not recognized when I attempt to compile an epub book using Pandoc在 Bookdown 中,当我尝试使用 Pandoc 编译 epub 书籍时,无法识别 `\textcolor`
【发布时间】:2019-12-24 04:05:20
【问题描述】:

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

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

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

这是有原因的吗?

【问题讨论】:

    标签: r-markdown pandoc tex bookdown


    【解决方案1】:

    让我们看看文档的处理方式。我将省略 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,但仍然出现错误。你有什么建议吗?再次非常感谢!
    • 哎呀。我认为发生的事情是 LaTeX sn-p,例如\newcommand{\foo}{bar},解析后没有产生任何输出。我已经调整了过滤器以防止它在这种情况下失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2022-01-09
    相关资源
    最近更新 更多