我正在编写一个文档,其中列出了一长串 UNIX shell 命令及其主要选项的说明。所有 UNIX 命令都是用\newcommand
LaTeX 命令编写的,因此我可以轻松地一次性更改它们的格式。由于 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
对要提及的每个命令仅调用一次。