\makeatletter
\providecommand*{\input@path}{}
\g@addto@macro\input@path{{./level1//}{./level1/level2//}{./level2//}}
\makeatother
我明白:
\makeatletter
\makeatother
只是重新定义宏或者其他东西所必需的。
\providecommand
仅获取当前宏input@path
并将其清除。
\g@addto@macro
我不完全明白这是什么意思。
{./level1//}{./level1/level2//}{./level2//}}
也不是这个。它是否告诉输入路径这些都是可以直接调用的目录?
答案1
您对各种命令的功能提供了几种解释。
\makeatletter
并且\makeatother
只是重新定义宏或者其他东西所必需的。
不完全是。默认情况下,@
不允许该字符出现在 TeX 或 LaTeX 宏的名称中;相反,有效的多字符宏名称必须仅由大写和小写字母组成,或者更准确地说,由类别代码为“字母”的字符组成。(默认情况下,类别代码为“字母”的字符只有大写和小写字母,您猜对了。)该指令\makeatletter
将类别代码@
从“其他”更改为“字母”,使在多字符宏名称中使用该@
字符在语法上合法。
为什么要执行这些步骤?由于目前主要的历史原因,LaTeX 内部命令通常(但不完全)使用一个或多个@
字符;这可能使“普通”用户意外执行它们的可能性大大降低。\makeatletter
让您克服这个(诚然不是很高)的障碍,并\makeatother
恢复默认的 catcode @
。
\providecommand
仅获取当前宏\input@path
并将其清除。
不!(你可能想到了\renewcommand{<some existing command>}{}
。)\providecommand
就像\newcommand
如果第一个参数不是有效的宏名称一样,并且它确实没有什么如果该名称的宏已经存在。
\providecommand*{\input@path}{}
是为了确保下一个操作说明,即如果尚未定义同名的宏,则,\g@addto@macro\input@path{{./level1//}{./level1/level2//}{./level2//}}
不会崩溃。\input@path
最后,让我们谈谈
\g@addto@macro\input@path{{./level1//}{./level1/level2//}{./level2//}}
宏\g@addto@macro
——请注意两个 [2!]@
字符——是一个低级 LaTeX 内核命令,它接受两个参数:第一个是现有宏的名称(此处:)\input@path
;第二个是要附加到第一个参数中命名的宏的一些附加材料。
我们假设该宏\input@path
为空(因为它是由前面的\providecommand
指令创建的)或包含语法有效的路径。该\g@addto@macro
指令附加
{./level1//}{./level1/level2//}{./level2//}
到该宏。
不知道您从哪里获得此代码片段或它应该做什么,恐怕我无法在解释或解释方面添加任何内容。