与内容无关的总高度

与内容无关的总高度

我正在从一个包含两对名称/值列的程序中生成一个表格。每对名称/值列形成一个两列禁忌表,然后将这两个表嵌套在一个总体禁忌表中以获得效果。我发现如果任何单元格换行,它看起来都不太好,所以在这种情况下,我将创建一个不同格式的表格。由于生成表格的程序不知道乳胶是否会换行单元格,因此需要在乳胶中确定。

为了确定是否存在任何换行单元格,我们会生成上述表格两次 --- 一次使用实际数据值,一次用 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

相关内容