这个垂直空间从哪里来的?

这个垂直空间从哪里来的?

我(幸运地)收到了我之前的一个问题的几个答案,并且在测试每一个答案时,我注意到一个我找不到解决方案的行为。

这是我的 MWE:

\documentclass[10pt,english]{article}
\usepackage[english]{babel}
\usepackage[protrusion=true,expansion=true, tracking=true]{microtype}
\usepackage{mathptmx}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage[showframe, paperwidth=6in,paperheight=9in]{geometry}
\geometry{tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
\pagestyle{empty}

%Needed for bridge related tabular enviroments defined below
\usepackage{array}

\raggedbottom

%********************************************************************************
%Use MnSymbol suit symbols
\DeclareFontFamily{U}{MnSymbolCards}{}

\DeclareFontShape{U}{MnSymbolCards}{m}{n}{
    <-6>  s*[1.2] MnSymbolC5
   <6-7>  s*[1.2] MnSymbolC6
   <7-8>  s*[1.2] MnSymbolC7
   <8-9>  s*[1.2] MnSymbolC8
   <9-10> s*[1.2] MnSymbolC9
  <10-12> s*[1.2] MnSymbolC10
  <12->   s*[1.2] MnSymbolC12}{}

\newcommand{\mndiamond}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A2}}}
\newcommand{\mnheart}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A3}}}
\newcommand{\mnspade}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A4}}}
\newcommand{\mnclub}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A5}}}

\renewcommand{\c}{\mnclub}
\renewcommand{\d}{\mndiamond}
\newcommand{\h}{\mnheart}
\newcommand{\s}{\mnspade}
%********************************************************************************

\def\hand#1#2#3#4#5{\vtop{
   \hbox{\textls[100]{\textsc{#1}}}
   \handA \s{#2}
   \handA \h{#3}
   \handA \d{#4}
   \handA \c{#5}
}}
\def\handA#1#2{\hbox{\hbox to1em{\hss#1\hss}\handB#2\relax}}
\def\handB#1{\ifx#1\relax\else #1\if1#1\else\kern2pt \fi\expandafter\handB\fi}

\newcommand{\bd}[4]{
\begin{tabular}[b]{ m{6em} m{6em} m{6em}}
 & #1 & \\
#2 &  & #3\\
   & #4 &
\end{tabular}
}

\makeatother

\begin{document}
\noindent $1$THEIR UNTO THEM PLACE CANNOT SIGNS DARKNESS.

\bd
{\hand{NORTH}{J652}{AQJ972}{J}{103}}
{\hand{WEST}{10}{K83}{Q973}{AQJ92}}
{\hand{EAST}{KQ974}{10543}{652}{5}}
{\hand{SOUTH}{A83}{\textemdash}{AK1084}{K8764}}

\noindent THEIR UNTO TAKQJAKQJAQKHJ AKQJAKQJAQKHJ ARKNESS.

\hand{NORTH}{J652}{AQJ972}{J}{103}

THEIR UNTO THEM AKQJAKQJAQKHJ DARKNESS.

\bd
{North}
{West}
{East}
{South}

THEIR UNTO THEM PLACE CANNOT SIGNS DARKNESS.
\end{document}

这是我的 pdfLaTeX 输出:

在此处输入图片描述

我主要关心的是区域 1 和下一段之间的垂直空间。垂直空间不是宏的副产品,

\def\hand#1#2#3#4#5{\vtop{
   \hbox{\textls[100]{\textsc{#1}}}
   \handA \s{#2}
   \handA \h{#3}
   \handA \d{#4}
   \handA \c{#5}
}}
\def\handA#1#2{\hbox{\hbox to1em{\hss#1\hss}\handB#2\relax}}
\def\handB#1{\ifx#1\relax\else #1\if1#1\else\kern2pt \fi\expandafter\handB\fi}

因为在区域二中相同的宏不会产生顶部或底部的垂直空间。

此外,我认为它不是宏的副产品:

\newcommand{\bd}[4]{
\begin{tabular}[b]{ m{6em} m{6em} m{6em}}
 & #1 & \\
#2 &  & #3\\
   & #4 &
\end{tabular}
}

因为相同的宏(本质上是表格环境)在区域3中没有产生相同的垂直空间。

我的问题:是什么产生了区域 1 中的垂直底部间距?

此外,输出中存在一些小的间距问题;是否可以询问 LaTeX 引擎不是尝试变得聪明并安排(添加或减去)任何类型的垂直间距?

答案1

此空间是由于使用时\vtop没有意识到\leavevmode应该在它之前而产生的。

tabular处理p单元格(或mb)时,它会确保其中的第一行和最后一行具有支撑;但这只能在单元格中的段落已开始且不\vtop具有支撑时才能完成。因此,您拥有仍处于垂直模式的框,然后最后一个支撑与初始支撑重合。

解决方法:如果你确实需要使用\vtop(你不需要做那项工作),一定要\leavevmode在它前面有。

如果我将的定义\vtop改为,则结果如下:\leavevmode\vtop\hand

在此处输入图片描述

现在您清楚地知道为什么您不想要\vtop

答案2

当然,空格不是我的宏的副产品。但我的宏产生了框。表格项以垂直模式开始,放置此框,最后开始水平模式(我不知道为什么)。此水平模式在环境中的参数\hand后放置空行。#4tabular

您可以在环境 (宏)中输入,\noindent#4当然还有 和。\noindent#3\noindent#2\noindent#1tabular\bd

编辑现在,我知道为什么水平模式在项目末尾启动tabular\@finalstrut这里扩展了将支柱放在项目末尾的方法。我确实研究过,latex.ltx但这不是个好主意。宏被编程为一些晦涩难懂的东西:

\def\@finalstrut#1{%
  \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1}

\nobreak为什么在 之前立即有\vrule?这很奇怪。为什么只在水平模式下才会应用惩罚?如果当前没有水平模式,则由于 而启动\vrule。最好不要查看latex.ltx文件(以保持良好的心态)。

編輯2\bd我建议将实现的宏替换tabular为另一个仅使用框进行操作的宏。这样就不需要\leavevmodenor了:\noindent

\def\bd#1#2#3#4{\vbox{
  \bx{}{#1}{}
  \bx{#2}{}{#3}
  \bx{}{#4}{}
}}
\def\bx#1#2#3{\hbox{\rlap{#1}\kern8em\rlap{#2}\kern8em\rlap{#3}\kern6em}}

相关内容