最強の数学文書システムを作りたい

数学の文書を書いてWebで公開したい時にはどうするのが良いでしょうか。私がこれまでにやってきたのは、

です。

しかし、PDFという形式はあまりWebには適しません。一方、Markdownでは数学の文書を書くうえで足りないものが多すぎます(定理環境や相互参照など)。

LaTeXは数学の文書を書くための語彙が豊富なので、LaTeXで原稿を書いて何らかの方法でHTMLに変換できると良さそうです。そのためのシステムを作りたいです。

形態

まずは単体の変換ツールとして作ることになると思います。Pandocみたいなイメージです。

ユーザーの利便性を考えると、ブログやWikiや本としての体裁を整えてくれるガワがあると良さそうです。静的サイトジェネレーターとかWordPressとか各種Wikiみたいなやつをイメージしています。

入力形式

数学の文書を書くための語彙が豊富なのはLaTeXなので、LaTeXを入力として受け取れるようにしたいです。TikZなどのパッケージも何らかの方法でサポートできると良さそうです。TeX言語を真面目に処理すればパッケージによってはそのまま動くかもしれません。

LaTeXが第一候補とはいえ、Markdownはあまりにもポピュラーなので、Markdown入力も考慮できると良さそうです。欲を言えば、Pandocのように色々な形式を入力として扱えると強そうです。

出力形式

Web向けのHTMLを出したいです。数式はMathMLがありますが、MathMLの表示がイマイチな環境向けにCSSやSVGを駆使した方法でも出力できると万全でしょう。

EPUBも出力できると良いかもしれません。

カスタマイズできるようにしたい

凝った変換処理をしたい時に、ユーザーが変換処理を書けるようになっていると良さそうです。Pandoc filterみたいなやつを書けるようにしたいです。

中間言語が大事

Pandocの名前を出しましたが、Pandocが多数の入出力形式に対応し、Pandoc filterを書けるようにしているのは、中間表現(Pandoc AST)をちゃんと規定しているおかげです。

プログラミング言語のコンパイラーを書くときも、うまい中間言語を設計するのが大事です。LLVM IRはその最たる例でしょう。LLVM IRのおかげでLLVMは多数の入力言語と多数のアセンブリ言語出力、そして汎用的な最適化を提供することができています。

私が作っているLunarMLでも、CPS中間表現で最適化を回して、LuaやJavaScriptコードを出力しています(入力はStandard MLだけですが)。

最強の数学文書システムも、うまい中間表現を規定すれば、多数の入力形式と出力形式、そしてユーザー定義の変換処理を扱えそうです。

LaTeXMLはどうか

中間表現はどういう形式でシリアライズされるべきでしょうか。PandocはJSONでした。一方で、XMLを中間表現に採用するのもアリな気がします。

LaTeXからXMLというと、心当たりがあります。LaTeXMLです。というわけで、LaTeXMLを使えないか検討してみるべきな気がします。直接使わなくても、先行事例としていろいろヒントになることはありそうです。

LaTeXMLはPerl製です。本格的に使うのであればPerlを習得する必要があるかもしれません。

LaTeXMLの処理速度には若干の不安があります。unicode-mathを使う文書を試しに処理させてみたところ、結構時間がかかりました。

自作するならどうするか

Perlは嫌じゃ〜〜となった場合にはTeX処理器から自作することになるでしょう。幸い、私にはその辺のノウハウがある程度あります。前に「TeXの字句解析器の動作について」という記事も書きました。

私が書くなら、HaskellかStandard MLで実装することになるでしょう。実行環境については、Haskellで書いたシステムはネイティブコードのほか、最近はJavaScriptやWebAssemblyにもコンパイルできるようです。Standard MLで書けばLunarMLによってLuaやJavaScriptなどにコンパイルできます。LunarMLのバックエンドを増やせは他の実行環境にも対応できます。

お金とライセンス

私がこれまでに趣味で書いたソフトウェアはほとんどGitHub上でOSSとして公開してきました。しかし、これはマネタイズが見込めないからという消極的な理由によるところが大きいです。

最強の数学文書システムを作るには手間がかかります。それを無償で公開するのは果たして持続可能と言えるのでしょうか?あるいは、数学文書をWebで公開したい人はそれなりにいるようなので、そういう人たちからお金を集めることはできないでしょうか?

とはいえ、私自身はお金を取るサービスを運営したことはありません。法律的なあれこれもわかりません。そもそも、ソフトウェアができていない段階からお金を取ることを考えても仕方がないかもしれません。

それでも、開発段階からマネタイズを考慮しておくのは悪いことではないでしょう。選択肢はいくつか考えられます。

まず、完全にクローズドソースで開発するという方法。ソフトウェアとしては、実行ファイルのみを配布あるいは販売します。あるいはWebサービスのみを提供することになるかもしれません。

オープンソースにする場合は、他の営利企業にただ乗りされるのは不愉快なので対策したいです。例えば、AGPL等の制限の強いライセンスを採用したいです。その場合、自分だけは無制限に商用利用できるように、また、商用ライセンスを販売できるようにしておく必要があります。そのためには外部のコントリビューターが混ざると厄介なので、外部からのコントリビューションを受け付けないようにする(例:LuaJITはオープンソースですが、外部からのPRは受け付けていないようです)か、外部からコントリビューションを受け付ける際にCLA (Contributor License Agreement) に署名してもらうことになるでしょう(例:KaTeXに貢献する際はCLAが必要です)。

別の方法として、スポンサーを募るというやり方も考えられます。十分なスポンサーが集まれば、緩いライセンスで公開しても問題ないでしょう。ただ、私はあまりスポンサーに期待していない(私のGitHub Sponsorは今の所ゼロです)ので、選択肢としては微妙です。

いつやるか

今年の前半はLunarMLの開発やら本の執筆やらに結構な時間を使いました。今年の後半は数学文書システムにある程度の時間を投入したいです。