假设我正在与其他人合作处理 LaTeX 文档。我定义了一堆命令别名(例如\true
for\top
和\false
for \bot
);它们的确切用途对于这个 TeX.SE 问题并不重要,但部分原因是为了让我们能够轻松使用“工作宏”,同时独立地微调底层的东西(例如,在数学和计算机科学中,表示两个布尔值的方式不同,也许我想稍后轻松更改这种风格决定)。此外,我认为某些命令不应该由其他人(或我)使用,因为它们可能已经过时、危险等。
防止用户直接调用某个命令或一组命令的最优雅方法是什么?我理解已加载的软件包可能仍然依赖它们,因此启动器可能类似于
\makeatletter
\let\hardtoinvoke@commandname\commandname
\renewcommand{\commandname}{}
\makeatother
在所有包加载完成后(确保@
用户无法轻易调用此宏)。有哪些注意事项?禁用某些命令以供“直接”使用的最干净的方法是什么?为了举例说明,假设我们想要对 0 参数宏(例如)以及\top
具有更复杂参数结构的宏(例如)执行此操作\raisebox
。可以很容易地将其推广到某种非常通用的\hidecommand
命令吗?
更新 1:此外,如果没有 -line \let
,其他人就真的无法使用该宏(是吗?)。
更新 2:\let
-\def
差异可能实际上会实现我想要的结果不可能的,因为对于\def
,将在使用时而不是定义时查找内容。因此,加载任何\def...\commandname...
在内部某处使用的包都会导致我无法\commandname
在不破坏内容的情况下禁用它,对吗?我之所以问这个问题,是因为可能存在巧妙的@
技巧(也许只有在环境之外调用时才会调用错误消息@
),但我觉得合适的解决方案可能并不容易。
答案1
简短的回答:你不能这样做。
较长的答案:实际上不可能检测诸如这样的宏\top
是直接在文件中使用还是通过另一个宏使用。(如果语法类似于\top@
或,\top!
那么就有可能测试以下字符的 catcode。
如果一个包已经定义\TopOrBot
了
\def\TopOrBot{\top/\bot}
那么无论您是\top
在加载包之前还是之后重新定义,\TopOrBot
都会使用您的新定义。
您唯一能做的就是重新定义位\top
以及\TopOrBot
引用的任何其他宏\top
。
答案2
使用
\def\setAllMyCommands{%
\def\foo{bar}%
...%
}
\AtBeginDocument{\setAllMyCommands}
然后用户的所有更改都将被您的原始定义覆盖。您无法真正为用户隐藏命令。如果他搜索定义,他会找到它。