Rafael Lopez
Rafael Lopez

Reputation: 21

Conditional highlighting of output

I suppose I'm missing something obvious here, but I've been stumped for a while on this. I have my .Rmd file setup, and almost everything knits fine to Markdown_strict and latex_fragment (with a little preprocessing on that one), but nevermind for now.

Here's a sample.Rmd file that I have as input. I couldn't figure how to nest backticks, so for now it's pseudo-escaped.

---
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")
\`\`\`

The LaTeX fragment I want is:

This is a sample.

\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{SELECT} \OperatorTok{*}
\KeywordTok{FROM}\NormalTok{ TABLE}
\end{Highlighting}
\end{Shaded}

What I get is:

This is a sample.

\begin{verbatim}
## [1] "\n```{=sql}\nSELECT *\nFROM TABLE\n```\n"
\end{verbatim}

And on the MD side, I do get what I want, that is:

---
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 >}}

For those familiar with Hugo, these are custom shortcodes I use for a Hugo-generated site. The lack of ident of the SQL code is on purpose, it's then highlighted through hugo.

At any rate, how do I get sqlcode(...) to output a fenced block that pandoc will correctly highlight in LaTeX, or alternatively, what part of pdf_document.R should I customize in order to achieve that ? I've tried various knitr functions that mark output and I can get an intermediary MD file that I could process to remove some markers, but I can't manage to process that intermediary MD file before knitr sends it to Pandoc.

Upvotes: 0

Views: 100

Answers (1)

Rafael Lopez
Rafael Lopez

Reputation: 21

After a while of trial and error I figured it out. It's as simple as changing one line -_-

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)))
  }
}

Upvotes: 1

Related Questions