最近,我发现了一个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
在sty
或cls
文件中,字母@
发生变化(即所谓的catcode
),并且可以在宏名称中使用它。在 中\def\@firstname
,\@firstname
是宏的名称,它将在指令中定义。