knitr/ Rmd: добавление титульной страницы и текста при конвертации в MS Word

Я пытаюсь написать отчет, используя rmarkdown пакет и, как это, к сожалению, обычно в моих полевых отчетах часто представляются как документы MS Word. Поэтому я не могу всегда полагаться на силу LaTeX и должны иметь возможность конвертировать мой .Rmd для MS Word. Теперь, поскольку я хочу иметь возможность создавать файлы PDF и MS Word из одного исходного файла, я пытаюсь найти общий способ сделать это. У меня есть PDF, работающий с помощью apa6 класс LaTeX-документа. Этот.РМД будет выглядеть это при создании файла слова:

---
title: My title
abstract: This is the abstract.
author: John Doe
affiliation: Unknown
note: Nothing to say.

output:
  word_document:
    reference_docx: myreference.docx
---

Lorem ipsum.

Я могу создать документ Word из это, но по понятным причинам мой заказ yaml-переменные (например, абстрактные) не будут отображаться в документе.

Итак, моя проблема заключается в следующем:

при создании документа Word, Как я могу добавить страницу заголовок (включая фамилии авторов, учреждение, автор, и т. д.) и еще одна страница с абстракцией перед телом документа ("Lorem ipsum")? Этот фокус здесь не в том, чтобы создавать pagebreaks (есть другие открытые вопросы по этой), но скорее * * есть ли способ сделать pandoc использовать пользовательский yaml переменные помещают их в начале документа и назначают им стили?

на rmarkdown пакет содержит include() функция, но она работает только с документами HTML и PDF.

1 ответов


я обнаружил, что можно настроить содержимое файла Markdown (например, добавить и изменить титульную страницу), сгенерированное rmarkdown перед отправкой в pandoc для преобразования в DOCX С помощью препроцессора. Предположим, мы пытаемся добавить некоторую информацию, указанную в параметре YAML note непосредственно перед рефератом (поддержка рефератов тем временем была добавлена в pandoc).

для этого нам сначала нужна функция препроцессора, которая читает входной файл и анализирует переднюю часть YAML и настраивает входной файл:

my_pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir, output_dir, from) {

  # Identify YAML front matter delimiters
  input_text <- readLines(input_file, encoding = "UTF-8")
  yaml_delimiters <- grep("^(---|\.\.\.)\s*$", input_text)

  if(length(yaml_delimiters) >= 2 &&
     (yaml_delimiters[2] - yaml_delimiters[1] > 1) &&
     grepl("^---\s*$", input_text[yaml_delimiters[1]])) {
    yaml_params <- yaml::yaml.load(paste(input_text[(yaml_delimiters[1] + 1):(yaml_delimiters[2] - 1)], collapse = "\n"))
  } else yaml_params <- NULL

  # Modify title page
  custom_lines <- c(
    "NOTE:"
    , metadata$note
    , "\n\n"
    , "# Abstract"
    , "\n"
    , metadata$abstract
    , "\n"
  )

  ## Add modified title page components after YAML front matter
  augmented_input_text <- c(custom_lines, input_text[(yaml_delimiters[2] + 1):length(input_text)])

  # Remove redundant default abstract
  yaml_params$abstract <- NULL

  # Add modifications to input file
  augmented_input_text <- c("---", yaml::as.yaml(yaml_params), "---", augmented_input_text)
  input_file_connection <- file(input_file, encoding = "UTF-8")
  writeLines(augmented_input_text, input_file_connection)
  close(input_file_connection)

  NULL
}

теперь нам нужно определить пользовательский формат, который использует наш препроцессор:

my_word_document <- function(...) {
  config <- rmarkdown::word_document(...)

  # Preprocessor functions are adaptations from the RMarkdown package
  # (https://github.com/rstudio/rmarkdown/blob/master/R/pdf_document.R)
  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir, output_dir, from = .from) {
    # save files dir (for generating intermediates)
    saved_files_dir <<- files_dir

    args <- my_pre_processor(metadata, input_file, runtime, knit_meta, files_dir, output_dir, from)
    args
  }

  config$pre_processor <- pre_processor
  config
}

теперь вы можете использовать пользовательский формат при рендеринге документов R Markdown следующим образом:

rmarkdown::render("./foo/bar.Rmd", output_format = my_word_document())