1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
|
% 文字コードは UTF-8
% uplatex で組版する
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage{color}
\definecolor{myblue}{rgb}{0,0,0.75}
\definecolor{mygreen}{rgb}{0,0.45,0}
\usepackage[colorlinks,hyperfootnotes=false]{hyperref}
\usepackage{pxjahyper}
\hypersetup{linkcolor=myblue,urlcolor=mygreen,
pdftitle={pxbabelパッケージ},
pdfauthor={八登崇之}}
\usepackage{bxtexlogo}
\bxtexlogoimport{*}
\usepackage{shortvrb}
\MakeShortVerb{\|}
\newcommand{\PkgVersion}{1.2}
\newcommand{\PkgDate}{2021/05/22}
\newcommand{\Pkg}[1]{\textsf{#1}}
\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
\newcommand{\Note}{\par\noindent ※}
\newcommand{\Means}{:\quad\inhibitglue}
\newcommand{\XS}{\hspace{\xkanjiskip}}
%-----------------------------------------------------------
\DeclareFontShape{JY2}{mc}{m}{ko}{<->s*[.924871]upkorrm-h}{}
\DeclareFontShape{JT2}{mc}{m}{ko}{<->s*[.924871]upkorrm-v}{}
\DeclareFontShape{JY2}{gt}{m}{ko}{<->s*[.924871]upkorgt-h}{}
\DeclareFontShape{JT2}{gt}{m}{ko}{<->s*[.924871]upkorgt-h}{}
\newcommand{\Kor}[1]{{\kanjishape{ko}\selectfont #1}}
%-----------------------------------------------------------
\begin{document}
\title{\Pkg{pxbabel} パッケージ}
\author{八登崇之\ (Takayuki YATO; aka.~``ZR'')}
\date{v\PkgVersion \quad [\PkgDate]}
\maketitle
%===========================================================
\section{概要}
\label{sec:Overview}
{(u)\pLaTeX}における日本語・簡体字中国語・繁体字中国語・
韓国語(以下この4つを「CJK言語」と総称する)の間の
「和文(CJK)フォント」の切り替えをBabelのインタフェースを
用いて行えるようにする。
\paragraph{前提環境}
\begin{itemize}
\item {\TeX}フォーマット: {\pLaTeX}/{\upLaTeX}
(拡張エンジンを含む)
\end{itemize}
\paragraph{依存パッケージ}
\begin{itemize}
\item \Pkg{babel}パッケージ
\item \Pkg{japanese-otf}パッケージ({\pLaTeX}の場合)
\end{itemize}
%-------------------
\subsection{用語集}
\label{ssec:terminology}
\begin{itemize}
\item CJK言語識別子\Means
本パッケージにおいてCJK言語を指し示す、以下の文字列。
\begin{itemize}
\item |japanese|\Means 日本語
\item |korean|\Means 韓国語
\item |schinese|\Means 簡体字中国語
\item |tchinese|\Means 繁体字中国語
\end{itemize}
\item 言語名\Means
Babelで指定する(|\foreignlanguage| 等の引数にする)
言語を表す文字列。
\Note 既定ではCJK言語に対する「言語名」は「CJK言語識別子」と
同じ(例えば日本語の「言語名」は|japanese|)であるが、
そうでない設定も可能である。
\item 仮想言語\Means
Babelの言語オプション定義ファイル(|*.ldf|)の読込を伴わない
言語のこと。
本パッケージではCJK言語を仮想言語として扱えるため、
各言語の定義ファイルを用意する必要がない。
\Note CJK言語を仮想言語にせず定義ファイルを利用することも可能。
\end{itemize}
%===========================================================
\section{読込}
\label{sec:Loading}
0.9版より\Pkg{babel}パッケージと一緒に読み込む方式
(一括読込モード)をサポートした。
従来通り、別個に読み込む方式(分離読込モード)も可能である。
どちらであるかは、\Pkg{pxbabel}読込時に\Pkg{babel}が読込済か
どうかで判別する。
\begin{quote}
〈一括読込モードの場合〉\\
|\usepackage[|\Meta{オプション}|]{pxbabel}|
\par\bigskip
〈分離読込モードの場合〉\\
|\usepackage[|\Meta{Babelのオプション}|]{babel}|\\
|\usepackage[|\Meta{オプション}|]{pxbabel}|
\end{quote}
%-------------------
\subsection{パッケージオプション}
\label{ssec:options}
\begin{itemize}
\item \Meta{CJK言語識別子}|=|\Meta{言語名}\Means
CJK言語を仮想言語として扱い、実際に使用するBabelの言語名を指定する。
\Note 詳細は\ref{sec:Commands}節を参照。
\Note 言語名の既定値はCJK言語識別子と同一名。
\item \Meta{CJK言語識別子}\Means
「\Meta{CJK言語識別子}|=|\Meta{CJK言語識別子}」と同じ。
\Note 既定でこれと同等の設定が適用されるので通常は指定する必要がないが、
一括読込モードで「最後の言語(基底言語になる)」を
指定するのに有用である。
\item \Meta{CJK言語識別子}|=+|\Meta{言語名}\Means
CJK言語を非仮想言語として扱い、実際に使用するBabelの言語名を指定する。
\Note 「\Meta{言語名}|.ldf|」という名前の
言語オプション定義ファイルが読み込まれる。
\item |+|\Meta{CJK言語識別子}\Means
「\Meta{CJK言語識別子}|=+|\Meta{CJK言語識別子}」と同じ。
\item Babelの有効な言語名\Means
その言語の定義ファイルを読み込む。
\Note 現状では、分離読込モードでもこの機能は有効であるが、
確実に動作させるのが困難であるため、将来的に
「分離読込モードではCJK言語のみが指定可能
\footnote{つまり、CJK言語以外は\texttt{babel}のオプションとして
指定する必要がある。}」
となる可能性がある。
\item |main=|\Meta{言語名}\Means
文書開始時に有効となる基底言語を、言語名
\footnote{CJK言語について言語名とCJK言語識別子が異なる設定を
用いる場合、\texttt{main}に指定するのは言語名の方であることに注意。}%
で指定する。
\Note |main|の指定がない場合、
分離読込モードでは\Pkg{babel}で最後に読まれた言語が基底言語になる。
一括読込モードでは\Pkg{pxbabel}で最後に読まれた言語が基底言語になる。
\item |caption=|\Meta{値}\Means
キャプション言語(キャプションや日付の文字列で使われる言語)の
固定に関する設定を行う。
有効な値は次の通り:
\begin{itemize}
\item 有効な言語名\Means その言語に固定する。
\item |main|\Means 文書開始時の基底言語に固定する。
\item |default|\Means キャプション文字列を文書クラスで
指定されたものから変更しない。
\item |switch|\Means キャプション言語の固定を行わない。
(Babelの既定動作。)
\item |auto|(既定値)\Means
文書開始時の基底言語が
「言語オプション定義ファイルの読込を伴わないCJK言語」
(仮に「仮想言語設定」と呼ぶ)の場合は |default|、
それ以外は |switch|。
\end{itemize}
\Note 詳細は\ref{sec:Caption-Lang}節を参照。
\item |noswitchcaption|\Means
|caption=default|と同じ。
\item |switchcaption|\Means
|caption=switch|と同じ。
\Note (|no|)|switchcaption|は0.9版より前との互換性のため存在する。
\item |switchfont|(既定値)\Means
CJK言語でフォントを切り替える機能を有効にする。
\item |noswitchfont|\Means
|switchfont| の否定。
\item |forcedeluxemulti|\Means
{\upLaTeX}で\Pkg{japanese-otf}パッケージを
|deluxe|オプションおよび|multi|オプション付で使用している
(|\UTFK|/|\UTFC|/|\UTFT|が多ウェイトで使える)ときに、
日本語以外のテキストについても多ウェイトの設定を有効にする。
\Note 本来は\XS|\UTFK|/|\UTFC|/|\UTFT|入力用である{\TeX}フォント
(和文TFM)を使うため、約物の周りの空き調整が無効になる。
\item |noforcedeluxemulti|(既定値)\Means
|forcedeluxemulti|の否定。
日本語以外のテキストについて多ウェイト設定を無効にする。
\Note 約物の周りの空き調整が正常に行われる。
\Note (|no|)|forcedeluxemulti|は試験的な機能であり、
将来的に廃止される可能性がある。
\end{itemize}
%===========================================================
\section{ユーザ命令}
\label{sec:Commands}
本パッケージの主要機能であるCJKフォント切替に
ついてはBabelの機能を用いて行うことになるため、
パッケージ特有の命令は存在しない。
例えば、次のようなパッケージ読込(一括読込モード)の場合
\footnote{使用エンジンが{\upLaTeX}であるか、または
{\pLaTeX}で\Pkg{bxutf8}入力エンコーディングを用いているとする。}%
:
\begin{quote}\begin{verbatim}
\usepackage[korean,japanese]{pxbabel}
\end{verbatim}\end{quote}
本文中で
\begin{quote}
|日本語文書中に\foreignlanguage{korean}{|%
\textgt{\Kor{한글}}|}がある。|
\end{quote}
と入力すれば次の出力が得られる。
\begin{quote}
日本語文書中に\Kor{한글}がある。
\end{quote}
本パッケージが提供する命令には次のものがある。
\begin{itemize}
\item |\cjklanguagename{|\Meta{CJK言語識別子}|}|\Means
そのCJK言語に対する言語名。
\Note 例えば、パッケージオプションで|schinese=chinesesimp|と指定した場合、
|\cjklanguagename|\hspace{0pt}|{schinese}|\XS は
「|chinesesimp|」に展開される。
\end{itemize}
%===========================================================
\section{キャプション言語の固定に関する設定}
\label{sec:Caption-Lang}
Babelでは言語の切替に関して、入力言語のみを切り替えるもの
(|\foreignlanguage|命令、|otherlanguage*|\XS 環境)
と基底言語を切り替えるもの
(|\selectlanguage|命令、|otherlanguage|環境)
があり、既定動作ではキャプション言語は基底言語に常に追随する
(|caption=switch|指定時と同じ)。
ところが、実際の言語定義を伴わない仮想言語においては、
キャプション文字列の設定は働かない。
このため、基底言語を仮想言語に切り替えた場合には
キャプション言語が正しくない事態が生じることになる。%
\footnote{ただし「文書開始時以外に基底言語を仮想言語に切り替える」
ことをしなければ問題は起こらない。
特に、「日本語の文書クラスを用いて、かつBabelにおいて
仮想言語扱いの日本語を文書全体で基底言語にする」
場合は、キャプションは文書クラスで定めたものに固定される。}
これによる混乱を避けるために、|caption|オプションによる
キャプション言語の固定が有用である場合がある。
特に、「Babelによるキャプション文字列の変更を抑止して文書クラスで
定めた文字列を常に有効にしたい」という場合は、
|caption=default|を指定すればよい。
文書開始時の基底言語が仮想言語である場合はこちらの使い方が
多いと考えられるので、この場合に限って|caption|の既定値を
(Babelの既定動作に相当する|switch|ではなく)
|default|としている。
\Note 0.9版より前は常に|default|を既定値としていた。
ゆえに、|caption|(および(|no|)|switchcaption|)オプション
指定がなく基底言語が仮想言語でない場合の|caption|設定は、
0.9版より前は|default|、以降は|switch|と異なることになる。
仮想言語設定でない場合は|default|にする必然性が少ないので、
Babelの既定動作に合わせる目的で仕様が変更された。
\Note \Pkg{bxbase}パッケージの\XS|\fixcaptiopnlanguage|命令による
キャプション言語固定の設定は、常に本パッケージでの設定より優先される。
この仕様は|main|オプションのものと一貫していないが、
互換性のためそのままにしている。
%===========================================================
\section{CJKフォント切替機能の原理}
\label{sec:Switch-Font}
\subsection{{\upLaTeX}において}
{\upTeX}は標準で、CJK言語の{\TeX}フォント(和文TFM)を用意している。
本パッケージはBabelにおいてCJK言語の切替処理(|\extras...|\XS マクロ)
の中に、フォントの切替を追加し、
言語の選択に応じて適切なフォントが選ばれるようにする。
%言語に対するBabelの言語オプションの名前は変わりうるので、
%その名前をパッケージ読込時に指定できるようにした。
%また、あるCJK言語の為のオプションが読み込まれていない時は、
%フォントの切替のみをする簡易の言語オプション(仮想言語設定)
%をその場で生成する。
\subsection{{\pLaTeX}において}
\Pkg{japanese-otf}パッケージの|multi|オプションは{\pLaTeX}において
韓国語・中国語を扱うためのもので、
これを使うと\XS|\UTFK|/|\UTFC|/|\UTFT|の各命令で
韓国語/簡体字中国語/繁体字中国語のフォントを用いて
文字が出力される
(これらの命令の引数は\XS|\UTF|と同じで16進表記のUnicode符号値)。
{\pLaTeX}における本パッケージの動作は次のようである。
%まず、{\upLaTeX}の場合と同じようにCJK言語のための
%Babel言語オプションを生成する。
Babelの言語がCJK言語に切り替わった場合には、
|\UTF|の動作を「本来の\XS|\UTF|」/|\UTFK|/|\UTFC|/|\UTFT|
に切り替える。
この機能は単独ではあまり有用とはいえないが、
\Pkg{bxutf8}入力エンコーディング
と併用してCJK言語のUTF-8直接入力を行う時に有用となる。
すなわち直接入力されたCJK文字は\XS|\UTF|に帰着するので、
結果的に{\upLaTeX}の時と同じように、Babelで切り替えた言語用の
フォントで出力することが可能となる。
\Note ただし、この機構には、
「JIS X~0208にある文字はそもそも\XS|\UTF|に変換されないので
常に日本語フォントで出力されてしまう」
という欠点をもつ。
これを解決するには\Pkg{pxfltsrc}パッケージ等の機能を用いて
文書にテキスト変換フィルタを適用するといった追加の処理が必要になる。
%===========================================================
\section{Babel一括読込モード}
\label{sec:Lumped-Loading}
0.9版より前では、Babel本体(\Pkg{babel}パッケージ)
とは別個に読み込む方式のみを採用していた。
ところがこの場合、
「Babelの本来の機能は不要で\Pkg{pxbabel}の
フォント切替だけを用いたい」
という場合、かなり不自然な指定をする必要があった。
例えば、日本語(|japanese|)と韓国語(|korean|)を
切り替えたい(メインは日本語)という場合は次のようになる。
\begin{quote}\begin{verbatim}
\usepackage[english]{babel}
\usepackage[main=japanese]{pxbabel}
\end{verbatim}\end{quote}
\Note \Pkg{pxbabel}を読んで基底言語を |japanese|
にする必要があるのだが、
そうするとまず\Pkg{babel}を読む必要があり
ここで何かダミーの言語(|english|を用いた)を指定する必要がある。
このままでは基底が|english|になるので、
|japanese|を基底にするためさらに|main|オプションが必要となる。
そこで、0.9版において、\Pkg{babel}と一括で読み込むことで、
\Pkg{babel}の使用言語オプション指定の方法を踏襲できるようにした。
\Pkg{babel}の読込前に\Pkg{pxbabel}を読み込むとこの動作になり、
\Pkg{babel}も一緒に読み込まれる。
\begin{quote}\begin{verbatim}
\usepackage[korean,japanese]{pxbabel}
\end{verbatim}\end{quote}
\Note オプションは\Pkg{babel}のものと同じ理屈で書く。
|korean|と|japanese|を用い、
かつ基底が|japanese|なのでこの順番になる。
目的が「{\upTeX}の非BMP文字対応の日本語フォントが使いたい」
だけの場合
\footnote{現在の{\upLaTeX}では既定の和文フォントが既に非BMP文字に
対応しているため、この使い方は不要である。}%
は以下のようになる。
\begin{quote}\begin{verbatim}
\usepackage[japanese]{pxbabel}
\end{verbatim}\end{quote}
\Note |japanese|のみ指定して、当然これを基底とする。
実際には、4つのCJK言語のオプションは「常に」出現するので、
上の2つの指定は等価であるが、
一括読込の場合は\Pkg{babel}の習慣に合わせて記述するのが
解りやすいと思われる。
%-------------------
\subsection{複雑な例}
\label{ssec:complex-loading}
少し複雑な例を挙げておく。
ドイツ語(|ngerman|)、日本語(|japanese|)、
簡体字中国語(|simpchinese|)、繁体字中国語(|tradchinese|)
を使用し、かつ前の3つには言語オプション定義(|*.ldf|)があり、
基底は日本語で、キャプション言語の固定は行わないとする。
\paragraph{分離読込モード}
\begin{quote}\begin{verbatim}
\usepackage[ngerman,simpchinese,japanese]{babel}
\usepackage[schinese=simpchinese,tchinese=tradchinese,
caption=switch]{pxbabel}
\end{verbatim}\end{quote}
\Note 分離読込の場合は\Pkg{babel}で最後に指定したものが基底言語。
\paragraph{一括読込モード}
\begin{quote}\begin{verbatim}
\usepackage[ngerman,schinese=+simpchinese,tchinese=tradchinese,
+japanese]{pxbabel}
\end{verbatim}\end{quote}
\Note 非仮想言語の|japanese|が基底なので、
|caption|は|switch|が既定値になる。
なお、非CJK言語(|ngerman|)には決して\XS|+|\XS を付けないことに注意。
%===========================================================
\end{document}
|