разрыв страницы для PDF и слово в rmarkdown - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь разработать отчет по rmarkdown для моего анализа данных, который можно было бы связать как в word_document, так и в pdf_document. Bookdown работает очень хорошо для подписей и автоматической нумерации (https://bookdown.org/yihui/bookdown/).. Осталась только одна главная проблема - как сделать разрывы страниц, которые могут работать для обоих.

Для pdf я использую xelatex от tinytex, и \newpage прекрасно работает. Для Word я использую разрыв страницы 5 раздела и настраиваю стиль (включая разрыв страницы и белый шрифт).

Я мог бы использовать Правка> Найти ... и Заменить все , но поскольку я все еще разрабатываю отчет и мне нужно часто проверять, что вывод выглядит великолепно в обоих форматах.

Есть ли способ, которым я мог бы:

  • заменить все в функции R,
  • отредактируйте шаблон tex, чтобы раздел 5 не отображался в выходных файлах PDF (\ newpage не отображается в слове ms), или
  • применить волшебную команду для принудительного разрыва страницы, совместимую со всеми форматами?

Спасибо!

Вот воспроизводящий пример файла R Markdown:

---
title: "Untitled"
author: "Me"
date: "November 15, 2018"
output:
  pdf_document: default
  word_document: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
Some text.  

I want a page break after this.

\newpage
##### page break

This should be the first sentence of the new page.

Some more text.

1 Ответ

0 голосов
/ 15 ноября 2018

Большое спасибо tarleb за ответ. Как и предполагалось, я использовал ваш ответ на этот пост: https://stackoverflow.com/a/52131435/2425163.

шаг 1: создайте текстовый файл со следующим кодом:

--- Return a block element causing a page break in the given format.
local function newpage(format)
  if format == 'docx' then
    local pagebreak = '<w:p><w:r><w:br w:type="page"/></w:r></w:p>'
    return pandoc.RawBlock('openxml', pagebreak)
  elseif format:match 'html.*' then
    return pandoc.RawBlock('html', '<div style=""></div>')
  elseif format:match '(la)?tex' then
    return pandoc.RawBlock('tex', '\\newpage{}')
  elseif format:match 'epub' then
    local pagebreak = '<p style="page-break-after: always;"> </p>'
    return pandoc.RawBlock('html', pagebreak)
  else
    -- fall back to insert a form feed character
    return pandoc.Para{pandoc.Str '\f'}
  end
end

-- Filter function called on each RawBlock element.
function RawBlock (el)
  -- check that the block is TeX or LaTeX and contains only \newpage or
  -- \newpage{} if el.format:match '(la)?tex' and content:match
  -- '\\newpage(%{%})?' then
  if el.text:match '\\newpage' then
    -- use format-specific pagebreak marker. FORMAT is set by pandoc to
    -- the targeted output format.
    return newpage(FORMAT)
  end
  -- otherwise, leave the block unchanged
  return nil
end

шаг 2: сохраните файл как page-break.lua в том же каталоге, что и мой файл R Markdown.

шаг 3: добавить ссылку в качестве аргумента pandoc.

Этот воспроизводимый пример (файл R Markdown) исправлен:

---
title: "Untitled"
author: "Me"
date: "November 15, 2018"
output:
  pdf_document: default
  word_document:
    pandoc_args:
     '--lua-filter=page-break.lua'
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

Some text.  

I want a page break after this.

\newpage

This should be the first sentence of the new page.

Some more text.

Обратите внимание, что это может не сработать для ток, но я не использую фильтр lua с pdf, а с помощью слова _document впоследствии очень легко добавить оглавление непосредственно в Word. Плюс есть ссылка на решение этой проблемы в приведенной выше ссылке.

...