在环境中设置长度时出现问题(溢出环境之外)

在环境中设置长度时出现问题(溢出环境之外)

我的文档中段落之间有间距,我想我能够追溯到我定义的自定义环境。

\makeatletter
\def\remarkname{Remark}
\newcounter{counter@myremarks}
\newenvironment{remark}{\par\vspace{0.2cm}\par\noindent\begingroup\small%
  \addtocounter{counter@myremarks}{1}%
  \textbf{\remarkname~\arabic{counter@myremarks}.}~~\ignorespacesandallpars}{%
  \endgroup\par\vspace{0.2cm}\par\@afterindentfalse\@afterheading}
\newenvironment{remark*}{\par\vspace{0.2cm}\par\noindent\begingroup\small%
  \textbf{\remarkname.}~~\ignorespacesandallpars}{%
  \endgroup\par\vspace{0.2cm}\par\@afterindentfalse\@afterheading}
\makeatother

\ignorespacesandallpars指令由 Martin Scharrer 发出,来自以前的 StackExchange 问题

(我知道还有许多其他方法 - 包或 amsmath 中的定义 - 来获得这种环境,但我还没有找到让我完全满意的方法,目前使用自定义定义更容易。)

使用此定义后,我发现间距有点奇怪,需要额外的 \smallskip 或 \medskip 命令。我想知道我做错了什么。

我的问题是在其他地方吗,还是我在这里做错了什么?

更新:以下代码片段说明了其中一个问题(第二个项目列表之前的间距与第一个不同):

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\ignorespacesandallpars{%
  \begingroup
  \catcode13=10
  \@ifnextchar\par
    {\endgroup\expandafter\ignorespacesandallpars\@gobble}%
    {\endgroup}%
}
\def\remarkname{Remark}
\newenvironment{remark*}{\par\vspace{0.2cm}\par\noindent\begingroup\small%
  \textbf{\remarkname.}~~\ignorespacesandallpars}{%
  \endgroup\par\vspace{0.2cm}\par\@afterindentfalse\@afterheading}
\makeatother

\begin{document}

Following is an item list
\begin{itemize}
\item One
\item ...
\end{itemize}

\begin{remark*}
  Now a remark.
\end{remark*}

And another item list
\begin{itemize}
\item One
\item ...
\end{itemize}

\end{document}

答案1

这也是\@afterheading为什么分段命令不应该成组使用的原因之一 ;-)

它全局设置\@nobreaktrue然后本地设置\everypar来撤消它。因此,在您的环境结束后(撤消设置\everypar),您就\@nobreaktrue坐在那里等待下一个列表来捕获它……

\@nobreak列出未插入的列表\topsep......

为了避免这种混乱,您必须确保\@afterheading在您的环境之外进行调用。

在您的定义中用 进行替换会将移到\@afterheading您的环境定义的组之外并使其重新出现。\aftergroup\@afterheading\@afterheading\topsep

相关内容