有没有办法吞噬所有后续跳过?相反的情况是可能的\unskip
。我有一个自定义章节布局(在中完成memoir
),使用tikz
,例如,图表列表用于\addvspace
分隔不同章节的图表——但如果前几章没有图表,那么开头会堆积一些图表\addvspaces
,留下不必要的空间。
如果你看一下 *.lof 文件的开头,就会出现以下情况memoir
:
\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax
\defcounter {refsection}{0}\relax
\select@language {english}
\defcounter {refsection}{0}\relax
\select@language {english}
\addvspace {0.5\onelineskip }
\addvspace {0.5\onelineskip }
\contentsline {figure}{\numberline {2.1}{\ignorespaces The...
\addvspace
请注意第一行之前的两行\contentsline
。
以下 MWE 将问题简化为本质,因此它不直接涉及 LOF。灰色区域显示了我的章节样式放置章节标题内容的区域。我没有包括该区域,而是将该区域设为灰色以显示在章节标题区域之后过渡到文本。
\documentclass{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\tikzset{every picture/.style={framed, inner frame sep=0pt,
background rectangle/.style={fill=gray}}}
\newcommand{\testchap}{
\noindent%
\begin{tikzpicture}
\pgfresetboundingbox
\useasboundingbox (0,0) rectangle (\textwidth, -5cm);
\end{tikzpicture}%
\par\nobreak\ignorespaces% TODO: how to eat all following skips??
}
\begin{document}
\testchap
\addvspace{.5\baselineskip} % this should be without effect
\lipsum*[1-3]
\end{document}
结果如下:
而不是这样:
有解决方案吗?
答案1
好的,经过大量研究,我找到了一个可行的解决方案,尽管对我来说这似乎是一种黑客行为。这个想法是定义一个布尔值\after@chapter
,表示“我们在下一章之后,不要\addvspace
在这里”。
\addvspace
然后使用该布尔值,并且仅当其为假时才添加空格。
最后,\@afterheading
当下一段开始时(使用\everypar
),我重新定义并重置该布尔值,以便在没有立即发生的情况下\addvspace
,它们仍会在文本中进一步发挥作用。
\newcommand{\testchap}{
\noindent%
\begin{tikzpicture}
\pgfresetboundingbox
\useasboundingbox (0,0) rectangle (\textwidth, -5cm);
\end{tikzpicture}%
\par\nobreak\global\after@chaptertrue%
\ignorespaces%
}
\ExplSyntaxOn
\newif\ifafter@chapter
\after@chapterfalse
\def\addvspace#1{
\ifafter@chapter
\else
\ifvmode
\if@minipage\else
\ifdim \lastskip =\z@
\vskip #1\relax
\else
\@tempskipb#1\relax
\@xaddvskip
\fi
\fi
\else
\@noitemerr
\fi
\fi}
% no newlines in here! (\ExplSyntaxOn takes care of that)
\def\@afterheading{
\@nobreaktrue
\everypar{
\ifafter@chapter
\global\after@chapterfalse
\else
\everypar{}
\fi
\if@nobreak
\@nobreakfalse
\clubpenalty \@M
\if@afterindent \else
{\setbox\z@\lastbox}
\fi
\else
\clubpenalty \@clubpenalty
\everypar{}
\fi}}
% this is specific to memoir: a section starts with \sectionblock.
% Define it to unset afterchapter, and don't add interlinespace.
\newcommand{\sectionblock}{
\ifafter@chapter
\global\after@chapterfalse
\nointerlineskip
\fi
}
显然,这只适用于\addvspace
,简单的\vspace
仍然会添加其空间。此外,我必须添加一个回忆录特定的 hack 并定义,\sectionblock
因为\@startsection
在其定义中说\if@nobreak\everypar{}
,这实际上破坏了我的代码 :)
最后,我不明白为什么我必须使用\global
。\@nobreakfalse
而朋友也不需要它?!