更改 namedst 默认名称

更改 namedst 默认名称

Adobe 定义了一些参数,允许您使用命令或 URL 打开 PDF 文档,这些命令或 URL 明确指定要显示的内容(命名目标或特定页面)以及如何显示它(使用特定视图、滚动条、书签、注释或突出显示等特性)。

我的问题是:

有没有办法更改 LyX 文档生成的 pdf 命名?默认参数是 Chapter.1、Chapter.2、Chapter.3...Section.1.1、Section.1.2、Section.3.2...

例如,在浏览器中,在指定位置打开 pdf 文档(由 lyx 或 tex 生成):

file:///C:/teste1.pdf#nameddest=chapter.4
file:///C:/teste1.pdf#nameddest=section.2.4

我需要更改这些默认名称,因为文档一直在更新,因此对章节和部分的引用的周转率很高。

也许是一个更新命令,像\renewcommand{\section}{}

答案1

链接和目的地由 hyperref 包添加。由于目的地需要不同的名称,因此名称由计数器名称和计数器值组成。

但拥有一个符号目标名称确实是一个有用的功能。因此,我在 hyperref 2012/07/28 v6.82u 中实现了这样的功能。它通过包选项启用destlabel。后来无法使用启用它\hypersetup

使用选项,锚点设置后的destlabel第一个名称\label用于设置下次 LaTeX 运行中使用的目标名称。

为了更好地理解 hyperref 中的目标名称内容,我在 hyperref 手册中写了一个部分,为了方便起见,我在此引用它。

目的地名称选项

目标名称(也称为锚点、目标或链接名称)是用于标识文档页面位置的内部名称。例如,它们用于内部文档链接或书签的链接目标中。

通常会在调用时设置锚点\refstepcounter。因此有一个计数器名称和值。两者都用于构造目标名称。默认情况下,计数器值跟在计数器名称后面,用点分隔。第四章的示例:

chapter.4

此方案由以下人员使用:

  • \autoref根据计数器名称显示参考的描述标签。
  • \hyperpage被索引用来获取页面链接。页面锚点设置 ( pageanchor) 不得关闭。

目标名称的唯一性非常重要,因为两个目标不能共享相同的名称。计数器值\the<counter>对于计数器来说并不总是唯一的。例如,表格和图形可以在章节内进行编号,而无需在编号中包含章节号。因此,hyperref 引入了\theH<counter> 允许唯一的计数器值而不会弄乱计数器编号的外观。例如,第三章中第二个表格的编号可能打印为2,即的结果\thetable。但目标名称是唯一的,因为在本例中table.2.4它使用了\theHtable给出的。2.4

通常用户不需要设置\theH<counter>。标准案例(章节、\dots)的默认值已提供。加载 hyperref 后, 如果使用 amsmath 包的 或 ,则具有父计数器的新计数器也会\theH<counter>自动定义。\newcounter\@addtoreset\numberwithin

通常,可以通过适当定义 来解决目标名称重复的问题\theH<counter>。如果 hypertexnames禁用选项,则使用唯一的人工数字代替计数器值。对于页面锚点,使用绝对页面锚点。使用选项时,plainpages 页面锚点使用阿拉伯语形式。在后两种情况下,\hyperpage 索引链接都会受到影响,可能无法正常工作。

如果未编号的实体获得锚点(章节、部分等的星号形式)或被使用,则使用\phantomsection虚拟计数器名称和人工唯一编号。section*

如果最终的 PDF 文件要与另一个文件合并,则目标名称可能会发生冲突,因为两个文档可能包含chapter.1或。此外,hyperref在文档开头page.1设置带有名称的锚点。这可以通过重新定义 来解决。包 hyperref 每次调用此宏时,它都会使用目标名称。宏必须是可扩展的,并且期望目标名称作为唯一参数。例如,重新定义宏以向所有目标名称添加前缀:Doc-Start\HyperDestNameFilter

\renewcommand*{\HyperDestNameFilter}[1]{\jobname-#1}

在文档中,docA目的地名称chapter.2 变成docA-chapter.2

目标名称也可以在 URI 外部使用(如果驱动程序没有删除或更改它们),例如:

http://somewhere/path/file.pdf#nameddest=chapter.4

但是使用数字似乎不太好。如果之前添加了另一个章节,数字就会改变。但是,将目标的新名称传递给通常深藏在内部的锚点设置过程非常困难。 label锚点设置后的第一个名称似乎是一个很好的近似值:

\section{Introduction}
\label{intro}

选项destlabel检查每个\label,是否有新的活动目标名称,并用标签名称替换目标名称。由于目标名称已经因锚点设置而被使用,因此新名称将记录在文件中.aux 并在后续的 LaTeX 运行中使用。重命名是通过重新定义 来完成的\HyperDestNameFilter。这会使旧的目标名称保持不变(例如,它们是 所需要的\autoref)。此重新定义也可用作\HyperDestLabelReplace,因此自己的重新定义可以使用它。以下示例还为 添加了前缀全部目的地名称:

\renewcommand*{\HyperDestNameFilter}[1]{%
  \jobname-\HyperDestLabelReplace{#1}%
}

另一种情况是只有前缀文件没有对应的前缀 \label,这更复杂,因为\HyperDestLabelReplace需要未修改的目标名称作为参数。这可以通过可扩展字符串测试(\pdfstrcmppdfTeX 或\strcmpXeTeX 的,包 pdftexcmds 也支持 LuaTeX)来解决:

\usepackage{pdftexcmds}
\makeatletter
\renewcommand*{\HyperDestNameFilter}[1]{%
  \ifcase\pdf@strcmp{#1}{\HyperDestLabelReplace{#1}} %
    \jobname-#1%
  \else
    \HyperDestLabelReplace{#1}%
  \fi
}
\makeatother

destlabel如果目的地尚未重命名,则可以使用选项目的地手动命名:

\HyperDestRename{<destination>}{<newname>}

提示:锚点也可以通过 来命名和设置\hypertarget

相关内容