Login
Create new posts
话说我本来是倾向于 KaTeX 的,因为我感觉他很快,而且 MathJax 似乎很难配。但是大家表示对缺少功能的 KaTeX 并无好感,给我提供了一些钻研 MathJax 的动力。 其实也不算钻研,因为实际上 MathJax 很简单,调用 MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.element.nativeElement]); 就可以渲染一个元素(这个 this.element.nativeElement 是从 Angular 中调用它 DOM 的语法),这个 .Queue 实际上是 MathJax 自己实现的回调格式,语法非常清奇,参数个数不定,每个都是数组,代表一个回调,顺序执行。比如这个 ['Typeset', MathJax.Hub, this.element.nativeElement],第一个元素是方法名,第二个元素是 this,之后的元素都是参数…… 我们可以看到这个就相当于执行 MathJax.Hub.Typeset(this.element.nativeElement),那为啥不执行这个?因为这方法是同步的,会导致页面十分卡。于是 MathJax 就自己封装了一个异步队列(它的 API 可能几百年没改了) 我们说回 Angular。因为要用 markdown,我的思路是用 marked 封装一个 directive。那么我们就应该在 marked 渲染完成之后用 MathJax 去 Typeset 这个组件。但真的这样做了,却产生了奇妙的效果——切换页面之后,要等将近一分钟才开始渲染。我在它的队列里放了几个 log,发现每个元素都被 queue 了 4 次,几十个元素,难怪要一分钟才开始渲染下一页的内容,即使大部分 markdown 里面根本没有数学。 这时候我开始灰心了,这个问题就没有解决办法了吗?绝望之时,我想到能不能直接 Typeset document,结果是可以的,而且十分快。所以渲染并不慢,可能是渲染的初始化过程比较慢。那么这时候方案就出来了,我们可以尽量减少渲染次数,同时只渲染 document。只要这个渲染还在进行,那么有再多的元素 queue 上来,我们也只当作 queue 了一次。 于是我就写了这么个 service: @Injectable() xport class MathjaxService {
public isQueued = false; public isRunning = false; window: any;
constructor(@Inject(PLATFORM_ID) private platformId: Object) { if (isPlatformBrowser(this.platformId)) { this.window = window as any; } }
finishRunning() { this.isRunning = false; if (this.isQueued) { this.queueChange(); } }
queueChange() { if (this.isRunning) { this.isQueued = true; } else { this.isQueued = false; this.isRunning = true; if (isPlatformBrowser(this.platformId)) { if (this.window.MathJax) { this.window.MathJax.Hub.Config({ messageStyle: 'none', tex2jax: { // preview: 'none', inlineMath: [['', '']], processEscapes: true } }); this.window.MathJax.Hub.Queue(['log', console, 'start'], ['Typeset', this.window.MathJax.Hub, document], ['log', console, 'end'], ['finishRunning', this]); } } else { this.finishRunning(); } } } 事实证明,它能圆满完成任务,它也就是现在运行在这个网站上的代码。
这是什么意思呢?
为什么计算出来的高度会比最高的 inline 子元素都高?
这是为什么呢?似乎形成了两个独立的系统 是因为 macOS Catalina 新引入的更严格的权限管理机制导致的吗?
reduce homology 解决了什么问题?当时怎么知道它应该是这样的,从而可以解决那些问题的?
如何配置 tsconfig,才能使 TypeScript 能够解析导入的模块的类型定义?
特别是 macOS 的 WiFi 扫描,是不是只是简单读取系统 API 而已?
为什么从来没有人教过我们这一点?我们的软件工程教育水平似乎还很不足的样子……
我们需要看合订本,是吗? https://colliot.org/zh/2018/01/%e7%94%a8-angular-%e5%bc%84%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%8c%e5%8d%95%e8%af%8d%e7%9a%84%e7%bd%91%e7%ab%99-eliseos-org/ 虎哥名人名言: 整个弄下来的感想就是,Angular 是真的好用,Angular 生态是真的不错,universal 完全按官方走一遍就活了,现在线上运行的版本就是 universal 的,右键查看源码可以看到是渲染好的页面发过来的。angular cli 一路可以 generate 到底,基于 NgModule 的路由懒加载也是开箱即用,不需要任何配置,非常美妙。
这个网站现在还是 Angular 的吗?
给定标准布朗运动 Bt 假设 s 是个停时,那么 B′t={Bt2Bs−Btif t≤sif t>s 是标准布朗运动。
弱反射原理 mathbb{P}{M_t ge a} = 2mathbb{P}{B_t ge a},其中 M_t = sup_{sin[0,t]}B_s 是布朗运动 B_t 在 [0,t] 内达到的最大值。 它可以写作mathbb{P}{B_t ge a}=dfrac{1}{2}mathbb{P}{M_t ge a},这个在直观上很容易理解,因为 B_t ge a 必然有 M_t ge a,而 M_t 第一次到达 a 之后,后续任何点大于或小于 a 的概率都是 1/2。 强反射原理 给定标准布朗运动 B_t,假设 s 是个停时,那么
begin{equation} B'_t= begin{cases} B_t & text{if } t le s 2B_s-B_t & text{if } t > s end{cases} end{equation}
仍是标准布朗运动。 这实际上就是「第一次到达 a 之后,后续任何点大于或小于 a 的概率都是 1/2」的严格表述。所以后者可以推出前者。
感觉跟 Brownian motion 或者说 Wiener process 的 reflection principle 有关?
找到了相关文章 Formalising Real Numbers in Homotopy Type Theory,让我来看一看。
怎么用类型系统表述戴德金分割呢?
textbf{} extbf{}
我现在懂了,就是戴德金分割
不成立。现在的语法也有这样的歧义
Create new posts