Невозможно использовать пользовательский шаблон в Bookdown - PullRequest
1 голос
/ 07 апреля 2020

Я создаю пакет R, использующий Bookdown для создания PDF-книг из .Rmd файлов. Я хочу использовать пользовательский шаблон из латекса. Итак, в соответствии с разделом Bookdown do c для шаблонов и Pando c do c для шаблонов , я создал в своем проекте следующую структуру:

myproj/
├── inst/
│   ├── examples/
│   |   ├── firstbook/
│   |   |   ├── index.Rmd
│   |   |   ├── ...
│   ├── rmarkdown/
│   |   ├── templates/
│   |   |   ├── book_tex/
│   |   |   |   ├── resources/
│   |   |   |   |   ├── template.tex
│   |   |   |   ├── skeleton/
│   |   |   |   |   ├── monograph.cls
│   |   |   |   |   ├── bibliography.bib
│   |   |   |   |   ├── skeleton.Rmd
│   |   |   |   ├── template.yaml
├── R/
│   ├── format.R
│   └── render.R
└── DESCRIPTION

Артефакты шаблона

Новый шаблон называется book_tex, я создал папку с таким именем в inst/rmarkdown/templates.

шаблон. tex is:

% !TeX program = pdfLaTeX
\documentclass{monograph}

\usepackage{hyperref}
\usepackage{newtxmath}       % Times Roman as basic font

\makeindex

\begin{document}

\author{ $for(authors)$ $authors.name$ \and $endfor$ }
\title{$title$}
$if(subtitle)$
    \subtitle{$subtitle$}
$endif$

\maketitle
\tableofcontents

$body$

\printindex

\end{document}

template.yaml is:

name: PDF Book
description: >
 Template for creating a TEX book
create_dir: true

skeleton.Rmd is:

---
title: Title here
subtitle: Do you have a subtitle? If so, write it here

thanks: | 
    Grants or other notes about the article that should go on the front 
    page should be placed here. General acknowledgments should be placed at the
    end of the article.
authors: 
- name: Author 1
  address: Department of YYY, University of XXX
  email: abc@def

- name: Author 2
  address: Department of ZZZ, University of WWW
  email: djf@wef

keywords:
- key
- dictionary
- word  

abstract: |
  The text of your abstract.  150 -- 250 words.

output: myprojpkg::book_tex
---

# Introduction {#intro}

Your text comes here. Separate text sections with

# Section title {#sec:1}

Some text.

## Subsection title {#sec:2}

Some other text.

Building

Я создал собственный формат, который в основном устанавливает мой пользовательский шаблон в файл format.R:

book_tex_format <- function(...) {
  rmarkdown::pdf_document(..., template = "book_tex")
}

А затем, в render.R, я вызываю Bookdown из каталога dir моего пакета (рабочий каталог myproj/inst/examples/firstbook) в RStudio:

bookdown::render_book(".", book_tex_format())

, который выдает ошибку:

"C: / PROGRA ~ 1 / Pandoc / pando c "+ RTS -K512m -RTS _index_merged.utf8.md - в латекс - из уценки + autolink_bare_uris + tex_math_single_backsla sh --output _index_merged.tex - самодостаточный - шаблон book_tex - высокая легкий стиль tan go --pdf-engine pdflatex - lua -filter "C: / Users / me / Documents / R / win-library / 3.5 / rmarkdown / rmd / lua / pagebreak. lua "- lua -filter" C: / Users / me / Documents / R / win-library / 3.5 / rmarkdown / rmd / lua / latex-div. lua "Не удалось найти шаблоны файлов данных \ book_tex.latex

Затем я попытался:

bookdown::render_book(".", rmarkdown::pdf_document(template="../../rmarkdown/templates/book_tex/resources/template.tex"))

, который, казалось, работал, но затем дал мне ошибку:

"C: / PROGRA ~ 1 / Pandoc / pando c "+ RTS -K512m -RTS _index_merged.utf8.md - в латекс - от уценки + autolink_bare_uris + tex_math_single_backsla sh --output _index_merged.tex --self -aged - -template ".... \ rmarkdown \ templates \ book_tex \ resources \ template.tex" --highlight-style tan go --pdf-engine pdflatex - lua -filter "C: / Users / me / Documents / R / win-library / 3.5 / rmarkdown / rmd / lua / pagebreak. lua "- lua -filter" C: / Users / me / Documents / R / win-library / 3.5 /rmarkdown/rmd/lua/latex-div.lua "! Ошибка LaTeX: файл `monograph.cls 'не найден.

Я сымитировал структуру, посмотрев, как работают RMarkdown и Bookdown. Но кажется, что это недостаточно хорошо. Я очень разочарован, эта часть API плохо документирована, и я не понимаю, как я должен заставить его работать.

Как мне вызвать render_book, чтобы передать шаблон?

bookdown::render_book(".", !!HERE!!)

Еще одна попытка

Я натолкнулся на функцию rmarkdown::draft, которая кажется рекомендуемым способом использования шаблона. Поэтому я вызвал (рабочий каталог: myproj/inst/examples):

rmarkdown::draft("mybook2", "book_tex", "myprojpkg", TRUE)

Обратите внимание, что мой пакет называется myprojpkg (в файле DESCRIPTION). Эта команда работает нормально и фактически выдает эту папку:

myproj/
├── inst/
│   ├── examples/
│   |   ├── firstbook/
│   |   ├── mybook2/
│   |   |   |   ├── monograph.cls
│   |   |   |   ├── bibliography.bib
│   |   |   |   ├── mybook.Rmd
│   ├── rmarkdown/
│   |   ├── templates/
│   |   |   ├── book_tex/
│   |   |   |   ├── ...
├── R/
│   ├── ...
└── DESCRIPTION

Где mybook.Rmd равно skeleton.Rmd переименовано. Таким образом, команда правильно берет шаблон, который я определил в своем пакете, и создает структуру каталогов, готовую к отправке в bookdown::render_book, однако проблема заключается в том, что при ее вызове я не получаю никакой ошибки, но не применяю правильный шаблон (template.tex внутри book_tex). Здесь команда опирается на содержимое skeleton.Rmd, где она указывает шаблон для использования в заголовке yaml, но этот шаблон не найден и не применяется: (


(дружественный) Отзыв о Bookdown документация

Я должен сказать, что эта часть пользовательских шаблонов нуждается в лучшем документировании, потому что не сразу разработчик должен структурировать проект так, чтобы все работало с пользовательскими шаблонами.

EDIT Я действительно нашел хорошую документацию по этим темам в функции rmarkdown :: draft . Я бы хотел сделать ее более заметной на страницах справки в разделах о шаблонах. кусок (довольно важный кусок) do c в основном скрыт.

1 Ответ

0 голосов
/ 28 апреля 2020

Проанализировав код и немного поиграв с Bookdown и Rmarkdown, и, как это показано в некоторых полученных мной комментариях (спасибо @stefan), я пришел к выводу, что шаблон и все его ресурсы необходимо в той же папке, где находятся ваши .Rmd файлы. На самом деле это отражается в наличии функции draft в Rmarkdown, которая выполняет эту задачу. Таким образом, моя структура папок в конечном итоге станет такой:

myproj/
├── monograph.cls
├── bibliography.bib
├── template.tex
├── mybook.Rmd
├── index.Rmd
├── _bookdown.yaml

Отсюда я открою RStudio и поменяю папку на myproj или открою оболочку R и поменяю рабочий каталог на myproj, введя: setwd("path/to/myproj"). Затем я бы вызвал команду:

bookdown::render_book("index.Rmd", bookdown::pdf_book(template = "template.tex"))

Это запустит машину и создаст ваш PDF.


Предупреждение: теоремы и другие среды

Если ваш шаблон Импорт amsthm или другие среды, которые определяют блоки, такие как theorem или аналогичные, Bookdown завершится ошибкой. Bookdown автоматически добавит определения для теорем в предоставленный вами шаблон Latex (его копия создается в промежуточной папке). Вам нужно применить это исправление , чтобы все заработало (в вашем index.Rmd):

---
title: My book
author: Me
---

```{r, echo=FALSE}
options(bookdown.post.latex = function(x) {
  from <- grep("usepackage\\{amsthm\\}", x)
  to <- grep("newtheorem\\*\\{solution", x)
  x <- x[-c(from:to)]
})
```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...