|  | find_file <- function(template, file) { | 
|  | template <- system.file("rmarkdown", "templates", template, file, | 
|  | package = "posterdown") | 
|  | if (template == "") { | 
|  | stop("Couldn't find template file ", template, "/", file, call. = FALSE) | 
|  | } | 
|  |  | 
|  | template | 
|  | } | 
|  |  | 
|  | find_resource <- function(template, file) { | 
|  | find_file(template, file.path("resources", file)) | 
|  | } | 
|  |  | 
|  | knitr_fun <- function(name) utils::getFromNamespace(name, 'knitr') | 
|  |  | 
|  | output_asis <- knitr_fun('output_asis') | 
|  |  | 
|  | merge_list <- function(x, y) { | 
|  | fun <- knitr_fun('merge_list') | 
|  | fun(as.list(x), y) | 
|  | } | 
|  |  | 
|  | #' Render a pandoc template. | 
|  | #' | 
|  | #' This is a hacky way to access the pandoc templating engine. | 
|  | #' | 
|  | #' @param metadata A named list containing metadata to pass to template. | 
|  | #' @param template Path to a pandoc template. | 
|  | #' @param output Path to save output. | 
|  | #' @return (Invisibly) The path of the generate file. | 
|  | #' @examples | 
|  | #' x <- posterdown:::template_pandoc( | 
|  | #'   list(preamble = "%abc", filename = "wickham"), | 
|  | #'   posterdown:::find_resource("posterdown_generic", "template.tex"), | 
|  | #'   tempfile() | 
|  | #' ) | 
|  | #' if (interactive()) file.show(x) | 
|  | #' @noRd | 
|  | template_pandoc <- function(metadata, template, output, verbose = FALSE) { | 
|  | tmp <- tempfile(fileext = ".md") | 
|  | on.exit(unlink(tmp)) | 
|  |  | 
|  | cat("---\n", file = tmp) | 
|  | cat(yaml::as.yaml(metadata), file = tmp, append = TRUE) | 
|  | cat("---\n", file = tmp, append = TRUE) | 
|  | cat("\n", file = tmp, append = TRUE) | 
|  |  | 
|  | rmarkdown::pandoc_convert(tmp, "markdown", output = output, | 
|  | options = paste0("--template=", template), verbose = verbose) | 
|  |  | 
|  | invisible(output) | 
|  | } | 
|  |  | 
|  |  | 
|  | # Call rmarkdown::pdf_document and mark the return value as inheriting pdf_document | 
|  | inherit_pdf_document <- function(...) { | 
|  | fmt <- rmarkdown::pdf_document(...) | 
|  | fmt$inherits <- "pdf_document" | 
|  | fmt | 
|  | } | 
|  |  | 
|  | # Helper function to create a custom format derived from pdf_document | 
|  | # that includes a custom LaTeX template and custom CSL definition | 
|  | pdf_document_format <- function(..., format, template, csl) { | 
|  |  | 
|  | # base format | 
|  | fmt <- inherit_pdf_document(..., template = find_resource(format, template)) | 
|  |  | 
|  | # add csl to pandoc_args | 
|  | fmt$pandoc$args <- c(fmt$pandoc$args, | 
|  | "--csl", | 
|  | rmarkdown::pandoc_path_arg(find_resource(format, csl))) | 
|  |  | 
|  |  | 
|  | # return format | 
|  | fmt | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  |  |