在 Linux Libertine O 中用替代符号替换斜体符号

在 Linux Libertine O 中用替代符号替换斜体符号

总部位于这个答案我想创建一个命令\amper,使用 Linux Libertine O 的替代符号,而保留常规符号\&。下面的 MWE 的问题是 hyperref 不喜欢 unicode 替换,因此会搞砸 pdf 信息中的标题。我想最好的解决方案是用替代符号替换 Linux Libertine 的常规斜体符号,但我不知道该怎么做。

编辑:我应该补充一下,\amper命令的定义这里与 hyperref 完美配合,默认情况下具有替代斜体 & 符号的字体,例如 Adob​​e 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问题。

相关内容