MathMLのmfencedで集合の外延表記をつくる

先日にひきつづき、MathMLと戯れています。

ironoir.hatenablog.com

今回は以下のMathML数式組版入門という書籍を読んでいます。以前に技術書展で現地購入したので、かなり前ですね。次に東京で現地開催されるのはいつの日になるんでしょうか。ただ、書名で検索するとまるまる内容が出てきます。他にまとまった情報もあるかもしれませんが、しっかりまとまっていると思うので必要な方はご覧いただければと思います。著者の方、ありがとうございます。

https://www.antenna.co.jp/AHF/ahf_publication/MathML/mathml-guide.pdf

さて、昨日はようやく使い始めたんですが、mfencedというタグがあって少し気に入りました。

f:id:ironoir:20210220224112p:plain

例えば上のような式があった場合に、最初は素直にカッコ文字を使って

    <math display="block">
      <mo>&exist;</mo>
      <mi>x</mi>
      <mo>(</mo>
      <mi>x</mi>
      <mo>=</mo>
      <mi>x</mi>
      <mo>)</mo>
      <mtext>.</mtext>
    </math>

のように書いていたんですが、これはmfencedを使って書き換えられます。

    <math display="block">
      <mo>&exist;</mo>
      <mi>x</mi>
      <mfenced>
        <mrow>
          <mi>x</mi>
          <mo>=</mo>
          <mi>x</mi>
        </mrow>
      </mfenced>
      <mtext>.</mtext>
    </math>

明示的にカッコは使っていないわけですが、これで自動的にmfencedの部分がカッコで囲まれます。構造化もされるので見やすい、個人的にはこちらの方が好みです。さらに、レンダリングの結果も微妙に変わります。差が分かりますか?ひらきカッコの前のスペースが少し広くなります。

f:id:ironoir:20210220224756p:plain

さて、このmfenced、もう一つ機能があります。それは区切り文字を挿入できるということ。

    <math display="block">
      <mfenced>
        <mi>x</mi>
        <mi>y</mi>
        <mi>z</mi>
      </mfenced>
    </math>

上記のように書くと、間にカンマも挿入されます。タプルが書き放題です。

f:id:ironoir:20210220225103p:plain

さらに、open close 属性を使えば、このカッコは自由な文字に変更することもできます。

    <math display="block">
      <mfenced open="{" close="}">
        <mi>x</mi>
        <mi>y</mi>
        <mi>z</mi>
      </mfenced>
    </math>

f:id:ironoir:20210220225632p:plain

うん。わかりやすい。人力で書くときにはしんどいですが、プログラミングから生成するのはこっちの方がやっぱりいいですよね。これで何か動くものを作ろうとしているので、さらに調べます。