SMathML的基本原理请参见SMathML论文 (draft).
根据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
, 让我们在以下两个例子之中对于它们进行比较.
inline
风格. 欧拉公式看上去是很有趣的.block
风格. 欧拉公式看上去是很有趣的.以上两个例子的MathML部分如下.
(Math #:attr* '((display "inline"))
(Mrow (Msup (Mi "e") (Mrow (Mi "i") (Mo "⁢") (Mi "π"))) (Mo "+") (Mn "1") (Mo "=") (Mn "0")))
(Math #:attr* '((display "block"))
(Mrow (Msup (Mi "e") (Mrow (Mi "i") (Mo "⁢") (Mi "π"))) (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>
显然, 这部分是为了让编写数学内容的生活更加简单.
$a
, $b
, $c
, ...参考$a
不过就是(Mi "a")
的缩写, 依此类推.
$alpha
, $beta
, $gamma
, ...参考$alpha
不过就是(Mi "α")
的缩写, 依此类推.
$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标准的细节与具体的浏览器实现有关, 因而有可能存在过时的情况.
(Msup $x $prime)
<msup><mi>x</mi><mo>′</mo></msup>
而不是(Mrow $x $prime)
<mrow><mi>x</mi><mo>′</mo></mrow>
尽管如此, 目前Firefox对此支持较好, 而Chrome按照正当做法则会造成偏上的情况. 更大的问题在于给具有下标的元素添加一撇, 例如(_^ $x $1 $prime)
<msubsup><mi>x</mi><mn>1</mn><mo>′</mo></msubsup>
此时Firefox一切正常, 但是Chrome不论怎样变通都无法得到想要达成的输出结果.(Mroot $n $x)
<mroot><mi>n</mi><mi>x</mi></mroot>
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>
<mover>
的渲染不是很符合预期, 例如(OverBar (&+ $x $y))
<mover><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mo>‾</mo></mover>