您如何让 org-mode 导出宽或长 table 以使其在 PDF 中可读?
How do you get org-mode to export a wide or long table so it's readable in PDF?
我正在使用 R 在组织模式下创建各种 tables,并希望将它们包含在导出为 PDF 的文件中。其中有些 table 对于标准页面来说太宽了,有些可能太长了。我已经想出如何旋转组织 table,但我确实需要旋转 table,这是代码块的输出。
我查看了 Org 手册、https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-R.html, the questions SO suggested, 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}
并创建了一个像这样的 table:
#+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
我希望格式 table 旋转 90 度。我得到了一个略微参差不齐的未旋转 table 似乎是由分隔列的未对齐的管道符号制成的。
我是 运行 Emacs 26.1 和 org 9.2.4。
想法?如果有帮助并且被允许,我可以 post 85 行的完整文档。
如果解决方案自然地扩展到跨页面很好地呈现长 tables,那就太好了。
更新:@lars
这是我在 PDF 中得到的内容:
您编写的内容存在一个基本问题:#+CAPTION:
和 #+ATTR_LATEX:
指令必须应用于代码块生成的 table,not 到代码块本身。我发现这样做的最佳方法是为代码块命名,以便在该名称下生成结果,然后将指令附加到结果:
#+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
指令下, #+CAPTION:
和 #+ATTR_LATEX:
指令所附加的内容。
另一个问题是您的代码块的header。您希望结果为 table,但您不想在那里指定 latex
:如果您的代码块生成乳胶 table,您只会使用它,而不是 Org 模式table.
我也摆脱了 :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
执行 C-c C-e l o
会在第 2 页生成带有横向 table 的 PDF。
顺便说一句,在这些情况下,一种不可或缺的调试技术是使用 C-c C-e l l
导出到乳胶文件,然后检查乳胶文件,用您选择的编译器编译它(pdflatex
似乎是你的选择),看看它在哪里以及如何失败。这通常可以让您深入了解必须对 Org 模式文件执行哪些操作才能解决 运行 遇到的任何问题。一个推论是你必须了解一些 LaTeX:有些人希望编写 Org 模式文件而不必看 LaTeX,但这只适用于最简单的情况:只要你稍微偏离常规位,掌握一些 LaTeX 知识非常有帮助。
我正在使用 R 在组织模式下创建各种 tables,并希望将它们包含在导出为 PDF 的文件中。其中有些 table 对于标准页面来说太宽了,有些可能太长了。我已经想出如何旋转组织 table,但我确实需要旋转 table,这是代码块的输出。
我查看了 Org 手册、https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-R.html, the questions SO suggested, 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}
并创建了一个像这样的 table:
#+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
我希望格式 table 旋转 90 度。我得到了一个略微参差不齐的未旋转 table 似乎是由分隔列的未对齐的管道符号制成的。
我是 运行 Emacs 26.1 和 org 9.2.4。
想法?如果有帮助并且被允许,我可以 post 85 行的完整文档。
如果解决方案自然地扩展到跨页面很好地呈现长 tables,那就太好了。
更新:@lars
这是我在 PDF 中得到的内容:
您编写的内容存在一个基本问题:#+CAPTION:
和 #+ATTR_LATEX:
指令必须应用于代码块生成的 table,not 到代码块本身。我发现这样做的最佳方法是为代码块命名,以便在该名称下生成结果,然后将指令附加到结果:
#+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
指令下, #+CAPTION:
和 #+ATTR_LATEX:
指令所附加的内容。
另一个问题是您的代码块的header。您希望结果为 table,但您不想在那里指定 latex
:如果您的代码块生成乳胶 table,您只会使用它,而不是 Org 模式table.
我也摆脱了 :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
执行 C-c C-e l o
会在第 2 页生成带有横向 table 的 PDF。
顺便说一句,在这些情况下,一种不可或缺的调试技术是使用 C-c C-e l l
导出到乳胶文件,然后检查乳胶文件,用您选择的编译器编译它(pdflatex
似乎是你的选择),看看它在哪里以及如何失败。这通常可以让您深入了解必须对 Org 模式文件执行哪些操作才能解决 运行 遇到的任何问题。一个推论是你必须了解一些 LaTeX:有些人希望编写 Org 模式文件而不必看 LaTeX,但这只适用于最简单的情况:只要你稍微偏离常规位,掌握一些 LaTeX 知识非常有帮助。