将 \item 替换为 \MyItem,以便用 mdframed 框住每个列表成员

将 \item 替换为 \MyItem,以便用 mdframed 框住每个列表成员

因为有人指出,重新定义\item可能会很危险`mdframed` 和 `\item` 之间奇怪的交互,我想知道这个解决方案是否会出现问题。

我的目标是替换:

\begin{enumerate}[label={(\alph*)}]
    \MyItem \TextA
    \MyItem \TextB
\end{enumerate}

在此处输入图片描述

(即,只有环境名称被改变):

\begin{MyEnumerate}[label={(\alph*)}]
    \MyItem \TextA
    \MyItem \TextB
\end{MyEnumerate}

获得mdframe每个项目的周围:

在此处输入图片描述

下面的解决方法似乎可行,至少对于这个测试用例来说是这样。那么,这种使用\MyItem而不是 的方式是否\item存在隐藏的危险,而这些危险在这个测试用例中并不明显。

笔记:

代码:

\documentclass{article}
\usepackage{etoolbox}% for toggles
\usepackage{enumitem}
\usepackage{mdframed}

\newcommand{\TextA}{%
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
        Sed accumsan hendrerit velit, vitae ultrices sapien porta nec.  
}%
\newcommand{\TextB}{%
        Duis blandit tempus placerat. 
        Nulla vitae erat ante. Nulla facilisi. 
        Aliquam tristique interdum suscipit. 
        Duis posuere orci vel velit suscipit in porttitor purus eleifend. 
}%


\newcommand{\MyItem}{\item}

\newtoggle{FirstItem}%
\toggletrue{FirstItem}%
\newenvironment{MyEnumerate}[1][]{%
    \renewcommand{\MyItem}{%
        \iftoggle{FirstItem}{%
            \global\togglefalse{FirstItem}
            %--------- start new frame
            \begin{mdframed}[skipbelow=2pt]%
            \begin{enumerate}[#1,series=MySeries]%
        }{%
            \end{enumerate}%
            \end{mdframed}%
            %--------- end previous frame and start new one
            \begin{mdframed}[skipbelow=2pt]%
            \begin{enumerate}[#1,resume*=MySeries]%
        }%
        \item%
    }%
}{%
    \end{enumerate}%
    \end{mdframed}% --------- end last frame
    \global\toggletrue{FirstItem}%
}%

\begin{document}\noindent
\textbf{enumerate:}
\begin{enumerate}[label={(\alph*)}]
    \MyItem \TextA
    \MyItem \TextB
\end{enumerate}
%
\medskip
\textbf{MyEnumerate:}
\begin{MyEnumerate}[label={(\alph*)}]
    \MyItem \TextA
    \MyItem \TextB
\end{MyEnumerate}
\end{document}

答案1

这个 cw 是为了减少未解答的问题

在我看来,你的代码运行良好。

相关内容