考虑以下两个模拟 MWE:
1.
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
%\let\gcd\NOD
\listfiles
\begin{document}
$\gcd{(a, b)}$, $\NOD{(a, b)}$
\end{document}
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[serbianc]{babel}
%\let\gcd\NZD
\listfiles
\begin{document}
$\gcd{(a, b)}$, $\NZD{(a, b)}$
\end{document}
相应的输出都是预期的并且是正确的:
另一方面,取消注释%\let\gcd...
行后,我得到:
错误
c:/Users/usr/Downloads/test/sr.tex:13: 未定义控制序列。\gcd
l.13 $\gcd {(a, b)}$, $\NZD{(a, b)}$ 错误消息顶行末尾的控制序列从未被 \def 过。如果您拼错了它(例如,
\hobx'), type
I')和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的任何东西。
我想说的是,1. 具有预期的行为,并且在钩子之前serbianc
不会激活额外功能(至少\NZD
)\AtBeginDocument
。
这两个 MWE 的行为是否应该相同?
由于 30000 个字符的限制,我无法粘贴整个日志,这里只是listfiles
输出:
1.
*File List*
article.cls 2021/02/12 v1.4n Standard LaTeX document class
size10.clo 2021/02/12 v1.4n Standard LaTeX file (size option)
fontenc.sty
t2aenc.def 2005/09/27 v1.0i Cyrillic encoding definition file
t2aenc.dfu 2021/01/27 v1.2l UTF-8 support for inputenc
t2acmr.fd 2001/08/11 v1.0a Computer Modern Cyrillic font definitions
inputenc.sty 2021/02/14 v1.3d Input encoding file
babel.sty 2021/07/22 3.63 The Babel package
bblopts.cfg 2005/09/08 v0.1 add Arabic and Farsi to "declared" options of babel
russianb.ldf 2021/01/10 1.3m Russian support for the Babel system
l3backend-pdftex.def 2021-08-04 L3 backend support: PDF output (pdfTeX)
***********
*File List*
article.cls 2021/02/12 v1.4n Standard LaTeX document class
size10.clo 2021/02/12 v1.4n Standard LaTeX file (size option)
fontenc.sty
t2aenc.def 2005/09/27 v1.0i Cyrillic encoding definition file
t2aenc.dfu 2021/01/27 v1.2l UTF-8 support for inputenc
t2acmr.fd 2001/08/11 v1.0a Computer Modern Cyrillic font definitions
inputenc.sty 2021/02/14 v1.3d Input encoding file
babel.sty 2021/07/22 3.63 The Babel package
bblopts.cfg 2005/09/08 v0.1 add Arabic and Farsi to "declared" options of babel
serbianc.ldf 2021/04/10 3.1 Serbian Cyrillic support for the Babel system
l3backend-pdftex.def 2021-08-04 L3 backend support: PDF output (pdfTeX)
***********
答案1
使用\addto\extras<language>
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[russian,serbianc]{babel}
\addto\extrasrussian{\let\gcd\NOD}
\addto\extrasserbianc{\let\gcd\NZD}
\begin{document}
This is \languagename
$\gcd(a, b)$, $\NZD(a, b)$
\selectlanguage{russian}
This is \languagename
$\gcd(a, b)$, $\NOD(a, b)$
\end{document}
答案2
\usepackage[俄语]{babel}:在装有 TeXlive 2021 的 Unix/GNU-Linux 下,命令
find /usr/local/texlive/2021 -name 'russian*' -exec fgrep -q NOD '{}' \; -print
产生线
/usr/local/texlive/2021/texmf-dist/tex/generic/babel-russian/russianb.ldf
在这个文件中,我们找到以下代码:
\if@uni@ode
\def\nod{\mathop{\mathrm{н.о.д.}}\nolimits}
\def\nok{\mathop{\mathrm{н.о.к.}}\nolimits}
\def\NOD{\mathop{\mathrm{НОД}}\nolimits}
\def\NOK{\mathop{\mathrm{НОК}}\nolimits}
\def\Proj{\mathop{\mathrm{Пр}}\nolimits}
\else
\def\nod{\mathop{\textnormal{\cyrn.\cyro.\cyrd.}}\nolimits}
\def\nok{\mathop{\textnormal{\cyrn.\cyro.\cyrk.}}\nolimits}
\def\NOD{\mathop{\textnormal{\CYRN\CYRO\CYRD}}\nolimits}
\def\NOK{\mathop{\textnormal{\CYRN\CYRO\CYRK}}\nolimits}
\def\Proj{\mathop{\textnormal{\CYRP\cyrr}}\nolimits}
\fi
这意味着在加载样式文件时命令会立即被定义。
\usepackage[serbianc]{babel}:在装有 TeXlive 2021 的 Unix/GNU-Linux 下,命令
find /usr/local/texlive/2021 -name 'serbianc*' -exec fgrep -q NZD '{}' \; -print
产生线
/usr/local/texlive/2021/texmf-dist/tex/generic/babel-serbianc/serbianc.ldf
在这个文件中,我们找到以下代码:
\addto\extrasserbianc{%
\babel@save\nzs \babel@save\nzd
\babel@save\NZS \babel@save\NZD
\if@srbc@uni@ode
\def\nzs{\mathop{\mathrm{нзс}}\nolimits}
\def\nzd{\mathop{\mathrm{нзд}}\nolimits}
\def\NZS{\mathop{\mathrm{НЗС}}\nolimits}
\def\NZD{\mathop{\mathrm{НЗД}}\nolimits}
\else
\def\nzs{\mathop{\textnormal{\cyrn\cyrz\cyrs}}\nolimits}
\def\nzd{\mathop{\textnormal{\cyrn\cyrz\cyrd}}\nolimits}
\def\NZS{\mathop{\textnormal{\CYRN\CYRZ\CYRS}}\nolimits}
\def\NZD{\mathop{\textnormal{\CYRN\CYRZ\CYRD}}\nolimits}
\fi}
标记列表\extrasserbianc
成为 at-begin-document-hook 的一部分。
哪一个更好?有时包希望/必须确保其定义最后执行(在其他包之后),或者在执行时,其他设置已经完成。在这种情况下,最好将定义推迟到\begin{document}
。否则,立即定义命令更直接,也许更安全(例如,当您想要确保命令的重新定义会引发错误时更安全)。检查文件
/usr/local/texlive/2021/texmf-dist/tex/generic/babel-*
了解不同语言中如何处理这个问题。