如何吃掉/吞噬所有后续跳跃?

如何吃掉/吞噬所有后续跳跃?

有没有办法吞噬所有后续跳过?相反的情况是可能的\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而朋友也不需要它?!

相关内容