此代码
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
\documentclass{article}
\usepackage{siunitx}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{2190}\leftarrow % ←
\begin{document}
$←$
\end{document}
产生错误
Undefined control sequence \textleftarrow
←
这(重新定义为)怎么会textleftarrow
在没有任何警告的情况下发生?
答案1
发生这种情况是因为对某些符号siunitx
使用了编码。在某处你有:TS1
siunitx.sty
\AtBeginDocument {
\cs_if_free:cT { T@TS1 }
{
\DeclareFontEncoding { TS1 } { } { }
\DeclareFontSubstitution { TS1 } { cmr } { m } { n }
}
}
这将加载ts1enc.dfu
包含以下内容的文件:
\DeclareUnicodeCharacter{2190}{\textleftarrow}
正如您所诊断的那样,它重新定义了箭头。
事实上,如果没有siunitx
,utf8
的宏←
是:
\u8:← ->\IeC {\leftarrow }
和和 siunitx
更改为:
\u8:← ->\IeC {\textleftarrow }
siunitx
一个阻止加载的黑客方法ts1enc.dfu
是通过\cs_if_free:cT
类似以下的方式进行欺骗:
\def\T@TS1{\NothingUseful}
但就在发布上述内容作为答案之前,我发现这是另一个答案由 Joseph Wright 表示,如果您加载textcomp
,siunitx
将不再加载ts1enc.dfu
,因此您拥有:
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
\documentclass{article}
\usepackage{textcomp}
\usepackage{siunitx}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{2190}\leftarrow % ←
\begin{document}
$←$
\end{document}