OldSlav SlavTeX オリジナル記法サポート

古代教会スラヴ語 TeX パッケージ OldSlav 0.1f: SlavTeX オリジナル記法対応版が完成した。oldslav-0.1f.{tar.gz, zip} パッケージは弊サイトのダウンロード・サービスから取得できる。

SlavTeX オリジナルは CP866 ロシア語コードで原稿を記述し,独自フォーマットでタイプセットを行う。唯我独尊の環境で動作するので,アクセント用記号のカテゴリーコードを好き勝手に変更し,アクセント記述のタイピング労力を軽減できるよう "\" なしで入力できるようになっている。OldSlav でもこの記法のサポートは当初からの目標のひとつであった。昨日の夜中にやっと完成に漕ぎ着け,課題をすべて解決してリリースする運びとなった。ノウハウを整理しておく。

", ', ^, _ などの記号をアクセント用として \ なしに TeX で入力できるようにするためには,そのカテゴリーコード(分類コード)を 7, 8, 12 から 13 に変更し,アクセント付加命令を定義しておく必要がある。ところが,これらの記号は LaTeX 内部や他のパッケージでも重要な意味を付与されていることが多く,不用意にカテゴリーコードを変更すると問題が多い。このため教会スラヴ語の入力時にのみ一時的に変更されるような調整が不可欠になってくる。

こういう場合,1.グループの中でカテゴリーコードを変更し,命令をアクセント用記号に代入してグループを閉じる,2. さらに同じ手法でカテゴリーコードと命令を変更前に戻す命令を定義しておく。次のようなコードになる。ここで実際にカテゴリーコード変更命令を定義する前に,当該カテゴリーコードを変更しておかないとエラーになることが最大の注意点である。

1.\setslavaccent: カテゴリーコード変更とアクセント記法変更命令の定義

% setslavaccent
\newif\ifst@acc@%モード判定 if
\gdef\cc@tm{13}
\begingroup%グループ開始
% save catcodes 分類コード保存
\xdef\cc@tild{\the\catcode126}%~13
\xdef\cc@bars{\the\catcode124}%|12
.....
% when catcode=13 save commands. 命令保存
\ifx\cc@tm\cc@tild\global\let\sv@tild=~\fi%
\ifx\cc@tm\cc@bars\global\let\sv@bars=|\fi%
.....
% catcodes changing. 分類コード変更
\catcode124=\active%|12
\catcode126=\active%~13
.....
% define setslavaccent
\gdef\setslavaccent{%アクセント記法変更命令
  \ifst@acc@\relax%
  \else%
    \catcode126=\active\let~=\apostrof%命令の代入
    \catcode124=\active\let|=\@ttlc%同上
    .....
    \st@acc@true%変更済みフラグセット
  \fi}%
\endgroup%グループ終了

2.\leaveslavaccent: カテゴリーコードと命令の復元

% leaveslavaccent
\begingroup
% catcodes recovery カテゴリコード復元
\catcode124=\cc@bars%|12
\catcode126=\cc@tild%~13
.....
% define leaveslavaccent; if catcode = 13 recover commands.
\gdef\leaveslavaccent{%復元命令
  \ifst@acc@%
    \catcode126=\cc@tild\ifx\cc@tm\cc@tild
    \let~=\sv@tild\fi%~13 命令復元
    \catcode96=\cc@bckq\ifx\cc@tm\cc@bckq
    \let`=\sv@bckq\fi%`12
    .....
    \st@acc@false%復元済みフラグセット
  \fi}%
\endgroup

これで他人様には迷惑をかけずにオリジナル記法がサポートできたと思ったら,あるテスト原稿で試験すると,aux ファイルの処理でエラーとなる。これは,カテゴリーコードが変更された状態で文書の終端を迎えると,その後に処理される aux ファイルにある記号がパースできない事象が発生するためであった。この原因追及には,トレース取得やら試験コーディングやらでおそろしく時間がかかってしまったが,対策は文書終了時点で復元命令を発効してやればよいわけである。ということで LaTeX の \enddocument を再定義する。

% leaveslavaccent at the end of document
\let\save@enddocument=\enddocument%
\def\ocs@enddocument{%
  \leaveslavaccent\save@enddocument}
\let\enddocument=\ocs@enddocument%

Babel の古典ギリシア語,仏・独・露語,ウクライナ語,チェコ語,タイ語,ヴェトナム語などと併用して試験したが問題なさそうである。サンプルを掲載しておく。古典ギリシア語とヴェトナム語は鬼門であり,これらとの混在確認をしておかないと言語パッケージとしては失格になってしまう。

20060923-oldslav.png