为什么不能同时使用 hyperref 和 \C?

为什么不能同时使用 hyperref 和 \C?

今天,我从 TeXLive 2015 更新到了 TeXLive 2019(是时候了,对吧?)。但是,我遇到了一个以前从未遇到过的问题。我通常会将\C复数声明为宏。但是,这与与包相关的命令的某些隐式声明相冲突hyperref(我也需要它)。

我收到以下错误消息:

! LaTeX Error: Command \C unavailable in encoding TU.

我检查了该包的手册hyperref,但他们似乎没有定义命令\C

这是一个最小的工作示例:

\documentclass{article}

\usepackage{fontspec}

\usepackage{amsmath}
\usepackage{amssymb}
\DeclareMathOperator{\C}{\mathbb{C}}
\DeclareMathOperator{\R}{\mathbb{R}}
\usepackage{hyperref}


\begin{document}
$\C$
\end{document}

请注意,这是 所特有的\C。该文档可正确编译\R

答案1

由于hyperref需要覆盖 Unicode 来制作书签,因此它定义了一个自己的输出编码,称为PU

在文件中puenc.def我们发现

\DeclareTextCommand{\C}{PU}[1]{#1\83\017}% U+030F

so\C用于组合双重音符号。

您有两种选择:

  1. \C将复数的名称更改为不同的(可能更好)的名称,例如\sC(集合 C)或您最喜欢的名称;

  2. 取消定义\C

对于后者,

\documentclass{article}

\usepackage{fontspec}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{hyperref}

\let\C\relax

\DeclareMathOperator{\C}{\mathbb{C}}
\DeclareMathOperator{\R}{\mathbb{R}}

\begin{document}

$\C$

\end{document}

小心你的书签,确保不要使用奇怪的口音。

答案2

我可能有上百个文档,其中我使用 \C 作为 \mathbf{C} 的宏,由于这种冲突,它们全部丢失了。我编写了一个 Python 程序来替换文档中的单词,并在我所有的 *.tex 文档上运行该程序,将 \C 更改为 \CC(双 \ 是 Python 理解“\C”所必需的)。任何感兴趣的人都可以在以下位置找到 substitui_palavra.pyhttp://www.calculo-numerico.sobralmatematica.org/programas/substitui_palavra.pyt 并将“ .pyt”更改为“ .py”。

相关内容