总部位于这个答案我想创建一个命令\amper
,使用 Linux Libertine O 的替代符号,而保留常规符号\&
。下面的 MWE 的问题是 hyperref 不喜欢 unicode 替换,因此会搞砸 pdf 信息中的标题。我想最好的解决方案是用替代符号替换 Linux Libertine 的常规斜体符号,但我不知道该怎么做。
编辑:我应该补充一下,\amper
命令的定义这里与 hyperref 完美配合,默认情况下具有替代斜体 & 符号的字体,例如 Adobe Garamond Pro、Sabon 等。
\documentclass{article}
\usepackage{libertineotf}
\usepackage{xspace}
\usepackage{relsize}
\newcommand*\scname{sc}
\makeatletter
\DeclareRobustCommand{\amper}{%
\ifx\f@shape\scname
{\smaller[1.2]\char"E050}%
\else
\char"E050
\fi
\xspace}
\makeatother
\newcommand{\myTitle}{Italic Ampersand \amper Linux Libertine O\xspace}
\usepackage{hyperref}
\hypersetup{unicode=true,pdftitle={\myTitle}}
\begin{document}
\title{\myTitle}
\maketitle
Text \amper test.
\end{document}
答案1
解决方案是使用\texorpdfstring
:
\makeatletter
\DeclareRobustCommand{\amper}{%
\texorpdfstring{%
\begingroup
\ifx\f@shape\scname
\smaller[1.2]%
\fi
\char"E050
\endgroup
}{\&}\xspace
}
\makeatother
这样hyperref
就能在 PDF 字符串中使用正常的“&”符号。
注意对宏进行一些小的优化:测试可以更短,这总是更好。使用\begingroup
和\endgroup
是一个品味问题,但这样做通常更安全。
(你\xspace
最后关于使用的评论当然是正确的)
但是有一个限制:你不能\amper
在章节标题中使用,除非你更改设置不是使用粗体,因为粗体变体中不存在变体 & 符号(至少在我的计算机上)。
答案2
使用私有使用区域代码点来访问替代字形通常不是一个好主意,而应该使用适当的 OpenType 功能,在这种情况下,可以使用Alternate=1
字体选项激活替代的 & 符号,现在使用简化的\amper
定义:
\newfontfamily\amperfont[Alternate=1]{Linux Libertine O}
\makeatletter
\DeclareRobustCommand{\amper}{{\amperfont\ifx\f@shape\scname\smaller[1.2]\fi\&}\xspace}
\makeatother
其副作用是,它将解决您的hyperref
问题。