有条件的高亮输出

问题描述 投票:0回答:1

我想我漏掉了一些明显的东西,但我在这个问题上困惑了好一阵子。我已经设置好了我的.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 文件。

r-markdown knitr
1个回答
1
投票

经过一段时间的试验和错误,我想通了。这就像改变一行一样简单-_-。

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)))
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.