确保“description”或“itemize”

确保“description”或“itemize”

有没有办法确保宏只能在特定环境中使用description

我正在寻找类似\ensuremath宏的东西。

答案1

您可以修改环境的定义,以便将命令设置为有效或无效。对于环境description,您可以使用以下代码:

\documentclass{article}
\let\olddesc\description
\def\myrealcmd#1{\textbf{#1}}
\def\myfakecmd#1{#1}
\let\mycmd\myfakecmd
\def\description{\let\mycmd\myrealcmd\olddesc}
\begin{document}
  \noindent This is a \mycmd{test} outside of description.
  \begin{description}
    \item This is a \mycmd{test} inside of one description.
    \begin{description}
      \item This is a \mycmd{test} inside of two descriptions.
    \end{description}
    \item This is a \mycmd{test} after a nested description.
  \end{description}
  And a \mycmd{test} outside again.
\end{document}

结果如下:

修改描述环境

答案2

etoolbox包为环境提供了钩子;因此您可以定义一个“隐藏”宏,然后仅在选定的环境中激活它

\usepackage{etoolbox}
\makeatletter % protect the definition of \mymacro
\newcommand{\@mymacro}{whatever}
\AtBeginEnvironment{description}{\let\mymacro\@mymacro}
\makeatother

% now we help users
\newcommand{\mymacro}{%
  \PackageError{mypackage}
    {\protect\mymacro\space outside `description'}
    {You can use \protect\mymacro\space only inside `description'}%
}

您可以添加其他环境,并在不同的环境中提供不同的含义:

\usepackage{etoolbox}
\makeatletter % protect the definition of \mymacro
\newcommand{\description@mymacro}{whatever}
\AtBeginEnvironment{description}{\let\mymacro\description@mymacro}
\newcommand{\itemize@mymacro}{whatever}
\AtBeginEnvironment{itemize}{\let\mymacro\itemize@mymacro}
\makeatother

答案3

当前环境名称存储在其中,\@currenvir因此您可以测试它是什么description或其他什么,但嵌套环境会掩盖它。如果您需要允许您的宏 任何地方在描述中,即使在嵌套的表格或项目中,那么您也需要\@currenvir 在描述的开头将其保存到另一个宏中(明确地或通过修补定义,\description然后您可以测试这个本地宏而不会被嵌套环境覆盖。

相关内容