使用 unicode-math Asana Math 作为字体时,使用 pdfencoding=auto 和 hyperref 会导致编译错误

使用 unicode-math Asana Math 作为字体时,使用 pdfencoding=auto 和 hyperref 会导致编译错误

我正在尝试Asana Math在旧文件上添加字体,看看它看起来怎么样。我发现lualatex出现编译错误,因为文件使用了

    \usepackage[pdfencoding=auto]{hyperref}

将上述内容更改为

    \usepackage[]{hyperref}

删除错误。删除Asana Math字体并保留也pdfencoding可以修复错误。我的subsubsection标题里面有数学字体。

这是为什么?我做错了什么?最好的改正方法是什么?

以下是显示错误的内容

\documentclass[12pt]{article}%

\usepackage{amsmath}

\usepackage{fontspec}
\usepackage{unicode-math}
\setmathfont{Asana Math}

\usepackage[pdfencoding=auto]{hyperref}

\begin{document}
\subsubsection{Part 4 $\det\left(  A^{T}\right)  =\det A$}
test

\end{document}

现在 lualatex foo.tex给出

This is LuaTeX, Version 1.10.0 (TeX Live 2019)
 restricted system commands enabled.
(./foo.tex
LaTeX2e <2018-12-01>
....    
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `\nmlimits@' on input line 13.

! Improper alphabetic constant.
<to be read again>
\math@bgroup
l.13 ...{Part 4 $\det\left(  A^{T}\right)  =\det A$}

?

但如果我使用这个

\documentclass[12pt]{article}%    
\usepackage{amsmath}     
\usepackage[pdfencoding=auto]{hyperref}

\begin{document}
\subsubsection{Part 4 $\det\left(  A^{T}\right)  =\det A$}
test

\end{document}

没有错误。但我从 hyperref 收到相同的警告

Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref)                removing `math shift' on input line 10.

根据答案节标题中的数学符号 它说

选项 pdfencoding=auto 或 unicode 可以使用更多符号启用 Unicode 书签。

使用 TL 2019

答案1

书签必须以 PDF 编码编写,而不能使用 LaTeX 格式(尽管某些扩展为字符的文本模式宏仍可工作)。您可以通过将选项添加到 来使某些公式psdextra工作hyperref

你可以指定替代的 PDF 字符串用于目录。这可能包含任何 Unicode 字符,包括所有数学符号、数学字母数字符号以及上标和下标。

\documentclass[12pt]{article}

\usepackage{amsmath}
\usepackage{fontspec}
\usepackage{unicode-math}

\defaultfontfeatures{Scale=MatchLowercase}
\setmainfont{TeX Gyre Pagella}[Scale = 1.0]
\setmathfont{Asana Math}

\usepackage[unicode, bookmarks]{hyperref}

\newcommand\transpose[1]{#1^{\symup T}}

\begin{document}
\subsubsection{\texorpdfstring{Part 4 \( \det\left(  \transpose{A} \right)  =\det A \)}%
                              {Part 4 det(

答案2

基本上问题描述为https://github.com/latex3/hyperref/issues/63:如果在用于书签的文本中含有已分配给字符的命令,hyperref 会不喜欢它。

在 unicode math 的字体更改命令的某个深度中,使用了这样的命令,然后失败了\det。我不知道有什么好的解决方案:问题中的 luacode 不会解决问题;虽然它避免了错误,但它也会在书签中插入不需要的内容。

最好的办法是避免在书签内容中使用任意、复杂的数学运算。按照 Davislor 的建议使用\texorpdfstring

附注:使用当前的 hyperref 和 lualatex,你可以/应该简单地使用

  \usepackage{hyperref} 

这将默认为unicode书签。

相关内容