如何制作“私有”宏,即只能在文件内访问的宏?

如何制作“私有”宏,即只能在文件内访问的宏?

我制作了一个文件 (macro_file.tex),其中包含我在另一个文件 (my_document.tex) 中使用的自制宏。在 my_document.tex 中,我在序言中输入了 macro_file.tex,以便在写作时使用宏。macro_file.tex 中的一些命令应该不是可以在 my_document.tex 中访问,因为它们只能由 macro_file.tex 中的其他宏使用。

这(容易)实现吗?

答案1

您可以在 中使用特殊的 catcode macro_file.tex。例如,您可以\catcode`$=11\relax在文件顶部发出,并$在所有内部宏名称中用作字母。\catcode`$=3\relax当然是在文件末尾。

$然后,您就有了公共宏(其名称中未使用),它们使用私有宏($其名称中使用),并且需要采取刻意的行动才能直接访问这些私有宏。

(人们可以想象一些非常复杂的方案,其中你的私有宏将拒绝工作,除非设置了某些标志集,但总是可以人工重新创建验证,只需查看你的公共宏的作用即可)。

顺便说一句,请注意上面正是 TeX/LaTeX 对字母所做的操作@……但二十年后人们都知道了\makeatletter,而且这个技巧不再那么有效 ;-)

选择$可能会导致 TeX 感知编辑器中的语法高亮出现问题... LaTeX3 和其他软件包使用_:作为私人信件。您还可以使用^?例如,这不会让您的 TeX 感知编辑器处于混乱状态。


继续评论。如上所述,TeX/LaTeX 用作@私人信件。作为此的延续,您可以使用^^@用作私人信件。它是 ASCII 码 0 的 TeX 输入,在 LaTeX 中,默认情况下 NULL 字节(或^^@)无效并导致构建失败。

普通用户不会立即知道文件中的与私有宏名称中\catcode0=11\relax的使用有任何关系^^@

\catcode0=11\relax
....
\def\my^^@private^^@macro{...}
\newcommand\publicmacro{\my^^@private^^@macro...}
...
\catcode0=15\relax % default LaTeX's config

(您实际上应该重置\catcode0为其原始状态,而不是强制重置15,即“无效状态”)。

@因此,这种方式对用户来说比现有方式更具挑战性\makeatletter。在这里它不会有帮助。

相关内容