『プログラマーのための圏論』を全訳した作業環境メモ

Bartosz Milewski著 "[Category Theory for Programmers](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/)" を全文和訳したので、翻訳の経過と作業環境について自分用に記録を残しておきます。

※当記事では**本の内容や圏論についての解説はしません**。誤訳の指摘等もコメント欄ではなくgithubで。

翻訳成果物は『プログラマーのための圏論』というタイトルにし、githubで[markdownソース](https://github.com/ktgw0316/milewski-ctfp-markdown)および[html版](https://ktgw0316.github.io/milewski-ctfp-markdown/)として公開しています。2023年1月末時点で下訳が終わった段階で、[推敲はまだ途中](https://github.com/ktgw0316/milewski-ctfp-markdown/issues/3)なので、確実に誤訳を含んでいます。

## これまでの過程

### 翻訳の動機

1. プログラミングの知識を足がかりにして圏論を勉強できそうな良書だと思ったから。
    * あわよくば関数型プログラミングの理解が深められるのを期待した。
1. 書籍1冊分の翻訳を経験してみたかったから。
    * OSSのドキュメントやUIの和訳をやっていた経験が活きるか。
1. 社会貢献

### かかった期間

約1年かかりました。

* 2018年に第1章の途中まで訳して放置
    * 他のOSS活動とか引っ越しとかがあって忙しかったので…。
* 2022年3月上旬に翻訳再開し、2023年1月下旬に下訳完了
    * 1日あたり20文以上を目標にし、調べ物含めて平均1時間くらい？ (毎日作業していたわけではない)

## 翻訳に使った環境

翻訳メモリとしてフリーウェアの[OmegaT](https://omegat.org/ja/)を使いました。

* 原文と訳文を上下に並べて表示
* 既に翻訳した文と似た文が出てきたら、翻訳済みのものを参考訳文として表示
* 用語集に入れておいた語句を自動表示
* 機械翻訳との連携
* 翻訳の進捗（翻訳済み文節数など）の統計
* git連携による自動コミットやグループ翻訳

などの機能があります。

過去にUI翻訳（似た文が頻出し表記ゆれに厳しい）で使って非常に有用だった経験がありました。今回はそれとは原文がだいぶ違った形なので使うべきか迷いましたが、結果としては大いに役立ちました。

### 環境構築

1. [OmegaTをダウンロード](https://omegat.org/ja/download)してインストールする。
    * 通常版・最新版のどちらでも良い。ただし、複数のPCで作業する場合はバージョンを揃えておくのが良さそう。
    * インストーラーの種類で迷ったら各OS用のJRE付きのものを選ぶのが無難。
    * macOSではhomebrewで通常版がインストールできる。
    * Windowsではwingetで最新版がインストールできる[ようにした](https://github.com/microsoft/winget-pkgs/pull/94593)。
    * Linuxではディストリビューションによってはパッケージが古いことがあるようなので要注意。
1. [Okapi Filters plugin](https://okapiframework.org/wiki/index.php?title=Okapi_Filters_Plugin_for_OmegaT#Download_and_Installation)をインストールする。
    * markdownなどの、OmegaTが直接サポートしていないファイル形式を扱えるようになる。
    * ダウンロード・展開し、jarファイルを`plugins`ディレクトリーに入れる。
    * `plugins`ディレクトリーのパスが分からない場合は、OmegaTのメニューから「設定」→「設定フォルダー」を使って調べられる。
1. 機械翻訳との連携の設定（必要に応じて）
    * OmegaTのメニューの「設定」→「環境設定」→「機械翻訳」で
        * 「翻訳を自動的に取得する」にチェックを入れる。
        * 利用したいサービス名を選択し、右欄にチェックを入れる。
        * サービスごとに「設定」ボタンを押してAPIキーなどを設定する。
1. gitレポジトリの設定
    * OmegaTで翻訳中は定期的に自動でコミットとプッシュが行われる。
      また、訳文生成前とプロジェクトを閉じるタイミングでも行われる。
    * ヘルプの[日本語版](https://omegat.sourceforge.io/manual-standard/ja/)では使い方の説明がないが、[英語版](https://omegat.sourceforge.io/manual-standard/en/howtos.html#howto.setupteamproject)には載っている。

### 原文の準備

もともとLaTeXソースを[有志によるPDF版のレポジトリ](https://github.com/hmemcpy/milewski-ctfp-pdf)から持ってきて翻訳していたけど、OmegaTのLaTeXパーサで分節化がうまくいかなかった（詳細は忘れた）ので、途中からmarkdownに変えました。

LaTeXからmarkdownへはsedでざっくり変換したあと、大量の修正を手作業で行いました。pandocでやれれば良かったけど、今回の原文ではすんなりいかないらしい。

### 訳文のスタイル

#### 敬体か常体か

いわゆる「です・ます」対「である・だ」。今回は文末は「だ」で統一、文中のみ場合によっては「である」を許すことにしました。根拠といえるほど深い理由はないですが、専門書寄りなので簡潔な文体にしたかったからです。

#### 訳語や表記のゆれ

上の項目とも関連しますが、準拠すべきスタイルガイドを最初に決めて、きっちり従うのが良いです。作業中はつい、スタイルで迷っても確認せずに翻訳を進めてしまうことが多く、後々修正するのが大変でした。

OmegaTで「ツール」→「品質チェック」を使ったり、JTF日本翻訳連盟の[日本語スタイルチェッカー](https://www.jtf.jp/tips/stylechecktool)などを活用し、訳文の品質をこまめに確認するのが良いです。

また、ゆれが起きやすい語については早い段階で単語登録すると便利です。

* 例：equivalent = 等価（同値ではなくこちらに統一）

### ひととおり翻訳した後のチェック

目視確認は、OmegaT上でも良いけど、できるだけ最終フォーマットに近い形（epub化して電子書籍リーダーで読むなど）で確認した方がミスに気付きやすいようです。蛍光ペン機能のあるepubリーダーアプリで通勤電車の中でチェックしたりしてたな…。

確認しながらその場で修正するためにOmegaT上でやるなら、フォントを等幅・ゴシックからプロポーショナル・明朝体に変えるだけでも多少は効果があります。

### 反省点・はまったところ

#### 翻訳済みの原文を途中で大幅に改変してしまった

前述のとおり、途中でLaTeX→markdownに変えました。既に翻訳していた文節は訳文候補として表示されるので完全に無駄にはなりませんが、微妙に異なる部分をちまちま修正する必要が出ました。

ただし、まったく新規の原文ファイルを追加するのは何の問題もありません。

#### 検索・置換で前方参照が使えなかった

普段vimでテキスト編集するときには正規表現の前方参照をよく使うのですが、OmegaTでは使えず不便でした。OmegaTの[取扱説明書](https://omegat.sourceforge.io/manual-latest/ja/appendix.regexp.html)には載っていないけど「幅ゼロの肯定先読み」などなら使えたのでそっちで何とかしました。この話題については別記事を書きたいと思います。

あとで知ったけどVS Code標準機能の検索でも同様なんですね…。VsVimばかり使っていたから気付きませんでした。

#### 既に日本の出版社が原著者にコンタクトしていた

しかも[2018年11月時点](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/#comment-95081)で。ただ、話は進んでないのではないかと推察します。

よりにもよって翻訳が終わったあとで気付いたので複雑な気分…。先に知ってたら手を付けなかったと思います。

[原著者に問い合わせ](https://github.com/ktgw0316/milewski-ctfp-markdown/issues/2)したところ、この記事の初版投稿後に

* 出版の予定はない
* 翻訳の公開は問題ない

との返事をもらえました。一安心です。

## 翻訳の参考にした文献（主なもののみ）

圏論に関して:

* ソーンダース・マックレーン『[圏論の基礎](https://www.maruzen-publishing.co.jp/item/?book_no=294317)』
    * 原書 "[Categories for the Working Mathematician](https://ci.nii.ac.jp/ncid/BC14664856)"
* 西郷甲矢人・能美十三『[圏論的集合論―集合圏とトポス](https://www.gensu.jp/product/%E7%B7%9A%E5%9E%8B%E4%BB%A3%E6%95%B0%E5%AF%BE%E8%A9%B1-%E7%AC%AC%EF%BC%91%E5%B7%BB%E5%9C%8F%E8%AB%96%E7%9A%84%E9%9B%86%E5%90%88%E8%AB%96-%E9%9B%86%E5%90%88%E5%9C%8F%E3%81%A8%E3%83%88%E3%83%9D%E3%82%B9/)』
* 谷村省吾「[物理学者のための圏論入門](https://nagoya.repo.nii.ac.jp/records/30360)」
* [檜山正幸のキマイラ飼育記](https://m-hiyama.hatenablog.com/)
* [https://cympfh.cc/aiura/]()
* [https://ziphil.com/diary/mathematics/]()

pandoc, markdownの使い方に関して:

* [Pandoc User’s Guide 日本語版](https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html)
* [PandocMarkdownのdivとspan](https://qiita.com/uesseu/items/1c0033629d3fd1ff6bf5)

翻訳・推敲に際して（随時追記予定）:

* 石黒圭『[文章は接続詞で決まる](https://www.kobunsha.com/shelf/book/isbn/9784334034733)』

## おわりに

詳しくない分野の書籍1冊を翻訳するのは、思った以上に大変でしたが、良い経験になりました。…と言っても、まだまだ推敲が終わってないので先は長いです。