楔形文字本を支える技術

ゆーです。
技術書典7で「楔形文字とユニコードの出会いにまつわるエトセトラ」という本を頒布します。
古代メソポタミアで使われた文字、楔形文字のユニコード符号化について書いたものです。

![表紙2mini.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110629/2cad0a11-2b97-d89d-8516-45329f55bf52.png)

さ-06D、mystt(ミスット)というサークルになります。サークル情報はこちらです。
https://techbookfest.org/event/tbf07/circle/5717193912221696

本書の執筆でえられた知見がいくつかあるのでまとめておきます。

## re:view

組版にはre:viewを使いました。出力はtex経由のpdfとします。
動作環境はWindows10のWSL2で導入したUbuntu18.03で、当初はdocker経由でreviewとtexliveを使っていたのですが最新版への追従のため両方ともローカルにインストールすることにしました。

後述するフォントとユニコードの懸念もあり、cssとhtmlで組版するvivliostyleにも興味があって[「技術書典６に向けての Re:VIEW+CSS組版 環境構築」](http://at-grandpa.hatenablog.jp/entry/2019/01/20/183940)を参考にトライしたのですが、自分の環境ではpdfの出力に成功せず断念しました。


## lualatex + jlreq

本書は当然ながら文中に楔形文字が頻出します。

review-initのデフォルト設定でセットアップした場合、クラスファイルとしてjsbook、texエンジンにはpLatex2eが使われます。この環境で楔形文字のフォントを設定して文字を表示するにはどうすれば……と悩んでいたところ、re:view作者のkmutoさんからアドバイスを頂き、親切にもサンプルプロジェクトファイルまで用意してもらえました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">review-jlreqのほうはLuaLaTeXでもそのまま利用できますが、cuneiformはやっぱりイバラの道ですね… <a href="https://t.co/zF1RNSk6d1">https://t.co/zF1RNSk6d1</a></p>&mdash; kmuto (@kmuto) <a href="https://twitter.com/kmuto/status/1161575260719681542?ref_src=twsrc%5Etfw">August 14, 2019</a></blockquote> 

それがクラスファイルとしてjlreq、texエンジンにはlualatexを使うというものです。lualatexでは内部文字コードにユニコードを使用しており、フォントもotfやttfのファイルを容易に設定できるのです。

ここでは最初から環境を整える手順を記します。
まず、review-init時に引数を加えてjlreqを指定します。

```shell
$ review-init --latex-template review-jlreq myproject
```

jlreq.clsはgithubから最新のものをダウンロードします。

```shell
$ cd myproject/sty
$ curl -O https://raw.githubusercontent.com/abenori/jlreq/master/jlreq.cls
```


re:viewではconfig.ymlで下記のように設定することでtexエンジンを切り替えることができます。

```yaml
# LaTeX用のコマンドを指定する
texcommand: "lualatex"
# LaTeX用のdvi変換コマンドを指定する(dvipdfmx)
dvicommand: "null"
```

楔形文字用のフォント(例えば[Notoプロジェクト](https://www.google.com/get/noto/)のNoto Sans Cuneiform)を導入します。

```shell
$ sudo mkdir /usr/share/fonts/cuneiform
$ sudo cp NotoSansCuneiform-Regular.ttf /usr/share/fonts/cuneiform
$ fc-cache -f
$ sudo luaotfload-tool --update
```

楔形文字を表示するreviewコマンド`@cu`を作ることにします。コマンドを追加することで、他のフォントでも楔形文字を表示できます。同じポイント数でもフォントによっては文字のサイズが小さく表示されてしまうものがあったので、文字の大きさを指定する`LARGE`や`Huge`などのマクロも付加しています。

```ruby:review-ext.rb
module ReVIEW
  module LATEXBuilderOverride
    # Noto Sans Cuneiformフォントで楔形文字を表示するコマンド
    Compiler.definline :cu
    def inline_cu(s)
      macro('textcuneiform', s)
    end

    # Santakkuフォントで楔形文字を表示するコマンド
    Compiler.definline :cusantakku
    def inline_cusantakku(s)
      macro('textcuneiformSantakku', macro('Huge', s))
    end
```

```tex:review-custom.sty
\newfontface{\cuneiform}[Scale=MatchUppercase]{NotoSansCuneiform-Regular}
\DeclareTextFontCommand{\textcuneiform}{\cuneiform}

\newfontface{\cuneiformSantakku}[Scale=MatchUppercase]{Santakku}
\DeclareTextFontCommand{\textcuneiformSantakku}{\cuneiformSantakku}
```



## トランスリテラルの表示

楔形文字をラテン文字（アルファベット)で表記することを翻字（transliteration)といいます。

例えば𒄞という文字はgu4と表記します。この4というのはguと読むたくさんの文字の中の4番目という意味で、同音異字が非常に多い楔形文字の翻字特有の記法です。通常この添字は下付きで表記します。また、単語の前後に「神」や「地名」などその単語の属性を示す文字を付記することがあり、この文字は読むときには発音されないため上付きで書く習慣があります。このような記法を表現するためのコマンド`@tl`も作りました。

```ruby:review-ext.rb
module ReVIEW
  module LATEXBuilderOverride
    # @cuなどは省略
    
    # トランスリテラルをいい感じに表示するコマンド
    Compiler.definline :tl
    def inline_tl(s)
      s2 = s.gsub(/([^\dx])([\dx]+)/, '\1\\textsubscript{\2}')
      s3 = s2.gsub(/\((.+)\)/, '\\textsuperscript{\1}')
      macro('texttt', s3)
    end

```

これらを使用することで、このように自由に楔形文字やトランスリテラルを表現することができるようになりました。

``` cuneiform.re
=== アッカド語とシュメール語
(略)
@<tl>{u2-še-piš BAD3 ša2 UNUG(KI) su-pu-ri}

@<cu>{𒌑𒊺𒄫𒂦𒃻𒀔𒆠𒋢𒁍𒊑}

この例@<fn>{simo}では@<tl>{BAD3}がシュメール語で壁を、@<tl>{UNUG(KI)}がウルク市を意味する語です。
アッカド語ではこれらをそれぞれdūru、Urukと読みました。
```
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110629/13e3f552-4975-ddcb-d091-5d8e704358a1.png)



## 地図の作成

メソポタミア文明について書かれた本のほとんどには最初にオリエント地方の地図が掲載されています。読者から遠く離れたこの地を少しでも身近に感じてもらうためには、必須といっていいでしょう。本書でも同じような地図を掲載したかったのですが、著作権的にクリアなオリエントの地図が見つからないため、自分で作図することにしました。

使用するソフトはPTOLEMY(トレミー)というシェアウェアです。
http://atlas.cdx.jp/software/ptolemy.htm

ちなみにシェアウェアとは主にオンラインで配布される（多くは個人開発による）ソフトウェアのうち有償のものを指す言葉です。最近あんまり呼ばなくなりましたね。

![ptolemy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110629/6f45ab9b-1571-4de2-cff8-e642d98c92e6.png)

このソフト、ただ地図を表示するだけでなく、縮尺や投影図法、表示するオブジェクト（地名や地形図など）を自由に設定して思い通りの地図を作図することができるのです。

今回は下記のような方針で作図することにしました。

* 現代の都市名・国家名は表示しない
* 山脈や河川などの地名は表示する
* チグリス川・ユーフラテス川の名前は特に大きく表示する
* 低地を薄く、山地を濃い色でモノクロの表示とする。
* 本文で参照する古代の都市名をいくつか追加する。
* 地図の範囲は西はヒッタイトとエジプト、東はザグロス山脈までとする

このようにして出来あがったのがこの地図です。右上の世界地図はPTOLEMYで出力した後で入れたものです。理想通りの仕上がりで大変満足です。

![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110629/22d3db52-8ae8-61fe-240e-eb8912f0701a.png)