Размещение новой среды в списках

Размещение новой среды в списках

Название не очень описательное. Я пытаюсь написать пользовательскую среду 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}

введите описание изображения здесь

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