我想我漏掉了一些明显的东西,但我在这个问题上困惑了好一阵子。我已经设置好了我的.Rmd文件,几乎所有的东西都能很好地与Markdown_strict和latex_fragment结合在一起(对那个进行了一点预处理),但现在还是算了吧。
这是我作为输入的一个sample.Rmd文件。我不知道如何嵌套回标,所以现在是伪回标。
---
title: "Sample"
output:
md_document:
preserve_yaml: yes
variant: markdown_strict+raw_html+all_symbols_escapable
latex_fragment: default
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = ".", output_format = "all") })
---
\`\`\`{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
sqlcode <- function(sql, code = "") {
if (knitr::is_latex_output()) {
return(paste0('\n```{=sql}\n',sql,'\n```\n'))
} else if (!knitr::is_html_output(excludes = "markdown")) {
if (length(code)>0) {
code = paste0(" ", code," ")
} else {
code = " "
}
pre <- paste0("{{< sql",code,">}}\n")
post <- "\n{{< /sql >}}"
return(knitr::raw_html(paste0(pre,sql,post)))
}
}
\`\`\`
This is a sample.
\`\`\`{r echo=FALSE}
sqlcode("SELECT *
FROM TABLE", "sample")
\`\`\`
我想要的 LaTeX 片段是。
This is a sample.
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{SELECT} \OperatorTok{*}
\KeywordTok{FROM}\NormalTok{ TABLE}
\end{Highlighting}
\end{Shaded}
我得到的是:
This is a sample.
\begin{verbatim}
## [1] "\n```{=sql}\nSELECT *\nFROM TABLE\n```\n"
\end{verbatim}
而在MD方面,我确实得到了我想要的东西,那就是:
---
title: "Sample"
output:
md_document:
preserve_yaml: yes
variant: markdown_strict+raw_html+all_symbols_escapable
latex_fragment: default
knit: (function(inputFile, encoding) {
rmarkdown::render(inputFile, encoding = encoding,
output_dir = ".", output_format = "all") })
---
This is a sample.
{{< sql sample >}}
SELECT *
FROM TABLE
{{< /sql >}}
对于那些熟悉雨果的人来说 这些都是我在雨果生成的网站上使用的自定义快捷码。没有身份的SQL代码是故意的,然后通过Hugo来突出显示。
在任何情况下,我如何让 sqlcode(...) 输出一个栅栏区块,让 pandoc 在 LaTeX 中正确地高亮显示,或者,我应该定制 pdf_document.R 的哪一部分来实现这个目标?我已经尝试了各种标记输出的 knitr 函数,我可以得到一个中间 MD 文件,我可以处理它来删除一些标记,但我无法在 knitr 将它发送到 Pandoc 之前处理这个中间 MD 文件。
经过一段时间的试验和错误,我想通了。这就像改变一行一样简单-_-。
sqlcode <- function(sql, code = "") {
if (knitr::is_latex_output()) {
knitr::raw_output(paste0('\n```sql\n',sql,'\n```\n'), markers=NULL)
} else if (!knitr::is_html_output(excludes = "markdown")) {
if (length(code)>0) {
code = paste0(" ", code," ")
} else {
code = " "
}
pre <- paste0("{{< sql",code,">}}\n")
post <- "\n{{< /sql >}}"
return(knitr::raw_html(paste0(pre,sql,post)))
}
}