LaTeX3 的 \GetIdInfo:其参数是如何自动填充的?

LaTeX3 的 \GetIdInfo:其参数是如何自动填充的?

l3bootstrap的文档说从字段\GetIdInfo中提取所有信息SVN。但我不知道这个字段从何而来。所以我想知道它\GetIdInfo是如何工作的,以及是否可以让它与其他 DVCS 一起工作,例如Git(可能与gitinfo2包一起工作)。

编辑: 我开始使用 LaTeX3 编写课程,并希望尽快获得最佳实践。因此,我查看了 LaTeX3.dtx文件,并看到l3doc.dtx类似以下内容:

\RequirePackage{expl3,xparse,calc}
\GetIdInfo$Id: l3doc.dtx 5353 2014-08-23 01:23:51Z bruno $
          {L3 Experimental documentation class}
[...]
\ProvidesFile{\ExplFileName.dtx}
  [\ExplFileDate\space v\ExplFileVersion\space\ExplFileDescription]
[...]
\ProvidesExplClass
  {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
[...]

我知道我可以手动替换两个$s 之间的信息,但是,由于\GetIdInfo能够从 SVN 字段中提取所有信息,我猜这已经自动完成了l3doc.dtx。因此我提出了这个问题。

答案1

这有两个部分:一个是技术部分,另一个是概念部分。我将首先讨论技术部分,然后再讨论整体思路。

从技术层面上讲,\GetIdInfo正如您在问题中所说的那样,旨在提取$标准 Subversion (SVN)Id块中两个标记之间的信息。这看起来像

\GetIdInfo$Id: l3galley.dtx 5423 2014-09-15 10:48:14Z joseph $

那么问题来了,数据是如何到达那里的:更多的是 Subversion 的东西,而不是 TeX 的东西(见http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html了解完整的 Subversion 详细信息)。每个要进行Id块扫描的文件都必须设置正确的属性

svn ps svn:keywords Id <filename>

因此在我的示例中,文件l3galley.dtx已设置此属性。启用此功能后,版本控制系统将扫描文件以查找

$Id<stuff>$

并将 替换<stuff>为当前签入的信息(文件名/修订/时间/日期/用户)。因此,Id最初只需 即可包含“空白”块$Id$

这里的关键点是,Id块只会更新,因为所涉及的各种文件都是使用 Subversion 进行管理的,并且只会更新这些文件。因此,在签入团队服务器的过程中,数据会添加到源文件中。

这让我们开始思考这些概念。对于团队来说,一个关键要求是所有文件始终携带“当前”版本数据。这里的想法是,与二进制文件不同,获取 LaTeX 源并提取代码以供直接使用相对容易,因此用户原则上可以使用任意版本的代码。因此,除非“实时”版本号需要在每个源文件中,以便它存在于编译中使用的所有文件中。(注意:这个要求早于我加入团队的时间,因此其背后的因素最好由其他人来解释。)

团队对版本控制的“严格”要求不一定适用于其他 LaTeX 程序员。此外,块的概念Id与“经典”版本控制系统(尤其是 Subverion)密切相关,它具有单一的全局版本系列和“权威”来源。Git 和 Mercurial 等分布式系统没有这一点。此外,它们并不真正鼓励 Subversion 用于块的搜索和替换概念Id。我知道 Git 背后的人真的不热衷于此,而对于 Mercurial,有一个扩展可以做到这一点,但它本身很复杂。(任何模拟 Subversion 概念的附加组件Id都不是“开箱即用”的,因此很容易被忽略:因此我不会选择走这条路。)

这些考虑的最终结果是,团队之外的用户没有真正强烈的理由使用\GetIdInfo。值得注意的是,个别团队成员的“个人”代码\GetIdInfo不一定使用。例如,在我自己的代码中,我使用更标准的<major>.<minor><patch>版本方案,文件日期手动更改,并作为构建上传到 CTAN 的过程的一部分进行设置。例如,在当前版本中,siunitx您会发现

\ProvidesExplPackage {siunitx} {2014/09/15} {2.6a}
  {A comprehensive (SI) units package}

而不是任何一条\GetIdInfo线。

请注意,虽然可以从分布式版本系统中获取版本数据,但在 LaTeX 环境中执行此操作的方法往往侧重于将数据包含在排版输出中,而不是源文件中。因此,它们可能不适合处理代码发布。

相关内容