マクロツイーター

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

きょうの XeTeX (3) : \XeTeXinputencoding, \XeTeXdefaultencoding

例の Qiita の記事で触れたように、XeTeX エンジンには入力ファイルの文字コードを選択する機能がある。

  • \XeTeXinputencoding <文字コード名> :[命令] 現在読込中のファイルの、以降のテキスト行の文字コードを指定する。設定は常にグローバルである。
  • \XeTeXdefaultencoding <文字コード名> :[命令] 以降に読み込むファイルの文字コードを指定する。設定は常にグローバルである。
文字コード

ここで <文字コード名> に指定できる値であるが、何故かマニュアルを見ても全然情報がない。ソースコードやネット上の情報から判断すると、以下のようである。

  • utf8UTF-8
  • utf16be : UTF-16BE。
  • utf16le : UTF-16LE。
  • utf16 : 環境により異なり、UTF-16BE と UTF-16LE の何れか一方になる。恐らく有用ではない。
  • bytes : バイトセマンティック。つまり、0〜255 のバイトをそのまま符号値 0〜255 の文字と解釈する。実質的に Latin-1(latin1)を指定したのと等価。
  • auto : (\XeTeXdefaultencoding のみで使用可能。)UTF-8、UTF-16BE、UTF-16LE の中で自動判別する。((\XeTeXinputencodingauto を指定しようとすると、「! Encoding mode `auto' is not valid for \XeTeXinputencoding.」のエラーが出て指定自体が無視される。))
  • 以上の値以外は、ICU ライブラリが認識する文字コード名(参照)と解釈される。有効な値を幾つか列挙する:
    • ascii: US-ASCII
    • latin1: Latin-1(ISO-8859-1)
    • latin2: Latin-2(ISO-8859-2)
    • cp437: CP437((inputenc パッケージの文字コード名でいうと、cp437 でなくて cp437de の方に等しい。))
    • koi8-r: KOI8-R
    • macMacintosh Roman
    • macceMacintosh Central European
    • windows-1250Windows-1250
    • windows-1251Windows-1251(Windows 版の Latin-1)
    • windows-1252Windows-1252
    • iso-2022-jpISO-2022-JP
    • shift_jisShift_JIS……じゃなくて CP932((Unicode とのマップについては、「ibm943」が“本来の Shift_JIS”により近い(ただし 2 バイト部分は全角互換形を優先する)。しかしこの文字コードでは 1 バイトの「\」(0x5C)が U+00A5 にマップされるので、TeX ソースでは非常に使いづらい。))
    • euc-jpEUC-JP*1
    • ksc_5601: CP949(UHC、Window 版の KS C 5601)
    • gbk: CP936(GBK、Windows 版の GB 2312)
    • big5: CP950(Windows 版の Big5)
    無効な値が指定された場合は、ログに警告が出力された上で、bytes の設定が使われる。
注意事項
  • \XeTeXdefaultencoding の既定値は「auto」である。\XeTeXinputencoding の既定値(つまりファイル先頭での設定値)は、もちろん \XeTeXdefaultencoding の値(auto の場合は自動判定された結果の値)である。
  • これらのパラメタの設定は常にグローバルである。つまり、グルーピングによる局所化の影響を受けない。
  • これらのパラメタの現在の値を“読みだす”方法は存在しないようにみえる。*2
  • ファイル先頭の BOM のコードについては、\XeTeXdefaultencoding が「auto」の場合は BOM と解釈される(つまりデコードすると消える)。しかし「utf...」の場合は BOM と解釈されずデコード後に残ってしまって出力に悪影響を及ぼすようである。((もちろん、ファイルの先頭にある BOM は \XeTeXinputencoding の影響を受けることはありえない。))
  • 以前の記事で説明したように、これらのプリミティブは「クオートで囲める引数」をとる。
    % 次の2つは等価
    \XeTeXinputencoding utf8
    \XeTeXinputencoding "utf8"
    
    ただし、引数となる有効な文字コード名には空白文字が入ったものは存在しないので、実際にクオートで囲む機会は無いと思われる。

*1:恐らく、これも実際は「CP932 の EUC 版(CP50932)」だと思われる。

*2:従って、一時的に値を変更した値に「元の値に戻す」という処理が行い難い。