【问题标题】:How do you get org-mode to export a wide or long table so it's readable in PDF?如何让 org-mode 导出宽或长的表格,使其在 PDF 中可读?
【发布时间】:2019-09-04 20:57:14
【问题描述】:

我正在使用 R 在 org 模式下创建各种表格,并希望将它们包含在导出到 PDF 中。其中一些表格对于标准页面来说太宽了,而有些表格可能太长了。我已经知道如何旋转 org 表,但我确实需要旋转作为代码块输出的表。

我查看了组织手册https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-R.html、SO 建议的问题、https://raw.githubusercontent.com/dfeich/org-babel-examples/ 和其他地方。这些要么没有提供解决方案,要么我不明白。

借用 https://github.com/dfeich/org-babel-examples/tree/master/latex,我将这些行附加到我的 org 文件的前端:

#+latex_compiler: pdflatex
#+LATEX_HEADER_EXTRA: \usepackage{rotfloat}
#+LATEX_HEADER_EXTRA: \usepackage{lmodern}
#+LATEX_HEADER: \hypersetup{colorlinks=true, linkcolor=blue}
#+LATEX_HEADER_EXTRA: \usepackage{tabularx}
#+LATEX_HEADER_EXTRA: \usepackage{tabu,longtable}
#+LATEX_HEADER_EXTRA: \usepackage{booktabs}

并创建了一个这样的表:

#+NAME: widetbltest
#+CAPTION: Sideways Table Test
#+ATTR_LATEX: :float sideways :placement [H]
#+HEADER: :exports results :results table latex :colnames yes
#+begin_src R
  y  <- data.frame(
      a = seq(1,20,by = 1),
      b = seq(1,20,by = 1),
      c = seq(1,20,by = 1),
      d = seq(1,20,by = 1),
      e = seq(1,20,by = 1),
      f = seq(1,20,by = 1),
      g = seq(1,20,by = 1),
      h = seq(1,20,by = 1),
      i = seq(1,20,by = 1),
      j = seq(1,20,by = 1),
      k = seq(1,20,by = 1),
      l = seq(1,20,by = 1),
      m = seq(1,20,by = 1),
      n = seq(1,20,by = 1),
      o = seq(1,20,by = 1),
      p = seq(1,20,by = 1),
      q = seq(1,20,by = 1),
      r = seq(1,20,by = 1),
      s = seq(1,20,by = 1)
      )
  y
#+end_src

我希望有一个旋转 90 度的格式化表格。我得到了一张略显粗糙的未旋转表格,似乎用未对齐的管道符号分隔列。

我正在运行 Emacs 26.1 和 org 9.2.4。

想法?如果有帮助并且被允许,我可以发布 85 行的完整文档。

如果解决方案自然地扩展到跨页面渲染长表格,那就太好了。

更新:@lars

这是我在 PDF 中得到的:

【问题讨论】:

  • 它在 emacs 中的评估结果是什么?

标签: r pdf emacs latex org-mode


【解决方案1】:

您所写的内容存在一个基本问题:#+CAPTION:#+ATTR_LATEX: 指令必须应用于由代码块生成的表,而不是 应用于代码块本身。我发现这样做的最好方法是为代码块命名,以便以该名称生成结果,然后将指令附加到结果:

#+NAME: widetbltest
#+HEADER: :exports results :results table :colnames yes
#+begin_src R
 ....
#+end_src

#+CAPTION: Sideways Table Test
#+ATTR_LATEX: :float sideways
#+RESULTS: widetbltest

现在,当您在代码块上执行C-c C-c 时(或当导出器执行代码块时),结果将可靠且可重复地放置在#+RESULTS: widetbltest 指令下,这就是@987654326 @ 和 #+ATTR_LATEX: 指令附加到。

另一个问题是代码块的标题。您希望将结果作为表格,但不想在此处指定 latex:仅当您的代码块生成乳胶表而不是 Org 模式表时才使用它。

我也去掉了:placement 指令,因为在我的实验中我得到一个错误,说sidewaystable 环境不支持它。也许这会随着rotfloattabu 而改变,但是 我没有安装这些软件包中的任何一个。我还删除了longtable,因为它已经包含在默认值中(至少是我的默认值)。

这是适合我的最终版本:

#+LATEX_HEADER_EXTRA: \usepackage{lmodern}
#+LATEX_HEADER_EXTRA: \usepackage{tabularx}
#+LATEX_HEADER_EXTRA: \usepackage{booktabs}
#+LATEX_HEADER: \hypersetup{colorlinks=true, linkcolor=blue}

* Wide table
#+NAME: widetbltest
#+HEADER: :exports results :results table :colnames yes
#+begin_src R
  y  <- data.frame(
      a = seq(1,20,by = 1),
      b = seq(1,20,by = 1),
      c = seq(1,20,by = 1),
      d = seq(1,20,by = 1),
      e = seq(1,20,by = 1),
      f = seq(1,20,by = 1),
      g = seq(1,20,by = 1),
      h = seq(1,20,by = 1),
      i = seq(1,20,by = 1),
      j = seq(1,20,by = 1),
      k = seq(1,20,by = 1),
      l = seq(1,20,by = 1),
      m = seq(1,20,by = 1),
      n = seq(1,20,by = 1),
      o = seq(1,20,by = 1),
      p = seq(1,20,by = 1),
      q = seq(1,20,by = 1),
      r = seq(1,20,by = 1),
      s = seq(1,20,by = 1),
      t = seq(1,20,by = 1),
      u = seq(1,20,by = 1),
      v = seq(1,20,by = 1),
      w = seq(1,20,by = 1),
      x = seq(1,20,by = 1),
      y = seq(1,20,by = 1),
      z = seq(1,20,by = 1)
      )
  y
#+end_src

#+CAPTION: Sideways Table Test
#+ATTR_LATEX: :float sideways
#+RESULTS: widetbltest

执行C-c C-e l o 会在第 2 页生成带有侧边表格的 PDF。

顺便说一句,在这些情况下,一种必不可少的调试技术是使用 C-c C-e l l 导出到乳胶文件,然后检查乳胶文件,使用您选择的编译器编译它(pdflatex 似乎是您的选择),然后查看它在哪里以及如何失败。这通常会提供有关您必须对 Org 模式文件执行哪些操作以解决您遇到的任何问题的见解。其中一个推论是您必须了解一些 LaTeX:有些人希望编写 Org 模式文件而不必查看 LaTeX,但这仅适用于最简单的情况:只要您稍微偏离常规有点,掌握一些 LaTeX 知识非常有帮助。

【讨论】:

  • 按承诺行事。如果我将列数加倍,它仍然会超出边缘。除非有一个“widetable.sty”可以在多个页面上无限地向右扩展一个表格,否则你只能在一个页面上放置这么多列是不争的事实。我还将每行中的“20”更改为“200”,期望(希望)longtable 可以让它跨越多个页面,但是它将表格垂直居中在旋转的页面上,从顶部和底部的页面跑出。我将尝试 C-c C-e l l 方法,看看我是否能解决这个问题,但欢迎提出建议。
  • 我怀疑你可以结合longtablesidewaystable 来处理任意大的表。但这是一个 LaTeX 问题(你应该在 TeX SE 上询问)。一旦您在 LaTeX 中找到了解决方案(如果您在 LaTeX 中获得了解决方案......),您也许可以设计您的 Org 模式文件来生成它:我不会尝试解决它方式(从 Org 模式转到 LaTeX)而没有先在 LaTeX 中解决它。这确实是一次令人沮丧的经历。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多