John Smith
John Smith

Reputation: 2876

RMarkdown Inline Code Format

I am reading ISL at the moment which is related to machine learning in R

I really like how the book is laid out specifically where the authors reference code inline or libraries for example library(MASS).

Does anyone know if the same effect can be achieved using R Markdown i.e. making the MASS keyword above brown when i reference it in a paper? I want to color code columns in data frames when i talk about them in the R Markdown document. When you knit it as a HTML document it provides pretty good formatting but when i Knit it to MS Word it seems to just change the font type

Thanks

Upvotes: 2

Views: 1399

Answers (1)

tblznbits
tblznbits

Reputation: 6778

I've come up with a solution that I think might address your issue. Essentially, because inline source code gets the same style label as code chunks, any change you make to SourceCode will be applied to both chunks, which I don't think is what you want. Instead, there needs to be a way to target just the inline code, which doesn't seem to be possible from within rmarkdown. Instead, what I've opted to do is take the .docx file that is produced, convert it to a .zip file, and then modify the .xml file inside that has all the data. It applies a new style to the inline source code text, which can then be modified in your MS Word template. Here is the code:

format_inline_code = function(fpath) {
  if (!tools::file_ext(fpath) == "docx") stop("File must be a .docx file...")
  cur_dir = getwd()
  .dir = dirname(fpath)
  setwd(.dir)
  out = gsub("docx$", "zip", fpath)

  # Convert to zip file
  file.rename(fpath, out)

  # Extract files
  unzip(out, exdir=".")

  # Read in document.xml
  xml = readr::read_lines("word/document.xml")

  # Replace styling
  # VerbatimChar didn't appear to the style that was applied in Word, nor was
  # it present to be styled. VerbatimStringTok was though.
  xml = sapply(xml, function(line) gsub("VerbatimChar", "VerbatimStringTok", line))

  # Save document.xml
  readr::write_lines(xml, "word/document.xml")

  # Zip files
  .files = c("_rels", "docProps", "word", "[Content_Types].xml")
  zip(zipfile=out, files=.files)

  # Convert to docx
  file.rename(out, fpath)

  # Remove the folders extracted from zip
  sapply(.files, unlink, recursive=TRUE)

  setwd(cur_dir)
}

The style that you'll want to modify in you MS Word template is VerbatimStringTok. Hope that helps!

Upvotes: 1

Related Questions