Kinx ライブラリ - 自動組版(Tiny Tyesetting)

# はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。今回は Tiny Typesetting 最新情報です。[**これ**](https://qiita.com/Kray-G/items/7dca6f2abb538500092d) の続きです。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。

ココんトコロ、こればかりやってました。はい。一先ず最初にやりたかったことはある程度できるようになりましたので、公開します。

ライブラリというより、単機能として使用できるよう KiTTy って名付けてあります（今時点では）。`kxkitty.exe` (Windows) と `kxkitty` (Linux) という実行コマンドも用意しています。

ひとまず、マニュアルをエッサホイサと作ったので、それを参照してみてください。マニュアル自体を KiTTy で作成しています（日本語と英語両方作るのは大変だった...）。ここでは日英両方載せておきます。英語はざざーっと仕上げることを優先したので、かなり自信ありません。

元のファイルはこれです。

* https://github.com/Kray-G/kinx/blob/master/examples/typesetting/KiTTy_jp.md
* https://github.com/Kray-G/kinx/blob/master/examples/typesetting/KiTTy_en.md

これを KiTTy 処理すると以下のようになります。自信はないですが、英語版も載せておきましょう。

* https://github.com/Kray-G/kinx/raw/master/examples/typesetting/KiTTy_jp.pdf
* https://github.com/Kray-G/kinx/raw/master/examples/typesetting/KiTTy_en.pdf

どうでしょう?

ちなみに処理速度は今のところ遅いといえば遅いのですが、私個人的にはまぁ我慢できます（私の子なので贔屓目だとは思います）。実行速度を向上できるだろう改善のアイデアはあるのですが、ちょっと時間的な余裕がないのでしばらくはこのままでしょう。あらかじめご容赦いただけるよう先に謝っておきたいと思います。すみません。

# 使っている技術情報などなど

## サポート機能一覧

マニュアルにも載せていますが、KiTTy は組版機能として以下の機能をサポートしています。なお、カーニングは現在サポートしていません。詳しくはマニュアルを読んでみてもらえると嬉しい。

*   基本組版機能
    *   ハイフネーション・ジャスティフィケーション・行分割
    *   ウィドウ／オーファン
    *   マルチカラム
    *   箇条書き
    *   数式
    *   イメージ
    *   グラフ（チャート）
    *   テーブル
    *   フォント
    *   色
    *   合字・特殊文字
    *   プログラム・コード
    *   タイトル・カバーページ・目次
    *   見出し
    *   相互参照
    *   引用
    *   脚注
* 日本語用組版機能
    *   日本語禁則処理
    *   日本語ルビ
* PDF 機能
    *   外部リンク
    *   相互参照リンク
    *   しおり

日本語組版機能も一部サポートしています。ルビも振れます。縦書きはサポートしていません。

## 主要な個別技術情報

せっかくの技術ブログなので、技術情報を少々。

### Knuth-Plass Line Breaking Algorithm

LaTeX で使われている行分割のアルゴリズムです。ハイフネーション処理をした後、個別の Box 単位に Glue と Penalty を挿入し、Penalty が最小になる位置で改行するようにコントロールします。

技術的な詳細は、日本語だと以下が参考になるでしょう。

* https://blog.antenna.co.jp/ILSoft2/archives/tag/%E8%A1%8C%E5%88%86%E5%89%B2

また、実装は、以下(BSD-2-Clause License)を修正して利用させていただきました。**見た目は JavaScript** の本領発揮です。

* https://github.com/bramstein/typeset/

### 数式

LaTeX を目指す（目指してはいませんが）なら数式が必要です。そこで、JavaScript には KaTeX とか MathJax とかあるので、ここでも **見た目は JavaScript** の特長を生かして進めようと思いましたが、細部（フォントとか CSS が必要とか）が違い過ぎて **無理でした**。なので、ここでは **Duktape + KaTeX** で実装しました。**が、しかし、レンダリングで躓き**、結局最終的には **Phantomjs** ベースで画像化します。Duktape は必要だったのか、という気もしますが、Duktape は他でも使いようがあるかもしれないので、まぁこのままでいいかな、と実装はステイにしました（修正する時間もあまりなく）。

なお、今時点で **Phantomjs を使うのは微妙**、という声もちらほらググると出てきますが、動いているので良しとします。node.js とか Chrome とか使わずに単一コマンドでできるのでライブラリ内に閉じて良いと思ってますが、他の手段でも「そう（単一コマンドだけで閉じる感じに）できますよ」という情報があれば下さい。

### Chart.js

**Phantomjs を内蔵した**ので、色々できるのでは、と最初にチャレンジしたのがうまくいきました。文書内に自由にチャートをかけるのは非常に便利な気がします。というか便利ですよね。

ちなみに、気をよくして Mermaid.js を組み込もうとして失敗しています（UMLとか書けるといいなー）。そのうち再チャレンジするかもしれません。

### その他

その他も紹介できそうなものは色々ありそうですが、時間的制約から本日はここまで。

## インストール方法

インストール方法もマニュアルに載っていますが、紹介しておきます。元が Markdown なので、基本コピーな感じでいけますね（ちょっと修正が必要ですが）。

インストールは以下の 2 ステップを実施します。

1. Kinx のインストール
2. KiTTy 追加モジュールのインストール

ちなみに、Kinx コアモジュールは 8.5～9M 程度ですが、KiTTy 追加モジュールは（フォントとかも含まれていて）74M くらいあります。[**ここ(リリースページ)**](https://github.com/Kray-G/kinx/releases) の Assets を見ると分かります。パッケージマネージャーを作るのは大変なので、全部コアに入れない方法を模索しました。パッケージマネージャー相当は今後用意したいですが、今はこの方法で。

### Linux

Linux では以下のようにモジュールをダウンロードします。
`v0.15.2` は KiTTy ライブラリが正式に追加されたバージョンです。
最新バージョンを使用する場合は書き換えてください。
ワークディレクトリを作成し、移動してください。

```
$ mkdir temp
$ cd temp
```

最初に kinx モジュールをダウンロードし展開し、
次に KiTTy パッケージをダウンロードして展開します。

```
$ curl -L \
    https://github.com/Kray-G/kinx/releases/download/v0.15.2/package_linux-amd64.tar.gz \
    --output package_linux-amd64.tar.gz
$ tar -xvf package_linux-amd64.tar.gz
$ curl -L \
    https://github.com/Kray-G/kinx/releases/download/v0.15.2/package_kitty.zip \
    --output package_kitty.zip
$ unzip package_kitty.zip
```

展開するとバージョン番号のフォルダができますので、
移動して `install.sh` コマンドを実行します。

```
$ cd v0.15.2
$ sudo ./install.sh
```

これでインストールは完了です。
実行フィルの位置[^exe]を確認してみましょう。

```
$ which kxkitty
/usr/bin/kxkitty
```

[^exe]: マニュアルだと `kinx` の場所を探してますね。こちらであるべきでしょう。そのうち直します。

### Windows

Windows では [Release ページ](https://github.com/Kray-G/kinx/releases) から最新のパッケージ（以下 2 点）をダウンロードします。

*   package_win64.zip
*   package_kitty.zip

それぞれ展開し、`package_kitty.zip` の中身を lib フォルダ配下にコピーします[^winbuild]。

> その際、lib 配下に fonts、phantomjs フォルダが配置されるようにしてください。
> 圧縮ファイル内のファイル構成が必ずしもそうなっていない可能性があります。

[^winbuild]: 現時点でインストーラは用意できていませんが、将来的に Windows インストーラを用意する予定です。

## ビルド

通常、ビルドから実施する必要はありません。
既にビルドされた実行モジュールが提供されており、手順にしたがってインストールを実施することで本システムを利用することができます。
あえてビルドから実行したい、といった場合は以下の手順によってビルドを実施できます。

### Linux

Github よりクローンし、make します。

```
$ git clone https://github.com/Kray-G/kinx.git
$ cd kinx
$ make
```

インストールします。

```
$ git clone https://github.com/Kray-G/kinx.git
$ cd kinx
$ sudo make install
$ sudo make kitty-install
```

### Windows

Github よりクローンし、make します。

```
$ git clone https://github.com/Kray-G/kinx.git
$ cd kinx
$ make.cmd
```

特に現在はインストール用のコマンドを用意していませんが、
ビルドした環境で使用可能です。
ビルドした環境でご使用ください。

## hello, world

次の文書を作成し、`helloworld.md` ファイルとして保存します。

```
% Hello Kinx Tiny Typesetting
% Your name
% October 7, 2020

<param style="ArticleA4"/>

# Greeting
hello, world
```

以下のように `kxkitty` コマンドを実行することで、`helloworld.pdf` が作成されます。

```
$ kxkitty helloworld.md
```

なお、現在はサンプル程度の記載が必要ですが、
もう少しシンプルなサンプルを提示できるよう改善する予定です。

# おわりに

多少なりとも「まぁまぁいいんじゃない？」と思いましたら、GitHub スターくれると嬉しいです（いつも同じこと言ってますが）。また、**これまで色々と応援してくださっている方々にもあらためて感謝**します。ちょっと更新が遅くなり気味な近頃ですが、ちょっとずつ進めていきたいと思いますので、GitHub 上で Issue なり Pull Request なりいただけると大変有難く思います。

では、今後ともよろしくお願いいたします。