我在用bookdown::gitbook和bookdown::pdf_book输出的文档中使用bookdown。
在我的Rmd文件中,我使用div来包装带有css文件样式的注释和警告。例如:
<div class="note">
This is a note.
</div>显然,在生成PDF文件时,HTML和CSS会被忽略。我想知道是否有一种方法来“注入”一个小脚本来代替div,例如,一个简单的前缀文本。
或者,是否有另一种方法可以在HTML和PDF中格式化它而不乱扔我的文件,方法是每次添加一些冗长的内容,比如:
if (knitr::is_html_output(excludes='epub')) {
cat('
<div class="note">
This is a note.
</div>
')
} else {
cat('Note: This is a note.')
}我也可以像描述的这里那样对区块引号进行样式化,但这不是一个选项,因为我仍然需要区块引号。
发布于 2022-03-14 17:16:55
这样做的适当方法是使用一个有围栏的div,而不是将HTML直接插入到您的标记中,然后尝试稍后使用LUA解析它。Pandoc已经允许您插入自定义样式并将它们处理为两种文件类型。换句话说,它将负责为您创建适当的HTML和LaTeX,然后您只需对它们进行样式设置。Bookdown文档引用了这个这里,但它只是指向进一步的文档这里和这里。
此方法将在html中创建自定义的类div,并在LaTeX代码中应用相同的样式名称。
所以,对于您的例子,它应该是这样的:
::: {.note data-latex=""}
This is a note.
:::HTML中的输出将与您的输出相同:
<div class="note">
<p>This is a note.</p>
</div>你已经有了你想要的CSS样式。
LaTeX代码如下:
\begin{note}
This is a note.
\end{note}要将这种样式添加到preamble.tex文件中,您将需要添加一些代码,您已经知道了这一点。下面是一个非常简单的LaTeX示例,它可以简单地从左侧和右侧缩进文本:
\newenvironment{note}[0]{\par\leftskip=2em\rightskip=2em}{\par\medskip}发布于 2022-02-14 22:51:01
我发现了这个回答 on tex.stackexchange.com,它使我走上了解决问题的正确轨道。
这就是我在做的事情。
boxes.lua: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
endpandoc_args添加到_output.ymlbookdown::pdf_book:
includes:
in_header: latex/preamble.tex
pandoc_args:
- --lua-filter=latex/boxes.lua
extra_dependencies: ["float"]preamble.tex中创建环境(也在_output.yml中配置):tcolorbox而不是mdframed\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}LaTeX Error: Not in outer par mode.。通过在我的Rmd文件中添加以下命令,我能够解决这个问题:```{r, echo = F}knitr::opts_chunk$set(fig.pos = "H",out.extra = "")
https://stackoverflow.com/questions/71088520
复制相似问题