我喜欢声明 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
,这就是它解决问题的原因。)