奇怪的 DeclareUnicodeCharacter / siunitx 冲突

奇怪的 DeclareUnicodeCharacter / siunitx 冲突

我喜欢声明 unicode 字符来编写可读的公式。然而,我刚刚遇到了一个奇怪的问题。下面的代码按预期工作,其中“×”符号被替换为所选代码(“plop”):

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\DeclareUnicodeCharacter{00D7}{plop}

\begin{document}
×
\end{document}

但是,如果我添加siunitx看起来完全不相关的包,我会收到一条错误,指出\texttimes未定义:

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{siunitx}

\DeclareUnicodeCharacter{00D7}{plop}

\begin{document}
×
\end{document}

然后它变得更加奇怪:如果我添加更不相关的包xfrac(顺序似乎并不重要),它会再次起作用:

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{siunitx}
\usepackage{xfrac}

\DeclareUnicodeCharacter{00D7}{plop}

\begin{document}
×
\end{document}

当然,这可以算是一种解决方案,但我无法对自己完全不理解的东西感到满意。另外,请注意,对于某些我尚未确定的软件包组合,错误会变成“\texttimes编码 T1 中命令不可用”。此外,这似乎根本不局限于“×”。以下代码:

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{siunitx}
%\usepackage{xfrac}

\DeclareUnicodeCharacter{00B2}{\ensuremath{^2}}

\begin{document}
$x²$
\end{document}

\texttwosuperior除非siunitx删除或xfrac添加,否则会出现“未定义控制序列”错误。请注意,当使用newunicodechar包声明字符时,似乎也会出现同样的事情。

siunitx当使用但不使用时,考虑的代码有什么问题xfrac

答案1

在内部,siunitx需要设置TS1范围内的一些最小字符支持。这样做是为了textcomp不强制加载:

\DeclareFontEncoding{TS1}{}{}
\DeclareFontSubstitution{TS1}{cmr}{m}{n}

后面跟着一些特定符号的声明。但是,这将导致 LaTeX 寻找TS1在设置之前激活的其他字符的接近符号。因此存在一个时间问题:在设置“最小”支持之前,您已经激活了该字符TS1。(最小支持siunitx仅定义绝对需要的符号。)

您可以通过加载textcomp或在加载后更改自定义字符的定义来最轻松地解决此问题siunitx。(xfrac包加载textcomp,这就是它解决问题的原因。)

相关内容