这个问题的棘手部分涉及 LaTeX。请注意,我的 TeX 代码是基于 tex.stackexchange 上的这两个问题:
- 如何使用文本 raggedright/centered/raggedleft 创建固定宽度的表格列?
- 表格中指定宽度的中心列(表格环境)?
问题的一部分很容易回答:如何设置固定的列宽,但将所有数字列向右对齐,将所有其他列向左对齐?
这只是正确的列类型的问题(请参阅上面链接的答案)。解决方案可能是:
\documentclass{article}
\usepackage{array}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\begin{document}
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)
irisShort <- head(iris)
print(xtable(irisShort,
digits=rep(0,6),
align=c(
"p{0.015\\textwidth}|",
"R{0.37\\textwidth}|",
"R{0.12\\textwidth}|",
"R{0.08\\textwidth}|",
"R{0.02\\textwidth}|",
"p{0.35\\textwidth}|")))
@
\end{document}
As p{}
默认情况下,列是左对齐的,我们只需要为具有固定宽度的右对齐列定义一种新的列类型:R
.
请注意,列名称重叠,但这是由于问题中指定的宽度造成的。
将列名称居中仅需要第一行的不同理由。这可以通过使用来实现\multicolumn
命令。然而,由于我们想要将 LaTeX 代码添加到列名称中,因此我们还必须防止xtable
使用清理列名sanitize.colnames.function = identity
:
irisShort2 <- irisShort
colnames(irisShort2) <- paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}")
print(xtable(irisShort2,
digits=rep(0,6),
align=c(
"p{0.015\\textwidth}|",
"R{0.37\\textwidth}|",
"R{0.12\\textwidth}|",
"R{0.08\\textwidth}|",
"R{0.02\\textwidth}|",
"p{0.35\\textwidth}|")),
sanitize.colnames.function = identity)
paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}")
使用原始列名,但将它们括在\multicolumn{1}{c|}{
colname}
它提供居中的列名称。
请注意,由于第一行中的列类型已更改,现在列名称不再重叠(相反,表太宽)。
The two code snippets in this answer produce the following output:
![enter image description here](https://i.stack.imgur.com/xoi8g.png)