我想在我的 PDF 中创建隐形的书签/锚点。我想要类似的东西\pdfbookmark
,但是带有一个不可见的参数。这个存在吗?
经过实验和阅读,我确定 PDF 有两种类型的锚点:
(从 PDF 查看器中的大纲角度进行的评论)
- 书签(可见
\pdfbookmark{bookmark}{hyperrefuid}
) - 命名目的地(不可见
\hypertarget{nameddestination}{bodytext}
)
看来 XeLaTeX 无法创建命名目的地,除非我做错了什么。XeTeX 3.14159265-2.6-0.99992 (TeX Live 2015/dev/Debian) 中按 hyperref 命名的目的地已损坏
我的意思是什么?我的意思是,当在 PDF 查看器中打开时,书签的文本不会显示在书签列表中,但当在类似 的浏览器中打开时,就会显示PDFedit
。
Adobe PDF 标准文档中指定 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf
hyperref
我尝试在该包的扩展名中搜索“隐藏”或“不可见” bookmark
,但没有找到任何结果。
情况
我有一个包含多种语言的 PDF parts
。
- 丹麦语 da
- 德国
- 希腊语 el
- 英语 en
- 西班牙语 es
- 意大利语
- 荷兰语 nl
- 挪威语(通用) 没有
- 葡萄牙语 pt
- 土耳其语 tr
如果程序配置为以德语运行,则应用程序将自动跳转到德语的开头。
执行
我想在每个的开头添加一个隐藏的书签 \ithinputlanguagefile
。我可以将其用作#1
书签文本。
% #1 = de
% #2 = German
% #3 = file
\newcommand{\ithinputlanguagefile}[3]{%
\bookmarksetupnext{bold,open=false} % setup bookmark
\newpage\pdfbookmark{#2}{bkm#1}%\pdfbookmark[level]{text}{internalNameId} from hyperref
\phantomsection % Necessary to correct link in Language Directory
\etoctoccontentsline{part}{#2}%
\setcounter{section}{0}% reset section so first sec in new lang starts at 1
\renewcommand*{\theHsection}{chX.\the\value{runningsectioncounter}} % Keeps hyperref happy (provides unique section numbers instead of using the section counter)
\input{#3}%input the language file
}
这样我的书签中就会出现一个语言名称列表。我还想使用不可见的书签,其“文本”类似于#1
本例中的文本,但在使用 pdf 查看器打开时在书签中不可见。
例子
我希望这个问题不需要一个简单的例子。我可以根据要求提供一个。
答案1
我提前为这个不成熟的回答道歉。我对此并不是 100% 确定,因为我对 PDF 规范不太了解。但是,Adobe Reader 能够跳转到文件内的“指定目标”,可能适合您正在寻找的内容。
在您的文档中添加\usepackage{hyperref}
您的序言和\hypertarget{destname}{}
需要的位置。
传统上,您可以使用以下方式打开文档:
acroread /a "nameddest=destname" doc.pdf
使用桌面版 Adobe Reader。Windows 10 的新应用形式已经改变了这种情况,但我认为访问它的方式仍然存在。
如果通过网络,链接到http://example.org/doc.pdf#nameddest=destname
也应按照定义的方式工作RFC3778 第 3 节。
答案2
可能的解决方法
笔记:这些不是直接针对所提问题的解决方案,但是提供了实现相同结果的替代方法。
这些方法不一定适合您的需要,但至少可以提供一些“值得思考的东西”。
方法 1:XML 页面索引
如果程序配置为以德语运行,则应用程序将自动跳转到德语的开头。
如上所述,此文件由程序打开。因此,可以通过编程方式访问该文件。
可以使用如下代码来实现。
\documentclass[10pt,a4paper,final]{article}
\usepackage{hyperref}
\newcommand{\openlangxmlfile}{%
\newwrite\langindexxml%
\immediate\openout\langindexxml=langindex.xml %
\immediate\write\langindexxml{<?xml version="1.0"?>}%
\immediate\write\langindexxml{<toc>}}
\newcommand{\writelangxmlfile}[2]{%
\immediate\write\langindexxml{%
<language name="#1" abbr="#2">\thepage</language>%
}}
\newcommand{\closelangxmlfile}{%
\immediate\write\langindexxml{</toc>}%
\immediate\closeout\langindexxml}
\begin{document}
\openlangxmlfile
\section{da: Danish}
\newpage
\writelangxmlfile{Danish}{da}
\section{de: German}
\newpage
\writelangxmlfile{German}{de}
\section{el: Greek}
\newpage
\writelangxmlfile{Greek}{el}
\section{en: English}
\newpage
\writelangxmlfile{English}{en}
\section{es: Spanish}
\newpage
\writelangxmlfile{Spanish}{es}
\closelangxmlfile
\end{document}
这将生成一个 XML 文件(如下所示),可以解析页码,然后与 PDF 打开参数的“page=X”一起使用。
<?xml version="1.0"?>
<toc>
<language name="Danish" abbr="da">2</language>
<language name="German" abbr="de">3</language>
<language name="Greek" abbr="el">4</language>
<language name="English" abbr="en">5</language>
<language name="Spanish" abbr="es">6</language>
</toc>
方法 2:单独文件
这是最简单、最有效的解决方法。每个 README 或文档都保存为语言包/文件夹中的单独文件。然后程序可以在同一位置找到所有相应的文件。
例如,在您的程序中,所有英文文件都在 中.\lang\en\
,所有德文文件都在 中.\lang\de
。
为了自动化此操作,您可以使用以下命令调用编译器en.body.tex
,其中ge.body.tex
、等是文件的内容。
for %i in (*.body.tex) do pdflatex -jobname=%i main.tex
您的main.tex
文件看起来如下:
\documentclass[...]{article}
% common preamble
\begin{document}
% common title info
\input \jobname.body.tex
% common end notes
\end{document}
参见 Martin 的回答了解更多信息。