我正在用该longtable
包在不同的页面上制作一个表格:
\begin{landscape}
\begin{longtable}{|c|c|c|c|c|c|c|}
\caption{Table noMCI.} \label{tab:long} \\
\hline
\multicolumn{1}{|c|}{\textbf{Study}} &
\multicolumn{1}{ c|}{\textbf{Participants}} &
\multicolumn{1}{ c|}{\textbf{Inclusion Criteria}} &
\multicolumn{1}{ c|}{\textbf{Study Design}} &
\multicolumn{1}{ c|}{\textbf{Intervention}} &
\multicolumn{1}{ c|}{\textbf{Primary Outcome}} &
\multicolumn{1}{ c|}{\textbf{Cognitive Function}}\\
\hline
\endfirsthead
\hline
\multicolumn{1}{|c|}{\textbf{Study}} &
\multicolumn{1}{ c|}{\textbf{Participants}} &
\multicolumn{1}{ c|}{\textbf{Inclusion Criteria}} &
\multicolumn{1}{ c|}{\textbf{Study Design}} &
\multicolumn{1}{ c|}{\textbf{Intervention}} &
\multicolumn{1}{ c|}{\textbf{Primary Outcome}} &
\multicolumn{1}{ c|}{\textbf{Cognitive Function}}\\
\hline
\endhead
\hline
\endfoot
\hline
\endlastfoot
One & abcdef ghjijklmn & 123.456778 & x & x & x & x \\
\end{longtable}
\end{landscape}
我想将“参与者”、“干预”和“认知功能”列分别拆分为 2、5 和 6 个子列。但是当我以这种方式更改代码时:
\hline
\multicolumn{1}{|c|}{\textbf{Study}} &
\multicolumn{2}{ c|}{\textbf{Participants}} &
\multicolumn{1}{ c|}{\textbf{Inclusion Criteria}} &
\multicolumn{1}{ c|}{\textbf{Study Design}} &
\multicolumn{5}{ c|}{\textbf{Intervention}} &
\multicolumn{1}{ c|}{\textbf{Primary Outcome}} &
\multicolumn{6}{ c|}{\textbf{Cognitive Function}}\\
我收到此错误“额外的对齐标签已更改为 \cr”,并且输出表导致:
如何修复?
编辑:如何在列之间设置垂直线?
答案1
首先,您必须指定包括形成“子列”的列在内的总列数,然后用于\multicolumn
合并特定行中的列,例如标题。
该表将包含大量列。我建议缩短标题列或至少添加换行符;你会发现制造细胞包与以下宏一起使用非常有用:\thead
因为\makecell
它们允许您在参数中添加换行符\\
。另一个优点是可以在一个地方添加格式,例如以粗体显示标题列,如示例中所示(参见 的行\theadfont
)。
您还可以考虑添加标题包以格式化标题。在示例中,我更改了表格和标题之间的距离。
我认为你应该删除垂直线。特别是在那个表中,你可以更灵活地减少列之间的空间并为内容添加更多空间。这可以通过更改来完成\tabcolsep
,这会影响整个表格(env 中示例中的注释行longtable
)。或者,可以在表格的序言中本地设置列之间的距离:只需@{<macro>}
在列之间插入;空参数@{}
完全删除间距,而<macro>
应该是任何插入额外空间的命令,例如\hspace{3pt}
,\quad
等\;
。
请参阅下面的示例
\documentclass{article}
\usepackage{pdflscape}
\usepackage{longtable}
\usepackage{caption} % To format captions
\usepackage{makecell} % For \thead and \makecell
\usepackage{booktabs} % For \toprule, \midrule and \bottomrule
\usepackage{kantlipsum} % For a dummy text, only for example
\captionsetup[table]{position=top,skip=3pt}
\renewcommand*\theadfont{\small\bfseries}
\renewcommand*\cellset{\small}
\renewcommand*\theadgape{\Gape[0pt]}
\begin{document}
\kant[1]
\begin{landscape}
\small
% \setlength\tabcolsep{3pt}
\begin{longtable}{@{} *{17}{c} @{}}
\caption{Table noMCI.}\label{tab:long} \\
\toprule
\thead{Study}
& \multicolumn{2}{c}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c}{\thead{Cognitive Function}} \\
\midrule\endfirsthead
\toprule
\thead{Study}
& \multicolumn{2}{c}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c}{\thead{Cognitive Function}} \\
\midrule\endhead
\bottomrule\endfoot
\bottomrule\endlastfoot
One
& A1 & A2
& 123.4
& B
& C1 & C2 & C3 & C4 & C5
& E
& F1 & F2 & F3 & F4 & F5 & F6 \\
Two
& G1 & G2
& 56.78
& H
& I1 & I2 & I3 & I4 & I5
& J
& K1 & K2 & K3 & K4 & K5 & K6 \\
Three
& A1 & A2
& 90.12
& B
& C1 & C2 & C3 & C4 & C5
& E
& F1 & F2 & F3 & F4 & F5 & F6 \\
Four
& G1 & G2
& 3.456
& H
& I1 & I2 & I3 & I4 & I5
& J
& K1 & K2 & K3 & K4 & K5 & K6 \\
\end{longtable}
\end{landscape}
\kant[2]
\end{document}
编辑
你真的需要注意这些标题。你把它们写得太长了!
如果您想添加额外的标题,只需添加额外的行。在前面的例子中,我使用了c
-column 类型,但由于您的表格包含文本,我会将列更改为p{<column-width>}
。它在单元格中形成段落。一个结果是文本在列边界处收到自然换行符。否则,长文本将排版在一行中。p{}
保持段落对齐,文本从左侧开始。为了正确左对齐,需要一个额外的选项:>{\raggedright\arraybackslash}
,您将其插入到列定义前面
... >{\raggedright\arraybackslash}p{1.5cm} ...
或者,也可以使用\centering
或\raggedleft
。如果使用额外的对齐,则\arraybackslash
在最后一列定义中是强制性的,因为这些宏重新定义了\\
。值得注意的是,该包ragged2e
提供了改进的对应项 sa或\Centering
,它们不需要。\RaggedRight
\RaggedLeft
\arraybackslash
还有一点,你的表格真的很大,有 17 列!很容易让表格太宽。因此,我建议使用替代包xltabular
。该包提供X
-column 类型。X
这是一个非常方便的附加功能,因为它将剩余空间分配给所有这些列。然后,所有定义为的列都X
获得相同的宽度。默认情况下,它还会创建具有标准对齐方式的段落。您可以插入上述表达式以获得不同的对齐方式。如果您有兴趣,还有一种方法可以全局执行此操作(请参阅文档)。
一种方案是将所有包含数字的列设置为 ,X
并将包含文本的其他列设置为固定宽度,因为您可能需要为不同的文本设置不同的宽度。或者,您可以r
为数字和X
文本定义常规列。只需确保所有包含文本的列都形成段落:使用 或X
。p{}
但是,您仍然需要注意避免使表格太宽。
还有一个建议,考虑使用几何学包以减少边距。这将为表格增加更多空间。您可以\newgeometry{}
在表格之前和\restoregeometry
之后使用以仅针对表格更改页面布局。请记住,这两个宏都会插入分页符。您可以在之前和之后使用它们\begin{landscape}...\end{landscape}
。
最后,如果您要缩短列,则可能需要附加注释。我放了两个示例(参见宏\tnote
)。这\rlap{}
是一个方便的宏,因为里面的任何内容都不会占用额外空间。它不会影响对齐,并且是为了保持演示整洁。
\documentclass{article}
\usepackage[pass]{geometry} % [pass]
\usepackage{pdflscape}
\usepackage{xltabular}
\usepackage{ragged2e,microtype}
\usepackage{caption} % To format captions
\usepackage{makecell} % For \thead and \makecell
\usepackage{booktabs} % For \toprule, \midrule and \bottomrule
\usepackage[nopar]{kantlipsum} % For a dummy text, only for example
\captionsetup[table]{position=top,skip=3pt}
\renewcommand*\theadfont{\small\bfseries}
\renewcommand*\cellset{\small}
\renewcommand*\theadgape{\Gape[0pt]}
\renewcommand*{\theadalign}{ct}
\newcolumntype{L}[1]{>{\RaggedRight}p{#1}}
\newcolumntype{C}[1]{>{\Centering}p{#1}}
\newcolumntype{R}[1]{>{\RaggedLeft}p{#1}}
\newcolumntype{Y}{>{\Centering}X}
\newcommand\tnote[1]{\rlap{\,\textsuperscript{#1}}} % For annotations
\begin{document}
\kant[1]
\newgeometry{margin=1cm}
\begin{landscape}
\small\sloppy
\setlength\tabcolsep{3pt}
\setlength\cmidrulekern{\tabcolsep}
\begin{xltabular}{\linewidth}{@{}
p{1.5cm}
*2{Y}
L{1.75cm}
L{1.75cm}
L{1.75cm} *4{Y}
C{1.75cm}
*6{Y}
@{}}
\caption{Table noMCI.}\label{tab:long} \\
\toprule
% Heading - first row
\thead[l]{Study}
& \multicolumn{2}{c}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c}{\thead{Cognitive Function}} \\
\cmidrule(lr){2-3}\cmidrule(lr){6-10}\cmidrule(lr){12-17}
% Heading - second row
& \thead{N} & \thead{Age}
& &
& \thead[l]{Training} & \thead{Ses.\\(n)} & \thead{Len.\tnote{2}\\(min)} & \thead{Freq.\\(n/w)\tnote{1}} & \thead{Total\\(n)}
& & \thead{WM} & \thead{PS} & \thead{Att.} & \thead{EF} & \thead{Vis.} & \thead{WM} \\
\midrule\endfirsthead
\toprule
% Heading - first row
\thead[l]{Study}
& \multicolumn{2}{c}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c}{\thead{Cognitive Function}} \\
\cmidrule(lr){2-3}\cmidrule(lr){6-10}\cmidrule(lr){12-17}
% Heading - second row
& \thead{N} & \thead{Age}
& &
& \thead[l]{Training} & \thead{Ses.\\(n)} & \thead{Len.\\(min)} & \thead{Freq.\\(n/w)\tnote{1}} & \thead{Total\\(n)}
& & \thead{WM} & \thead{PS} & \thead{Att.} & \thead{EF} & \thead{Vis.} & \thead{WM} \\
\midrule\endhead
\bottomrule\endfoot
\bottomrule\endlastfoot
% Table body
One
& 123.4 & 56.78
& \kant[2][2]
& Sample sample sample
& \kant[2][1] & 40 & 60 & 5 & 40
& E
& F1 & F2 & F3 & F4 & F5 & F6 \\
\end{xltabular}
\vspace{-0.75\baselineskip}%
\textsuperscript{1} Measured in a number of something per week\par
\textsuperscript{2} Length of something etc.
\end{landscape}
\restoregeometry
\kant[2]
\end{document}
编辑2
为了添加垂直线,只需添加|
列定义。在我看来,你的表格包含很多列,看起来不太好。
Booktabs 宏不再起作用,因为当规则和栏交叉时,每个宏都会添加一个间隙。如果您愿意,您可以简单地使用\hline
或使用我建议的技巧(参见代码)。
您可能需要拉伸该表 - 查看其线条\arraystretch
并根据您的喜好更改其因子。
我发现带有表格的页面上的页码由于边距较小而被部分截断。我通过设置自定义footskip
选项纠正了这个问题。
\documentclass{article}
\usepackage[pass]{geometry} % [pass]
\usepackage{pdflscape}
\usepackage{xltabular}
\usepackage{ragged2e,microtype}
\usepackage{caption} % To format captions
\usepackage{makecell} % For \thead and \makecell
\usepackage{booktabs} % For \toprule, \midrule and \bottomrule
\usepackage[nopar]{kantlipsum} % For a dummy text, only for example
\captionsetup[table]{position=top,skip=3pt}
\renewcommand*\theadfont{\small\bfseries}
\renewcommand*\cellset{\small}
\renewcommand*\theadgape{\Gape[0pt]}
\renewcommand*{\theadalign}{ct}
\newcolumntype{L}[1]{>{\RaggedRight}p{#1}}
\newcolumntype{C}[1]{>{\Centering}p{#1}}
\newcolumntype{R}[1]{>{\RaggedLeft}p{#1}}
\newcolumntype{Y}{>{\Centering}X}
\NewDocumentCommand\tnote{sm}{%
\rlap{\IfBooleanF{#1}{\,}\textsuperscript{#2}}} % For annotations
\begin{document}
\kant[1]
\newgeometry{margin=1cm,footskip=24pt}
\begin{landscape}
\renewcommand*\arraystretch{1.25}
\small\sloppy
\setlength\parindent{0pt}
\setlength\tabcolsep{3pt}
\setlength\cmidrulekern{\tabcolsep}
\begin{xltabular}{\linewidth}{|
p{1.5cm} |
*2{Y|}
L{1.75cm} |
L{1.75cm} |
L{1.75cm} | *4{Y|}
C{1.75cm} |
*6{Y|}
@{}}
\caption{Table noMCI.}\label{tab:long} \\
%\toprule
\noalign{\hrule height \heavyrulewidth}
%%% Heading - first row
\thead[l]{Study}
& \multicolumn{2}{c|}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c|}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c|}{\thead{Cognitive Function}} \\
% \cmidrule(lr){2-3}\cmidrule(lr){6-10}\cmidrule(lr){12-17}
\cline{2-3}\cline{6-10}\cline{12-17}
% Heading - second row
& \thead{N} & \thead{Age}
& &
& \thead[l]{Training} & \thead{Ses.\\(n)} & \thead{Len.\tnote{2}\\(min)} & \thead{Freq.\\(n/w)\tnote*{1}} & \thead{Total\\(n)}
& & \thead{WM} & \thead{PS} & \thead{Att.} & \thead{EF} & \thead{Vis.} & \thead{WM} \\
% \midrule\endfirsthead
\noalign{\hrule height \lightrulewidth}\endfirsthead
%%% Heading - consequtive rows
% \toprule
\noalign{\hrule height \heavyrulewidth}
\thead[l]{Study}
& \multicolumn{2}{c|}{\thead{Parti-\\cipants}}
& \thead{Inclusion\\Criteria}
& \thead{Study\\Design}
& \multicolumn{5}{c|}{\thead{Intervention}}
& \thead{Primary\\Outcome}
& \multicolumn{6}{c|}{\thead{Cognitive Function}} \\
% \cmidrule(lr){2-3}\cmidrule(lr){6-10}\cmidrule(lr){12-17}
\cline{2-3}\cline{6-10}\cline{12-17}
% Heading - second row
& \thead{N} & \thead{Age}
& &
& \thead[l]{Training} & \thead{Ses.\\(n)} & \thead{Len.\\(min)} & \thead{Freq.\\(n/w)\tnote*{1}} & \thead{Total\\(n)}
& & \thead{WM} & \thead{PS} & \thead{Att.} & \thead{EF} & \thead{Vis.} & \thead{WM} \\
% \midrule\endhead
% \bottomrule\endfoot
% \bottomrule\endlastfoot
\noalign{\hrule height \lightrulewidth}\endhead
\noalign{\hrule height \heavyrulewidth}\endfoot
\noalign{\hrule height \heavyrulewidth}\endlastfoot
% Table body
One
& 123.4 & 56.78
& \kant[2][2]
& Sample sample sample
& \kant[2][1] & 40 & 60 & 5 & 40
& E
& F1 & F2 & F3 & F4 & F5 & F6 \\
\end{xltabular}
\vspace{-\baselineskip}%
\textsuperscript{1} Measured in a number of something per week\par
\textsuperscript{2} Length of something etc.
\end{landscape}
\restoregeometry
\kant[2]
\end{document}