具有正确对齐的“enumerate”标签且没有“enumitem”包的非零“\itemindent”

具有正确对齐的“enumerate”标签且没有“enumitem”包的非零“\itemindent”

我想缩进 中的列表项的第一行enumerate。为此,我定义了几种enumerate-like 环境(见下文)。

在 中enumerateI,我只使用非零\itemindent。然后所有标签都与标准 相比向右移动enumerate。“ZZZ”行上的“2.”和“(a)”之间的距离也是错误的。

在 中enumerateII,我添加\itemindent\labelsep。行“XXX”、“YYY”和“WWW”上的标签与 处于相同的位置enumerate,但行“ZZZ”上的“(a)”与行“YYY”和“WWW”上的“(a)”和“(b)”不垂直对齐。

在 中enumerateIII,如果为真,则将其设置\itemindent为 0。@noparlist现在,行“ZZZ”上“(a)”的对齐方式正确,但这次“WWW”不再缩进,“(b)”未与“(a)”垂直对齐。

[注:我测试过@noparlist,但我不明白这个开关与@inlabel和 有何不同@noparitem。LaTeX 的“source2e”对此相当模糊,因此如果有人可以澄清这些开关的含义,我将不胜感激。这应该是一个单独的问题吗?无论如何,在这里考虑的情况下,这没有什么区别。]

我也尝试修改“latex.ltx”\itemindent定义中包含的行,但没有成功。\@item

因此,我的问题是:如何获得与 enumerateII“XXX”、“YYY”和“WWW”行相同的对齐,以及与 enumerateIII“ZZZ”行相同的对齐?我知道以前已经有人问过类似的问题,但我希望自动的解决方案不是使用enumitem包。重新定义\@item是可以接受的,只要不是太大胆。

这是我的代码:

\documentclass{article}

\makeatletter

\newlength\standardlabelsep
\setlength\standardlabelsep{5pt}
\newlength\myitemindent
\setlength\myitemindent{\parindent}

\newenvironment{enumerateI}{%
  \begin{enumerate}%
    \setlength\itemindent{\myitemindent}%
    \setlength\labelsep{\standardlabelsep}%
  }{\end{enumerate}}

\newenvironment{enumerateII}{%
  \begin{enumerate}%
    \setlength\itemindent{\myitemindent}%
    \setlength\labelsep{\standardlabelsep}%
    \addtolength\labelsep{\itemindent}%
  }{\end{enumerate}}

\newenvironment{enumerateIII}{%
  \begin{enumerate}%
    \setlength\itemindent{\myitemindent}%
    \setlength\labelsep{\standardlabelsep}%
    \addtolength\labelsep{\myitemindent}%
    \if@noparlist
       \setlength\itemindent{0pt}%
    \fi
  }{\end{enumerate}}

\newcommand\XXX{XXX\dotfill\break xxx\dotfill\hfill}
\newcommand\YYY{YYY\dotfill\break yyy\dotfill\hfill}
\newcommand\ZZZ{ZZZ\dotfill\break zzz\dotfill\hfill}
\newcommand\WWW{WWW\dotfill\break www\dotfill\hfill}

\makeatother

\begin{document}

Standard \verb|enumerate|:
\begin{enumerate}
\item
  \XXX
  \begin{enumerate}
  \item
    \YYY
  \end{enumerate}
\item
  \begin{enumerate}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerate}
\end{enumerate}

\verb|enumerateI|:
\begin{enumerateI}
\item
  \XXX
  \begin{enumerateI}
  \item
    \YYY
  \end{enumerateI}
\item
  \begin{enumerateI}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerateI}
\end{enumerateI}

\verb|enumerateII|:
\begin{enumerateII}
\item
  \XXX
  \begin{enumerateII}
  \item
    \YYY
  \end{enumerateII}
\item
  \begin{enumerateII}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerateII}
\end{enumerateII}

\verb|enumerateIII|:
\begin{enumerateIII}
\item
  \XXX
  \begin{enumerateIII}
  \item
    \YYY
  \end{enumerateIII}
\item
  \begin{enumerateIII}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerateIII}
\end{enumerateIII}

\end{document}

答案1

我能找到的enumitem最好的答案是使用 enumitem 自定义枚举边距。不幸的是,每当后者是紧随其后的第一个东西时,都[before=\trickindent]必须手动在后面插入“ ”。另一个问题是,与为零的情况相比,标签水平移动。\begin{enumerate}\item\itemindent

如果没有enumitem,解决方案是修改\@item为下面的代码。修改后的版本 ,\modified@item与原始版本不同,因为\itemindent不是插入标签框内,而是插入到 的末尾\everypar(我希望这是正确的地方)。之后\let\@item\modified@itemenumerate和都itemize被修改了。由于“ \ifdim...”,这种情况仅在\itemindent为正时才会发生,因此description或等环境不会受到影响。这似乎有效,但如果和以外的其他环境被错误修改,verse可能会产生副作用。enumerateitemize

注意:我不会接受我的答案,以防有人提出更好的答案。

以下是代码:

\documentclass{article}

\makeatletter

\def\modified@item[#1]{%
  \if@noparitem
    \@donoparitem
  \else
    \if@inlabel
      \indent \par
    \fi
    \ifhmode
      \unskip\unskip \par
    \fi
    \if@newlist
      \if@nobreak
        \@nbitem
      \else
        \addpenalty\@beginparpenalty
        \addvspace\@topsep
        \addvspace{-\parskip}%
      \fi
    \else
      \addpenalty\@itempenalty
      \addvspace\itemsep
    \fi
    \global\@inlabeltrue
  \fi
  \everypar{%
    \@minipagefalse
    \global\@newlistfalse
    \if@inlabel
      \global\@inlabelfalse
      {\setbox\z@\lastbox
       \ifvoid\z@
         \kern-\itemindent
       \fi}%
      \box\@labels
      \penalty\z@
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \everypar{}%
    \fi
    \ifdim\itemindent>\z@\kern\itemindent\fi % Added.
  }%
  \if@noitemarg
    \@noitemargfalse
    \if@nmbrlist
      \refstepcounter\@listctr
    \fi
  \fi
  \sbox\@tempboxa{\makelabel{#1}}%
  \global\setbox\@labels\hbox{%
    \unhbox\@labels
    \ifdim\itemindent>\z@\else\hskip \itemindent\fi % Original without `\ifdim`.
    \hskip -\labelwidth
    \hskip -\labelsep
    \ifdim \wd\@tempboxa >\labelwidth
      \box\@tempboxa
    \else
      \hbox to\labelwidth {\unhbox\@tempboxa}%
    \fi
    \hskip \labelsep}%    
  \ignorespaces}

\newlength\standardlabelsep
\setlength\standardlabelsep{5pt}
\newlength\myitemindent
\setlength\myitemindent{\parindent}

\newenvironment{enumerateI}{%
  \begin{enumerate}%
    \setlength\itemindent{\myitemindent}%
    \setlength\labelsep{\standardlabelsep}%
  }{\end{enumerate}}

\newcommand\XXX{XXX\dotfill\break xxx\dotfill\hfill}
\newcommand\YYY{YYY\dotfill\break yyy\dotfill\hfill}
\newcommand\ZZZ{ZZZ\dotfill\break zzz\dotfill\hfill}
\newcommand\WWW{WWW\dotfill\break www\dotfill\hfill}

\makeatother

\begin{document}

\verb|enumerate| with the original \verb|\@item|:
\begin{enumerate}
\item
  \XXX
  \begin{enumerate}
  \item
    \YYY
  \end{enumerate}
\item
  \begin{enumerate}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerate}
\end{enumerate}

\verb|enumerateI| with the original \verb|\@item|:
\begin{enumerateI}
\item
  \XXX
  \begin{enumerateI}
  \item
    \YYY
  \end{enumerateI}
\item
  \begin{enumerateI}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerateI}
\end{enumerateI}

\verb|description| with the original \verb|\@item|:
\begin{description}
\item[AAA.]
  \XXX
  \begin{description}
  \item[BBB.]
    \YYY
  \end{description}
\item[CCC.]
  \begin{description}
  \item[DDD.]
    \ZZZ
  \item[EEE.]
    \WWW
  \end{description}
\end{description}

\makeatletter
\let\@item\modified@item
\makeatother

\verb|enumerate| with the modified \verb|\@item|:
\begin{enumerate}
\item
  \XXX
  \begin{enumerate}
  \item
    \YYY
  \end{enumerate}
\item
  \begin{enumerate}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerate}
\end{enumerate}

\verb|enumerateI| with the modified \verb|\@item|:
\begin{enumerateI}
\item
  \XXX
  \begin{enumerateI}
  \item
    \YYY
  \end{enumerateI}
\item
  \begin{enumerateI}
  \item
    \ZZZ
  \item
    \WWW
  \end{enumerateI}
\end{enumerateI}

\verb|description| with the modified \verb|\@item|:
\begin{description}
\item[AAA.]
  \XXX
  \begin{description}
  \item[BBB.]
    \YYY
  \end{description}
\item[CCC.]
  \begin{description}
  \item[DDD.]
    \ZZZ
  \item[EEE.]
    \WWW
  \end{description}
\end{description}

\end{document}

相关内容