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
需要未修改的目标名称作为参数。这可以通过可扩展字符串测试(\pdfstrcmp
pdfTeX 或\strcmp
XeTeX 的,包 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
。