siunitx 覆盖 ← 和 → 的定义

siunitx 覆盖 ← 和 → 的定义

此代码

% !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使用了编码。在某处你有:TS1siunitx.sty

\AtBeginDocument {
  \cs_if_free:cT { T@TS1 }
    {
      \DeclareFontEncoding { TS1 } { } { }
      \DeclareFontSubstitution { TS1 } { cmr } { m } { n }
    }
}

这将加载ts1enc.dfu包含以下内容的文件:

\DeclareUnicodeCharacter{2190}{\textleftarrow}

正如您所诊断的那样,它重新定义了箭头。

事实上,如果没有siunitxutf8的宏是:

\u8:← ->\IeC {\leftarrow }

siunitx更改为:

\u8:← ->\IeC {\textleftarrow }

siunitx一个阻止加载的黑客方法ts1enc.dfu是通过\cs_if_free:cT类似以下的方式进行欺骗:

\def\T@TS1{\NothingUseful}

但就在发布上述内容作为答案之前,我发现这是另一个答案由 Joseph Wright 表示,如果您加载textcompsiunitx将不再加载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}

相关内容