如何在 xtable 的对齐参数中同时设置列宽和文本对齐方式?
How to set both column width and text alignment in align argument of xtable?
我想保留使用 xtable
的 align
参数设置的列宽,我想将所有数字列右对齐,其他列左对齐,headers到中心。
我找到了一些使用 tables 的解决方案,它们直接写在 rnw
文件中,但我想从文件中加载数据,因为我的 table 很大并且可以更改在创建 knitr 文档期间。
代码(我在这个例子中使用了iris
数据集,而不是我自己的数据):
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)
irisX <-print (xtable (iris,
digits=rep(0,6),
align= c("p{0.015\textwidth}|",
"p{0.37\textwidth}|",
"p{0.12\textwidth}|",
"p{0.08\textwidth}|",
"p{0.02\textwidth}|",
"p{0.35\textwidth}|")))
@
这个问题的棘手部分是指 LaTeX。请注意,我的 TeX 代码是基于 tex.stackexchange:
上的这两个问题
- How to create fixed width table columns with text raggedright/centered/raggedleft?
- Center column with specifying width in table (tabular enviroment)?
问题的一部分很容易回答:如何设置固定的列宽但将所有数字列右对齐而所有其他列左对齐?
这只是正确的列类型的问题(请参阅上面链接的答案)。解决方案可能是:
\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}
由于 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}
中,后者提供了居中的列名称。
请注意,由于第一行中的列类型已更改,现在列名称不再重叠(相反,table 太宽)。
此答案中的两个代码片段产生以下输出:
我遇到了同样的问题,想在 R 控制台中将此作品分享为
library(xtable)
irisShort <- head(iris)
print(xtable(irisShort,
digits=rep(0,6),
align=c(
"p{1cm}|","p{3cm}|",
"p{2cm}|","p{3cm}|",
"p{3cm}|","p{3cm}|")))
我想保留使用 xtable
的 align
参数设置的列宽,我想将所有数字列右对齐,其他列左对齐,headers到中心。
我找到了一些使用 tables 的解决方案,它们直接写在 rnw
文件中,但我想从文件中加载数据,因为我的 table 很大并且可以更改在创建 knitr 文档期间。
代码(我在这个例子中使用了iris
数据集,而不是我自己的数据):
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)
irisX <-print (xtable (iris,
digits=rep(0,6),
align= c("p{0.015\textwidth}|",
"p{0.37\textwidth}|",
"p{0.12\textwidth}|",
"p{0.08\textwidth}|",
"p{0.02\textwidth}|",
"p{0.35\textwidth}|")))
@
这个问题的棘手部分是指 LaTeX。请注意,我的 TeX 代码是基于 tex.stackexchange:
上的这两个问题- How to create fixed width table columns with text raggedright/centered/raggedleft?
- Center column with specifying width in table (tabular enviroment)?
问题的一部分很容易回答:如何设置固定的列宽但将所有数字列右对齐而所有其他列左对齐?
这只是正确的列类型的问题(请参阅上面链接的答案)。解决方案可能是:
\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}
由于 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}
中,后者提供了居中的列名称。
请注意,由于第一行中的列类型已更改,现在列名称不再重叠(相反,table 太宽)。
此答案中的两个代码片段产生以下输出:
我遇到了同样的问题,想在 R 控制台中将此作品分享为
library(xtable)
irisShort <- head(iris)
print(xtable(irisShort,
digits=rep(0,6),
align=c(
"p{1cm}|","p{3cm}|",
"p{2cm}|","p{3cm}|",
"p{3cm}|","p{3cm}|")))