(continued)前の記事では、「LaTeXではカッコは必ずしも対応してなくてもいいけどMathMLではカッコの対応が大事」ということを書いた。MathML特有の概念(マークアップ)は他にも色々あるので、この記事ではそれらを掘り下げていく。いう文字の並びを書いた時に、これが「一つの識別子か、乗算記号を省略した複数の変数か」というのが明らかではないという問題がある。MathMLへ変換する際は、識別子であれば一つの<mi>タグを生成し、複数の変数であれば複数の<mi>タグとそれを区切る<mo>&InvisibleTimes;</mo>を生成する必要がある。「識別子か複数の変数か」の判断に関しては、\mathrm等のフォントに関する指定を考慮すれば良いだろう。\mathrmの中であれば識別子と判断し、そうでなければ複数の変数と判断する。数値リテラルに関しても同様の問題がある。いう数値リテラルを書いてもひとまとまりとしては扱われず、ただ数字やピリオドが並んでいるだけである。なってしまう、というような経験は誰にでもあるだろう。)<mn>に関しては変換器の側で「数字とピリオドの並びをひとまとまりとして解釈する」という方針である程度カバーできそうだ。いう風に使っている場合も考えられるので注意が必要である。使う場合はクラスが\mathpunctではなく\mathordになるように{}で囲う、というのはTeXに詳しい皆さんならよく知っているだろう。等の不可視演算子について触れた。これは「通常は何も表示しないが、そこで行分割が必要になった場合には掛け算記号が挿入される」という代物である。対応させるのは妥当な発想だろう。linebreak="goodbreak">&InvisibleTimes;</mo>という風にlinebreak属性を指定したものになるだろう。TIMES」を出力するには、やはりLaTeXソースの段階でマークアップしておくか、変換器が推測する必要があるだろう。作ってそれに対する添字として実現する。\({}^t\!A\){}^t\!A転置記号を左上に書く流儀の中でも、人によって空白の量は異なるかもしれない。MathMLには<mmultiscripts>というタグがあり、このような柔軟な位置の添字をより直接的に表現できる。変換することが望ましい。処理系の側では追加のマークアップを用意すると良いかもしれない。あり、\mathopアトムの四隅に添字を配置できる。これも<mmultiscripts>に対応させると良いだろう。(\sidesetは\sum等の\mathopクラスのアトムに適用することを前提としており、汎用的には使えない。タグによって数式の一部をインタラクティブにできる。複数の数式を切り替え(トグル)たり、ツールチップを表示したりできる。https://www.w3.org/TR/MathML3/chapter3.html#presm.maction変換の際にこれらのMathML要素を出力できるようなTeXコマンドを用意しておくと良いかもしれない。MathJaxWebサイトにおいて手抜きで簡単に数式を書けるようにする、みんな大好きMathJaxであるが、MathJaxではLaTeXの記法を拡張しており、MathML出力を意識した拡張が使えるようになっている。Unicode文字をコードポイントにより入力できる。LaTeXの方言のことで、Knuthによるジョークのことではない。オリジナル:http://pear.math.pitt.edu:80/mathzilla/itex2mml.html最新版(?):https://golem.ph.utexas.edu/~distler/blog/itex2MML.htmlみなさんnLabには日頃からお世話になっていると思うが、nLabで使われているWikiエンジン(Instiki)で数式をLaTeX記法からMathMLに変換するのに使われているのがこのitex2MMLである。\itexnumコマンドにより、一つの<mn>タグに入るべき数値表記を明示できる。\begintoggle{}..\endtoggle\toggleの記法がMathJaxと互換性がないものになっている。TeXZillahttp://fred-wang.github.io/TeXZilla/コマンド一覧:https://github.com/fred-wang/TeXZilla/wiki/TeXZilla-Commands系譜としては、itex2MMLの姉妹に相当するだろうか。JavaScript製だが、ページ出力ではなく単体のプログラムとして動作するようだ。\mtextTeX4htTeX4htはTeXが出力したDVIを対象に処理を行うらしい。DVIから処理して得られるHTMLはどうしても構造化から縁遠いイメージがあり、そこをどうやって処理しているのか気になる。\Configureコマンドというのがあるようだが、どうなっているのか。Companionという本にTeX4htとLaTeX2HTMLについての解説があるらしいが、移り変わりが激しいWeb分野について、前世紀の本をお金を出して買う価値があるか疑わしい。Gurari)は2009年に亡くなっているようで、そのせいか知らないが、ドキュメントに載っているリンクがいくつかリンク切れしている。変換ツールが沢山載っている。皆さん車輪の再発明しすぎでは、感がなくもない。人によって「LaTeX→HTML/MathML/etc.」の思想が異なる以上、実装が乱立するのも仕方がないのだ。KaTeXhttps://khan.github.io/KaTeX/function-support.htmlKaTeXはあまりMathMLのことを考えていないイメージがあり、MathML出力を意識した拡張は見受けられない。よって生成されるハイパーリンクはハイパーテキスト特有の概念であろう(しかしハイパーリンクならPDFにもあるわけだが)。LaTeXMathMLオリジナル:https://www.maths.nottingham.ac.uk/personal/drw/lm.html拡張:http://math.etsu.edu/LaTeXMathML/Perl版:http://pillars.che.pitt.edu/LaTeXMathML/オリジナルと拡張版はJavaScript製である。Webブラウザ上で動的にページを変換することを目指しているように見える。Perl版は単体のコマンドとして使えて、LaTeXiTのMathML出力で使われているようである。MathML出力用の独自コマンドの類は、ドキュメントを見る限りでは特に見当たらない。plasTeXhttp://tiarno.github.io/plastex/Python製。数式についてはあまり真面目に考慮されていないようで、システムにインストールされたLaTeX処理系で画像化しているらしい(?)。この記事で取り上げても得るものは少なそうである。LaTeX2HTMLhttp://www.latex2html.org/https://github.com/latex2html/latex2html/Perl製。前世紀から開発が続いている。数式をHTML(4以前)に変換する機能はありそうだが、MathMLには対応していないように見える。この記事で取り上げても(ryHeVeAhttp://hevea.inria.fr/OCaml製のやつ。一応MathMLを出力するオプションがあるようだ。いいけどLaTeXにあるような上付き文字、下付き文字を<sup>や<sub>で表すと見た目が貧相に見えるからやめたほうがいいと思う。TtMhttp://hutchinson.belmont.ma.us/tth/mml/C言語で実装されている。数式のマークアップに関する独自拡張は特に見受けられない。いいけどLaTeXにあるような上付き文字、下付き文字を<sup>や<sub>で表すと見た目が貧相に見えるから(ryWebtexhttp://pkgw.github.io/webtex/JavaScriptで動的にDOMを生成する。MathJaxやKaTeXと異なり、文書全体が対象である。数式はMathMLを使わず、<canvas>に描画されるようだ。この文書の対象外である。筆者が作りたいもの簡易的なLaTeX→HTML/MathML変換プログラムには、LaTeXの文法をマークアップ言語のような感じででっち上げてそれを解釈する、というものが多いだろう。実際のLaTeX文書ではマクロの定義を始めとして、色々厄介な凝ったことをしていることが考えられ、より精度良くTeX/LaTeXを模倣しないとうまくいかない可能性が高い。それに、言語オタク的な趣味として、あるいはTeX言語のより良い理解を得るために、TeX処理系を高精度で再現したい。processorでの処理が字句解析のレイヤーに介入できる)。listを解釈し、MathMLに変換することである。いうわけでここ最近TeXの重箱の隅をぐいぐいつついているわけである。実装の方針:LaTeX文書全体ではなく、数式の部分を対象とする。Markdown中にLaTeX記法で書いた数式を処理できるようにするため。LaTeX文書の数式以外の部分をHTMLに変換する機能を実装するのも面白いのかもしれないが、優先的なゴールではない。ソフトウェアとして再利用可能な構成を目指す。第一級モジュールのような高級な言語機構を備える言語であればこれは可能だと信じる。(再利用可能にしたところでどう使うのかという話だが)組版エンジンを追加で実装すればそのままTeX互換処理系ができる...レベルになるといいなあ(妄想)TeXとの完全な互換性よりも、合理的だと思われる仕様を目指す。LuaTeX等の先進的なエンジンから良さそうな仕様を無理のない範囲で取り込んでいく。入力に間違いや推奨されない書き方がある場合に、TeXよりもわかりやすいエラーメッセージ・警告メッセージが出るようにする。KnuthのTeXはエラー時にトークンを挿入したりしてある程度エラーリカバリーができるようになっているが、そんなものは実装しない。(箇条書きの中で言ってることが矛盾してなくもない気がするが気にしない。)生成するMathMLであるが、WebKitのようなMathML対応が比較的貧弱な環境でもある程度まともに表示されるように、CSSと組み合わせてどうにかしたい。(WebKitの実装がどの程度まともでどの程度だったらCSSでカバーできるのか、確かめる必要がある。TeXエミュレート型」に相当するだろう。「TeXエミュレート型」の変換器はいくつかあるので、わざわざ新しいものを作る価値があるのか...と言われると答えづらいが、まあ詰まるところ筆者のエゴなのでどうでもいい。生成しようという動きは前世紀からあったわけだが、「MathML特有の概念とかXMLの属性をLaTeXでマークアップする記法(コマンド)を標準化しよう」という動きはなかったのだろうか。styleに関する処理系横断のコマンド群はあっても良かったはずで、現状では各処理系が独自にコマンドを定義し、しかも一部では互換性がない(同じコマンド名で異なる挙動を示す)という事態になっている。ちなみにLaTeX文書にハイパーリンク等を挿入する機構としてはLaTeXのhyperrefパッケージがあり、実際に、LaTeXからHTMLを吐くような処理系はだいたい共通して\hrefコマンド等を実装している。そのような共通するコマンドがMathML出力でも欲しかった。あとは、この「LaTeX数式→MathML」というトピックについてまとめられた文献(論文等)があるようなら漁ってみるべきかもしれない。コメントをキャンセルメールアドレスが公開されることはありません。*サイト自明なことに悩んで、人は強くなるんだ。2019年12月20日この記事では、Haskellの型クラスの互換性にまつわる問題と、それに対する緩和策を考える。2019年11月3日この記事は筆者の作業記録です。