枚举中第一个项之前的令人讨厌的空格,它启动了一个定理

枚举中第一个项之前的令人讨厌的空格,它启动了一个定理

请考虑以下示例:

\documentclass{article}
\newtheorem{Theorem}{Theorem}
\begin{document}
\begin{Theorem}
On the other hand, this one has only one claim.
\end{Theorem}
\begin{Theorem}
\begin{enumerate}
\item First claim
\item Second claim
\end{enumerate}
\end{Theorem}
\end{document}

排版结果如下:

在此处输入图片描述

请注意,第二个定理的列表中的第一个项目之前有额外的水平空间。

有什么合理的方法可以摆脱这种困境吗?

理想情况下,该解决方案将与amsthmthmtools、一起发挥作用enumitem

注意:这与在定理环境中是否可以跳过第一行?但不完全相同。

答案1

使用该包的解决方案的两种变体enumitem。在第一种情况下,enumerate使用了两个环境;第一个使用 leftamargin=* 来抑制不需要的水平空间;第二个enumerate使用resume来保留编号但保留 的标准值\leftmargin;两个环境之间的垂直间距也得到了纠正。在第二种情况下,也使用了 选项leftmargin=*,但这次只使用了一个enumerate环境,因此将删除所有项目的水平空间。

\documentclass{article}
\usepackage{enumitem}

\newtheorem{Theorem}{Theorem}

\begin{document}

\begin{Theorem}
   On the other hand, this one has only one claim.
\end{Theorem}

\begin{Theorem}
  \begin{enumerate}[leftmargin=*]
    \item First claim
  \end{enumerate}\vspace*{-2\partopsep}
  \begin{enumerate}[resume]
    \item Second claim
  \end{enumerate}
\end{Theorem}

\begin{Theorem}
   On the other hand, this one has only one claim.
\end{Theorem}

\begin{Theorem}
  \begin{enumerate}[leftmargin=*]
    \item First claim
    \item Second claim
  \end{enumerate}
\end{Theorem}

\end{document}

结果:

答案2

你可以使用一个\@labels技巧(例如Phil Hirschhorn 对“避免在枚举开始时换行”的回答)结果如下:

代码结果图像

有两种方法可以使用它。第一种是手动将\thmenumhspace后置放\begin{enumerate}在定理中:

\documentclass{article}
%\usepackage{amsthm,enumitem,thmtools}% works with or without
\newtheorem{Theorem}{Theorem}
\makeatletter
\newlength{\@thlabel@width}%
\newcommand{\thmenumhspace}{\settowidth{\@thlabel@width}{\itshape1.}\sbox{\@labels}{\unhbox\@labels\hspace{\dimexpr-\leftmargin+\labelsep+\@thlabel@width-\itemindent}}}
\makeatother
\begin{document}
\begin{Theorem}
1. First claim 2. Second claim.
\end{Theorem}
\begin{Theorem}
\begin{enumerate}\thmenumhspace
\item First claim
\item Second claim
\end{enumerate}
\end{Theorem}
\end{document}

再多做一点工作,就可以实现自动化,希望没有任何副作用(这次,您需要 amsthm 才能使其正常工作):

\documentclass{article}
\usepackage{amsthm,enumitem,thmtools}% needs amsthm
\newtheorem{Theorem}{Theorem}
\makeatletter
\newcommand{\thmenumhspace}[1]{\sbox{\@labels}{\unhbox\@labels\hskip#1}}
\let\original@item\item
\newlength{\@thlabel@width}%
\newcommand{\RedefineItem}{%
  \settowidth{\@thlabel@width}{\itshape1.}%
  \def\item{\let\item\original@item\thmenumhspace{\dimexpr-\leftmargin+\labelsep+\@thlabel@width-\itemindent}\original@item}
}
\let\original@Theorem\Theorem
\def\Theorem{
   \@ifnextchar[{\Theorem@Opt}
                {\Theorem@NoOpt}
}
\def\Theorem@Opt[#1]{%
   \@ifnextchar\begin{\RedefineItem\original@Theorem[#1]}%
                     {\original@Theorem[#1]}%
}
\def\Theorem@NoOpt{%
   \@ifnextchar\begin{\RedefineItem\original@Theorem}%
                     {\original@Theorem}%
}
\makeatother
\begin{document}
\begin{Theorem}
1. First claim. 2. Second claim.
\end{Theorem}
\begin{Theorem}
\begin{enumerate}
  \item First claim
  \item Second claim
\end{enumerate}
\end{Theorem}
\begin{Theorem}
This one has two claims.
\begin{enumerate}
  \item First claim
  \item Second claim
\end{enumerate}
\end{Theorem}
\begin{Theorem}[Title]
\begin{enumerate}
  \item First claim
  \item Second claim
\end{enumerate}
\end{Theorem}
\begin{Theorem}[Title]
This one has two claims.
\begin{enumerate}
  \item First claim
  \item Second claim
\end{enumerate}
\end{Theorem}
\end{document}

答案3

您可以先进行一些\item如下操作:

\documentclass{article}
\newtheorem{Theorem}{Theorem}
\newcommand*\fixitem {\item[]%
  \refstepcounter{enumi}\hskip-\leftmargin\labelenumi\hskip\labelsep}
\begin{document}
\begin{Theorem}
On the other hand, this one has only one claim.
\end{Theorem}
\begin{Theorem}
\begin{enumerate}
\fixitem First claim
\item Second claim
\end{enumerate}
\end{Theorem}
\end{document}

结果是:

tex 运行的结果

答案4

这是一个非答案,其目的是指出某些提供的答案确实给出了定理中枚举项的正确边距缩进。

虽然我只展示了其中一种答案方法的来源和输出,但其他方法也给出了类似的、不受欢迎的缩进。

\documentclass{article}
%\usepackage{amsthm,thmtools}% works with or without

\usepackage{enumitem}

\newcommand{\sometext}{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis sem. Nullam nec mi et neque pharetra sollicitudin.}

\newtheorem{theorem}{Theorem}

\begin{document}

\begin{theorem}
  This is normal enumeration inside a theorem, which should be matched when no text precedes the enumeration:
  \begin{enumerate}
    \item \sometext
    \item \sometext
  \end{enumerate} 
\end{theorem}

Margination of the first item of next theorem does \emph{not} agree with the ``normal'' margination of the preceding Theorem 1.

\begin{theorem}\label{thm-2}
  \begin{enumerate}[leftmargin=*]
    \item \sometext
  \end{enumerate}\vspace*{-2\partopsep}
  \begin{enumerate}[resume]
    \item \sometext
  \end{enumerate}
\end{theorem}


Margination of \emph{neither} item of the next theorem agrees with the ``normal'' margination of Theorem 1.

\begin{theorem}
  \begin{enumerate}[leftmargin=*]
    \item \sometext
    \item \sometext
  \end{enumerate}
\end{theorem}

A theorem with no enumeration inside:

\begin{theorem}
   \sometext
\end{theorem}

\end{document}

现在查看输出中的项目的缩进,其中直接以枚举开头的定理与枚举之前有文本的定理的缩进不同:

当枚举紧跟定理标题时,缩进错误

问题变成:enumerate紧接着出现时\begin{theorem},会出现以下情况:

  • 消除“定理”和第一项编号之间的多余水平空格;然而
  • 保持与定理中相同的“正常”项目缩进,在enumerate?之前有一些文本

避免“定理”和第一项编号之间的额外水平空格

相关内容