为什么 nameref 包会删除 \label 中的结尾点以及如何在本地避免这种删除?

为什么 nameref 包会删除 \label 中的结尾点以及如何在本地避免这种删除?

所以,我正在破解与之相关的一些东西,在破解过程中,我发现在我的电脑手册nameref第 3 页的开头(日期为 2016/05/21)nameref

我们重新定义\label,以便它也将当前部分的名称写入.aux 文件;如果名字以点结尾,我们就删除它

我检查了最新文档namerefCTAN 中,这句话仍然存在。实际上,我不希望此功能对我自己的功能起作用,\newcounter因为它确实以点结尾。

所以我的问题是

  1. 为什么他们会这么做如果名字以点结尾,我们就删除它

  2. 有没有好的办法可以在本地破解它以了解\label结尾的点?为什么要在本地破解?我假设第一个问题有一个很好的理由,所以我不建议完全删除它。

  3. 实际上,我理解此功能是通过同一页面上的此定义实现的

    \def\NR@strip@period#1.\ltx@empty#2\@nil{#1}

    但是,我对它的用法感到很困惑,因为后面\def跟着三个连续的命令,而通常的命令看起来就像\def\newcommand<argument>\oldcommand。所以,有人能向我解释一下这行代码是如何工作的吗?或者给我一些参考。这样我就能自己弄清楚黑客行为了。

答案1

为什么这样?这都是很久以前的事了,但有些风格把标题当作一个句子,而且

介绍。
啦啦啦……

在生成的引用中,您希望它说“在简介中我们描述..永远不会“在简介中我们描述....”所以您需要 . 来。

\newcommand原始\def允许不同分隔参数以指定的标记结束。

如果你走的话

\def\zz#1.{the argument is #1}

然后\zz将把到第一个为止的所有内容作为.参数

\zz The Introduction.

会产生the argument is The Introduction 没有 . 的结果,所以这几乎就是我们想要的,除非章节标题没有 . 。这会产生一个低级错误,即参数永远不会结束,所以诀窍是使用如下形式

\def\zz#1.#2\relax{#1}

并始终提供.\relax

现在如果是那时的#1论点\section

\zz#1.\relax

可以称为

\zz The Introduction..\relax

现在我们得到 #1 是简介,#2 是。被丢弃

如果原文中没有 . 则调用为

\zz The Introduction.\relax

这里,#1 再次成为介绍,而 #2 则为空且未被使用。

\NR@strip@period是这个想法的一个稍微复杂的版本\zz

相关内容