在渲染PDF文件时,如何在RMarkdown中将表的所有行保留在同一页面上?

时间:2014-12-30 08:34:32

标签: r r-markdown

如果可能,LaTex会将表的所有行保留在同一页面上。但是,我发现,如果我将RMarkdown文档呈现为PDF文件,如果表格靠近页面末尾,则表格可能会跨越两页。这对我来说很奇怪,因为我相信RMarkdown文件在生成PDF文件之前实际上已转换为LaTex文件。

  ---
  title       : "Table"
  output      : 
    pdf_document
  ---

  # Section 1

  # Section 2

  # Section 3

  # Section 4

  # Section 5

  # Section 6

  # Section 7

  # Section 8

  # Section 9

  # Section 10

  # Section 11

  # Section 12

  # Section 13

  Column 1          |     Column 2 |
  -------------     | -------------|
  1) Cell           |     Cell     |
  2) Cell           |     Cell     |
  3) Cell           |     Cell     |
  4) Cell           |     Cell     |
  5) Cell           |     Cell     |
  6) Cell           |     Cell     |
  7) Cell           |     Cell     |
  8) Cell           |     Cell     |
  9) Cell           |     Cell     |
  10) Cell          |     Cell     |
  11) Cell          |     Cell     |
  12) Cell          |     Cell     |
  13) Cell          |     Cell     |
  14) Cell          |     Cell     |
  15) Cell          |     Cell     |
  16) Cell          |     Cell     |
  17) Cell          |     Cell     |
  18) Cell          |     Cell     |

如果将其保存在temp.Rmd中,然后按render("temp.Rmd", output_file="temp.pdf")转换为PDF文件,则前12行显示在第1页,其余行显示在第2页:

A table on two pages

是否有可能要求渲染(或pandoc?)在表格之前添加额外的行,以便表格的所有行都出现在同一页面上?

2 个答案:

答案 0 :(得分:6)

正如评论中所建议的那样,问题是pandoc的默认LaTeX模板使用longtable(普通的LaTeX表不会分页)。如果您不想创建自己的模板,只需修改默认模板即可。

Vanilla Pandoc

您可以使用knitr生成正常的Markdown文件。然后,您可以使用pandoc通过

使用另一个LaTeX模板生成PDF / TeX文件

pandoc --template=mytemplate.xex -o myfile.pdf myfile.md

设置新模板的最简单方法是修改默认模板,您可以将pandoc转储到控制台:

pandoc --print-default-template=latex

然后,您需要将行\usepackage{longtable,booktabs}更改为\usepackage{booktabs}

如果您使用的是OS X或Linux,则可以使用sed并输出重定向,直接生成不带longtable的模板:

pandoc --print-default-template=latex | sed 's/longtable,//' > mytemplate.tex

RStudio

如果您是从RStudio执行此操作,那么最简单的选项可能只是更改默认模板。 (最近发布的RStudio捆绑包pandoc所以使用与system pandoc不同的东西。)如果你查看" R Markdown"构建/状态窗口,您将看到如下内容:

output file: rmarkdown.knit.md

/Applications/RStudio.app/Contents/MacOS/pandoc/pandoc rmarkdown.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures --output rmarkdown.pdf --template /Library/Frameworks/R.framework/Versions/3.0/Resources/library/rmarkdown/rmd/latex/default.tex --highlight-style tango --latex-engine /usr/texbin/pdflatex --variable 'geometry:margin=1in' 

Output created: rmarkdown.pdf

(我在Mac上,在Windows或Linux上做过这个示例,这看起来会有所不同。)模板在命令中列出,然后您可以按照上面的说明进行修改。这当然会改变通过RStudio生成的所有文档的行为。据我所知,目前还没有公开的选项来更改所使用的模板,但这可能会随着文档模板似乎成为最近版本中的活动工作区而发生变化。

编辑(2016-05-05):

似乎在最近版本的pandoc中使用longtablehard coded,因此从前导码中删除longtable会产生一些错误。您可以使用a filter解决此问题。

保存链接的python脚本和

Vanilla Pandoc

--filter path/to/filter.py标志添加到您的pandoc调用中。

RStudio

为额外的pandoc args修改你的YAML块:

---
title       : "Table"
pandoc_args : --filter path/to/filter.py
output      : 
    pdf_document
---

如上面的链接所示,这将生成普通的LaTeX表,这意味着不支持表格中的脚注。

答案 1 :(得分:4)

最简单的方法是在表格之前添加分页符(\newpage\pagebreak),但如果您正在编辑可移动表格位置的文本,则这是非智能的。我想这样做的阶段就是你在编辑文档之后和测试输出之后(检查丑陋的断点),就在生成最终输出之前。

answer to a related question已在SO上。另外,apparently \pagebreak是:

  

实际上是一个LaTeX命令,而不是Markdown命令,但大多数...降价到pdf引擎...使用LaTex并接受它。