我正在从一个包含两对名称/值列的程序中生成一个表格。每对名称/值列形成一个两列禁忌表,然后将这两个表嵌套在一个总体禁忌表中以获得效果。我发现如果任何单元格换行,它看起来都不太好,所以在这种情况下,我将创建一个不同格式的表格。由于生成表格的程序不知道乳胶是否会换行单元格,因此需要在乳胶中确定。
为了确定是否存在任何换行单元格,我们会生成上述表格两次 --- 一次使用实际数据值,一次用 X 替换每个值。如果所有值都是 X,则名称列会很短而不会换行,因此如果使用实际数据生成的表格的总高度与仅使用 X 作为数据的相同表格的总高度相同,那么我们就知道没有任何换行。
美中不足的是,如果我们用 X 替换每个单元格,那么即使包含实际数据的表格不换行,两个表格的总高度也会略有不同。我担心如果实际表格更大,差异可能会变得更大。
如果没有单元格换行,有什么方法可以确保两者的总高度相同?
\documentclass{article}
\usepackage{calc}
\usepackage{colortbl}
\usepackage{tabu}
\newsavebox\bboxA
\newsavebox\bboxB
\newsavebox\bboxElse
\newlength{\thA}
\newlength{\thB}
\begin{document}
\savebox{\bboxA}{
\begin{tabu}{X|[blue]X}
\tabulinesep=4pt\begin{tabu}{>{\bfseries}lX}
\everyrow{\tabucline[blue]-}
1 & X \\
2 & X \\
3 & X \\
\end{tabu}
&
\tabulinesep=4pt\begin{tabu}{>{\bfseries}lX}
\everyrow{\tabucline[blue]-}
4 & X \\
5 & X \\
7 & X \\
\end{tabu}
\end{tabu}
}
\setlength{\thA}{\totalheightof{\usebox{\bboxA}}}
\savebox{\bboxB}{
\begin{tabu}{X|[blue]X}
\tabulinesep=4pt\begin{tabu}{>{\bfseries}lX}
\everyrow{\tabucline[blue]-}
1 & 8.3 \\
2 & 10.3 \\
3 & 19 \\
\end{tabu}
&
\tabulinesep=4pt\begin{tabu}{>{\bfseries}lX}
\everyrow{\tabucline[blue]-}
4 & 16 \\
5 & 15.6 \\
7 & 19.8 \\
\end{tabu}
\end{tabu}
}
\setlength{\thB}{\totalheightof{\usebox{\bboxB}}}
A: \the\thA{}
\begin{center}
\usebox\bboxA
\end{center}
\vspace{5ex}
B: \the\thB{}
\begin{center}
\usebox\bboxB
\end{center}
\end{document}
输出的屏幕截图。以点为单位显示的 A 和 B 数字是包含表格的框的总高度。目标是这两个数字相同,但事实并非如此。如何更改代码,以便只要单元格中的数据不换行,它们的总高度就相同?
添加
自从我发布它以来,我一直在研究这个问题,似乎如果我们添加一个支柱,以便所有四个出现的 都\begin{tabu}{>{\bfseries}lX}
被替换为,\begin{tabu}{>{\strut\bfseries}lX}
那么两个总高度确实会相同。虽然它在这里有效,但我不确定这是否通常可以工作,在没有单元格换行的情况下为两个表提供相同的总高度,或者是否还有其他我需要担心的事情。
添加 2
此部分有错误,因此我将其删除并用下一部分替换。
添加 3
这里是对 MWE (1) 的修订,使用了 Peter Gill 的想法,利用了\vphantom
此处\mystrut
定义的宏:如何检测当前字体大小的最高字母和最深字母的长度?(2)我们还在 bboxA 中实现了 David Carlisle 的想法(在新的 bboxC 中也实现了,以说明不适合的情况),使用ll
格式代替lX
,现在我们显示每个框的宽度和总高度。最后我们还显示了\textwidth
。
\documentclass{article}
\usepackage{calc}
\usepackage{colortbl}
\usepackage{lipsum}
\usepackage{tabu}
\newsavebox\bboxA
\newsavebox\bboxB
\newsavebox\bboxC
\newlength{\thA}
\newlength{\thB}
\newlength{\thC}
\newlength{\wA}
\newlength{\wB}
\newlength{\wC}
\def\mystrut{\vphantom{Ag}}
\begin{document}
\savebox{\bboxA}{%
\begin{tabu}{l|[blue]l}
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}ll}
\everyrow{\tabucline[blue]-}
1 & 8.3 \\
2 & 10.3 \\
3 & 19 \\
\end{tabu}
&
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}ll}
\everyrow{\tabucline[blue]-}
4 & 16 \\
5 & 15.6 \\
7 & 19.8 \\
\end{tabu}
\end{tabu}
}
\setlength{\thA}{\totalheightof{\usebox{\bboxA}}}
\setlength{\wA}{\widthof{\usebox{\bboxA}}}
\savebox{\bboxB}{%
\begin{tabu}{X|[blue]X}
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}lX}
\everyrow{\tabucline[blue]-}
1 & 8.3 \\
2 & 10.3 \\
3 & 19 \\
\end{tabu}
&
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}lX}
\everyrow{\tabucline[blue]-}
4 & 16 \\
5 & 15.6 \\
7 & 19.8 \\
\end{tabu}
\end{tabu}
}
\setlength{\thB}{\totalheightof{\usebox{\bboxB}}}
\setlength{\wB}{\widthof{\usebox{\bboxB}}}
\savebox{\bboxC}{%
\begin{tabu}{l|[blue]l}
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}ll}
\everyrow{\tabucline[blue]-}
1 & \lipsum[1] \\
2 & 10.3 \\
3 & 19 \\
\end{tabu}
&
\tabulinesep=4pt\begin{tabu}{>{\mystrut\bfseries}ll}
\everyrow{\tabucline[blue]-}
4 & 16 \\
5 & 15.6 \\
7 & 19.8 \\
\end{tabu}
\end{tabu}
}
\setlength{\thC}{\totalheightof{\usebox{\bboxC}}}
\setlength{\wC}{\widthof{\usebox{\bboxC}}}
A: Total height: \the\thA{} Width: \the\wA{}
\begin{center}
\usebox\bboxA
\end{center}
\vspace{5ex}
B: Total height: \the\thB{} Width: \the\wB{}
\begin{center}
\usebox\bboxB
\end{center}
\vspace{5ex}
C: Total height: \the\thC{} Width: \the\wC{}
\begin{center}
\usebox\bboxC
\end{center}
\vspace{5ex}
Text Width: \the\textwidth
\end{document}
结果如下所示。我们看到 bboxA 的宽度小于 345pt 的文本宽度,而 bboxC 的宽度大于 345pt。
答案1
刚刚注意到有请求我发表评论并回答。
X
这样使用成本比较高。
更直接的方法是强制使用列规范的单行ll
,然后测试生成的表的宽度,如果表宽大于,则选择替代布局\textwidth
。