如何让 org-mode 导出宽表或长表,以便以 PDF 形式读取?

Bil*_*llH 6 pdf emacs latex r org-mode

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

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

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

#+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}
Run Code Online (Sandbox Code Playgroud)

并创建了一个像这样的表:

#+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
Run Code Online (Sandbox Code Playgroud)

我期望有一个旋转 90 度的格式化表格。我得到了一个稍微破旧的未旋转的桌子,似乎是用未对齐的管道符号分隔列制成的。

我正在运行 Emacs 26.1 和 org 9.2.4。

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

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

更新:@lars

这是我在 PDF 中得到的内容:

在此输入图像描述

Nic*_*ckD 3

您编写的内容存在一个基本问题:#+CAPTION:and#+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

Run Code Online (Sandbox Code Playgroud)

现在,当您C-c C-c在代码块上执行操作时(或当导出器执行代码块时),结果将可靠且可重复地放置在指令下#+RESULTS: widetbltest,这就是#+CAPTION:and#+ATTR_LATEX:指令所附加的内容。

另一个问题是代码块的标题。您希望结果作为表格,但您不想latex在那里指定:只有当您的代码块生成乳胶表而不是组织模式表时,您才会使用它。

我还摆脱了该:placement指令,因为在我的实验中我收到一个错误,指出sidewaystable环境不支持它。也许这会随着rotfloat或 的变化而改变tabu,但我没有安装这些软件包中的任何一个。我也摆脱了,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

Run Code Online (Sandbox Code Playgroud)

这样做C-c C-e l o会生成一个 PDF,第 2 页上有一个横向表格。

顺便说一句,在这些情况下,一种不可或缺的调试技术是导出到乳胶文件,C-c C-e l l然后检查乳胶文件,使用您选择的编译器进行编译(pdflatex似乎是您的选择),并查看它在哪里以及如何失败。这通常可以让您深入了解必须对 Org 模式文件执行哪些操作才能解决遇到的任何问题。其中的一个推论是,你必须了解一些 LaTeX:有些人希望编写 Org 模式文件,而永远不必查看 LaTeX,但这只适用于最简单的情况:一旦你偏离了人迹罕至的道路,哪怕是一点点无论如何,拥有一些 LaTeX 知识是非常有帮助的。