1#' Convert to an RTF document
2#'
3#' Format for converting from R Markdown to an RTF document.
4#'
5#' See the \href{https://bookdown.org/yihui/rmarkdown/rich-text-format-document.html}{online
6#' documentation} for additional details on using the \code{rtf_document} format.
7#'
8#' R Markdown documents can have optional metadata that is used to generate a
9#' document header that includes the title, author, and date. For more details
10#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
11#'
12#' R Markdown documents also support citations. You can find more information on
13#' the markdown syntax for citations in the
14#' \href{https://pandoc.org/MANUAL.html#citations}{Bibliographies
15#' and Citations} article in the online documentation.
16#' @inheritParams pdf_document
17#' @inheritParams html_document
18#' @inheritParams word_document
19#' @return R Markdown output format to pass to \code{\link{render}}
20#' @examples
21#' \dontrun{
22#'
23#' library(rmarkdown)
24#'
25#' # simple invocation
26#' render("input.Rmd", rtf_document())
27#'
28#' # specify table of contents option
29#' render("input.Rmd", rtf_document(toc = TRUE))
30#' }
31#' @export
32rtf_document <- function(toc = FALSE,
33                         toc_depth = 3,
34                         number_sections = FALSE,
35                         fig_width = 5,
36                         fig_height = 4,
37                         keep_md = FALSE,
38                         md_extensions = NULL,
39                         pandoc_args = NULL) {
40
41  # knitr options and hooks
42  knitr <- knitr_options(
43    opts_chunk = list(dev = 'png',
44                      dpi = 96,
45                      fig.width = fig_width,
46                      fig.height = fig_height)
47  )
48
49  # build pandoc args
50  args <- c("--standalone")
51
52  # table of contents
53  args <- c(args, pandoc_toc_args(toc, toc_depth))
54
55  # pandoc args
56  args <- c(args, pandoc_args)
57
58  preserved_chunks <- character()
59
60  pre_processor <- function(metadata, input_file, runtime, knit_meta,
61                             files_dir, output_dir) {
62    preserved_chunks <<- extract_preserve_chunks(input_file, knitr::extract_raw_output)
63    NULL
64  }
65
66  post_processor <- function(metadata, input_file, output_file, clean, verbose) {
67    output_str <- read_utf8(output_file)
68    output_res <- knitr::restore_raw_output(output_str, preserved_chunks)
69    if (!identical(output_str, output_res)) write_utf8(output_res, output_file)
70    output_file
71  }
72
73  # return output format
74  output_format(
75    knitr = knitr,
76    pandoc = pandoc_options(
77      to = "rtf",
78      from = from_rmarkdown(extensions = md_extensions),
79      args = args,
80      lua_filters = if (number_sections) pkg_file_lua("number-sections.lua")
81    ),
82    keep_md = keep_md,
83    pre_processor = pre_processor,
84    post_processor = post_processor
85  )
86}
87