有人能向我解释一下为什么在这个 cls 文件中 `\def` 与 @ 一起使用吗?

有人能向我解释一下为什么在这个 cls 文件中 `\def` 与 @ 一起使用吗?

最近,我发现了一个CV模板类这里在 GitHub 上

文件中awesome-cv.cls有一些定义令我困惑,例如:

% Define writer's name
% Usage: \name{<firstname>}{<lastname>}
% Usage: \firstname{<firstname>}
% Usage: \lastname{<lastname>}
% Usage: \familyname{<familyname>}
\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
\newcommand*{\firstname}[1]{\def\@firstname{#1}}
\newcommand*{\lastname}[1]{\def\@lastname{#1}}
\newcommand*{\familyname}[1]{\def\@lastname{#1}}
\def\@familyname{\@lastname}

谁能向我解释为什么这里使用@符号?

更新

我发现几小时内几分钟,这可能会有所帮助。 在此处输入图片描述

答案1

因为 被设计为某些包或文档类的内部宏,最终用户不应该知道/使用/重写。也就是说,最终用户应该/可以\firstname在 中使用main.tex,但不能\@firstname,因为 @ (at) 是一个特殊字符(如&%等),通常不能在控制序列中使用,除非您制作at普通字母(\makeatletter)并且直到您不制作at其他类型的特殊字符(\makeatother)。这是通过更改 catcodes 来实现的(请参阅 \makeatletter 和 \makeatother 起什么作用?)。此站点中有很多使用 修复软件包错误或更改某些类的默认行为的示例\makeatletter (a lot of code with many @) \makeatother,尽管理想情况下最终用户不应该看到这些内容,即使这是他们自己的补丁,因为最好将代码隐藏在某个 .sty 或 .cls 文件中。

答案2

stycls文件中,字母@发生变化(即所谓的catcode),并且可以在宏名称中使用它。在 中\def\@firstname\@firstname是宏的名称,它将在指令中定义。

相关内容