在以下 MWE 中
\documentclass[draft]{article}
\newenvironment{myitem}{\item}{}%
\begin{document}
\begin{enumerate}
\item \begin{enumerate}
\item Item 1
\item Item 2
\end{enumerate}
\end{enumerate}
\begin{enumerate}
\item \begin{enumerate}
\begin{myitem} Item 1 \end{myitem} % This is the only difference
\item Item 2
\end{enumerate}
\end{enumerate}
% even this works!!!!
\begin{enumerate}
\item \begin{enumerate}
\myitem Item 1 \endmyitem % This is the only difference
\item Item 2
\end{enumerate}
\end{enumerate}
\end{document}
第一部分的输出是正确的,但我的详细myitem
环境(应该只是复制\item
)的输出缺少第二行的数字。编辑:知道为什么会这样吗?请注意,如果我在外部添加任何文本\item
,一切都会按预期工作(内部枚举从新行开始)。
在我的实际用例中,我必须在每个项目的开始和结束时执行一些代码,这就是我采用环境的原因。
编辑:感谢您提出的其他解决方法。但我也非常想知道环境方法失败的原因。
编辑2:我发现我可以复制错误的行为。
\begin{enumerate}
\item \begin{enumerate}
\begingroup \item test 1 \endgroup
\item item 2
\end{enumerate}
\end{enumerate}
因此,很明显,环境正在围绕 启动组,这\item
就是问题所在。我想我可以按如下方式更改我的环境的定义:
\newenvironment{myitem}{\endgroup\item\begingroup}{}%
导致在外部创建组\item
,但随后我收到错误
\begin{enumerate} on input line 15 ended by \end{myitem}.
答案1
描述
我使用了另一种方法来获得你想要的东西。
\itemBeginCode
和中定义的代码在环境中的\itemEndCode
每个之前和之后执行。\myitem
myenumerate
结果
代码
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\itemBeginCode}{\emph{(start)}}
\newcommand{\itemEndCode}{\emph{(end)}}
\newtoggle{myfirstitem}
\newenvironment{myenumerate}{%
\toggletrue{myfirstitem}%
\begin{enumerate}%
}{%
\itemEndCode% for the last item
\end{enumerate}%
}
\newcommand{\myitem}{%
\iftoggle{myfirstitem}{}{\itemEndCode}% if not the first item
\item%
\togglefalse{myfirstitem}%
\itemBeginCode%
}
\begin{document}
\begin{enumerate}
\item
\begin{myenumerate}
\myitem Item 1
\myitem Item 2
\end{myenumerate}
\end{enumerate}
\end{document}
答案2
从我以前的一个问题中找到了一个解决方案问题。抱歉造成噪音。
我只需要像这样定义环境。
\makeatletter
\long\def\myitem{{\ifnum0=`}\fi\@myitem\@argend}%
\long\def\@myitem#1\@argend#2\end#3{%
\expandafter\ifstrequal\expandafter{#3}{myitem}%
{\ifnum0=`{\fi}\end{myitem}\@myrealitem{#1#2}}{\@myitem#1#2\end{#3}\@argend}}
\def\@myrealitem#1{\item #1}
\makeatother