在自定义 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{...}{...}
我知道这可能不是最好的设计。我只是想确保我不能使用\myMacro
outsite 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}