使用 asparaenum 环境时,第一个标签前面出现不需要的 \parindent

使用 asparaenum 环境时,第一个标签前面出现不需要的 \parindent

使用asparaenum来自 的环境时paralist,有时\parindent第一个项目前面的 是不必要的。例如,如果asparaenum在启动环境后直接使用该环境proof,则会导致在\parindent“证明。”和第一个项目的标签之间出现额外的内容。

我如何设置环境其行为类似于paralist,但并未首先介绍这一点\parindent?具体来说,我希望找到一个基于paralistenumitem的解决方案,且不会破坏 的可选参数\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命令重新定义为不执行任何操作,因此我们不会再进行重置,并且该命令不会在嵌套列表中执行任何坏事。

相关内容