12

Bookdown 有许多配置选项,我发现很难理解如何知道一个选项是否存在,以及这些选项背后的逻辑。

具体来说,鉴于至少有两个其他地方可以说明选项,我发现很难描述其中的选项类型:_bookdown.yml

  • _output.yml,
  • 函数调用的参数,例如bookdown::render_book.

在我看来,_bookdown.yml函数的参数和参数之间没有任何类型的 1 对 1 映射bookdown::render_book,因此_bookdown.yml似乎不仅仅是将选项记录到函数调用的不同方式。

我们可以在源代码中看到 `_bookdown.yml' 控制了一些配置选项,但不是全部。

所以 - 重新表述这个问题 - 为什么是_bookdown.yml一个单独的配置文件以及它应该包含的内容的定义在哪里/是什么?

举一个有代表性的例子,有一个chapter_name选项可以用于_bookdown.yml. 我有以下问题:

  1. 我们怎么知道这是一个选项,因为这里的文档甚至这里的示例中都没有引用
  2. 一旦我们知道它存在,我怎么知道它有什么影响?所有这些选项是否都传递给其他包(例如 pandoc、rmarkdown)?我唯一能找到参考的地方是bookdownchapter_name的 CRAN 源代码,即使在那里我也无法真正弄清楚它是如何使用的。

请注意,_bookdown.yml作者的讨论是here,但我仍然不完全理解。

4

1 回答 1

11

以下是对代码库的一些调查结果:

我们可以看到,'config' 变量是从这里通过调用的函数bookdown::render_book填充的,该函数可以在 中找到。_bookdown.yml load_configutils.R

load_config似乎做了两件事 - 它将内容存储config在一个名为 的主选项列表opts中,其中config只是一个元素,然后返回该config元素。

注意opts最初是在这里定义的。它是从knitr:::new_defaults可以在此处找到的 a 创建的。

然后该config变量出现在代码库的多个部分中。

以下代码具有代表性:

  if (is.na(new_session)) {
    new_session = FALSE
    if (is.logical(config[['new_session']])) new_session = config[['new_session']]
  }

所以我们可以看到,如果new_session直接bookdown::render_book作为函数参数传递给它,它就被使用了。否则会尝试从_bookdown.yml文件中加载它。

config作为参数传递了很多bookdown::render_book。例如,我们可以看到它source_filesutils.R.

我们得出什么结论? _bookdown.yml允许您填充bookdown包的全局选项列表。每当您看到config(这是一个列表)正在使用代码库时,您可以通过填充来设置此列表的元素_bookdown.yml

我还没有找到可以指定的选项的完整列表,_bookdown.yml但一种轻松找出可能的方法是在 Github 上搜索示例

于 2016-11-27T09:41:04.067 回答