Windows 11 + WSL2ならKeTCindyがDockerコンテナ上で簡単に動かせるらしい

# はじめに

どうも，KeTCindyはいいぞおじさんと申します．本稿では，動的幾何学ソフトCinderellaを用いて作成された図形を${\rm\LaTeX}$に出力できるKeTCindyをDockerコンテナ上で動作させる方法を紹介します．

## この記事に書いてあること

+ KeTCindyをDockerコンテナ上で動かし，出力されたPDFファイルを閲覧する方法

## この記事に書いていないこと

+ WSL2やDockerの使用方法
+ Windows 11 + WSL2以外でのCinderellaの動かし方

## KetCindyとは

冒頭で述べたように，KeTCindyとは動的幾何学ソフトCinderellaを用いて作成された図形を${\rm\LaTeX}$に出力するためのシステムのことです．「GUIアプリケーションで作成した図形を${\rm\LaTeX}$に取り込む」というだけであればいくつか似たようなシステムは存在します．筆者が個人的に一番すごいと感じるのは，陰線処理された3次元図形を出力できることです（下の図のようなイメージ）．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/10378fbb-7dc0-812a-d83a-15c8396e421f.png)

その他のサンプルや利用方法に関しては公式ホームページ[^1]を参照してください．また，GitHubリポジトリ[^3]にもたくさんの資料があります．

[^1]: https://s-takato.github.io/ketcindyorg

Dockerコンテナ上で動かす方法は公式ではサポートされていないようですが，Linux向けの導入方法を`Dockerfile`上で再現することで比較的容易に導入できたので紹介します．


## 動作環境

筆者が使用している環境です．これ以外の環境（特にWindows 11 + WSL2の部分）では，Dockerコンテナとして導入したGUIアプリケーションを動かすのに多少の苦労が伴うと思われます．

+ Windows 11 Professional
+ WSL2 (Ubuntu 22.04 LTS)
+ Rancher Desktop

# 導入方法

導入は，大きく分けて以下のステップで行います．

1. `Dockerfile`作成，コンテナ作成
1. 初期設定

後者の初期設定は`Dockerfile`への記述でスキップできそうな気がしましたが，難しそうだったので断念しました．
よいアイデアがあれば教えてください．

## `Dockerfile`作成

以下のような`Dockerfile`を作成します．

```Dockerfile:Dockerfile
FROM texlive/texlive:latest

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
	wget \
	tar \
	jq \
	r-base \
	maxima \
	gcc \
	evince \
	pkexec \
	sudo

# Cinderellaのアーカイブをダウンロードして解凍
RUN wget https://beta.cinderella.de/Cinderella-3.0b.2089.tar.gz -O /tmp/Cinderella-3.0b.2089.tar.gz \
	&& tar -xzf /tmp/Cinderella-3.0b.2089.tar.gz -C /opt \
	&& rm /tmp/Cinderella-3.0b.2089.tar.gz

# /opt/cinderellaにパスを通す
ENV PATH="/opt/cinderella:$PATH"

# keTcindyの最新リリースをダウンロードして解凍
RUN LATEST_RELEASE=$(wget -qO- https://api.github.com/repos/ketpic/ketcindy/releases/latest | jq -r '.tag_name') \
	&& wget https://github.com/ketpic/ketcindy/archive/$LATEST_RELEASE.tar.gz -O /tmp/ketcindy-$LATEST_RELEASE.tar.gz \
	&& tar -xzf /tmp/ketcindy-$LATEST_RELEASE.tar.gz -C $HOME \
	&& rm /tmp/ketcindy-$LATEST_RELEASE.tar.gz
```

1. KetCindyの動作には${\rm\LaTeX}$が導入されている必要があります．ここでは，DockerイメージとしてTeX Liveを導入しています．
2. 次に，`apt-get`コマンドを用いて必要なパッケージを導入しています．`wget`から`jq`までは`Dockerfile`内に記載した後段の作業を行うため，`r-base`から`evince`まではKetCindyの動作のため，`pkexec`と`sudo`はKetCindyが内部で使用しているスクリプトを動作させるために導入しています．
3. 次に行うのはCinderellaの導入です．Cinderellaは`apt-get`コマンドでは導入できないため，公式ホームページ[^2]から取得しています．バージョン番号の部分は適宜書き換えてください．
4. Cinderellaの導入後はパスを通しておきます．必須というわけではありませんが，あると便利でしょう．パスを通さずにCinderellaを起動する場合は`/opt/cinderella/Cinderella`とコマンドを叩いてください．
5. 最後に，KeTCindyのGitHubリポジトリから最新リリースを取得します．GitHubのAPIを利用して最新のタグを取得し，そのタグ名のリリースを取得するという流れになっています．

`Dockerfile`を作成した後はDockerコンテナをビルドし，コンテナの中に入りましょう．入り方は自由ですが，筆者はVisual Studio CodeのRemote Container機能を利用しています．

## 初期設定

作成したコンテナにログインした状態で，ターミナル上で以下のコマンドを実行してCinderellaを起動します：

```sh
$ Cinderella
```

すると，Cinderellaの画面が立ち上がります[^4]．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/45b40e69-01c1-1849-b057-c247d5d3ae7d.png)

Cinderellaの画面から「File」→「Open」を選択し，`~/Ketcindy-<tag名>/doc`以下にある`ketcindysettings.cdy`を開きます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/be8549dd-8741-068b-4c95-4b742e1dcd58.png)

「Lang」「Tex」「Grahpic」ボタンはクリックするたびに値が切り替わるので，好みのものに変えます．ここではそれぞれ「j」「lualatex」「tikz」としました．

真ん中の「TexLive」「Kettex」「Ketjs」は適切なものを選択します．本稿ではTeX Liveを使用しているので，「TexLive」を選択します．

右側の「Mkinit」「Update」「Work」については，この順にボタンをクリックすることで初期設定用のスクリプトが走ります．この環境では途中の「Update」をクリックしたときにエラーが発生しますが，特に気にせず実行してください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/ff3497b6-5615-1058-a1e7-70dfb14f6ea2.png)

「Work」ボタンまでクリックしたのち，先ほど「Update」ボタンクリック時にエラーが発生して行えなかった処理を手動で実行します．

```sh
$ cd ~/ketcindy-<tag名>/doc/fig
$ R --vanilla --slave < update.r
```

これで初期設定は完了です．

[^2]: https://beta.cinderella.de
[^3]: https://github.com/ketpic/ketcindy
[^4]: さらっとやってますが，ウインドウが平然とWIndowsのものとして出てくるのは実はとてもすごいことです．


# 動作確認

初期設定時に生成されるワークディレクトリには，いくつかのテンプレートファイルが同梱されています．Cinderellaの画面から「File」→「Open」を選択し，`~/Ketcindy<年月日>/templates`以下から適当な`.cdy`ファイルを選択して開きます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/edfc9dc6-a867-bed2-a993-e7f6c1953b0c.png)

右上の「Figure」ボタンをクリックしてPDFファイルが開かれれば環境構築成功です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/15e258a7-ad8a-efae-3dbb-dc6640a2bf9b.png)

最終成果物としてのPDFファイルだけでなく，途中の`.tex`ファイルも`templates/fig`以下に格納されており，取得可能です．

ちなみに`09surfaceC.cdy`では「Scripting」→「Edit Scripts」からスクリプトエディタを開き，4行目の`Xyzax3data`関数の呼び出しにオプション引数`a1`を加えると，座標軸に矢じりを生やすことができます[^5]．Cinderella上の画面でも生成されたPDFでも矢じりが生えています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/46aa5002-2b43-7b9d-4c21-e8a4133178b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/fa7cd137-8173-639f-dc10-e3f920b55dd6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784698/327e5a25-75aa-995b-eeb1-74104411400b.png)


[^5]: 公式ドキュメントにはデフォルトで矢じりが生えると書いてあったのですが，筆者の環境では明示的に指定しないと生えませんでした．