我刚刚注意到一些奇怪的事情。请看以下示例
\documentclass{article}
\usepackage{hyperref}
\hypersetup{hidelinks}
\begin{document}
\tableofcontents
\addcontentsline{toc}{section}{``xxx''}
\addcontentsline{toc}{section}{Here---and \emph{there}}
\addcontentsline{toc}{section}{1--2 vs. 1-{}-2}
\addcontentsline{toc}{section}{\LaTeX}
\end{document}
得到以下 PDF
当然,打印的内容是完美的。PDF 书签(左侧)实际上也几乎是正确的:各种 LaTeX 细节都转换为有意义的内容(格式命令被删除,\LaTeX
变为 LaTeX,双连字符和三连字符正确地变为 en- 和 em-破折号等)。当我开发这个示例时,我一开始很惊讶,因为我刚刚注意到开和关双引号被逐字保留为单(反)引号对,因此我认为所有这些示例都是错误的。但不,只有双引号是 LaTeX 输入未转换为印刷正确的 PDF 书签的一个例子——或者,至少,是我想测试的唯一一个……
有什么办法吗?我曾想过克隆 hyperref.sty 的定义,\addcontentsline
并在使用时使用\StrSubstitute
fromxstring
将单引号对替换为双引号,但这看起来是一个相当笨拙和脆弱的解决方案。有更好的主意吗?\Hy@writebookmark
答案1
基于关于此 hyperref 问题的讨论Ulrike Fischer 在评论中提到她的代码在另一篇文章中,以下是我认为最有效的方法:
\documentclass[german,french,english]{article}
\usepackage[autostyle=true]{csquotes}
\usepackage{babel}
\usepackage{hyperref}
\hypersetup{hidelinks}
% you need the following only if you want the quotes in bookmarks to
% reflect the specific style used in the document, otherwise they are
% simple plain quotes
\makeatletter
\DeclarePlainStyle{\csq@thequote@oopen}{\csq@thequote@oclose}{\csq@thequote@iopen}{\csq@thequote@iclose}
\pdfstringdefDisableCommands{\csq@resetstyle}
\makeatletter
\begin{document}
\tableofcontents
\addcontentsline{toc}{section}{``Plain \LaTeX\ does not work because hyperref does not substitute quotes''}
\addcontentsline{toc}{section}{\texorpdfstring{``}{“}texorpdfstring works but is pointlessly verbose\texorpdfstring{''}{”}}
\addcontentsline{toc}{section}{“UTF-8 quotes work fine and are a good straightforward solution”}
\addcontentsline{toc}{section}{\enquote{enquote is the perfect multilingual solution}{}}
\selectlanguage{german}
\addcontentsline{toc}{section}{\enquote{enquote is the perfect multilingual solution}{}}
\selectlanguage{french}
\addcontentsline{toc}{section}{\enquote{enquote is the perfect multilingual solution}{}}
\end{document}
结果是这样的:
我不明白为什么必须{}
在后面添加\enquote
,但为了使其工作,这是必要的(并且似乎没有负面影响)。