お前らいい加減PDFだけ共有するのはやめろ

# 概要

+ 知見が共有されないからLaTeX文書やSATySFi文書をGoogle DriveなんかでPDFだけ投げるのまじでやめろ
+ 手軽さも考えるとGitHubで丸ごと公開しちゃうのがおすすめ
+ そのときはMITライセンスをくっつけておくのが無難

# 問題提起

最近Twitter上で数学やらなんやらの解説PDFがよく出回ってくる．しかも質が高いものが多く，トッテモトッテモ素晴らしい．一方で，載ってるURLがGoogle Driveなのを見るとちょっとげんなりしてしまう．なぜって？そりゃあPDFだけでソースが回ってこないからだよ．

# いくつかの例

なぜソースが回ってこないのが問題なのか？書くときはどうせ自分で調べればいいんじゃないか？そう思うあなたのためにいくつか例を挙げよう．なお，知っている人にとっては完全に茶番なので読み飛ばすとよい．

あなたは数学に関する何かの解説を眺めていたとする．
$$
x \in \mathbb{R}
$$
とかいう記述はあちこちにみられるであろう．「$x$は実数である」という主張を表現するのに頻繫に使う記号列である．
自分もこういうのを書いてみたいと思えば，当然調べることになる．「LaTeX 黒板太字」なんてワードで検索をかけてみれば

```LaTeX
x \in \mathbb{R}
```

と書けばいいのだということがわかる[^amssymb]．これで一件落着である．
...ちょっと待ってほしい．上のコードには**`\mathbb{R}`が実数全体の集合を表すのだという情報は一切含まれていない！**
これは非常によろしくない．どうにか解決したいところだが，その解決策は実はとても単純である．
プリアンブルに

```LaTeX
\newcommand\Real\mathbb{R}
```

と記述するだけである．ところが，このような記法を表立って推奨している人はあまり多くはない[^example]．嘆かわしい限りである[^pkg]．

「俺は数学やるわけじゃないしな」なんていうあなたのためにもうひとつ例を挙げよう．あなたは実験レポートを書いているものとしよう．定量的な議論のためには単位つきの量が必要不可欠である．ところが単位つきの量の記述にはそれを明示するために守らねばならないいくつかのルールがある．「長さ$1m$」なんて書いた日にはあなたの単位は絶望的である．むろんあなたはそんなことはわかっているはずである．

+ 単位は立体で記述すべし
+ 数値と単位の間には欧文での単語間スペースに相当する量だけスペースを挿入すべし

というルールに従って書こうと考え，

```latex
1 \ \rm{m}
```

なんて書いてみたとする．一応出力としては「$1 \ \rm{m}$」となって，目的は達せられたように見える．
**こんな書き方は絶対にしてはいけない**．`\rm`の使い方がおかしいし，そもそも`\rm`なんて普通使うべきではない．スペースを`\ `で空けているところももダメである．この位置では改行を禁止しておくべきである．従って，せめて

```latex
1~\textrm{m}
```

もしくは

```latex
1~\mathrm{m}
```

である．textかmathかは（数式でない）本文中に書くか数式中に書くかで変わる．しかし先ほどと同じ理由でこれもよろしくない．

この問題に対する手軽な解決策は，siunitxパッケージを読み込んで

```latex
\SI{1}{\meter}
```

とすることであろう．しかし生成されたPDFを見て，あなたは**数値と単位の間のスペースが四分空きになっている**ということに気づく．このままでいいのであればよいが，レポートの規約として，数値と単位の間のスペースを欧文での単語間スペースに相当する量にせよと決められていたら訂正必須である．数値と単位間のスペースが定められた規約を満たしていないということで，あなたの単位が危うくなってしまう．siunitxパッケージの利用はあきらめるしかないのだろうか．もちろんそんなことはない．実はプリアンブル（もしくはsiunitxパッケージ読み込み時のオプションとして）

```latex
% \usepackageとは別で書く場合
\sisetup{numer-unit-product=~}

% \usepackageと一緒に書く場合
\usepackage[number-unit-product=~]{siunitx}
```

に書けば解決である．実に簡単なものであった．

# 例から言いたいこと

上で挙げた例はいずれも「知っていれば」単純かつ真似しやすいテクニックであった．そう，**一度でもそういうことをやっているソースを見たことがあれば誰でも使える**のである．ではなぜこんな単純なテクニックが広まっていないのか？答えは単純で，**一度も見たことがない**からである．黒板太字「$\mathbb{R}$」も単位つきの量もよく見ているはずなのに，ソースが広まっていないせいでこういうテクニックが受け継がれないのである[^bad]．

上のような比較的メジャーな例ならいい．筆者が専門としていた（過去形）材料系では「$\langle\bar{1}10 \rangle$方向」みたいな記法をよく使う．結晶中の方向を等価なものは同一視して書き表すときに使うものである．単純に出力が欲しいだけなら

```latex
\langle \bar{1}10 \rangle
```

でよい．しかし，

```latex
\direction(*){\minus{1}10}
```

のように`\direction`か`\direction*`，そして`\minus`コマンドを適切に定義した上で書く方が適切ではないかと思う．こんなテクニックは「材料系のためのLaTeX入門」なんていうニッチな解説が出ない限り広まらないであろう．しかし材料系専門でこういう書き方ができる人が多いはずもなく[^expert]，現実はむしろjarticleクラスがいまだに使われていたりするのである．

共有されるべきだが細かいテクニックはほかにいくらでも挙げることができる．ぱっと思いついただけでも

+ 商集合を書くときに「$X/\sim$」ではなく「$X/{\sim}$」のように書く方法（$\sim$前のスペースに着目）
+ $f : X \to Y$ではなく$f \colon X \to Y$と書く方法（コロンの意味を考えると後者が適切なように思う）
+ 条件付き確率「$p(A \mathrel{|} B)$」の書き方
+ `\emph`するときに欧文も和文と同様に太字で出力する方法
+ 化学式をマトモに書く方法，申し訳ないが`\mathrm{SiO_2}`なんてのはNG．

くらいはある．あなたの需要に刺さりそうなものはあっただろうか．こういうことをよくやる人がソースも公開してくれていたら我々はそれをありがたく頂戴するだけでよくなる．まぁバッドノウハウを引き継ぐリスクもあるけど．

# ソースの共有方法

肝心なのは，ソースをどうやって共有するかである．PDFを共有するだけの人がよく使うのはDropboxやGoogle Driveあたりだが，共有が恐ろしく面倒である．ディレクトリごと共有フォルダに投げるともれなくauxファイルとかもついてくる．うっかりやってしまったときにはちょっとイラっとくるであろう．

そんなあなたにオススメなのがGit/GitHubである．「Gitは分散型バージョン管理システムで～」なんてのはどうでもいい．この用途であれば「Gitとは，なんかいい感じにファイルを管理してくれるシステムのことである」くらいの認識で十分である．覚えるべきは

+ clone
+ add
+ commit
+ push

である．cloneとpushはすぐ下で述べるGitHubのようなサービスとの連携で使う．まず覚えるのはひとまずこの4つだけでいい．とりあえずその辺の解説を読んで環境構築をしてくるといい．解説はここではしない．

Gitだけではローカルでデータを管理しているだけである．共有するためには作成したリポジトリを公開する必要がある．
このためのサービスはいくつかあるが，とりあえずGitHubを利用しておけばいいだろう．今はプライベートリポジトリも無料で作成できる．

## 追記（2021/08/17）

Git/GitHubについて，その基本的知識と，CUIベースを前提とした環境構築と運用についてそれなりに詳細な解説を書いた．


https://qiita.com/Nmatician/items/765edfbd726725d1ae8c

GUIベースでの運用は，環境構築のハードルが下がる代わりに常用に対する利便性はCUIベースよりも大きく劣ると考えられる．
いずれにせよ，筆者にはほとんど経験がないので誰か記事を書いてくれないかなと思う．

なお，この記事の以下で述べているものは，上の記事の簡略版といえる．



# 具体的なワークフロー

まず最初にローカルでリポジトリを作成してからリモートリポジトリに紐づけるよりも，まずリモートリポジトリを作成してからそれをcloneしてくる方が楽である．具体的には

+ 紐づけ作業が不要
+ ライセンスや`.gitignore`を自動生成してくれる

あたりが理由である．よって，手順としては以下のようになる：

1. まずGitHub上でリモートリポジトリを作成する．
1. その際，「Add .gitignore」と「Choose a license」にチェックを入れる．すると，いくつかの選択肢が表示される．
1. 「Add .gitignore」側の「.gitignore template:」には「TeX」を選択する．
1. 「Choose a license」側の「License:」には適切なものを選択する．特に好みがなければMITライセンスでよいと思われる．
1. 作成したリモートリポジトリをローカルにcloneする．
1. .gitignoreをテキストエディタで開き，*.pdfを消すか残すかを決める（公開する間際に消すのがオススメ）．
1. ローカルで文書を執筆する．
1. 適切なタイミング（寝る前とか）にaddしてcommitしてpushしておく．
1. 完成したらTwitterで宣伝する（最初に作成したリモートリポジトリがPrivateならPublicに変更しておくのを忘れずに）

ちなみに学位論文のバックアップとしても便利である．手順なそのままでいいだろう．その場合にはGitHubだけではなくbitbucketやGitLabのようにほかのサービスにもリポジトリを紐づけておくとよい．

# ライセンスについて

公開する場合，ライセンスは必ず同梱するべきである．ライセンスがない場合，中のコードを使っていいのかわからないからである．
文書を配布する用途では再利用を禁止したいなどということはないだろう．ライセンスはMITライセンスを指定しておくとよい．
MITライセンスはかなり緩いライセンスだが，もちろん利用者は何をしてもいいというわけではない．とはいえ，そこで使われているテクニックの原理を理解して自分で再現する，という場合には特に問題は起きないであろう（多分）．

# 最後に

LaTeXだけではなくSATySFiにも手を出してほしい．現状，SATySFiに関するGitHub上のリポジトリの数が十分に増えるとコミュニティにとって大きな利益になる．つまり，あなたがSATySFiで書いた文書をGitHub上で公開するだけでコミュニティにそこそこ大きな貢献ができるのである．

[^amssymb]: 実はこれだけでは不十分で，適切なパッケージを読み込む必要があるのだが，ここではとやかくいわないこととする．
[^example]: [保守性の観点から述べている例](https://qiita.com/gfngfn/items/cb76cf01c372b7ccb4a9)
[^pkg]: むしろこの程度の機能がなぜパッケージ化されていないかということの方が不思議かもしれない．後で作ってみようかな．
[^bad]: どうせソースを共有するようになったってみんな`\mathbb{R}`と書くんじゃ意味ないじゃんって言われるとその通り過ぎて東京オリンピックになってしまう．
[^expert]: そもそもLaTeXに詳しいと言い切れる日本人自体相当少ないと思う．私程度ではもちろん詳しいなんて言えない．