这里主要是为了记录MathML和SMathML微妙的地方, 以及当前的SMathML有哪些地方需要修改或补充. 这里只是草稿而已, 或许会有些混乱, 而且也不一定正确.
在某种意义上来说, 提供给用户自行扩展的功能总是好的, 因此SMathML设计了一种相当一般的变换机制, 即过程T
. 并且, 基于过程T
, 还提供了一个用于数学内容渲染的过程Tm
. Tm
会对于整数和分数以及符号进行额外的变换, 但这是硬编码的, 或许Tm
乃至其他什么部分应该给用户自行设计渲染方式的空间.
问题主要在于自行设计的这些部分该如何与SMathML的其他部分进行交互. 最妥当的方式当然是强制要求不能产生任何交互, 必须从头开始编写, 但这的确不方便, 且没有必要. 那么, 或许这种机制需要像T
一样让用户有选择是否交互的余地. 但是, 似乎把事情做得漂亮相当困难, 所以我卡在这里了. 当我想明白的时候, 我会将其加入SMathML之中.
这里记录一些编写博客的时候创造的抽象.
(define $Hom (Mi "Hom"))
(define Hom
(case-lambda
((A B) (appl $Hom A B))
((C A B) (appl (_ $Hom C) A B))))
(define $Aut (Mi "Aut"))
(define Aut
(case-lambda
((A) (app $Aut A))
((C A) (app (_ $Aut C) A))))
(define (_cm A . x*)
(_ A (apply &cm x*)))
之前我的设计太过局限, 让引用在一开始就生成, 然而更好的方式是将其设计成一个接受上下文信息的函数. 因为设计的问题, 似乎这不能立即实现.
之前我的一个设计失误在于没有考虑到跨section的连续标号. 当然, 全局的连续标号是存在的, 但是和跨section标号不是一类东西. 之前的诸多页面总是滥用全局标号的一些特性实现的. 似乎存在两种容易想到的解决之道, 一种是允许heading不刷新局部环境, 另一种是通过某种新的构造来擦除全局环境里的信息, 后者仍然显得相当tricky, 因为还是需要用到全局的标号. 或许允许擦除特定局部环境里的信息也是有价值的, 甚至可以不局限于擦除, 而设计某种更加通用的变换. 新特性施工中. (目前已完成)
这个似乎也是一种设计局限, 因为我没有允许heading和entry不出现在top level, 不然的话判断顺序对于我而言有点难办. 也有可能存在一些扭曲的解决之道, 比如说遇到公式就另起一段, 或者也可以设计一些特殊的entry, 通过特殊的规则转换它们. 然而, 总归不是什么well-designed的东西.
我几乎没有设计任何关于代码呈现的功能 (除了一个用于转义的ad hoc过程), 这可以包括着色, 格式化, 等等. 我在翻译The Little Typer时遇到了这样的需求, 即我需要频繁地在代码中插入以不同字体显示的元变量
. 我发现基于字符串的可复合性
并不好, 主要是试图将几段(用于呈现的)代码合并的时候. 我不能直接将这些元素转为字符串然后合并, 因为这将丢失给转换过程使用的结构信息. 但我相信某种程度上的自动化仍然是可能的, 这之后再思考, 因为我希望尽可能一般.