在環境中設定長度時出現問題(溢出到環境之外)

在環境中設定長度時出現問題(溢出到環境之外)

我的文檔中的段落之間有間距,我認為我已經能夠追溯到我定義的自訂環境。

\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

相關內容