有没有办法确保宏只能在特定环境中使用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
然后您可以测试这个本地宏而不会被嵌套环境覆盖。