在 中进行大量计算后Python
,Pandas
DataFrame
创建了一个包含多个向量的 。幸运的是,Pandas
可以 格式导出其表格booktabs
,但 LaTeX 会对齐“向量”,我希望保持与导出时相同的间距/对齐方式,即向量的每个元素在列中保持对齐。我发现 可以按\verb
元素/单元格使用,但我的表格有很多列,甚至还有更多行。我尝试了 的几个array
\newcolumntype
定义,\verb
但没有一个接近正确渲染,或者只是出现错误。似乎应该有一种方法可以指定整个列所需的格式。
这是一个 MWE,其列和行比我的实际数据少很多,但仍然显示问题。
\documentclass{article}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{rrrrllr}
\toprule
ID & n & M & B & vector 1 & vector 2 & SC \\
\midrule
-1 & 4 & 123 & 1475 & [ 36 1 43 113] & [ 574 253 636 1266] & 1519 \\
-3 & 4 & 192 & 2111 & [ 54 74 147 30] & [ 736 913 1567 520] & 2169 \\
-5 & 4 & 446 & 4125 & [ 68 226 238 155] & [ 855 2278 2389 1637] & 4026 \\
\bottomrule
\end{tabular}
\end{document}
渲染结果如下:
如何让 Vector 列保留其元素对齐方式,如 LaTeX 源中所示?
有没有办法使列标题居中并使其下方的列数据右对齐?
答案1
像这样?
一种方法是将每个矩阵列放在单独的表列中。例如使用tabularray
包:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\begin{document}
\begin{tblr}{colspec={Q[r,$] ccc r@{\ }r@{\ }r@{\ }r r@{\ }r@{\ }r@{\ }r c}}
\toprule
\SetCell[c=1]{c} \text{ID}
& n & M & B & \SetCell[c=4]{c} vector 1
& & & & \SetCell[c=4]{c} vector 2
& & & & SC \\
\midrule
-1 & 4 & 123 & 1475 & [ 36 & 1 & 43 & 113] & [ 574 & 253 & 636 & 1266] & 1519 \\
-3 & 4 & 192 & 2111 & [ 54 & 74 & 147 & 30] & [ 736 & 913 & 1567 & 520] & 2169 \\
-5 & 4 & 446 & 4125 & [ 68 & 226 & 238 & 155] & [ 855 & 2278 & 2389 & 1637] & 4026 \\
\bottomrule
\end{tblr}
\end{document}
当然,这也可以用tabular
表格来实现:
\documentclass{article}
\usepackage{amsmath}
\usepackage{array}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{>{$}c<{$} ccc r@{\ }r@{\ }r@{\ }r r@{\ }r@{\ }r@{\ }r c}
\toprule
\text{ID}
& n & M & B & \multicolumn{4}{c}{vector 1}
& \multicolumn{4}{c}{vector 2}
& SC \\
\midrule
-1 & 4 & 123 & 1475 & [ 36 & 1 & 43 & 113] & [ 574 & 253 & 636 & 1266] & 1519 \\
-3 & 4 & 192 & 2111 & [ 54 & 74 & 147 & 30] & [ 736 & 913 & 1567 & 520] & 2169 \\
-5 & 4 & 446 & 4125 & [ 68 & 226 & 238 & 155] & [ 855 & 2278 & 2389 & 1637] & 4026 \\
\bottomrule
\end{tabular}
\end{document}
答案2
像这样吗?
\documentclass{article}
\usepackage{booktabs}
\usepackage{mathtools}
\begin{document}
\[ \begin{array}{*{4}{r}*{2}{r@{\enspace}r@{\enspace}r@{\enspace}r}r}
ID & n & M & B & \multicolumn{4}{c}{\text{vector 1}} & \multicolumn{4}{c}{\text{vector 2}} & SC \\
\midrule
-1 & 4 & 123 & 1475 & [\, 36 & 1 & 43 & 113\,] & [\, 574 & 253 & 636 & 1266\,] & 1519 \\[0.5ex]
-3 & 4 & 192 & 2111 & [\, 54 & 74 & 147 & 30\,] & [\, 736 & 913 & 1567 & 520\,] & 2169 \\[0.5ex]
-5 & 4 & 446 & 4125 & [\, 68 & 226 & 23 & 55\,] & [\, 855 & 2278 & 2389 & 1637\,] & 4026 \\
\bottomrule
\end{array} \]
\end{document}
答案3
恐怕您必须编辑表格以插入更多&
标记。
由于我们不能确保向量第一个条目的所有数字都有相同的数字长度,我们需要为开括号保留一列;为了对称和方便输入,我还为闭括号保留了一列。
\documentclass{article}
\usepackage{amsmath}
\usepackage{booktabs}
\begin{document}
\[
\begin{array}{
@{}
*{4}{r} % the first four columns
c@{\,} % for the open bracket
*{4}{r} % the first vector
@{\,}c % for the closed brace
c@{\,} % for the open bracket
*{4}{r} % the second vector
@{\,}c % for the closed brace
r % the last column
@{}
}
\toprule
% the headers
\multicolumn{1}{@{}c}{\text{ID}} &
\multicolumn{1}{c}{n} &
\multicolumn{1}{c}{M} &
\multicolumn{1}{c}{B} &
\multicolumn{6}{c}{\text{vector 1}} &
\multicolumn{6}{c}{\text{vector 2}} &
\multicolumn{1}{c@{}}{\text{SC}} \\
\midrule
-1 & 4 & 123 & 1475 & [ & 36 & 1 & 43 & 113 & ] & [ & 574 & 253 & 636 & 1266 & ] & 1519 \\
-3 & 4 & 192 & 2111 & [ & 54 & 74 & 147 & 30 & ] & [ & 736 & 913 & 1567 & 520 & ] & 2169 \\
-5 & 4 & 446 & 4125 & [ & 68 & 226 & 238 & 155 & ] & [ & 855 & 2278 & 2389 & 1637 & ] & 4026 \\
\bottomrule
\end{array}
\]
\end{document}
答案4
这种方法可能一般不适用,但对于 OP 的情况有效。优点是:零需要额外的表格格式,并且第 5 列和第 6 列居中对齐,但带有右对齐向量,正如 OP 所要求的那样。
这种方法适用的限制也很重要:标记[
只能出现在表格中以表示向量的开始,并且给定向量的列宽由该向量的最宽元素定义,而不考虑相邻行或列中向量的列宽。这样的限制对于 OP 来说可能是或可能不是可以接受的。如果后一种限制被证明是麻烦的,那么有一些补救措施,但这需要将输入格式更改为 OP 希望的其他格式。
该方法涉及在[
的持续时间内使其处于活动状态tabular
并使用的特征tabstackengine
使向量内部右对齐且具有固定宽度的列。
\documentclass{article}
\usepackage{booktabs,tabstackengine}
\setstackTAB{ }
\fixTABwidth{T}
\setstacktabbedgap{1ex}% INTER-COLUMN GAP SIZE
\renewcommand\stackalignment{r}% ALIGNMENT WITHIN VECTOR
\begin{document}
\catcode`\[=\active
\def[#1]{\string[\Matrixstack{#1}\string]}
\begin{tabular}{rrrrccr}
\toprule
ID & n & M & B & vector 1 & vector 2 & SC \\
\midrule
-1 & 4 & 123 & 1475 & [ 36 1 43 113] & [ 574 253 636 1266] & 1519 \\
-3 & 4 & 192 & 2111 & [ 54 74 147 30] & [ 736 913 1567 520] & 2169 \\
-5 & 4 & 446 & 4125 & [ 68 226 238 155] & [ 855 2278 2389 1637] & 4026 \\
\bottomrule
\end{tabular}
\catcode`\[=12
\end{document}