マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Babel な話:ロシア語してウクライナ語すると結局 \Asbuk がアレな件

Babel のロシア語(russian)およびウクライナ語(ukrainian)オプションでは、\Asbuk\asbuk でカウンタを「各々の言語での」キリル文字の序列で出力することができる。(これは OT2 エンコーディングでも特に問題が起こらない。)

さて、Babel でロシア語・ウクライナ語・英語を指定して、さらに基底言語を英語からロシア語に(\selectlanguage で)切り替えた状態で、\Asbuk を使ってみる。

\documentclass[a4paper]{article}
\usepackage[OT2,T1]{fontenc}
\usepackage[russian,ukrainian,english]{babel}
\begin{document}
\selectlanguage{russian}
\renewcommand*{\theenumi}{\Asbuk{enumi}}
\begin{enumerate}
\item Odin.
\item Dva.
\item Tri.
\item Chetyre.
\item Pyatp1.
\item Shestp1.
\item Semp1.
\end{enumerate}
\end{document}

なんと、ロシア語なのに、ウクライナ語のキリル文字の序列になってしまっている。

ここで、言語オプションの読込の順番を変更して、

\usepackage[ukrainian,russian,english]{babel}

のようにすると、正しくロシア語の序列で出力される。*1

このことから容易に推測できるように、この原因は、ロシア語とウクライナ語のオプションの実装コードがともに \Asbuk\asbuk をグローバルに定義してしまっているからである。美文書で述べられているように、「多言語が同時に」使えることが Babel の利点のはずなのだが、各言語オプションを実装しているのは別々の人であるため、残念ながら、実際には「同時に使うことの想定を明らかに忘れてしまっている」ケースがかなり散見される。

ただし、今回のケース((より一般的には、「同名の命令のグローバルな書き換え」であり「基底言語に依存して変更されるべきもの」である場合。(つまり「ロシア語の文書」であるなら、途中にウクライナ語や英語が出現しても \Asbuk はロシア語の序列を出すべきであろう。)))では、「基底言語が固定された文書」(大抵の「多言語の文書」はこれを満たすであろう)については影響が及ばない。何故なら、ロシア語の \Asbuk を使いたいという場合、その文書の基底言語はロシア語に違いない。だから、Babel の読込では、russian が最後のオプションになっているはずである。結果的に、文書全体で \Asbuk はロシア語のものとなり、これは(文書を通じて)基底言語がロシア語であることと合致する。

*1:ちなみに、この序列においては「アクセント付文字」の〈Ё〉や〈Й〉、および「yer 類」〈Ъ Ы Ь〉は飛ばされる。