数式を簡単に表示する方法

おれおれマークダウンで$LaTeX$形式で数式を書くのがめんどくさいです。特に式の変形とかは、似たようなことをコピペして修正して書くのが、なんか無駄な作業のような気がしてつらいです。

とりあえず、$LaTeX$マクロを使えばまだマシになります。例えば、組み合わせとかはいくつかの表記方法があるようで、${}_n\mathrm{C}_r$だったり行列みたいに書いたりします。「やっぱり、こっちがいいな」と思っても、直接書いてしまっていては変更が大変です。この場合はマクロで

$$
  \newcommand{\combination}[2]{{}_{#1} \mathrm{C}_{#2}}
$$

$$ \newcommand{\combination}[2]{{}_{#1} \mathrm{C}_{#2}}$$と書いておけば$\combination{n}{r}$で$\combination{n}{r}$が出ます。意味を書いて、表記法を指定して出力がよさそうです。

しかし、普通のマークダウンだと、ファイルの先頭でマクロを定義して、その後のMathブロックでマクロを使えないんですよね。これが不便なので普通のマークダウンとの互換性は捨てることにしました。プログラムで変換してHTMLを吐き出す方法でやります。となると、別にMarkdownとの互換性を考慮する必要もないので独自フォーマットでよくなるんですよね。

独自フォーマットで良しとすると、一気に自由度が上がりました。自由すぎてなにをしていいのかわかりません。とりあえず、

```exec ruby
  a = 100
  p a + 50
```

150

と表示できました。前に書いたPlantUMLを別プロセスで呼ぶコードをコピペしてRubyでevalしただけですけど。

もうちょっと意味のある式だと、

```exec ruby
class Combination
  def initialize(n, r)
    @n = n
    @r = r
  end

  def print
    printf "\\combination{#@n}{#@r}"
  end
end
 
print "$$"
print "(a + b)^4 = "
(0..4).each do |r|
  print " + " if r > 0
  c = Combination.new(4, r)
  c.print
  printf "a^#{4 - r}b^#{r}"
end
print "$$"
```
$$(a + b)^4 = \combination{4}{0}a^4b^0 + \combination{4}{1}a^3b^1 + \combination{4}{2}a^2b^2 + \combination{4}{3}a^1b^3 + \combination{4}{4}a^0b^4$$

こんな感じでRubyで書いてしまうか、DSLを作るか、全く別の言語を作るかですかね?別の言語ならRubyじゃなくてHaskellとかで書いてもいいし。とりあえずはRubyで限界を感じるか飽きるまではRubyで書いていきますかね?

そして、これを拡張していけば文芸的プログラミングができるんじゃないですかね?

コメント

このブログの人気の投稿

五十音配列付き新下駄配列

WSLでの親指シフトはどうやらMozcで実現可能と気がつくまで

親指シフト新下駄配列の可能性