У меня возникли проблемы с интервалами между абзацами в документе, и я думаю, что мне удалось отследить их до определенной мной пользовательской среды.
\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
появиться снова.