为每个新命令的实例创建 pdf 书签

为每个新命令的实例创建 pdf 书签

我正在编写一个文档,其中列出了一长串 UNIX shell 命令及其主要选项的说明。所有 UNIX 命令都是用\newcommandLaTeX 命令编写的,因此我可以轻松地一次性更改它们的格式。由于 UNIX 命令条目很多,我想为每个命令条目制作一个 PDF 书签,以便轻松浏览它们,为此,我使用了书签包。下面是一个例子:

\documentclass{article}
\usepackage{hyperref}
\usepackage{bookmark}
\newcommand{\cmd}[1]{\pdfbookmark[2]{#1}{unixcommand}\textcolor{blue}{\texttt{{\large #1}}}}
\begin{document}
\cmd{ls} → list the files
\begin{itemize}
  \item \texttt{-l} = foo bar
\end{itemize}
\end{document}

它运行得很好:我在 PDF 阅读器的内部索引中看到了所有命令书签,但每个命令都指向\cmd{}文档的第一个条目,而不是正确的条目。有什么办法可以解决这个问题吗?

答案1

hyperref文档(第 21 页)解释\pdfbookmark如下(重点是我的)

\pdfbookmark[<level>]{<text>}{<name>}<text>创建具有指定测试 [ ] 和给定级别 [ ](默认值为 0)的书签<level>。用作内部锚点的名称<name>(与级别结合使用)。因此名称必须是唯一的(类似于\label)。

根据问题中的定义,\cmd将发出\pdfbookmark[2]{#1}{unixcommand},这意味着<name>不是唯一的(它始终是unixcommand)。事实上,如果你查看.log使用两次的文档的文件\cmd,你会发现

pdfTeX warning (ext4):
destination with the same identifier (name{unixcommand.2})
has been already used, duplicate ignored

\AtBegShi@Output ...ipout \box \AtBeginShipoutBox 
                                                  \fi \fi 
l.15 \end{document}
                   ] (asddaasdasdasd.aux) )

(不幸的是,此警告的格式与其他 LaTeX 警告不同,我们人类更难发现,而且您的编辑器也可能无法发现)。

我们需要确保每个人都\cmd创建一个唯一的标签来链接回来。

\newcommand*{\cmd}[1]{%
  \pdfbookmark[2]{#1}{unixcommand:#1}%
  \textcolor{blue}{\texttt{{\large #1}}}}

可以。请注意,这仍然要求您\cmd对要提及的每个命令仅调用一次。

相关内容