我正在对 REVTeX 的内部结构(更具体地说是它的组件 ltxfront 包)进行修补,目的是编写一个包来处理作者 ORCID iD,并且我想了解正在使用的数据结构如何工作,以便我可以复制它们。
我对变量 (?) 特别困惑\@author
,它似乎是大多数操作发生的地方。据我所知,包代码与此数据结构交互的关键位置是:
功能
\@author@init
\def\@author@init{% \let\@author\@author@cleared \@booleanfalse\collaboration@sw }%
...似乎使用重置它
\@author@cleared
,\def\@author@cleared{{}{}{}}%
该
\@author@def
命令似乎初始化\@author
为作者姓名和空白预告片:\def\@author@def#1#2{% \frontmatterverbose@sw{\typeout{\string\author\space\string\collaboration}}{}% \move@AU\move@AF\move@AUAF \let\@AF@join\@author@join #1% \def\@author{{#2}{}}% }%
该
\@author@join
函数似乎将数据附加到其中:\def\@author@join@#1#2#3{% \def\@author{{#1}{\@join{\@separator}{#2}{#3}}}% }% \def\@author@join{\expandafter\@author@join@\@author}%
然后在
\email
处理过程中被调用:\newcommand*\email[1][]{\begingroup\sanitize@url\@email{#1}}% \def\@email#1#2{% \endgroup \@AF@join{#1\href{mailto:#2}{#2}}% }%
作者的具体输出似乎是由
\doauthor
函数编写的\def\doauthor#1#2#3{% \ignorespaces#1\unskip\@listcomma \begingroup #3% \@if@empty{#2}{\endgroup{}{}}{\endgroup{\comma@space}{}\frontmatter@footnote{#2}}% \space \@listand }%
\@author@present@script
然后在上标地址变体中调用它\def\@author@present@script#1#2#3{% \begingroup \gdef\comma@space{\textsuperscript{,\,}}% \doauthor{#2}{#3}{\@affil@present@script}% \endgroup \advance\@tempcnta\m@ne }%
以及
\@author@present@group
组地址变体\def\@author@present@group#1#2#3{% \gdef\comma@space{\gdef\comma@space{\textsuperscript{,\,}}}% \doauthor{#2}{#3}{\@affil@present@group}% \advance\@tempcnta\m@ne }%
这两个似乎都是 的
\@author@present
别名\AU@opr
:\def\frontmatter@author@produce@script{% \begingroup \let\@author@present\@author@present@script %[...] \def\AU@opr{\@author@count\@tempcnta}% %[...] \begingroup %[...] \let\AU@opr \@author@present %[...] \@AAC@list %%% maybe this is the key operative part? %[...] \endgroup %[...] \endgroup }%
无论如何,这让我想到了我的问题:
什么是
\@author
?它是变量吗?它是命令吗?它是宏吗?它会计算单个标记吗?它是一系列标记吗?经过进一步思考后,我明白它“只是”一个宏,但我发现它非常难以捉摸——它的值似乎会为每个作者重置,而且我很难找到它保留其值的地方。
的值的预期结构是什么? -delimited 元素
\@author
的数量至少存在一些轻微的冲突:似乎使用将其设置为,但使用仅带有两个元素。我猜后者是正确的版本,第一个包含作者姓名,第二个包含要作为脚注的电子邮件/感谢/等?{}
\@author@init
\@author@cleared
{}{}{}
\@author@def
\def\@author{{#2}{}}
{}
如何访问 的值
\@author
?如何将其打印到日志文件中以供调试?如何访问其值以将其打印到文档中?edited的值如何?我猜想这和in
\@author
有很大关系,但细节仍然不太清楚。\expandafter
\@author@join
的输入参数是什么
\@author@present
?定义\@author@present@script#1#2#3
只是表明有三个参数,但没有具体说明它们是什么,我很难理解包如何将的值拉\@author
入此调用。如果我尝试将其追溯到输出过程中调用它的位置,它就会迷失在 的不同版本的海洋中\AU@opr
,它似乎根据出现的位置扮演着多种不同的角色。
谢谢您的耐心等待!我正在尝试复制一个并行数据结构来处理 ORCID iD,因此非常欢迎您提供任何说明。
编辑:我曾尝试联系 REVTeX 的维护人员;似乎没有专门负责的开发人员,但我收到了 APS CIO 的回复。看来 REVTeX 可能会在中期某个时间点发布到 GitHub 上,届时可能会提交添加此功能的拉取请求。
与此同时,我已经按照我的设想制作了一个功能原型(可在 GitHub 上获取ORCIDinREVTeX 包)。此代码可能适合进一步分发(?),但我认为这不是一个好的解决方案,因为它将渲染的 iD 图标附加到作者文本中(即在 的第一个元素的末尾\@author
)。对我来说,一个可持续的长期解决方案将涉及单独的数据结构或\@author
仅包含数字 iD 的附加元素,实际渲染将推迟到\doauthor
。
因此,我想保持这个问题的开放性——我想了解现有数据结构的工作细节,目的是帮助将来编写一个扩展版本。