🖨️

Vim で Unicode なファイルを印刷しよう!

2022/01/23に公開

Vim でファイルを印刷してみる

他の多くのテキストエディタがそうであるように、Vim も編集しているファイルの内容をプリンタで印刷することができます。 何か適当なファイルを Vim で開いて次のように実行してみましょう。

ファイルを印刷する
:hardcopy
:ha	" 上の短縮形

利用している OS が MS-Windows なら印刷ダイアログが表示されます。 Unix な環境では黙ってプリンタにジョブが送信されてしまうかもしれません。

このとき、MS-Windows ならほとんどの文字に適当なフォントをあてがって印刷してくれるでしょう (ですので、お話はここでおしまいです)。 しかし、Unix な環境だとそうはいきません。 非 latin1 な文字に遭遇すると ¿ (? が反転した文字) に置き換えられてしまいます。 日本語の文章なんかを印刷した暁には目もあてられない無駄紙ができあがることでしょう。


目もあてられない無駄紙を作る

Vim の印刷に関する設定

Vim の印刷に関する設定は print.txt にまとまっています。 これを閲覧するには、Vim を起動して次のように実行します。

印刷に関するヘルプを見る
:help print.txt

この中で、日本語や Unicode なファイルを印刷するための設定として、特に関係のあるものは printencodingprintmbcharset そして 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-LightGothicBBB-Medium といった PostScript フォントであることに注意してください。

設定の準備

フォントの準備

フォントの存在を確認する方法は様々ありますが、ここでは ghostscript を利用して確認を行います。 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 フォントがどのファイルに対応させられているか確認します。

Ryumin-Light フォントの対応を確認する (GothicBBB-Medium も同様)
$ 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 に作成します。

CMap へのシンボリックリンクを作成する
$ 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 に次のように追加します。

vimrc
set printencoding=utf-8
set printmbcharset=UniJIS2004
set printmbfont=r:Ryumin-Light,b:GothicBBB-Medium,c:yes,a:yes

完成

これで日本語や Unicode なファイルを印刷しても無駄紙にならなくなりました。 しかし、絵文字のような文字は印刷できません。 悪しからず。


無駄紙ではないようだ

おわりに

おわりです。


参考

Discussion