标题不太具描述性。我尝试编写一个自定义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}