Название не очень описательное. Я пытаюсь написать пользовательскую среду remark
в стиле amsthm
, которая может принимать аргументы в качестве заголовка (мне не нужны ссылки на функциональные возможности). Я хотел упростить код, избежав trivlist
. remark
В средах в стиле теоремы есть .5\topsep
пробелы до и после среды. Но это выглядит очень странно в средах со списками, таких как itemize
. Вот что у меня есть:
\documentclass{article}
\usepackage{lipsum} % for testing
% paragraph environment, takes one mandatory header text
\newenvironment{para}[1]{
% add space before environment
\par\addvspace{.5\topsep}
% header text
\noindent\textit{#1.}%
% default rubber space after header text and ignore following spaces
\hspace*{5pt plus 1pt minus 1pt}\ignorespaces
}{
% add space after environment
\par\addvspace{.5\topsep}
}
\begin{document}
\lipsum[66]
\begin{para}{Looks good}
\lipsum[66]
\end{para}
\lipsum[66]
\begin{itemize}
\item \lipsum[66]
Compare \verb|\parsep| above and the \verb|\parsep+.5\topsep| below.
\begin{para}{Looks weird}
\lipsum[66]
\end{para}
\lipsum[66]
\end{itemize}
\end{document}
Как вы можете видеть, в списочных средах .5\topsep
добавляется к ненулевому \parsep
, создавая больший зазор. Исходные amsthm
среды избегают этого, используя механизмы Latex для списков (устанавливая \@topsep
и \@topsepadd
на желаемый интервал .5\topsep
). Аналогично, я бы предпочел вообще не добавлять пробел, если para
вызывается внутри списочных сред.Есть ли способ определить, находится ли я в среде списка? Или есть более элегантное решение?
Редактировать:Добавлено изображение скомпилированного файла.
решение1
КакДэвид Карлайл сказал, вам не следует использовать \topsep
для определения вашей среды, так как она устанавливается и сбрасывается списочными средами, и ваша среда не будет давать последовательного поведения (так как она зависит от длины, которая часто меняется на лету). Вероятно, вы захотите жестко закодировать значение (сделать его клеем, если хотите, но я просто возьму, 4pt
так как это, кажется, желаемая величина).
Чтобы справиться с эффектом, \parskip
который может присутствовать или отсутствовать (в среде списка, \parskip
устанавливается равным \parsep
), вы можете просто отменить его, добавив дополнительный vspace. Следующий код, вероятно, сделает то, что вам нужно:
\documentclass{article}
\usepackage{lipsum} % for testing
% paragraph environment, takes one mandatory header text
\newenvironment{para}[1]{
% add space before environment
\par\addvspace{4pt}\addvspace{-\parskip}
% header text
\noindent\textit{#1.}%
% default rubber space after header text and ignore following spaces
\hspace*{5pt plus 1pt minus 1pt}\ignorespaces
}{
% add space after environment
\par\addvspace{4pt}\addvspace{-\parskip}
}
\begin{document}
\lipsum[66]
\begin{para}{Looks good}
\lipsum[66]
\end{para}
\lipsum[66]
\begin{itemize}
\item \lipsum[66]
Compare \verb|\parsep| above and the \verb|\parsep+.5\topsep| below.
\begin{para}{Looks weird}
\lipsum[66]
\end{para}
\lipsum[66]
\end{itemize}
\end{document}