SMathML参考

一. 原理

SMathML的基本原理请参见SMathML论文 (draft).

二. 元素参考

2.1 基本元素

根据MathML Core标准, 目前SMathML提供如下基本元素以供构造MathML表达式.

Math Merror Mfrac Mi Mmultiscripts Mn Mo Mover Mpadded Mphantom Mroot Mrow
Ms Mspace Msqrt Mstyle Msub Msubsup Msup Mtable Mtd Mtext Mtr Munder Munderover

Math参考

根据MathML标准, MathML表达式必须被包裹于<math>元素之中. 尽管如此, SMathML提供了一种手段, 可以免除读者疲于添加Math的辛劳. 在slt.rkt之中, 我们提供了构造树变换的基本抽象T. 据此, 我们在math-styles.rkt之中提供了一个过程Tm, 其可以自动为数学内容添加<math>标签. 我们也为过程Math提供了一个简短的别名M.

MathML内容有两种呈现风格, 一种是inline, 另一种是block, 让我们在以下两个例子之中对于它们进行比较.

例子1. inline风格. 欧拉公式eiπ+1=0看上去是很有趣的.
例子2. block风格. 欧拉公式eiπ+1=0看上去是很有趣的.

以上两个例子的MathML部分如下.

(Math #:attr* '((display "inline"))
      (Mrow (Msup (Mi "e") (Mrow (Mi "i") (Mo "&it;") (Mi "&pi;"))) (Mo "+") (Mn "1") (Mo "=") (Mn "0")))
(Math #:attr* '((display "block"))
      (Mrow (Msup (Mi "e") (Mrow (Mi "i") (Mo "&it;") (Mi "&pi;"))) (Mo "+") (Mn "1") (Mo "=") (Mn "0")))
在不明确指出呈现风格的情况下, MathML默认的呈现风格是inline.

Mfrac参考

Mfrac构造一个分式, 例如

(Mfrac (Mn "1") (Mrow (Mi "x") (Mo "+") (Mn "1")))
<mfrac><mn>1</mn><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow></mfrac>
1x+1

2.2 衍生元素与复合元素

显然, 这部分是为了让编写数学内容的生活更加简单.

$a, $b, $c, ...参考

$a不过就是(Mi "a")的缩写, 依此类推.

$alpha, $beta, $gamma, ...参考

$alpha不过就是(Mi "&alpha;")的缩写, 依此类推.

$a:normal, $a:bold, $a:script, ...参考

$a:normal不过就是(Mi "a" #:attr* '((mathvariant "normal")))的缩写, 依此类推.

三. 变换

SMathML提供了一些构造变换的手段和两个实用的变换.

set-attr*参考

Ttable参考

Ttable为用户调整表格提供了方便的抽象.

T参考

T是对于一般树变换的抽象.

Tm参考

Tm为用户编写数学内容提供了许多方便.

Tn参考

Tn为用户提供了一种进行自动编号与引用的手段.

四. 注记

此注记内容和MathML标准的细节与具体的浏览器实现有关, 因而有可能存在过时的情况.

  1. 根据MathML标准, 撇 (prime) 的正当做法是使用上标, 例如
    (Msup $x $prime)
    <msup><mi>x</mi><mo>&prime;</mo></msup>
    x而不是
    (Mrow $x $prime)
    <mrow><mi>x</mi><mo>&prime;</mo></mrow>
    x尽管如此, 目前Firefox对此支持较好, 而Chrome按照正当做法则会造成偏上的情况. 更大的问题在于给具有下标的元素添加一撇, 例如
    (_^ $x $1 $prime)
    <msubsup><mi>x</mi><mn>1</mn><mo>&prime;</mo></msubsup>
    x1此时Firefox一切正常, 但是Chrome不论怎样变通都无法得到想要达成的输出结果.
  2. 虽然不知出于何种原因, 但是目前根式的渲染似乎是不正常的, 例如
    (Mroot $n $x)
    <mroot><mi>n</mi><mi>x</mi></mroot>
    nx
  3. 对于Chrome而言, 除非括号内包裹的是较大的数学表达式, 那么就必须为括号添加stretchy="false"属性以使其看起来符合常理, 例如
    (&cm (pare $x) (par0 $x))
    <mrow><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>,</mo>
    <mrow><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mrow>
    (x),(x)
  4. 目前Chrome对于标签<mover>的渲染不是很符合预期, 例如
    (OverBar (&+ $x $y))
    <mover><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mo>&OverBar;</mo></mover>
    x+y
  5. 目前Chrome对于数学表格的属性支持极其有限, 因此即便连对齐也无法控制.

五. 例子, 或者说画廊

二项式公式

(x+y)n=k=0n(nk)xnkyk

一个经典的极限

limx0sinxx=1

e的定义

elimn(1+1n)n或者en=01n!

希腊字母

αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ

不同的字体

normalbolditalicbold-italicdouble-struckbold-frakturscriptbold-scriptCCCCCCCCfraktursans-serifbold-sans-serifsans-serif-italicsans-serif-bold-italicmonospaceCCCCCC

Fibonacci序列

fib(0)fib(1)fib(2)fib(3)fib(4)fib(5)fib(6)fib(7)fib(8)fib(9)fib(10)fib(11)fib(12)01123581321345589144