.bib 文件中的 knitr 块

knitr chunks within .bib file

我正在使用 LaTeX 包 problems 从问题数据库创建解决方案集。该数据库的结构类似于书目数据库,位于 .bib 文件中。整个系统对于常规 LaTeX 工作得很好,但现在我的一些解决方案中有 R 代码(在 knitr 块中)。

RStudio 中 knitting/TeXing/BibTeXing 的默认序列不起作用——代码最终逐字地出现在文档中,连同块分隔符的损坏版本。因此,我需要找到正确的步骤工作流以确保代码通过。

这个包似乎非常适合有两个文件,一个用于数据库,一个用于.tex/.rnw,所以我不能做一个有效的例子,但是像这样:

\documentclass{article}
\usepackage[solution]{problems}
\Database{

@QUESTION{1.1,
    problem = {1.1},
    solution = {This solution only uses TeX, like $\bar{x}$. It works fine.}}

@QUESTION{1.2,
    problem = {1.2},
    solution = {This solution includes code
        <<>>=
            head(iris)
        @
        It does not work.
    }}}

\begin{document}
Problems for this week were 1.1 and 1.2
\problems{1.1}
\problem{1.2}
\end{document}

您必须先 编织 .bib 文件 然后 运行 LaTeX 和 BibTeX。

虽然你通常有一个 .Rnw 文件编织到 .tex 然后让 LaTeX 工具处理 .tex.bib 文件你将不得不开始使用(让我们称之为).Rbib 编织成 .bib 然后由 LaTeX 处理的文件。

为简单起见,我将名为 .Rbib 的文件命名为 bibliography.Rnw,但您可以选择任何您喜欢的扩展名。我选择 .Rnw 是因为里面使用的语法与 .Rnw 文件中的语法相同。

作为 bib 文件的虚拟条目,我使用来自 verbosus.com 的数据并添加了一些 knitr 代码。

第一个块设置全局块选项以防止knitr将块代码或任何标记添加到输出文件。下一个块显示了如何使用生成的内容填充 title 字段,而 \Sexpr{} 部分是如何使用它来添加一些动态文本的示例。

<<setup>>=
library(knitr)
opts_knit$set(
  echo = FALSE,
  results = "asis"
)
@

article{article,
  author  = {Peter Adams},
  title   = {
<<echo=FALSE, results = "asis">>=
  cat("The title of the work")
@
},
  journal = {"The title of the journal"},
  year    = 1993,
  number  = 2,
  pages   = {201-213},
  month   = 7,
  note    = {An optional note},
  volume  = 4
}

@book{book,
  author    = {Peter Babington},
  title     = {\Sexpr{"The title of the work"},
  publisher = {The name of the publisher},
  year      = 1993,
  volume    = 4,
  series    = 10,
  address   = {The address},
  edition   = 3,
  month     = 7,
  note      = {An optional note},
  isbn      = {3257227892}
}

拥有块选项 results = "asis" 并使用 cat() 而不是 print() 很重要。否则,输出中会有不需要的字符。

如果将其另存为 bibliography.Rnw,则以下内容足以获得包含已评估块的 .bib 文件:

knit(input = "bibliography.Rnw", output = "bibliography.bib")

之后只剩下标准的 LaTeX 编译。