`mdframed` 和 `\item` 之间奇怪的交互

`mdframed` 和 `\item` 之间奇怪的交互

我想理解(并找到解决方案)以下问题。首先,MWE:

\documentclass{article}
\usepackage{mdframed}
\usepackage{fancybox}


\newsavebox{\mcBox}

\newenvironment{monItemize}{
\renewcommand{\item}%
{\end{lrbox}%
\fbox{
\usebox{\mcBox}
}   \\\begin{lrbox}{\mcBox}}%
\begin{lrbox}{\mcBox}%
}
{\end{lrbox}
\fbox{%
\usebox{\mcBox}%
}%
}

\newcommand{\itemm}{}
\newenvironment{monItemizeMD}{
\renewcommand{\itemm}%
{\end{lrbox}%
\begin{mdframed}[userdefinedwidth=3cm]%
\usebox{\mcBox}
\end{mdframed}%
    \begin{lrbox}{\mcBox}}%
\begin{lrbox}{\mcBox}%
}
{\end{lrbox}
\begin{mdframed}[userdefinedwidth=3cm]%
\usebox{\mcBox}
\end{mdframed}%
}

\begin{document}


\begin{monItemize}
\item aaa
\item bbb
\end{monItemize}

\begin{monItemizeMD}
\itemm ccc
\itemm ddd
\end{monItemizeMD}

\end{document}

在环境中monItemize,我重新定义\item,将内容放在fbox

在环境中,我通过命令而不是 来monItemizeMD定义项目,并且内容位于 mdframed-Box 中而不是 中。\itemm\item\fbox

  1. 问题:如果我使用\itemin monItemizeMD(当然,在定义中和环境的实例中),则编译失败。为什么?
  2. 问题:一般来说,重新定义有多安全\item
  3. 问题:我是否仍可以使用 来解决问题 1 \item?因为我的问题是,在许多已经存在的文档中,我有一个\item重新定义的环境。在我的 documentclass 中,我想用\fboxmdframed 框替换 。

答案1

1)\item是一个垂直模式命令,它基本上开始一个新段落,但lrbox类似于\fbox水平\mbox(LR)模式构造,除非您首先嵌套 parbox 或 minipage 或类似的东西,否则不允许垂直材料。

2)正如前几天提到的使用 \trivlist 和 \list 定义环境LaTeX 到处都使用列表。例如,如果你重新定义,\item你就重新定义了center环境。verbatim更新特别是你也会重新定义 mdframed

3)我不太确定您想要解决的顶级要求是什么,您想要将枚举的每个项目装箱并允许在框内打破?

答案2

重新定义\item可能会带来危险且不可预测的结果,正如您所发现的。如果您只想\item用 3cm 的宽度框住文本,那么

\newsavebox{\mcBox}
\newif\ifstartmonItemize
\newenvironment{monItemize}
  {\startmonItemizetrue
   \renewcommand{\item}{%
     \ifstartmonItemize
       \startmonItemizefalse
     \else
       \end{lrbox}
       \noindent
       \framebox[3cm][l]{\usebox{\mcBox}}\\
     \fi
     \begin{lrbox}{\mcBox}\strut}%
  }
  {\end{lrbox}\noindent\framebox[3cm][l]{\usebox{\mcBox}}}

会做。

相关内容