revtex4 的 \@author 变量如何工作?

revtex4 的 \@author 变量如何工作?

我正在对 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

因此,我想保持这个问题的开放性——我想了解现有数据结构的工作细节,目的是帮助将来编写一个扩展版本。

相关内容