FreeBSDの日本語マニュアル(2)

前回に引き続きFreeBSDの日本語マニュアル。
まだ課題が残っているので、jmanで困っていない人はjmanを使えば良いと思います。

# 前提条件
以下の条件を満たす人向け。

* FreeBSD 9以降を使っている。
* 環境変数`LANG`に `ja_JP.UTF-8`を指定している
* パッケージの依存関係で、ja-groff(ports/japanese/groff)ではなくgroff(ports/textproc/groff)をインストールしたい

# 準備
以下のパッケージをpkgngもしくはportsからインストールする

* groff(ports/textproc/groff)
* ~~ja-nkf(ports/japanese/nkf)~~ (標準のiconvを使うように修正)
* ja-man-doc(ports/jamanese/man-doc)

※ ja-man-docは、/usr/doc/ja_JP.eucJP/man で make installしても良い。

# インストール
必要なファイルは、https://gist.github.com/false-git/7183d616527e8efda181 にあります。

## ディレクトリの準備
好きなところにディレクトリを作成する。

```shell-session
% mkdir jman
% cd jman
```
## ファイルを揃える
上記gistから、スクリプトを持ってきます。

```shell-session
% fetch https://gist.githubusercontent.com/false-git/7183d616527e8efda181/raw/3751937e803e86b296f635798d5793ae082d753b/makejman.sh
```
## 実行する

```shell-session
% sudo ./makejman.sh
```
rootで実行するので、不安な人はファイルの中身を見ながら1ステップずつ実行してください。

# 中身の説明
## /usr/local/bin/man の作成

```shell-session
cp /usr/bin/man /usr/local/bin/
cd /usr/local/bin
patch < $PDIR/man.path
```
/usr/bin/man を /usr/local/bin/ にコピーし、パッチをあてます。
以前のものと同じです。

## mdoc.local の修正

```shell-session
cd /usr/local/share/groff/site-tmac
V=`uname -r|sed 's/-.*//'`
echo ".ds default-operating-system FreeBSD\\~$V" >> mdoc.local
cat $PDIR/mdoc.local.add >> mdoc.local
```
この修正により、以下のような行がmdoc.localに追加されます。

```mdoc.local
.ds default-operating-system FreeBSD\~10.1
.if "\*[locale]"ja.UTF-8" \{\
.mso mdoc_ja.local
.mso ja.tmac
.\}
```
default-operating-system は、uname -r から持ってきています。
これは、manページのフッタに表示されます。
ハードコードしてしまうので、FreeBSDのバージョンが変わるとおかしくなります。(オリジナルのmanはどうやって解決しているのだろう？)
その後の`.if`で、localeが`ja.UTF-8`のときのみmdoc_ja.localとja.tmacを読み込むようにしています。
localeは、manコマンドからgroffに渡されるのですが、ja.tmacの中で上書きされてしまうため、groffのオプションに-mjaを付ける代わりに、ここで読み込みます。

## mdoc_ja.local の作成

```shell-session
tar xzOf $PDIR/tmac-20030521_2.tar.gz tmac-20030521_2/mdoc/ja.eucJP | iconv -f euc-jp -t utf-8 | sed s/japanese-iso-8bit/utf-8/ | /usr/local/bin/preconv > mdoc_ja.local
```
FreeBSDのja-groffの配布物であるtmac-20030521_2.tar.gz から、ja.eucJPを取り出し、preconvを使ってgroffが読めるコードに変換しています。

## シンボリックリンクの生成
```shell-session
ln -s /usr/share/man/ja /usr/share/man/ja_JP.UTF-8
ln -s /usr/local/man/ja /usr/local/man/ja_JP.UTF-8 
```
manコマンドは、以下の順で探すため、jmanが検索する ja はそのままでは検索されないため、リンクを張る。

1. `lang_country.charset` (`ja_JP.UTF-8`)
2. `lang.charset` (`ja.UTF-8`)
3. `en.charset` (`en.UTF-8`)

# 元に戻す方法

* /usr/local/bin/man を削除する
* /usr/local/share/groff/site-tmac/mdoc_ja.local を削除する
* /usr/local/share/groff/site-tmac/mdoc.local の 最後の5行を削除する
* /usr/share/man/ja_JP.UTF-8 を削除する
* /usr/local/man/ja_JP.UTF-8 を削除する

※ /usr/local/share/groff/site-tmac/mdoc.local のみオリジナルのファイルを修正するので、必要であればインストールの前にバックアップしてください。もし、なくしてしまっても、groffを再インストールすれば復元されます。

# 解決する問題

* UTF-8の環境で、日本語のマニュアルが表示できます。
* manページのヘッダ/フッタも正しく表示されます。
* 「書式」セクションも正しくフォーマットされます。

# 解決しない問題

man patch すると、以下のようになります。

![man.png](https://qiita-image-store.s3.amazonaws.com/0/3357/cc3dc9e5-abfc-c8ef-671b-b89fea2fd098.png)

ちなみに、jmanだと以下のようになります。

![jman.png](https://qiita-image-store.s3.amazonaws.com/0/3357/cfcfca40-dd06-95a0-7b92-c096a557d083.png)

どうも、まだ割り付けに問題があるようです。
jgroffには、EUCの文字が改行で区切られている場合には、改行を空白に変換せずに結合するようなパッチがあたっているそうなので、その辺の問題かも知れません。

## 追記
patch のマニュアルが正しく整形されない理由がわかりました。
man コマンドがgroffに渡すオプションのうち、tmacを指定するのは `-mtty-char` と `-man`です。
`-man`の指定により、`/usr/local/share/groff/current/tmac/an.tmac`が読まれます。
`an.tmac`は、単に`andoc.tmac`を読んでいるだけです。
`andoc.tmac`は、処理対象のファイルが`Dd`を含めば`doc.tmac`を、`TH`を含めば`an-old.tmac`を読みます。
今回手を入れたのは、`doc.tmac`の方だけでしたが、日本語のpatch.1 は古い形式で書かれていたため、`an-old.tmac`が読まれることになり、結果として`ja.tmac`が読まれないため、割り付けがおかしくなったのでした。

`an-old.tmac`を読むと、`doc.tmac`と同じように`man.local`を最後に読み込むようになっているので、`/usr/local/share/groff/site-tmac/man.local`に以下を追加することで、正しくフォーマットされるようになりました。

```groff:man.local
.if "\*[locale]"ja.UTF-8" \{\
.mso ja.tmac
.\}
```
~~mdocではなくmanの場合に、mdoc_ja.localの各種定義が必要かどうかわからなかった(patch.1は正常にフォーマットできているように見えるため)ため、まだ上記インストールスクリプトには取り込んでいません。~~
セクション3で`.TH`が含まれるファイル(math, zlib等)を見ても問題なさそうだったの、上記スクリプトに含めました。

他に、このやり方で崩れるマニュアルがあったら教えてください。