将宏限制在某个环境中

将宏限制在某个环境中

在自定义 LaTeX/XeLaTeX 方面,我是个菜鸟。我想知道是否有办法将宏的使用限制在特定环境中。

考虑以下宏和环境:

\newcommand\myMacro[2]{#1 ... #2}
\newenvironment{myEnv}{...}{...}

我想要以下内容:

\begin{myEnv}
  % The following two calls to \myMacro are valid.
  \myMacro{...}{...} .... \myMacro{...}{...}
\end{myEnv}
% This one should not be valid and throw an error.
\myMacro{...}{...}

我知道这可能不是最好的设计。我只是想确保我不能使用\myMacrooutsite of myEnv

答案1

环境内的所有定义都是局部的,因此您只需在环境开始时定义宏即可。#执行此操作时,您需要将 all 重复:

\newenvironment{myEnv}{%
  \newcommand\myMacro[2]{##1 ... ##2}%
}{...}

另一种方法是在环境之外定义具有不同名称的宏,然后使用 将其复制到正式名称\let。此类内部宏通常@在其名称中使用,以便用户不会意外定义具有相同名称的宏。

\makeatletter 
\newcommand\my@Macro[2]{#1 ... #2}
\newenvironment{myEnv}{%
    \let\myMacro\my@Macro
}{...}
\makeatother

答案2

你也可以写:

\def\my@private@macro{code}

在序言中,然后,当你定义环境时:

\newenvironment{myenv}{\let\mymacro\my@private@macro + begin env code}{end env code}

相关内容