Der Titel ist nicht sehr aussagekräftig. Ich versuche, eine benutzerdefinierte Umgebung remark
im -Stil zu schreiben amsthm
, die Argumente als Header annehmen kann (ich brauche keine Referenzierungsfunktionen). Ich wollte den Code vereinfachen, indem ich vermeide trivlist
, remark
dass Theoremumgebungen im -Stil .5\topsep
vor und nach der Umgebung Leerzeichen haben. Aber das sieht in Listenumgebungen wie wirklich seltsam aus itemize
. Hier ist, was ich habe:
\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}
Wie Sie sehen, wird in Listenumgebungen das .5\topsep
zu dem von Null verschiedenen hinzugefügt \parsep
, wodurch eine größere Lücke entsteht. Die ursprünglichen amsthm
Umgebungen vermeiden dies, indem sie die Mechanismen von Latex für Listen verwenden ( \@topsep
und \@topsepadd
auf den gewünschten Abstand von einstellen .5\topsep
). Ebenso würde ich es viel lieber vorziehen, überhaupt kein Leerzeichen hinzuzufügen, wenn para
in Listenumgebungen aufgerufen wird.Gibt es eine Möglichkeit festzustellen, ob man sich in einer Listenumgebung befindet? Oder gibt es eine elegantere Lösung?
Bearbeiten:Bild der kompilierten Datei hinzugefügt.
Antwort1
AlsDavid Carlisle sagte, sollten Sie nicht verwenden, \topsep
um Ihre Umgebung zu definieren, da es durch Listenumgebungen gesetzt und zurückgesetzt wird und Ihre Umgebung kein konsistentes Verhalten zeigt (da es von einer Länge abhängt, die häufig im laufenden Betrieb geändert wird). Sie möchten wahrscheinlich einen Wert fest codieren (machen Sie einen Kleber daraus, wenn Sie möchten, aber ich nehme einfach, 4pt
da dies die gewünschte Menge zu sein scheint).
Um den Effekt von zu handhaben, \parskip
der vorhanden sein kann oder nicht (in einer Listenumgebung \parskip
ist auf gleich gesetzt \parsep
), können Sie ihn einfach durch Hinzufügen eines zusätzlichen vspace aufheben. Folgendes wird wahrscheinlich das gewünschte Ergebnis erzielen:
\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}