我制作了一个文件 (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
。在这里它不会有帮助。