ASCIIMathML を使う

作成日:2011-12-07
最終更新日:

MathML の手打ちに疲れる

MathML を手打ちするのはさすがに疲れる。 簡単な式表現を字句解析して MathML にする手段はないだろうか、 と考えていたところ、ASCIIMathML という JavaScript を見つけた。 以前の ASCIIMathML は数式記法と数式表示を合わせたシステムであったが、 現在数式表示としての ASCIIMathML はメンテナンスされていない。 一方、数式記述方法としての ASCIIMathML は ASCIIMath というように末尾の ML を落とした名前で現在流通している。 この場合、数式表示(レンダリング)部分は MathJax を使う。詳しくは MathJax のページを参照のこと。 下記は、ASCIIMath + MathJax の組み合わせのデモページである。

ASCIIMath(asciimath.org)

古い ASCIIMathML のためのページ

以下は、レンダリングも自前で行う、古い ASCIIMathML のためのページである。 特に理由がない限りは、レンダリングは MathJax で行うのがよいので、そちらを参照されたい。

さて、古い ASCIIMath.js を使うためには、 下記にある ASCIIMathML.js を自分のところにダウンロードすればよい。
ASCIIMathML(github.com)

なお、以前は下記のリンクがあり、ここが主要ページだった。現在、下記のリンクをクリックすると上記の ASCIIMath のページにダイレクトされる。

ASCIIMathML: Math on the web for everyone(www1.chapman.edu)

ASCIIMathML の記法は下記のとおりである。
Syntax and List of Constants (www1.chapman.edu)

さて、このファイルを インクルードすれば、簡単な表現で式が書ける。以下、対比してみよう。 なお、文字入力の事例は、福井高専の MathMLマニュアル (toshichan.be.fukui-nct.ac.jp)から、 4章の MathML Tips 集による。 ただし、文字入力で前後につけるバッククォーテーションは省略している。

なお、ASCIIMathML が使えるブラウザは限られる。 Mozilla/Firefox 系は表示がはっきりしている。また Opera (12.14) でも、 多少表示が乱れるが使える。 Google Chrome, Safari などは使えない。たとえば、Opera では、 ASCIIMathML.js をインクルードすると次のメッセージが出る。

To view the ASCIIMathML notation use Internet Explorer 6+MathPlayer or Netscape/Mozilla/Firefox

事例の対比:基本編

文字入力表現説明備考
a+b+3`a+b-3`加法、減法
a b`a b`乗法
1/2+1/x-x/3`1/2+1/x-x/3`除法
(a+b)-3`(a+b)-3`カッコ
(x-1)/3+1/(a+b)-(x+3)/(x-c)`(x-1)/3+1/(a+b)-(x+3)/(x-c)`分数と式
x^2-3^x`x^2-3^x`べき乗
sqrt(x)+sqrt(2)`sqrt(x)+sqrt(2)`根号
a=b`a=b`等号
a gt b`a gt b`不等号
a ge b`a ge b`等号つき不等号
a lt b`a lt b`不等号
a le b`a le b`等号つき不等号
f(x)`f(x)`関数
x^(y-1/3)`x^(y-1/3)`べき乗
root(3)(x)+root(a)(3)`root(3)(x)+root(a)(3)` 3乗根、n乗根
sin(x+3)`sin(x+3)`正弦関数
pi`pi`円周率
log_3(x)`log_3(x)`対数
log_e(x)+e^x`log_e(x)+e^x`指数
sin^-1(x)`sin^-1(x)`逆正弦関数
sum_(i=1)^20k_i`sum_(i=1)^20k_i`
prod_(i=1)^20k_i`prod_(i=1)^20k_i`
{::}_(\ n)C_r`{::}_(\ n)C_r`組み合わせの数ダミーの囲みを作ってその右側として表した文字を左側添字とする
{::}^(\ t)A`{::}^(\ t)A`行列の転置同上
vec v`vec v`ベクトル
(a_x,a_y+b_y)`(a_x,a_y+b_y) `ベクトルの成分表示
((x,3),(1,y))`((x,3),(1,y)) `行列
|(x,3),(1,y)|`|(x,3),(1,y)| `行列式
dy/dx`dy/dx`微分
intf(x)dx`intf(x)dx`不定積分
int_0^1f(x)dx`int_0^1f(x)dx`定積分
int_1^oo1/x^2dx`int_1^oo1/x^2dx`無限大
abs(-x)`abs(-x)`絶対値
norm(x-y)`norm(x-y)`ノルム
lim_(x->0)sin(x)`lim_(x->0)sin(x)`極限
4+3i`4+3i`虚数
(delz)/(delx)`(delz)/(delx)`偏微分
(d^2y)/dx^2`(d^2y)/dx^2`2 階微分
|\ |`| |`半角スペース
|quad|`|quad|`半角 * 2 スペース
a XX b`a times b`乗算MathJax 用の a times b も使える
a -: b`a -: b`除算MathJax 用の a div b も使える

事例の対比:応用編

下記は、基本編以外の記号である。

文字入力表現説明備考
bbbC bbbN bbbQ bbbR bbbZ`bbbC bbbN bbbQ bbbR bbbZ`二度打ち体
ccB ccC ccE ccF ccH ccI ccL ccM ccR`ccB ccE ccF ccH ccI ccL ccM ccR`カリグラフ体(スクリプト体)
frC frH frI frR frZ`frC frH frI frR frZ`フラクトゥール
dotA dota`dotA dota`(時間に関する)一階微分
ddotA ddota`ddotA ddota`(時間に関する)二階微分
-=`-=`定義; (図形の)合同; (剰余の) 合同
@`@`写像
ldots cdots vdots ddots`ldots cdots vdots ddots`などなどl, c, v, d はそれぞれ low, center, vertical, diagonal と思えばよい
A^(**)`A^(**)`双対空間
A^("**")`A^("**")`第二双対空間*** は星型アスタリスク `***` になる。

基本編や応用編に出ていない記号類は、http://www1.chapman.edu/~jipsen/mathml/asciimathsyntax.html を参照されたい。

事例の対比:発展編

下記は、基本編、応用編以外の記号で、自分で ASCIIMathML.js に追記させて使う場合の例である。

文字入力表現説明
bbA bba`bbA bba`太字。input:"bb" の定義行で、 atname属性を"mathvariant"に, atval属性を"bold-italic"に変更。
ccA`ccA`カリグラフ体(スクリプト体)
ttA tta
`ttA tta`テレタイプ
frA frB `frA frB` fracture, fraktur

カスタマイズ

カスタマイズをするには asciimath.newcommand を <head> 部におけばよい。 <script> asciimath.newcommand(sign, unicode) </script>

複号

`x+-y-+3` を表示する。
複号で、± はあるが、プラスとマイナスの上下が逆になったものは ASCIIMathml では用意されていない。 これを表示するためには、 ページのヘッダー部に次の追加をすればよい。
<script> asciimath.newcommand("-+", "\u2213") </script>

なお、ASCIIMathml.js にある行
{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
のすぐ下に
{input:"-+", tag:"mo", output:"\u2213", tex:"mp", ttype:CONST},
の行を挿入してもよいが、土足で入り込んでいるようだから、上記の ascimath.newcommand("", "") で追加するのがおしとやかだ。

なぜ ASCIIMathML.js なのか

以下は、ASCIIMathML.js を「数式記述」と「数式表現」に分けて記載する。最初に述べた通り、「数式表現」に関しては、表示の美しさから MathJax をお勧めする。

数式記述

数式記述は現在では TeX 以外には考えられない(もちろん、LaTeX 、AMS-TeX のようなものも TeX とみる)。

では、TeX を覚えればいいではないかという議論があるだろう。それについては、私は覚えないと答える。 理由はないが、あえてあげればめんどくさいのだ。 そんなのは何の理由にもならない。あえていえば、 萩谷昌己さんのエッセイ(hagi.is.s.u-tokyo.ac.jp)を読むと、 萩谷さんは Knuth の TeX をこきおろしている。これをいいことに、私は TeX を覚えないことにした。

では ASCIIMathML.js がそれの代わりになるかといえば、それは怪しい。 しかし、TeX を覚えないと決めたからには ASCIIMathML に殉じるしかない。

数式表現

世の中には、WEB で数式を表示する手法が多くある。たとえば、MathJax とか、mimeTeX とかがある。 MathJax は秋田大学の後藤文彦さん (www.str.ce.akita-u.ac.jp) が推薦している。 実際、MathJax による表示は美しい。かくいう私のページも、数式記述こそ ASCIIMath を使っているものの、 数式表示はこのページを除いてすべて MathJax にまかせている。

数式表現において ASCIIMathML.js がわずかに MathJax に比べて優れているところといえば、軽量であるがために自分のサイトにコピーして使っても、 それほど容量を食わず速くダウンロードできることがある。またコードが少なくて読みやすいため、自分での改造も比較的容易である。

ASCIIMathML による証明の一例

せっかくなので、ASCIIMathML によって数学の一証明を記述してみる。 題材は、`pi` が無理数であるという証明である。この証明は、 大阪理工大学(現:近畿大学)の学生であった岩本義和(湯上義和)氏による。 これを真鍋和弘氏(札幌篠路高校)が、http://www7a.biglobe.ne.jp/~watmas/dosukyo/circle-reports/irrationalnumberbyManabe.pdf にてこの証明を紹介している。これを多少追記して記述してみる。

定理1

`pi` は無理数である。

補題1

`pi^2` が無理数ならば、`pi` は無理数である。

証明

`pi` が有理数ならば、`pi^2` は有理数である(仮に `pi = a/b` という形の有理数ならば、`pi^2 = (a^2)/(b^2)` という形の有理数になる)。この対偶をとれば、補題1が得られる。

補題2

次の関数 `f(x)`
`f(x) = x^n (1-x)^n / (n!) , n in NN`
は、次の3つの性質を満たす。

  1. `f(x) = 1/(n!) sum_(m=n)^(2n)c_m x^m` という多項式であり、係数 `c_m` はすべて整数である。
  2. ` 0 < x < 1` に対して `0 < f(x) < 1/(n!)`
  3. `AAk(>=0)` に対して、関数 `f` の `k` 回微分 `f^((k))(x)` を考える。 `x` が 0 と 1 のときの微係数 `f^((k))(0)` と `f^((k))(1)` はいずれも整数である。

証明

  1. `f(x) = x^n (1-x)^n / (n!) = x^n / (n!) (1-x)^n = x^n / (n!) sum_(m=0)^n ({::}_(\ n)C_m(-x)^(n-m)) = 1/(n!) sum_(m=n)^(2n) ((-1)^(m-n){::}_(\ 2n)C_m)x^m `
    ここで、`{::}_(\ n)C_m` は2項係数であるから証明された。
  2. `0 < x < 1` では `x^n < 1 ` かつ ` (1-x)^n < 1` 。よって `f(x)` の式から成り立つ。
  3. `x = 0` のときを考える。`k < n` であれば、`f^((k))(x)` の定数項はないから、`f^((k))(x) = 0`。 `k > 2n` であれば、`f^((k)) = 0` であるから `f^((k))(x) = 0` 。`n < k <= 2n` のときは、1. から `f^((k))(0) = (k!)/(n!) c_k` であるが、`k > n` だから `(k!)/(n!)`は整数。かつ `c_k` は 1. より整数である。したがって、`f^((k))(0)` は整数である。
    `x = 1` のときを考える。`f(x) = f(1-x)` が恒等的に成り立つから、`f^((k))(1-x) = (-1)^kf^((k))(x)` である。 よって、`f^((k))(1) = (-1)^(k)f^((k))(0)` であり、i で証明した `f^((k))(0)` が整数であることと合わせ、 `f^((k))(1)` も整数である。

補題3

任意の正の実数 `c` に対し、十分大きな整数 `n` をとれば、`(c^n) / (n!)` はいくらでも小さくすることができる。

証明

正の整数 `m` を `m > 2c` となるようにとる。すると `c / m < 1 / 2` であるから、 `n` を `m` より大きい整数とすれば、

`(c^n) / (n!) = (c * c * * * c) / (1 * 2 * * * m) * (c / (m + 1)) * (c / (m + 2)) * * * c/n`
` < (c^m) / (m!) * c/m * c/m * * * c/m`
` < (c^m)/(m!) * 1/2 * 1/2 * * * 1/2 `
` = (c^m)/(m!) * (1/2)^(n-m)`

ここで、`n` を大きくすれば `(1/2)^(n-m)` はいくらでも小さくすることができる。

定理1の証明

`pi^2` が有理数と仮定すれば、正の整数 a, b によって `pi^2 = a / b` とおける。補題 2 の関数から、 新しい関数 `F(x)` をつぎのように作る。

`F(x) = b^(n)[pi^(2n)f(x) - pi^(2n-2)f^((2))(x) + pi^(2n-4)f^((4))(x) - ... + (-1)^(n)f^((2n))(x)]`

このとき、各行を展開すると `F(0)` は整数であることがわかる。なぜなら、[] 内を展開すると、 第1項は `b^(n)pi^(2n)f(0) = b^n (a/b)^n f(0) = a^n f(0)` となり、`f(0)` は補題2のiiiで整数となるからである。以下、第2項、第3項も同様にして展開し、 すべての項が整数であるから、`F(0)` は整数である。同様に、`F(1)` も整数である。さて、 `F(x)` の x に関する 2 回微分は

`(d^2)/(dx^2) F(x) = b^(n)[pi^(2n-2)f(x) - pi^(2n-4)f^((2))(x) + pi^(2n-6)f^((4))(x) - ... + (-1)^(n-1)f^((2n))(x)]`

となる(なお、`f(x)` は `x` の `2n` 次式だから、`f^((2n+2)) = 0` である) 。これと `F(x)` の元の式から

`(d^2)/(dx^2) F(x) = F^(′′)(x)= -pi^2F(x)+b^n pi^(2n+2) f(x)`

となる。また、

`d/(dx)[F^(')(x)sin pi x - pi F(x) cos pi x]``=[F^('')(x)+ pi^2F(x)] sin pi x`
`=b^n pi^(2n+2)f(x) sin pi x`
`=pi^2 a^2 f(x) sin pi x`

となるので

`alpha = pi int_0^1 a^n f(x) sin pi x dx`` = [1/pi F^'(x) sin pi x - F(x) cos pi x]_0^1 `
` = F(0) + F(1)`

は整数となる。一方、補題2の ii より、

` 0 < pi int_0^1 a^n f(x) sin pi x dx < (pi a^n)/ (n!)`

となる。したがって、十分大きな n に対して、

`0 < alpha < (pi a^n)/(n!) < 1`

となる(補題3も参照)。`alpha` は整数であったからこれは矛盾である。 よって `pi^2` は無理数であり、補題1より `pi` もまた無理数である。■

解析学の紹介の次は代数学といきたいが、現代日本人の業績は知らない。 江戸時代の和算家、 関孝和が導いた結果を応用数理学会誌の読後感として書いたので、 そちらを参照されたい。

工夫が必要な表現

カッコが対応しない場合

複雑な式を ASCIIMathML で表示するために必要な工夫を紹介する。 交代化演算と呼ばれる処理では[と]の組を使うが、このカッコが同じレベルにないとおかしな表記になる。 そこで、非表示のダミーのカッコである :} と {: を使ってレベルを同じにする。

正誤表記表示
a_(j_1)^([i_1:}) cdots a_(j_r)^({:i_r])`a_(j_1)^([i_1:}) cdots a_(j_r)^({:i_r])`
a_(j_1)^([i_1) cdots a_(j_r)^(i_r])`a_(j_1)^([i_1) cdots a_(j_r)^(i_r])`

なお、ASCIIMathML オリジナルの表示では、[ が ] より大きく表示されるが、 MathJax を経由すれば同じ大きさになる。

集合の条件のバーと絶対値・ノルムのバーが混在する場合

数列空間 `l^2` の定義を次のように書いたとする。

l^2 -= {x={x_n}_(n=1)^oo | sum_(n=1)^oo |x_n| ^2 < +oo }

これを ASCIIMathML で表示すると次のようになる。

`l^2 -= {x={x_n}_(n=1)^oo | sum_(n=1)^oo |x_n| ^2 < +oo }`

ここで問題になるのが縦棒(バー)の大きさだ。 Σの左のバーが集合の「ただし」の条件の意味であるのに対し、 右のバーは、その次のバーと組になって絶対値を表す。 ところが、ASCIIMathML ではΣの両脇のバーを組としてみなしてしまい、 その結果ノルムを表す絶対値の組が不ぞろいになる。

これを解消する最良の方法は、絶対値を関数の形で書くことである。

l^2 -= {x={x_n}_(n=1)^oo | sum_(n=1)^oo abs(x_n) ^2 < +oo }

`l^2 -= {x={x_n}_(n=1)^oo | sum_(n=1)^oo abs(x_n) ^2 < +oo }`

この場合、「ただし」の条件を表すバーが短くなるので、 それを解消するには見えないバー {: を使う。

l^2 -= {x={x_n}_(n=1)^oo {:| sum_(n=1)^oo abs(x_n) ^2 < +oo }

`l^2 -= {x={x_n}_(n=1)^oo {:| sum_(n=1)^oo abs(x_n) ^2 < +oo }`

なお、絶対値やノルムを関数の形ではなく、| そのものを書く方法は勧められない。

場合分け

見えないカッコは場合分けの表記にも使える。例として、ディラックのδ関数の定義を掲げる。

表記

delta_(ij) = {(0, (i != j)),(1, (i = j)):}

表示

`delta_(ij) = {(0, (i != j)),(1, (i = j)):}`

ASCIIMathML で対応できない表現

囲み形式

MathML には、<menclose> という要素がある。 この要素は、ある種の囲みを指示する。 具体的には下記を見てもらいたい。
http://www.w3.org/Math/testsuite/build/main/Presentation/GeneralLayout/menclose/menclose1-full.xhtml
デフォルトでは割算処理の囲みであるが、そのほかにも保険数学で用いられる囲みなど有用な表現がある。 この memclose 要素への翻訳は、ASCIIMathML では対応できない。

ASCIIMathML に追記すれば対応できる表現

太字

太字は bb などで指示することになっているが、私の環境が悪いのか、bb コマンドが効かない。 しかたがないので、bb の定義を変えて、
{input:"bb", tag:"mstyle", atname:"fontweight", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
で定義されている行を
{input:"bb", tag:"mstyle", atname:"mathvariant", atval:"italic-bold", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
に変更している。

なお、bb の代わりに mathbb を使い、下記の通り {input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
で定義されている行を
{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"italic-bold", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
に変えたこともあった。そうすると、小文字はすべてうまくいくのだが、大文字は文字化けする。 C, N, Q, R, Zは表示されるが、これらはすべて数の集合(複素数、自然数…)を表す書体となる。

フラクトゥール

数学ではよくドイツの文字にあるひげ文字が使われることがある。正確にはフラクトゥール という(フラクタルという表記もある)が、 これがどういうわけか大文字の C, H, I, R, Z に対応するものしか表示されなかった。

他の文字でも表示させるために JavaScript ファイルに直接追加する方法を以前示していたが、 2021-06-20 現在の下記の最新版では不要であることがわかった。
https://github.com/asciimath/asciimathml/blob/master/ASCIIMathML.js
また小文字のフラクトゥールも可能である。

`ABCDEFGHIJKLMNOPQRSTUVWXYZ`
`frAfrBfrCfrDfrEfrFfrGfrHfrIfrJfrKfrLfrMfrNfrOfrPfrQfrRfrSfrTfrUfrVfrWfrXfrYfrZ`
`abcdef g h i j klmnopqrstuvwxyz`
`frafrbfrcfrdfre frf frg frh fri frj frk frl frm frn fro frp frq frr frs frt fru frvfrwfrxfryfrz`

カリグラフ体

フラクトゥールのほかに数学では活字上の筆記体も用いられる(ちょっと形容矛盾だ)。 これはカリグラフ体と呼ばれるらしい。

以前の ASCIIMathML ではどういうわけか一部の大文字アルファベットしかうまく変換できなかった。その一部とは B (`ccB`)、E (`ccE`)、F(`ccF`) 、H(`ccH`) 、I(`ccI`)、 L(`ccL`)、 M(`ccM`)、R(`ccR`) である。これらの用途を知るため説明を足した。 なお、今では他の大文字アルファベットでも問題なく変換できる。 また、以前の ASCIIMathML では小文字のアルファベットのカリグラフ体は全く変換できなかったが、今は下記のように変換できる。

カリグラフ体大文字入力表現説明カリグラフ体小文字入力表現
ccA`ccA` cca`cca`
ccB`ccB`ベルヌーイ数ccb`ccb`
ccC`ccC` ccc`ccc`
ccD`ccD` ccd`ccd`
ccE`ccE`期待値cce`cce`
ccF`ccF`フーリエ変換ccf`ccf`
ccG`ccG`ccg`ccg`
ccH`ccH`ハミルトニアン、ヒルベルト空間cch`cch`
ccI`ccI`複素数の虚数部cci`cci`
ccJ`ccJ`ccj`ccj`
ccK`ccK`cck`cck`
ccL`ccL`ラグランジアン、ラプラス変換ccl`ccl`
ccM`ccM`メラン変換、M行列ccm`ccm`
ccN`ccN`ccn`ccn`
ccO`ccO`cco`cco`
ccP`ccP`ccp`ccp`
ccQ`ccQ`ccq`ccq`
ccR`ccR`複素数の実数部ccr`ccr`
ccS`ccS`ccs`ccs`
ccT`ccT`cct`cct`
ccU`ccU`ccu`ccu`
ccV`ccV`ccv`ccv`
ccW`ccW`ccw`ccw`
ccX`ccX`ccx`ccx`
ccY`ccY`ccy`ccy`
ccZ`ccZ`ccz`ccz`

ユニコードにおけるカリグラフ体は、複数の面に割り当てられていた。 そして、以前の ASCIIMathML のバージョンでは一方の面しか考慮されていなかった。 その場合は ASCIImathML.js に個別に加える必要があった。今はその必要はないが、参考までにどのようなことをやっていたかを残しておく。 A の筆記体 `ccA` を ccA と打って表示したい場合は、次の行を加える。

{input:"ccA",	 tag:"mi", output:"\ud835\udc9c", tex:null, ttype:CONST},

多彩なアクセント

字の上に示す記号を仮にアクセントと呼ぶ。用意されているのは、 ハット(hat, 山形)、バー(bar, 平板)、アンダーライン(ul, 下線)、ベクトル(vec、右側)、 ドット(dot, 1点)、ダブルドット(ddot,2点)である。 あるとき、波形を出そうとしたが出ない。次の行を // diacritical marks の段落に追加した。

{input:"\\tilde",	tag:"mover",	output:"~",			ttype:UNARY, acc:true},

下付きを使う

連続和で使われる`Sigma` のほか、連続積で使われる`Pi`、最大最小の `max`、`min` 、 極限を取る `lim` 、集合の和 `uuu` 、集合の積 `nnn` は、 アンダースコア表現を指定すると右下添字ではなく真下につく。 argmax や argmin は、 min や max と同じように対象となる範囲を真下に書くが、ASCIIMathML ではアンダースコア表現では 真下にならず右下になってしまう。真下になるように定義するには、 max や min と同じように定義してしまえばよい。 そのような関数は、 //standard functions のところにあるので、argmin と argmax を追加している。

`1 = max_x (1 - abs(x)) `
`0 = argmax_x (1 - abs(x)) `

太字表現をする集合

数学の授業で、太字を表すために文字の一部を二重に書くことがある。 このような字体は活字でも用いられ、二度打ち体、二重線体、オープンフェース、黒板太字、 ブラックボードボールドなどと呼ばれる。 よく使われる黒板太字体には下記がある。

文字入力表現説明
CC`CC`複素数
RR`RR`実数
QQ`QQ`有理数
NN`NN`自然数
ZZ`ZZ`整数

上記5例より頻度は落ちるが、H の黒板太字で四元数を、P の黒板太字で素数を、そして E の黒板太字でユークリッド空間を表すことがある。 ただこれら2例は HH や PP 、EE と打ってもそのままでは黒板太字にならないので、 HH や PP 、EE が黒板太字であることを ASCIIMathML.js の input:"CC" の前後で行を追加して output を定義しないといけない。

文字入力表現説明
bbbE`bbbE`ユークリッド空間
bbbH`bbbH`四元数
bbbK`bbbK`体、`CC` または `RR`
bbbP`bbbP`素数

また、以前の ASCIIMathML.js では ee で自然対数を、ii で虚数単位を現わしていたが、 これも今はデフォルトではない。

カッコ

以下、あまり見慣れない記号を付け加えているのは、 論理学の本「プログラムの基礎理論」に出てくるからである。

高村吉一さんが、W3C による文字に対するXML実体の定義 (takamu.sakura.ne.jp) の訳を公開している。以下の記述はこの訳をもとに調べた。 高村さんに感謝する(URL 2018/08/14 に修正)。

LeftDoubleBracket U+27E6 数学用左二重角がっこ MATHEMATICAL LEFT WHITE SQUARE BRACKET 左二重かっこの区切り記号 left double bracket delimiter lobrk

RightDoubleBracket U+27E7 数学用右二重角がっこ MATHEMATICAL RIGHT WHITE SQUARE BRACKET 右二重かっこの区切り記号 right double bracket delimiter robrk

謎なのは、別名の [l|r]obrk の obrk だが、o が double の意味で、brk が bracket の意味だと思えばいいだろう。

文字入力表現説明
[|`[|`左カッコ
|]`|]`右カッコ

非重複和

同じく高村吉一さんによる文字に対するXML実体の定義 (takamu.sakura.ne.jp) から、 MML Alias (takamu.sakura.ne.jp) を参考に、 調べた。

uplus U+228E U0228E 多重集合の集合和 MULTISET UNION /uplus B: 集合和の中のプラス記号 /uplus B: plus sign in union UnionPlus

文字入力表現説明
u+`u+`非重複和

定義記号

同じく高村吉一さんによる MML Alias (takamu.sakura.ne.jp) を参考に、 別の論理記号を調べた。≜ と ≝ であり、 これらはどちらも定義を表す。 なお、高村さんの上記のページに ≜ はあるが、≝ はないことを付記する。 公式には、下記のページのように、js ファイル本体を更新する必要はなく、 HTML のページに入れておけばいいようだ。
Extending the symbol table

これに従い、HTML の head 部分に次の2行を入れた。

asciimath.newcommand("d=", "\u225c")
asciimath.newcommand("D=", "\u225d")

文字入力表現説明
d=`d=`定義
D=`D=`定義

ヴァイエルシュトラスのペー関数

楕円関数の一種である、ヴァイエルシュトラス(ワイエルシュトラス)のペー関数は、 ℘ と書く。 ASCIIMathML では書き方が定められていないため、Tex の \wp を流用しておく。

文字入力表現説明Unicode
wp`wp`ワイエルシュトラスの `wp` 関数U+2118

内積

ベクトル a と b の内積を、(a, b) と表記することは一般的に行われている。 しかし、この表記が ASCIIMathML により行列表記と解釈されてしまうこともある。そのときには、カッコを二重引用符で囲ってしまえばよい。 すなわち、"("a, b")" とする。


まりんきょ学問所コンピュータの部屋マーク付け言語手習い > ASCIIMathML を使う


MARUYAMA Satosi