Проблема установки длин в среде (вытекание за пределы среды)

Проблема установки длин в среде (вытекание за пределы среды)

У меня возникли проблемы с интервалами между абзацами в документе, и я думаю, что мне удалось отследить их до определенной мной пользовательской среды.

\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принадлежит Мартину Шарреру и исходит отпредыдущий вопрос 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появиться снова.

Связанный контент