babel russian 和 serbianc 中 \gcd 类似物的行为有何不同?

babel russian 和 serbianc 中 \gcd 类似物的行为有何不同?

考虑以下两个模拟 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}

相应的输出都是预期的并且是正确的:

  1. 在此处输入图片描述
  2. 在此处输入图片描述

另一方面,取消注释%\let\gcd...行后,我得到:

  1. 在此处输入图片描述

  2. 错误

    c:/Users/usr/Downloads/test/sr.tex:13: 未定义控制序列。\gcd

    l.13 $\gcd {(a, b)}$, $\NZD{(a, b)}$ 错误消息顶行末尾的控制序列从未被 \def 过。如果您拼错了它(例如,\hobx'), typeI')和正确的拼写(例如,`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-*

了解不同语言中如何处理这个问题。

相关内容