我搜索了一下,但找不到可靠的方法来在列跨多行的表格中换行。关于如何让此表格适合页面,您有什么想法吗?:
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}
\begin{tabular}{cccc}
\toprule
& & \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{3-4}
& & Logic of consequences & Logic of appropriateness \\
\midrule
\multirow{2}{*}{Principal actor in rule adoption process} & EU-driven & External incentives model & Social learning model \\
& CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
答案1
在回答有关包装包含在内的文本的问题时\multirow
,您可以将内容放在指定宽度的<stuff>
段落框中:\parbox{<len>}{<stuff>}
<len>
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{multirow}% http://ctan.org/pkg/multirow
\begin{document}
\begin{tabular}{cccc}
\toprule
& & \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{3-4}
& & Logic of & Logic of \\
& & consequences & appropriateness \\
\midrule
\multirow{2}{*}{\parbox{4cm}{Principal actor in rule adoption process}} & EU-driven & External incentives model & Social learning model \\
& CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
但是,就您的文档规格而言,这仍然太宽了(12pt,a4paper
)。因此,这里可能有一个更好的表格布局和一些边距调整(使用geometry
):
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage[margin=3cm]{geometry}% http://ctan.org/pkg/geometry
\begin{document}
\noindent\begin{tabular}{ccc}
\toprule
& \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{2-3}
\parbox{0.3\linewidth}{\centering Principal actor in rule adoption process} &
\parbox{0.3\linewidth}{\centering Logic of consequences} &
\parbox{0.3\linewidth}{\centering Logic of appropriateness} \\
\midrule
EU-driven & External incentives model & Social learning model \\
CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
注意\noindent
避免段落缩进,否则会将表格推到右侧,超出文本(右)边距。
答案2
首先,您最初尝试的代码中存在一些错误(列太多,多行定义错误)。因此我们的起点代码应如下所示:
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}
\begin{tabular}{ccc}
\toprule
\multirow{2}{*}{Principal actor in rule adoption process}
& \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{2-3}
& Logic of consequences & Logic of appropriateness \\
\midrule
EU-driven & External incentives model & Social learning model \\
CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
看起来像应该工作是将列转换为段落(换行)列;您可以使用数组包和特殊的 p 定义使它们居中。(我假设你需要使它们保持居中。)我还添加了 \noindent,以便表格之前没有段落缩进(常见做法)。
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{multirow}
\usepackage{array}
\begin{document}
\noindent
\begin{tabular}%
{>{\centering\arraybackslash}p{0.3\textwidth}%
>{\centering\arraybackslash}p{0.3\textwidth}%
>{\centering\arraybackslash}p{0.3\textwidth}}
\toprule
\multirow{2}{*}{Principal actor in rule adoption process}
& \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{2-3}
& Logic of consequences
& Logic of appropriateness \\
\midrule
EU-driven & External incentives model & Social learning model \\
CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
但是,这不起作用,因为多行不“遵守”段落列定义,因此文本不会换行。 (多行文档没有提到这个“功能”,令我惊讶的是,这个问题和类似问题的其他答案中都没有提到这一点,因为对我来说,这是非常不直观的。)
因此我们需要将多行包装在 parbox 中以“手动重新应用列格式”:
\documentclass[12pt,a4paper]{article}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{multirow}
\usepackage{array}
\begin{document}
\noindent
\begin{tabular}%
{>{\centering\arraybackslash}p{0.3\textwidth}%
>{\centering\arraybackslash}p{0.3\textwidth}%
>{\centering\arraybackslash}p{0.3\textwidth}}
\toprule
\multirow{2}{*}{\parbox{0.3\textwidth}{\centering Principal actor in rule adoption process}}
& \multicolumn{2}{c}{Logic of rule adoption} \\
\cmidrule{2-3}
& Logic of consequences
& Logic of appropriateness \\
\midrule
EU-driven & External incentives model & Social learning model \\
CEE-driven & Lesson-drawing model & Lesson-drawing model \\
\bottomrule
\end{tabular}
\end{document}
您可以恢复为 {ccc} 列定义,并让 parbox 的宽度固定 <= 该列的任何其他行内容,但这有点笨拙。最好保留它们,这样就可以获得到处环绕、居中文本的好处。
编辑:实际上,如果您手动设置多行宽度,它也可以起作用:
\multirow{2}{0.3\textwidth}{\centering Principal actor in rule adoption process}}
这也许是一个更简洁的解决方案,但有点神秘的是,为什么手动指定宽度(参见 *)会导致它开始换行,但直到手动添加后才会居中。(我假设是因为指定的宽度隐式应用了段落样式换行。)至少使用 parbox 可以使其明确。
编辑2:更通用的是,如果你到处都使用 \linewidth 而不是 \textwidth,并且多行宽度为\linewidth
(不是 0.3\linewidth
)。\linewidth 似乎为您提供了上下文宽度,在表格单元格中,即列宽。但是,我还没有看到有关 \linewidth 的描述(包括此网站上的全面答案:\textwidth、\linewidth 和 \hsize 之间的区别) 提到了这个表格上下文(它们都谈论列表、小页面和 parbox),所以我非常惊讶它是这样工作的。也许是因为 parbox 被暗中使用了(?),或者 \linewidth 比人们意识到的更通用?
答案3
您可能还需要为每行添加一些垂直间距。例如,\\[3ex]\hline
否则,如果换行的文本很长,它将溢出到后续行。换行文本单元格的高度由非多行单元格的高度总和决定。在我的情况下 - 换行的单元格更长 - 因此切\hline
过它。
[3ex]
只需使用或等扩展每行的高度即可[4ex]
。除非有人有更好的解决方案。这为我解决了问题。