Vim で Unicode なファイルを印刷しよう!
Vim でファイルを印刷してみる
他の多くのテキストエディタがそうであるように、Vim も編集しているファイルの内容をプリンタで印刷することができます。 何か適当なファイルを Vim で開いて次のように実行してみましょう。
:hardcopy
:ha " 上の短縮形
利用している OS が MS-Windows なら印刷ダイアログが表示されます。 Unix な環境では黙ってプリンタにジョブが送信されてしまうかもしれません。
このとき、MS-Windows ならほとんどの文字に適当なフォントをあてがって印刷してくれるでしょう (ですので、お話はここでおしまいです)。 しかし、Unix な環境だとそうはいきません。 非 latin1 な文字に遭遇すると ¿ (? が反転した文字) に置き換えられてしまいます。 日本語の文章なんかを印刷した暁には目もあてられない無駄紙ができあがることでしょう。
目もあてられない無駄紙を作る
Vim の印刷に関する設定
Vim の印刷に関する設定は print.txt にまとまっています。 これを閲覧するには、Vim を起動して次のように実行します。
:help print.txt
この中で、日本語や Unicode なファイルを印刷するための設定として、特に関係のあるものは printencoding、printmbcharset そして printmbfont です。
printencoding
このオプションでは “印刷に使う文字エンコーディング” を設定します。 このオプションの値は、例えば、utf-8 であったり euc-jp であったりという具合です。
印刷に際して、バッファにある文字は printencoding で指定されたエンコーディングに変換されます。 つまり、encoding に utf-8 を printencoding に euc-jp を指定した場合は、印刷される際に utf-8 → euc-jp の変換を受けることになります。 変換できない文字は ¿ になります。
Unicode なファイルを Unicode なままに印刷するには、当然 Unicode なエンコーディングを指定する必要があります。
printmbcharset
このオプションでは “漢字 (CJK 文字) を出力するための文字セット” を指定します。 このオプションの値は、例えば、JIS_X_1990 であったり MSWINDOWS であったりという具合です。
ここで厄介なのが、この値は printencoding と決められた組み合わせでしか利用できないということです。 例えば、printencoding に utf-8 を指定した場合、printmbcharset に JIS_X_1990 は利用できますが MSWINDOWS は利用できません。
print.txt の中で、日本語の文字セットとして Unicode に対応しているものは JIS_X_1990 となっていますが、これでは正しく印刷できませんでした (そして、この記事があります)。
printmbfont
このオプションは “漢字 (CJK) を出力するために使われるフォントのリスト” を指定します。 ここで、フォントとは Ryumin-Light や GothicBBB-Medium といった PostScript フォントであることに注意してください。
設定の準備
フォントの準備
フォントの存在を確認する方法は様々ありますが、ここでは ghostscript を利用して確認を行います。 ghostscript がシステムにインストールされていない場合は、次のように実行してインストールしてください。
$ sudo apt install ghostscript # Debian 系 Linux
# pkg install ghostscript9-agpl-x11 # FreeBSD
次のように実行してフォントの存在を確認します。
$ gs
GS> /Ryumin-Light-H findfont setfont
GS> /GothicBBB-Medium-H findfont setfont
GS> quit
このとき、次のような出力がある場合はフォントが存在していません。
Can't find (or can't open) font file ~~~.
Didn't find this font on the system!
フォントが存在していない場合はフォントを用意する必要があります。
Debian 系 Linux の場合
Debian 系 Linux の場合、PostScript フォントと実際のフォントの対応が /usr/lib/ghostscript/fonts/cidfmap に記述されています。 次のように実行して、PostScript フォントがどのファイルに対応させられているか確認します。
$ cat /var/lib/ghostscript/fonts/cidfmap \
> | grep '^/Ryumin-Light'
/Ryumin-Light /Japanese-Mincho-Regular ;
$ cat /var/lib/ghostscript/fonts/cidfmap \
> | grep '^/Japanese-Mincho-Regular'
/Japanese-Mincho-Regular << /FileType /TrueType /Path (/usr/share/fonts/truetype/fonts-japanese-mincho.ttf) /SubfontID 0 /CSI [(Japan1) 4] >> ;
/Japanese-Mincho-Regular-JaH << /FileType /TrueType /Path (/usr/share/fonts/truetype/ttf-japanese-mincho.ttf) /SubfontID 0 /CSI [(Japan2) 4] >> ;
cidfmap ファイルで指定されているパス (/usr/share/fonts/truetype/fonts-japanese-(gothic|mincho).ttf) に何かしらのフォントがあれば良いので IPA フォントへのシンボリックリンクを作成します。 IPA フォントが無ければインストールします。
$ sudo apt install fonts-ipafont
$ sudo ln -s /usr/share/fonts/ipafont-gothic/ipag.ttf \
> /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
$ sudo ln -s /usr/share/fonts/ipafont-mincho/ipam.ttf \
> /usr/share/fonts/truetype/fonts-japanese-mincho.ttf
これでフォントが利用可能になるはずです。
FreeBSD の場合
FreeBSD の場合も Debian と同様ですが、ファイルの場所が異なります。 cidfmap ファイルの場所は /usr/local/share/cmap/cidfmap です。 そして、シンボリックリンクを作成するべき場所は /usr/local/share/ghostscript/fonts/std.ja_JP/(Ryumin-Light|GothicBBB-Medium)) です。
CMap の準備
CMap (character map) とは、文字コードとフォントに含まれる文字 (グリフ) とを対応させる表のことです。 Vim の print.txt の言うには UTF-8 と JIS_X_1990 の対応がデフォルトで利用可能であるはずです。 しかし、この組み合わせはなぜか利用できないので UTF-8 と JIS X 0213:2004 との対応である UniJIS2004-UTF8 を利用します。
Debian 系 Linux の場合
目的のものは /var/lib/ghostscript/CMap/UniJIS2004-UTF8-H です (*-V のものもありますが縦書き用です)。 このファイルへのシンボリックリンクを ~/.vim/print/UniJIS2004-UTF8-H.ps に作成します。
$ mkdir -p ~/.vim/print
$ ln -s /var/lib/ghostscript/CMap/UniJIS2004-UTF8-H \
> ~/.vim/print/UniJIS2004-UTF8-H.ps
FreeBSD の場合
FreeBSD の場合も Debian と同様です。 目的のファイルは /usr/local/share/cmap/UniJIS2004-UTF8-H にあります。
vimrc の記述
ようやく Vim の設定を記述できます。 vimrc に次のように追加します。
set printencoding=utf-8
set printmbcharset=UniJIS2004
set printmbfont=r:Ryumin-Light,b:GothicBBB-Medium,c:yes,a:yes
完成
これで日本語や Unicode なファイルを印刷しても無駄紙にならなくなりました。 しかし、絵文字のような文字は印刷できません。 悪しからず。
無駄紙ではないようだ
おわりに
おわりです。
参考
- iranoan. UNICODEをhardcopyで印刷する方法. vim-jp/issues – GitHub. (accessed 2022-01-22).
- vim-jp. print. Vim日本語ドキュメント. (accessed 2022-01-22).
- モリサワ. CMap・cmap(Character Map). フォント用語集 – 文字の手帖 – 株式会社モリサワ. (accessed 2022-01-22).
Discussion