使用asparaenum
来自 的环境时paralist
,有时\parindent
第一个项目前面的 是不必要的。例如,如果asparaenum
在启动环境后直接使用该环境proof
,则会导致在\parindent
“证明。”和第一个项目的标签之间出现额外的内容。
我如何设置环境其行为类似于paralist
,但并未首先介绍这一点\parindent
?具体来说,我希望找到一个基于paralist
或enumitem
的解决方案,且不会破坏 的可选参数\item
。
我附上了一个小例子来说明发生了什么以及我想要什么输出。请注意,虽然我可以手动修改环境实例asparaenum
以获得所需的输出(示例的第三部分),但我不知道如何使用新的列表环境自动执行此操作。
\documentclass{amsart}
\usepackage{paralist}
\usepackage{enumitem}
\begin{document}
What \verb!asparaenum! does:
\begin{proof}
\begin{asparaenum}
\item One.
\item Two.\qedhere
\end{asparaenum}
\end{proof}
What \verb!enumitem! does:
\begin{proof}
\begin{enumerate}[wide]
\item One.
\item Two.\qedhere
\end{enumerate}
\end{proof}
What I want:
\begin{proof}
\begin{asparaenum}
\newlength\saveitemindent
\saveitemindent=\itemindent
\advance\itemindent-\parindent
\item\itemindent=\saveitemindent One.
\item Two.\qedhere
\end{asparaenum}
\end{proof}
\end{document}
答案1
您可以抽象出上一个示例中的操作。最灵活的包是enumitem
,但如果您愿意,paralist
只需将其更改\enumitem[wide]
为\asparaenum
,然后\endenumerate
将其更改为\endasaparaenum
。
\documentclass[twocolumn]{amsart}
\usepackage{enumitem}
\usepackage{etoolbox}
\makeatletter
\newenvironment{proofenum}
{\enumerate[wide]%
\edef\sauter@saveditemindent{\the\itemindent}%
\advance\itemindent-\parindent
\patchcmd{\@item}{\ignorespaces}{\sauter@restoreitemindent\ignorespaces}{}{}}
{\endenumerate}
\newcommand\sauter@restoreitemindent{%
\itemindent=\sauter@saveditemindent
\def\sauter@restoreitemindent{}}
\makeatother
\begin{document}
\begin{proof}
\begin{proofenum}
\item One.
\item Abc
\item[XYZ] Def
\item \label{XXX} Two.\qedhere
\end{proofenum}
\end{proof}
\end{document}
(该twocolumn
选项只是为了缩小下图的尺寸。)
我们调整第一个\itemindent
,然后将其恢复为第一个\item
命令的最终工作的一部分;该\sauter@restoreitemindent
命令重新定义为不执行任何操作,因此我们不会再进行重置,并且该命令不会在嵌套列表中执行任何坏事。