在bookdown首页之前插入pdf

时间:2017-04-24 12:41:01

标签: r pdf latex r-markdown bookdown

我正在用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 个答案:

答案 0 :(得分:2)

选项1: 你可以试试这样的东西

includes:
    after_body:Title_page.tex

选项2: 由于我对乳胶更加舒服,我会将主要论文和官方页面生成为两个单独的pdf文档,然后使用latex package pdfpages将这两个文档组合起来。

这样的东西
\usepackage{pdfpages}

\begin{document}

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

\end{document}

我最终会用pdflatex编译。

请告诉我这是否有用。

答案 1 :(得分:2)

一种策略是编辑乳胶模板,以便在\includepdf之前调用\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$ 
    
    \maketitle之前

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

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

    bookdown::pdf_book:
      template: mytemplate.tex
    

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

答案 2 :(得分:1)

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

一种解决方案是创建单独的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只是许多跨平台实用程序(Windows,Mac,Linux)中的一个,用于合并PDF。另一种选择是qpdf

答案 3 :(得分:0)

这是一种简单的方法,但是将所有内容都保留在rmarkdown中,结合了scoa's answer的精华并使用了其他stackoverflow example的一些技巧。

它从bookdown demo开始 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,在其中将名为cover_pdf.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

那你应该很甜蜜!

如果遇到问题,可以从this github repo branch

下载或克隆一个有效的示例。