在浮动环境中,例如图形标题,LaTeX 有一个\global\@minipagefalse
,为什么这是必要的,以及这个开关有什么作用?
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}
\ifdim \wd\@tempboxa >\hsize
#1: #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
答案1
LaTeX 使用此@minipage
开关来处理 minipage 环境(或类似构造)开头的垂直间距。如果为真,则 \addvspace
不会添加空格。因此,例如,如果 minipage 以列表环境开头,则通常会在列表前面添加的空格(通过\addvspace
)将被抑制。
该开关将在小页面环境(或类似构造)开始时设置为 true,并且通常在 之前设置为 false \everypar
,即文本材料出现在该“小页面”中的那一刻。
现在,在标题实现的情况下,使用了两种不同的策略:如果标题比当前水平宽度宽,则将其重新设置为普通段落(因此开关将被设置为 false \everypar
)。但是如果它很小,则直接使用该框而不触发段落构建器。因此,在这种情况下必须手动设置开关。
之所以在全球范围内进行,只是因为开关总是在全球范围内进行操作。
答案2
消息人士称
The float mechanism, like minipage, sets the flag |@minipage| true
before executing the user-supplied text. Many \LaTeX\ constructs
test for this flag and do not add vertical space when it is true.
The intention is that this emulates \TeX's `top of page' behaviour.
The flag must be set false at the start of the first paragraph. This
is achieved by a redefinition of |\everypar|, but the call to
|\@parboxrestore| removes that redefinition, so it is re-inserted
if needed. If the flag is already false then the |\caption| was not
the first entry in the float, and so some other paragraph has already
activated the special |\everypar|. In this case no further action is
needed.
测试此开关的最重要的命令是\addvspace
它是最常用于在列表等显示环境周围添加垂直空间的命令。它是一个全球的标志并将其设置在浮动环境中意味着即使浮动从设置的地方浮动到未设置的地方,浮动也会以一致的方式运行。