如何在不禁用命令的情况下阻止用户调用该命令?

如何在不禁用命令的情况下阻止用户调用该命令?

假设我正在与其他人合作处理 LaTeX 文档。我定义了一堆命令别名(例如\truefor\top\falsefor \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}

然后用户的所有更改都将被您的原始定义覆盖。您无法真正为用户隐藏命令。如果他搜索定义,他会找到它。

相关内容