情况

情况

我想在我的 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使用桌面版 Adob​​e 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 的回答了解更多信息。

相关内容