问题
我有一张tabu
表格,其中一列的文本比表格其余部分的文本大。为了避免文本太靠近顶部规则,我在相关单元格中插入了一个支柱(底部已被打破)(如建议的那样这里)。
\smash[b]{\strut}
但是,除非插入里面,否则似乎会导致插入意外的额外垂直空间\textbf{}
。
如果我使用普通的\strut
(包括降序的0.3\baselineskip
)或者我创建支柱被砸碎手动使用\rule{0pt}{0.7\baselineskip}
(应该具有相同的尺寸}无论我将它放在哪里似乎都能正常工作。
有人能解释一下为什么\smash[b]{\strut}
插入到块内还是\textbf{}
块外很重要吗?
例子
这是一个演示此行为的简单示例。首先是结果,然后是 LaTeX 源。
结果
LaTeX 源
\documentclass[a4paper]{article}
\usepackage[top=3cm, bottom=3cm, width=6cm]{geometry}
\usepackage[parfill]{parskip}
\usepackage{tabu}
\usepackage{amsmath}
\begin{document}
Large text in \verb$tabu$ environment is too close to the uppermost line:
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\textbf{MIDDLE}} & right
\end{tabu} \\
\hline
\end{tabu}
To fix it we insert a smashed strut \emph{outside} the \verb$\textbf$ block but it does not look nice:
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\smash[b]{\strut}\textbf{MIDDLE}} & right
\end{tabu} \\
\hline
\end{tabu}
Putting the smashed strut \emph{inside} \verb$\textbf$ apparently works:
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\textbf{\smash[b]{\strut}MIDDLE}} & right
\end{tabu} \\
\hline
\end{tabu}
If the strut is not smashed it works \emph{outside} \verb$\textbf$:
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\strut\textbf{MIDDLE}} & right
\end{tabu} \\
\hline
\end{tabu}
If the smashed strut is replaced by a \verb$\rule$ is also works:
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\textbf{\rule{0pt}{0.7\baselineskip}MIDDLE}} & right
\end{tabu} \\
\hline
\end{tabu}
\end{document}
答案1
X
和列之间有着根本的区别c
。后者的排版方式与 相同\makebox[<dimen>]{<text>}
(<dimen>
是自动计算的,而前者是(由于选项,\parbox{<dimen>}{<text>}
文本将居中)。c
X
虽然 a\smash
在水平框 ( ) 中没有问题\makebox
,但它不会在 中开始一个段落\parbox
。如有疑问,请使用\leavevmode
before 。\smash
正如您所注意到的\rule
。与使用不同的解决方法\smash[b]
可能确实是
\rule{0pt}{\ht\strutbox}
对于初学者来说这可能有点神秘。
因为此宏开始一个段落,所以它\strut
在内部有效。\textbf
我希望输入的是
\begin{tabu}{|c|}
\hline
\begin{tabu} {lX[c]r}
left & {\LARGE\leavevmode\smash[b]{\strut}\bfseries MIDDLE} & right
\end{tabu} \\
\hline
\end{tabu}
如果您在多个地方需要此功能,您可以定义一个新命令。
\usepackage{xparse}
\NewDocumentCommand{\tabustrut}{o}
{%
\leavevmode\IfNoValueTF{#1}{\smash{\strut}}{\smash[#1]{\strut}}%
}
因此您可以使用\tabustrut
for\leavevmode\smash{\strut}
和\tabustrut[b]
for 。在列中\leavevmode\smash[b]{\strut}
使用没有问题,它不会执行任何操作。\leavevmode
c