Sagemath のバージョンアップごとの SageTeX と TeXShop の設定を簡単にするにはアプリにシンボリック・リンクを張ること

SageTeX を TeXShop で使う場合, Sagemath のアップデートのたびに TeXLive と TeXShop のファイルを修正することになってしまうという事象に対処を試みます. 現行の Sagemath の枠組の中で苦し紛れの対策をしたところ, 簡単な SageTeX ソースは TeXShop からコンパイルすることができました.

長期間使うと様々な状況に遭遇してボロが出てくる可能性は残っていますが, 現状を報告します.

この記事は [SageTeX を TeXShop で使うために Sagemath のバージョンを TeXShop に登録すること](https://qiita.com/rana-aerea/items/468f221bbab18131316e) の執筆の際してマニュアルを読み返した時に湧いた疑問の調査報告です.
## 確認した環境
* 作業記録の日付は2020年01月17日〜20日
* macOS Mojave 10.14.6
* TeXLive2017+TeXShop (奥村晴彦／黒木祐介 著 改訂第7版 LaTeX2ε 美文書作成入門) mac風インストール
* SageMath-8.9 (ディストリビューションは `sage-8.9-OSX_10.14.6-x86_64.app.dmg` で同梱の SageTeX は `2019/01/09 v3` )
* インストールして使用していた SageMath-8.9 を削除してからの実験

## macOS の Sagemath アプリとSageTeX関連ファイルのフォルダーにシンボリック・リンクを張ります
既にインストールしてある `SageMath-8.9.app` を使う場合を例にして解説します. TeXShop もインストール済とします.

### ステップ1:  管理者アカウントでログインします.
### ステップ2:   (管理者アカウント) Sagemath アプリにシンボリック・リンクを張ります.

具体的にはTerminal.app で1行コマンド

```console
    myhome$ ln  -s  /Applications/SagMath-8.9.app    /Applications/SageMath.app
```

を実行します.
### ステップ3:   (管理者アカウント) Sagemath アプリを1回起動します.
Sagemath アプリを本体 (SageMath-8.9.app)から起動するかシンボリック・リンク(SageMath.app)から起動するかして初回の起動を行います. 初回の起動により, Sagemath のアプリがシステムにローカライズされます. シンボリック・リンクからの起動で大丈夫だということは確認済です. 

検証の後の開発元が未確認とのダイアログで `OK` をクリックして, システム環境設定のセキュリティとプライバシーを開いて開発元が未確認の SageMath-8.9.app の実行を `このまま開く` ボタンのクリックで許可して, 再び検証の後に開発元が未確認とのダイアログで `開く` をクリックしました. その後5分ぐらいしてから `loading-page.html`  や Jupyter のログイン画面が Safari に出てきましたので, Safari と Sagemath を quit しました.

2018年のmacBookPro 13inch Touch Bar モデルの場合, ディスク・イメージのマウントから `loading-page.html` までで 45分ぐらいかかりました.

新規インストールの場合は他にも様々なダイアログが出てくる可能性があります. 
### ステップ4:   (管理者アカウント) TEXMFLOCAL にフォルダー・ツリーを作ります.

これは, フォルダー  ` /Users/Shared/TeXLive/texmf/tex/latex` が無かった場合の対応です. このフォルダーがある場合はステップ4をスキップして下さい.
このフォルダー名のテンプレートは  ``TEXMFLOCAL/tex/latex/sagetex'' です.

具体的にはTerminal.app で

```console
    myhome$ mkdir  /Users/Shared/TeXLive/texmf/tex
    myhome$ mkdir  /Users/Shared/TeXLive/texmf/tex/latex
```

というコマンド2行を実行します. ただし, `/Users/Shared/TeXLive/texmf` は下記のコマンドで出てくるフォルダーです.

```console
    myhome$ kpsewhich  kpsewhich  -var-value=TEXMFLOCAL
    /Users/Shared/TeXLive/texmf
```

出力も2行目に引用しておきました.
### ステップ5:    (管理者アカウント) SageTeX 関連ファイルのフォルダーにシンボリック・リンクを張ります.

`/Users/Shared/TeXLive/texmf/tex/latex/sagetex` がある場合は, このフォルダーを退避しておいて下さい. (このフォルダーのテンプレートは `TEXMFLOCAL/tex/latex/sagetex` です.)
そして, Terminal.app で 1行コマンド

```console
    myhome$ ln   -s   /Applications/SageMath.app/Contents/Resources/sage/local/share/texmf/tex/latex/sagetex   /Users/Shared/TeXLive/texmf/tex/latex/sagetex
```

を実行します. (`/Users/Shared/TeXLive/texmf` は先ほどのフォルダーと同じです.)
コマンドのテンプレートは

```console
打ち込み不可 myhome$ sudo ln -s /Applications/SageMath.app/Contents/Resources/sage/local/share/texmf/tex/latex/sagetex TEXMFLOCAL/tex/latex/sagetex
```

です.

このステップは [SageTeXのスタイルファイルはSagemathのdistributionからインストールすること](https://qiita.com/rana-aerea/items/1d30c2dc4782416737d0) に記載のファイル群の配置に代わる作業です.
### ステップ6:    (管理者アカウント) TeX のデータベースを更新します.
具体的には, Terminal.app で

```console
    myhome$ sudo texhash
```

というコマンドを実行します.   ` texhash` の実行を忘れると SageTeX ソースがコンパイルできないことを確認しました. テンプレート ` texhash TEXMFLOCAL` の方を使うと, データベースの更新を行うフォルダーを減らすことが出来るという仕様になっているようです.「改訂第7版 LaTeX2ε 美文書作成入門」の DVD からの mac風インストールの場合は `sudo`  なしの `texhash` で大丈夫のようです.
### ステップ7:   TeXShop の使用者アカウントにログインします.
### ステップ8:   (TeXShop の使用者アカウント) エンジンを配置します.

具体的には,  ファイル `~/Library/TeXShop/Engines/Inactive/Sage/sage.engine` を `~/Library/TeXShop/Engines/`にコピーします.

Terminal.app を使うなら

```console
    myhome$ cd   ~/Library/TeXShop/Engines
    Engines$ cp   Inactive/Sage/sage.engine   sage.engine
```

というコマンド2行を実行します.
### ステップ9:   (TeXShop の使用者アカウント) エンジンを編集します.
ファイル `~/Library/TeXShop/Engines/sage.engine` の後ろから5行目にある

```
    /Applications/SageMath-7.6.app/Contents/Resources/sage/sage "$sagename"
```

という行の中のバージョン・ナンバーをデリートします. この行が

```
    /Applications/SageMath.app/Contents/Resources/sage/sage "$sagename"
```

に変わります. 

###  ステップ10:   (TeXShop の使用者アカウントの少なくとも1つ) SageTeX の動作確認を行います. 
簡単な SageTeX ソース (例えば,   [SageTeX を TeXShop で使うために Sagemath のバージョンを TeXShop に登録すること](https://qiita.com/rana-aerea/items/468f221bbab18131316e)  に記載の 2020-01-18-sagetex-by-texshop.tex) をコンパイルして SageTeX の動作確認を行います. テストファイルの条件は SageTeX を使うマジック

```latex
    %!TEX TS-program = sage
```

 が先頭にあって `\usepackage{sagetex}` に加えて SageTeX の機能を実際に使う TeX ソースだということです.
### ステップ11: (管理者アカウント ) 退避しておいた SageTeX 関連ファイル群を処分することが出来ます.
ステップ9 の動作確認が成功した場合は, ステップ5 で退避しておいた `/Users/Shared/TeXLive/texmf/tex/latex/sagetex` をデリートして構いません.
 
### コメント
ステップ7--9 はTeXShop の利用者アカウントごとに行います. 利用者アカウントの数が多い場合は, 編集後の `sage.engine` を共有フォルダーに置いておいて,  TeXShop の利用者アカウントの `~/Library/TeXShop/Engines` にコピーすると能率的です.
## ゲストユーザーというアカウントで使う場合の問題点
ゲストユーザーはログアウトするたびファイルが消えてしまうアカウントです. `~/Library/TeXShop` のフォルダー・ツリーも消えてしまうことを確認しました.

その対策としては, TeXShop のエンジンを共有フォルダー `/Users/Shared` に置いておいて, ゲストユーザーにログインするたびに TeXShopを起動してから, そのエンジンを共有フォルダーから `~/Library/TeXShop/Engines` に配置しなすというものがあります.
## Sagemath をアップグレードしたら アプリのシンボリック・リンクだけ張りなおせば十分です.
Sagemath の新しいバージョンをインストールしたときは, 新しいバージョンの動作テストをしてから, SageMath.app という名前のシンボリック・リンクをデリートしてから新しいバージョンへのシンボリック・リンクを SageMath.app という名前で作りなおせば, SageTeX もアップグレードできてしまいます. その状態で古いバージョンの Sagemath を残したまま SageTeX の方の動作確認もできます. 上手くいかなかった場合はシンボリック・リンクを張りなおして原状復帰することもできます. 
## シンボリック・リンクを使う方法は消去法で出てきました
安直に考えると, SageMath-8.9.app のファイル名を  SageMath.app に変更したくなるところですが, 上手くいきません. Sagemath のソフトは初回の起動時にパッケージ内のファイルの絶対パス名をパッケージ内の `.so` ファイルに書き込むことによってシステムにローカライズします. そのため, Sagemath アプリはファイル名を変更すると動かなくなります.

次の案としては SageMath-8.9.app をインストールしなおして, ファイル名を変更してから初回の起動を行うということが考えられます. これも試してみました. 簡単な SageTeX ソースのコンパイルは確かにできました. ただ, Sagemath はグループで使用して, グループの  Sagemath のノートブックをダウンロードして使うということを想定していますので, グループに合わせてバージョンを変更することが起こるものと考えた方がいいようです. その場合, バージョン・ナンバーをファイル名から削ってしまった Sagemath アプリは使いにくくなってしまいます. というのも, macOS は同じソフトの同じバージョンを複数インストールすると macOS が混乱してしまうからです. 確認した症状は, システム環境設定で実行許可の上でアプリを起動すると何度目の起動でも検証が行われてしまうというものです. 私はその状況の中で `diskUtil` コマンドによるアクセス権修復を行う羽目になってしまいました.

その次に考えたのは, `Finder` でエイリアスを作る方法です. macOS版のエイリアスが unix のディレクトリーの働きをしてくれないため不可となりました.

ハード・リンクによる方法はハード・リンクから初回の起動を行なってしまった場合に複数バージョンの共存が難しくなってしまうため不可となりました. 詳細を説明します. SageMath-8.9.app に SageMath.app というハード・リンクを張って, SageMath.app というハード・リンクで初回の起動を行なってしまった場合 , 後から SageMath-9.0.app をインストールして , SageMath.app というハード・リンクを SageMath-9.0.app に張りなおした場合, SageMath-8.9.app が SageMath-9.0 のファイルを使ってしまい正常に動作できなくなります. そのため, Sagemath 上の自作プログラムの動作を  SageMath-8.9.app と  SageMath-9.0.app で比較してデバッグすることが出来なくなってしまいます.

## マニュアル `About Sage.pdf` の読み方
マニュアル `~/Library/TeXShop/Engines/Inactive/Sage/About Sage.pdf` には Sagemath の開発者向けの提案が書いてあります. "Clever Step" という呼び方になっていますが,  macOS の Sagemath アプリのファイル名をバージョン・ナンバー無しの `Sage.app` でリリースして欲しいという提案です. この部分は, ユーザーサイドで `SageMath-8.9` を `Sage.app` や  `SageMath.app` にファイル名変更することを書いているのではないようです. 実際, `sage.engine` の後ろから 8行目のコメントを見ると最近の SageMath はファイル名変更が出来なくなっていると明言しています.

`Sage` は関数型言語で別のものがある他, Qiita で検索しても Google で検索しても様々な意味の固有名詞が出てきてしまいますので Sagemath へ名称変更になったのは正解だったと思います.