问题

问题

问题

我有一张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>}文本将居中)。cX

虽然 a\smash在水平框 ( ) 中没有问题\makebox,但它不会在 中开始一个段落\parbox。如有疑问,请使用\leavevmodebefore 。\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}}%
 }

因此您可以使用\tabustrutfor\leavevmode\smash{\strut}\tabustrut[b]for 。在列中\leavevmode\smash[b]{\strut}使用没有问题,它不会执行任何操作。\leavevmodec

在此处输入图片描述

相关内容