考虑手册中的以下声明memoir
:
\newcommand{\marginbox}[1]%
{\parbox[t][0pt]{6em}{\itshape\raggedleft\mbox{} #1}}
这个命令中的空 mbox 有什么用?
答案1
可能\mbox
用于退出垂直模式,因为要\parbox
切换到段落模式。例如,#1
可以用\color
命令开始。在垂直模式下,颜色 whatsit 设置在垂直列表的顶部,然后标题文本开始一个新段落,该段落位于颜色 whatsit 下方。顶部对齐的参考点\paragraph
是颜色 whatsit。然后,此参考点与当前基线对齐。结果,头部标题移动以下当前基线。
of避免了这种情况\leavevmode
,\mbox
方法是离开垂直模式,开始新段落,进入水平模式。然后,颜色 whatsit 会与以下标题文本一起放在当前基线上。
我不认为 的空白\hbox{}
部分\mbox{}
在这里有任何用处,\mbox{}
只是比\leavevmode
或 更短一点\noindent
。但是定义包含一个由以下空格引起的错误。后面的空格\mbox{}
是不是由于水平模式而被忽略。这意味着第一行的文本没有完整的6em
,其行宽减少了该空间的宽度。
固定定义是:
\newcommand{\marginbox}[1]{%
\parbox[t][0pt]{6em}{%
\itshape
\raggedleft
\leavevmode % or \mbox{}% without following space
#1%
}%
}
答案2
比较差异。 将使\mbox
您退出垂直模式。 这里,\marginbox
是您定义的;\xmarginbox
消除了\mbox{}
定义中的 。
\vspace
诸如、、\llap
和之类的宏\rlap
在垂直模式和水平模式下的行为有所不同。
\documentclass{memoir}
\newcommand{\marginbox}[1]%
{\parbox[t][0pt]{6em}{\itshape\raggedleft\mbox{} #1}}
\newcommand{\xmarginbox}[1]%
{\parbox[t][0pt]{6em}{\itshape\raggedleft #1}}
\begin{document}
x\marginbox{\vspace{\baselineskip}y}\par
x\xmarginbox{\vspace{\baselineskip}y}\par
\vspace{3em}
x\marginbox{\llap{xyz}}\par
x\xmarginbox{\llap{xyz}}\par
\end{document}