首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展Pandoc

如何扩展Pandoc
EN

Stack Overflow用户
提问于 2022-02-12 02:33:05
回答 2查看 194关注 0票数 1

我在用bookdown::gitbookbookdown::pdf_book输出的文档中使用bookdown。

在我的Rmd文件中,我使用div来包装带有css文件样式的注释和警告。例如:

代码语言:javascript
复制
<div class="note">
This is a note.
</div>

显然,在生成PDF文件时,HTML和CSS会被忽略。我想知道是否有一种方法来“注入”一个小脚本来代替div,例如,一个简单的前缀文本。

或者,是否有另一种方法可以在HTML和PDF中格式化它而不乱扔我的文件,方法是每次添加一些冗长的内容,比如:

代码语言:javascript
复制
if (knitr::is_html_output(excludes='epub')) {
  cat('
<div class="note">
This is a note.
</div>
  ')
} else {
  cat('Note: This is a note.')
}

我也可以像描述的这里那样对区块引号进行样式化,但这不是一个选项,因为我仍然需要区块引号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-14 17:16:55

这样做的适当方法是使用一个有围栏的div,而不是将HTML直接插入到您的标记中,然后尝试稍后使用LUA解析它。Pandoc已经允许您插入自定义样式并将它们处理为两种文件类型。换句话说,它将负责为您创建适当的HTML和LaTeX,然后您只需对它们进行样式设置。Bookdown文档引用了这个这里,但它只是指向进一步的文档这里这里

此方法将在html中创建自定义的类div,并在LaTeX代码中应用相同的样式名称。

所以,对于您的例子,它应该是这样的:

代码语言:javascript
复制
::: {.note data-latex=""}
This is a note.
:::

HTML中的输出将与您的输出相同:

代码语言:javascript
复制
<div class="note">
<p>This is a note.</p>
</div>

你已经有了你想要的CSS样式。

LaTeX代码如下:

代码语言:javascript
复制
\begin{note}
This is a note.
\end{note}

要将这种样式添加到preamble.tex文件中,您将需要添加一些代码,您已经知道了这一点。下面是一个非常简单的LaTeX示例,它可以简单地从左侧和右侧缩进文本:

代码语言:javascript
复制
\newenvironment{note}[0]{\par\leftskip=2em\rightskip=2em}{\par\medskip}
票数 1
EN

Stack Overflow用户

发布于 2022-02-14 22:51:01

我发现了这个回答 on tex.stackexchange.com,它使我走上了解决问题的正确轨道。

这就是我在做的事情。

  1. 创建具有以下功能的boxes.lua
代码语言:javascript
复制
function Div(element)
-- function based on https://tex.stackexchange.com/a/526036

    if 
        element.classes[1] == "note" 
        or element.classes[1] == "side-note" 
        or element.classes[1] == "warning" 
        or element.classes[1] == "info" 
        or element.classes[1] == "reading" 
        or element.classes[1] == "exercise" 
    then

        -- get latex environment name from class name
        div = element.classes[1]:gsub("-", " ")
        div = div:gsub("(%l)(%w*)", function(a, b) return string.upper(a)..b end)
        div = "Div"..div:gsub(" ", "")
        
        -- insert element in front
        table.insert(
            element.content, 1,
            pandoc.RawBlock("latex", "\\begin{"..div.."}"))

        -- insert element at the back
        table.insert(
            element.content,
            pandoc.RawBlock("latex", "\\end{"..div.."}"))

    end
    return element
end
  1. pandoc_args添加到_output.yml
代码语言:javascript
复制
bookdown::pdf_book:
  includes:
    in_header: latex/preamble.tex
  pandoc_args: 
    - --lua-filter=latex/boxes.lua 
  extra_dependencies: ["float"]
  1. preamble.tex中创建环境(也在_output.yml中配置):
    • 我使用的是tcolorbox而不是mdframed

代码语言:javascript
复制
\usepackage{xcolor}
\usepackage{tcolorbox}

\definecolor{notecolor}{RGB}{253, 196, 0}
\definecolor{warncolor}{RGB}{253, 70, 0}
\definecolor{infocolor}{RGB}{0, 183, 253}
\definecolor{readcolor}{RGB}{106, 50, 253}
\definecolor{taskcolor}{RGB}{128, 252, 219}

\newtcolorbox{DivNote}{colback=notecolor!5!white,colframe=notecolor!75!black}
\newtcolorbox{DivSideNote}{colback=notecolor!5!white,colframe=notecolor!75!black}
\newtcolorbox{DivWarning}{colback=warncolor!5!white,colframe=warncolor!75!black}
\newtcolorbox{DivInfo}{colback=infocolor!5!white,colframe=infocolor!75!black}
\newtcolorbox{DivReading}{colback=readcolor!5!white,colframe=readcolor!75!black}
\newtcolorbox{DivExercise}{colback=taskcolor!5!white,colframe=taskcolor!75!black}
  1. 因为我的框中也有图像和表格,所以我遇到了LaTeX Error: Not in outer par mode.。通过在我的Rmd文件中添加以下命令,我能够解决这个问题:
代码语言:javascript
复制
```{r, echo = F}

knitr::opts_chunk$set(fig.pos = "H",out.extra = "")

代码语言:javascript
复制
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71088520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档