我想缩进 中的列表项的第一行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@item
,enumerate
和都itemize
被修改了。由于“ \ifdim
...”,这种情况仅在\itemindent
为正时才会发生,因此description
或等环境不会受到影响。这似乎有效,但如果和以外的其他环境被错误修改,verse
可能会产生副作用。enumerate
itemize
注意:我不会接受我的答案,以防有人提出更好的答案。
以下是代码:
\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}