我试图在 Xelatex 文档中将 \overline 更新为 \bar,但 Xelatex 无法编译,而且我不明白为什么会出现错误“\bar 已定义”。
这是我的 Xelatex 代码:
\documentclass{book}
\usepackage{polyglossia}
\setmainlanguage{french}
\renewcommand{\bar}{\overline}
\begin{document}
$\bar{ABCD}$\\
$\overline{ABCD}$
\end{document}
但是当我处于正常的 Latex 模式时,此代码可以完美编译:
\documentclass{book}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\renewcommand{\bar}{\overline}
\begin{document}
$\bar{ABCD}$\\
$\overline{ABCD}$
\end{document}
我一直在搜索相关主题,但到目前为止,我还没有找到任何解决方案。
(答案在这里:renew 命令有问题?不适用于酒吧)
感谢您的帮助。
答案1
很有趣!
所发生的情况是fontspec
(由 加载polyglossia
)必须\bar
使用与标准 LaTeX 不同的数学符号字体重新定义,因此它调用(在开始文档时)
\DeclareMathAccent{\bar}{\mathalpha}{legacymaths}{22}
的工作\DeclareMathAccent
原理很复杂,但本质上它会检查其第一个参数(此处\bar
)是否未定义或定义为数学重音符号;在这种情况下,它会根据要求(重新)定义它。如果命令已被定义为非数学重音符号,则会引发错误。
由于您正在执行\renewcommand{\bar}{\overline}
,我们处于第二种情况,因为\overline
不是数学重音(从 TeX 的角度来看)。
解决方案:
\AtBeginDocument{\renewcommand{\bar}{\overline}}
它将比 执行的重新定义更晚执行fontspec
。这也适用于标准 LaTeX。