ASCIIMathML |
Unua eldono : 2011-12-07 Lasta ŝanĝo : |
Uzi MathML-n estas laca por mi. ASCIIMathML estas facila
ASCIIMath(asciimath.org)
あとはここに書いてあるように進めばよい。
以前は、下記のリンクがあった。現在、下記のリンクをクリックすると上記にリダイレクトされる。
ASCIIMathML: Math on the web for everyone(www1.chapman.edu)
ここから、最上段の Download をクリックすると、 ASCIIMathML.js (ver 2.0.2) download page という名称のページが表示される (http://mathcs.chapman.edu/~jipsen/mathml/asciimathdownload.html)。 このページで、下記のような行がある。
Here is the script: ASCIIMathML.js (right-click on the link and choose "Save Target As..." " if your browser does not display the JavaScript code)
この通り、ASCIIMathML.js の個所を右クリックして「リンク先を保存...」を選ぶ。 フォルダを指定すれば、この ASCIIMathML.js がダウンロードされる。 このファイルのバージョンは 2.1 であることを確認すること。次の表示があるはずだ。
Version 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen
これより古いバージョンは使わないこと。
なお、表記をまとめたページは下記にある。
さて、このファイルを インクルードすれば、簡単な表現で式が書ける。以下、対比してみよう。 なお、文字入力の事例は、福井高専の 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>b | `a>b` | 不等号 |
| a>=b | `a>=b` | 等号つき不等号 |
| a<b | `a < b` | 不等号 |
| a<=b | `a<=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)` | |
| 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_(k=1)^20k_i | `sum_(k=1)^20k_i` | |
| {::}_(\ n)C_r | `{::}_(\ n)C_r` | |
| 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` | 無限大 |
| |-x| | `|-x|` | 絶対値 |
| 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 スペース |
下記は、基本編以外の記号である。
| 文字入力 | 表現 | 説明 |
|---|---|---|
| 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` | (時間に関する)二階微分 |
| -= | `-=` | 定義; (図形の)合同; (剰余の) 合同 |
| |\ | | `|\ |` | 空白 |
| |quad| | `|quad|` | 空白 |
基本編や応用編に出ていない記号類は、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 |
| HH PP | `HH PP` | 黒板太字。"HH" のoutput属性を"\u210D" で、"PP" の output 属性を"\u2119" で表すよう、 ASCIIMathML.js に追加する。 |
| x+-y-+3 | `x+-y-+3` | 複号。 ±はあるが、プラスとマイナスの上下が逆になったものは ASCIIMathml では用意されていない。 これを表示するためには、ASCIIMathml.js にある行{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST}, のすぐ下に{input:"-+", tag:"mo", output:"\u2213", tex:"mp", ttype:CONST},の行を挿入する。 |
世の中には、WEB で数式を表示する手法が多くある。たとえば、MathJax とか、mimeTeX とかがある。 MathJax は秋田大学の後藤文彦さんが推薦している。 しかし、私がこれから ASCIIMathML を使う理由は、TeX を知らないからである。 MathJax を使うには TeX を知らなければならない。面倒だ。
では、TeX を覚えればいいではないかという議論があるだろう。それについては、私は覚えないと答える。 理由はないが、あえてあげればめんどくさいのだ。 そんなのは何の理由にもならない。あえていえば、 萩谷昌己さんのエッセイ(hagi.is.s.u-tokyo.ac.jp)を読むと、 萩谷さんは Knuth の TeX をこきおろしている。これをいいことに、私は TeX を覚えないことにした。
では ASCIIMathML.js がそれの代わりになるかといえば、それは怪しい。 しかし、TeX を覚えないと決めたからには ASCIIMathML に殉じるしかない。
せっかくなので、ASCIIMathML によって数学の一証明を記述してみる。 題材は、`pi` が無理数であるという証明である。この証明は、 大阪理工大学(現:近畿大学)の学生であった岩本義和(湯上義和)氏による。 これを真鍋和弘氏(札幌篠路高校)が、http://www7a.biglobe.ne.jp/~watmas/dosukyo/circle-reports/irrationalnumberbyManabe.pdf にてこの証明を紹介している。これを多少追記して記述してみる。
`pi` は無理数である。
`pi^2` が無理数ならば、`pi` は無理数である。
`pi` が有理数ならば、`pi^2` は有理数である(仮に `pi = a/b` という形の有理数ならば、`pi^2 = (a^2)/(b^2)` という形の有理数になる)。この対偶をとれば、補題1が得られる。
次の関数 `f(x)`
`f(x) = x^n (1-x)^n / (n!) , n in NN`
は、次の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)` はいくらでも小さくすることができる。
`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 {:|x_n|:} ^2 < +oo }
表示は次の通り
`l^2 -= {x={x_n}_(n=1)^oo | sum_(n=1)^oo {:|x_n|:} ^2 < +oo }`
今度は、ノルムの両端の大きさは同じになったが、条件を表すバーも合わせて小さくなってしまった。 MathJax の表記であれば、条件のバーは集合を表すカギカッコと同じ大きさになる。 書評のページを参照。
もう一つの方法は、条件を表す項を見えないカッコでくくってしまうことである。 すぐ左にみえないかっこである {: を挿入して条件のバーと対にさせる。
l^2 -= {x={x_n}_(n=1)^oo {:| sum_(n=1)^oo {:|x_n|:} ^2 < +oo }
表示は次のようになり、より自然に見える。
`l^2 -= {x={x_n}_(n=1)^oo {:| sum_(n=1)^oo {:|x_n|:} ^2 < +oo }`
なお、同じようでも見えないかっこを右におく、すなわち |:} としてしまうと次のように表示され、 意図した結果が得られない。
`l^2 -= {x={x_n}_(n=1)^oo |:} sum_(n=1)^oo {:|x_n|:} ^2 < +oo }`
MathML には、<menclose> という要素がある。
この要素は、ある種の囲みを指示する。
具体的には下記を見てもらいたい。
http://www.w3.org/Math/testsuite/build/main/Presentation/GeneralLayout/menclose/menclose1-full.xhtml
デフォルトでは割算処理の囲みであるが、そのほかにも保険数学で用いられる囲みなど有用な表現がある。
この memclose 要素への翻訳は、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 に対応するものしか表示されない。 仕方がないので、それ以外のフラクトゥールを表したければ自前で ASCIIMathML.js に書いておくしかない。 たとえば、frB という表記で、B のフラクトゥールを `frB` のように表すならば、 次の行を ASCIIMathML.js に追加する。場所は var AMSymbols の定義のところで行うのが必須で、 AMquote, の行の直後がいいだろう。
{input:"frB", tag:"mi", output:"\ud835\udd05", tex:null, ttype:CONST},
なお、B のフラクトゥールが "\ud835\udd05" という表記であることは、 マークアップとエンコード (www5.pf-x.net)で知った。mikeo_410 さんに感謝する。
| ラテン文字 | 表記 | フラクトゥール | 説明 |
|---|---|---|---|
| A | udd04 | `frA` | |
| B | udd05 | `frB` | |
| C | - | `frC` | |
| D | udd06 | `frD` | |
| E | udd07 | `frE` | |
| F | udd08 | `frF` | |
| G | udd09 | `frG` | |
| H | - | `frH` | |
| I | - | `frI` | |
| J | udd0c | `frJ` | |
| K | udd0d | `frK` | |
| L | udd0e | `frL` | |
| M | udd0f | `frM` | |
| N | udd10 | `frN` | |
| O | udd11 | `frO` | |
| P | udd12 | `frP` | |
| Q | udd13 | `frQ` | |
| R | - | `frR` | |
| S | udd15 | `frS` | |
| T | udd16 | `frT` | |
| U | udd17 | `frU` | |
| V | udd18 | `frV` | |
| W | udd19 | `frW` | |
| X | udd1a | `frX` | |
| Y | udd1b | `frY` | |
| Z | - | `frS` |
フラクトゥールのほかに数学では活字上の筆記体も用いられる(ちょっと形容矛盾だ)。 これはカリグラフ体とかスクリプト体とか呼ばれるらしいが、 これもどういうわけか一部の大文字アルファベット、すなわち B (`ccB`)、E (`ccE`)、F(`ccF`) 、H(`ccH`) 、I(`ccI`)、 L(`ccL`)、 M(`ccM`)、R(`ccR`) しかうまく変換できない。 これらの用途を知るため、 http://www3.fctv.ne.jp/~takamu/xml-entity-names-ja/script-ja.html を参考として推測した。
| 文字入力 | 表現 | 説明 |
|---|---|---|
| ccB | `ccB` | ベルヌーイ数数 |
| ccE | `ccE` | 期待値 |
| ccF | `ccF` | フーリエ変換 |
| ccH | `ccH` | ハミルトニアン、ヒルベルト変換 |
| ccI | `ccI` | 複素数の虚数部 |
| ccL | `ccL` | ラグランジアン、ラプラス変換 |
| ccM | `ccM` | メラン変換、M行列 |
| ccR | `ccR` | 複素数の実数部 |
これらは u+2100 区にあり、Letterlike Symbols Block ということで、字のような記号がここに収められている。 これら変換できるものは script capital (B|E|F|H|I|L|M|R) のように名前が付けられている。 これら以外のものは、第1面の数学用文字数字記号で表さなければいけない。たとえば、 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 - |x|) `
`0 = argmax_x (1 - |x|) `
数学の授業で、太字を表すために文字の一部を二重に書くことがある。 このような字体は活字でも用いられ、二度打ち体、二重線体、オープンフェース、黒板太字、 ブラックボードボールドなどと呼ばれる。 よく使われる黒板太字体には下記がある。
| 文字入力 | 表現 | 説明 |
|---|---|---|
| CC | `CC` | 複素数 |
| RR | `RR` | 実数 |
| `QQ` | 有理数 | |
| NN | `NN` | 自然数 |
| ZZ | `ZZ` | 整数 |
http://www3.fctv.ne.jp/~takamu/xml-entity-names-ja/double-struck-ja.html 上記5例より頻度は落ちるが、H の黒板太字で四元数を、P の黒板太字で素数を、そして E の黒板太字でユークリッド空間を表すことがある。 ただこれら2例は HH や PP 、EE と打ってもそのままでは黒板太字にならないので、 HH や PP 、EE が黒板太字であることを ASCIIMathML.js の input:"CC" の前後で行を追加して output を定義しないといけない。 また、以前の ASCIIMathML.js では ee で自然対数を、ii で虚数単位を現わしていたが、 これも今はデフォルトではない。
以下、妙な記号を付け加えているのは、論理学の本「プログラムの基礎理論」に出てくるからである。
http://www3.fctv.ne.jp/~takamu/xml-entity-names-ja/mmlalias-ja.html を参考に、カッコを調べる。
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 の意味だと思えばいいだろう。
| 文字入力 | 表現 | 説明 |
|---|---|---|
| [| | `[|` | 左カッコ |
| |] | `|]` | 右カッコ |
http://www3.fctv.ne.jp/~takamu/xml-entity-names-ja/mmlalias-ja.html を参考に、論理記号を調べる。
uplus U+228E U0228E 多重集合の集合和 MULTISET UNION /uplus B: 集合和の中のプラス記号 /uplus B: plus sign in union UnionPlus
| 文字入力 | 表現 | 説明 |
|---|---|---|
| u+ | `u+` | 非重複和 |
http://www3.fctv.ne.jp/~takamu/xml-entity-names-ja/mmlalias-ja.html を参考に、論理記号を調べる。 ≜ や ≝ は定義を表す。 ASCIIMathML.js には次の2行を入れた。
{input:"d=", tag:"mo", output:"\u225c", tex:"null", ttype:CONST},
{input:"D=", tag:"mo", output:"\u225d", tex:"null", ttype:CONST},
delta equal to U+225C U0225C
| 文字入力 | 表現 | 説明 |
|---|---|---|
| d= | `d=` | 定義 |
| D= | `D=` | 定義 |
公式には、下記のページのように、js ファイル本体を更新する必要はなく、
HTML のページに入れておけばいいようだ。
Extending the symbol table
楕円関数の一種である、ヴァイエルシュトラス(ワイエルシュトラス)のペー関数は、 ℘ と書く。 ASCIIMathML では書き方が定められていないため、Tex の \wp を流用しておく。
| 文字入力 | 表現 | 説明 | Unicode |
|---|---|---|---|
| wp | `wp` | ワイエルシュトラスの `wp` 関数 | U+2118 |
Lernejo de Marinkjo > Ĉambro de komputilo > Markup lingvo > ASCIIMathML