我的文档中段落之间有间距,我想我能够追溯到我定义的自定义环境。
\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