11

我正在用 Rmarkdown 中的 Bookdown 写我的论文(我最终会将它导出为 PDF 格式)。要提交我的论文,我需要在论文的第一页之前包含一些带有手写签名的扫描文件。

Bookdown 在组合不同的 Rmd 文件方面非常出色,但我没有设法在标题页之前包含 PDF 文档。

我试过这个:

bookdown::pdf_book: 
  includes:
    in_header: preamble.tex
    before_body: beforebody.tex

在 preamble.tex 中:

\usepackage{pdfpages}

在 beforebody.tex 中:

\includepdf[pages={5}, scale=1]{OfficialFrontpages.pdf}
\newpage

但是,它首先创建 Bookdown 标题页,并且仅将这些页面插入到目录之前。有没有办法强制在最终 PDF 文档的第一页之前包含此文档?

将这些命令作为第一个 .Rmd 文件的行包含在内也不起作用:

![Caption](OfficialFrontpages.pdf) 
\raggedright 
\clearpage
4

4 回答 4

2

一种策略是编辑 latex 模板,以便您调用您的\includepdfis 评估之前\maketitle。似乎 bookdown 正在使用常规的rmarkdown latex template。让我们复制并编辑它。有几种替代方法可以做到这一点:

  1. 您可以完全删除这部分:

    $if(title)$
    \maketitle
    $endif$
    

    然后在你的 Rmd 文档中写:

    \includepdf[pages={5}, scale=1]{OfficialFrontpages.pdf}
    \maketitle
    
  2. 或者您可以移动该部分,即负责处理的部分before_body

    $for(include-before)$
    $include-before$
    $endfor$ 
    

    before \maketitle,并将您当前的策略与 before_body 一起使用。

无论哪种方式,您都需要告诉 knitr 使用您的自定义模板:

bookdown::pdf_book:
  template: mytemplate.tex

您可能需要调整一些其他参数,因为 knitr 在与自定义模板一起使用时的行为并不完全相同(例如,您可能需要自己重新定义边距大小)。

于 2017-06-04T12:42:49.670 回答
2

如果您在 Bookdown 工作流程中附加外部 PDF,则会为其构建过程增加不必要的开销(尤其是对于扫描的文档)。相反,只有在将产品处理给管理员时才需要合并。

一种解决方案是创建一个单独的 TeX 并通过 LaTeX 包合并文档pdfpages。这已经发布在这里,但对我来说,这两个 PDF 似乎有点矫枉过正。我会简单地选择:

pdftk OfficialFrontpages.pdf MyThesis.pdf cat output final.pdf

根据文档的大小(数字等),您可能还可以从添加 compress作为最后一个参数中受益。

当然,如果您不想离开舒适的 R 控制台,没有什么能阻止定义函数:

pdfMerge <- function(doc1, doc2)
    system2("pdftk", paste(doc1, doc2, "cat output final.pdf"))

pdftk只是用于合并 PDF 的众多跨平台实用程序(Windows、Mac、Linux)之一。另一种方法是qpdf

于 2017-06-10T10:50:50.673 回答
2

选项1: 您可以尝试这样的事情

includes:
    after_body:Title_page.tex

选项2: 由于我更喜欢​​latex,所以我会将论文和官方页面生成为两个单独的pdf文档,然后使用latex包pdfpages将这两者结合起来。

就像是

\usepackage{pdfpages}

\begin{document}

\includepdf[pages={5}, scale=1]{OfficialFrontpages.pdf}
\newpage
\includepdf[pages={-}, scale=1]{MyThesis.pdf}

\end{document}

我最终会用 pdflatex 编译。

让我知道这是否有用。

于 2017-06-04T03:50:29.230 回答
0

这是一种简单的方法,但将所有内容都保留在 rmarkdown 中,结合了scoa 的最佳答案并使用了其他stackoverflow 示例中的一些技巧。

它从bookdown 演示 preamble.tex开始,在底部添加了两行。

\usepackage{booktabs}
\usepackage{pdfpages}
\usepackage{amsthm}
\makeatletter
\def\thm@space@setup{%
  \thm@preskip=8pt plus 2pt minus 4pt
  \thm@postskip=\thm@preskip
}
\makeatother
\let\oldmaketitle\maketitle
\AtBeginDocument{\let\maketitle\relax}

制作这个新文件 ,before_body.tex您希望将 pdf 的第 1 页称为cover_pdf.pdf文档的封面。

\includepdf[pages={1}, scale=1]{cover_pdf.pdf}
\newpage

\let\maketitle\oldmaketitle
\maketitle

编辑_output.yml以包含您的before_body.tex,结果如下:

bookdown::gitbook:
  css: style.css
  config:
    toc:
      before: |
        <li><a href="./">A Minimal Book Example</a></li>
      after: |
        <li><a href="https://github.com/rstudio/bookdown" target="blank">Published with bookdown</a></li>
    edit: https://github.com/rstudio/bookdown-demo/edit/master/%s
    download: ["pdf", "epub"]
bookdown::pdf_book:
  includes:
    in_header: preamble.tex
    before_body: before_body.tex
  latex_engine: xelatex
  citation_package: natbib
  keep_tex: yes
bookdown::epub_book: default

那你应该很甜!

如果您遇到问题,可以从这个 github repo 分支下载或克隆一个工作示例

于 2020-03-17T00:33:06.310 回答