Spiga

在博客里轻松使用LaTeX数学公式

2010-04-26 01:32 by Milo Yip, 10941 visits, 收藏, 编辑

笔者最近的博文有不少数学相关内容,发现利用一些网上服务、jQuery和CSS,可以更轻松地在博客里使用\LaTeX语法排版方程式。\LaTeX是基于\TeX的排版系统。而\TeX就是美国著明计算机教授高德纳(Donald E. Knuth),为了编写他的巨著《计算机程序设计艺术(The Art of Computer Programming)》而设计的系统,对于数学公式的排版支援十分强大。

线上LaTeX数学公式编辑器

笔者最初使用这个线上LaTeX数学公式编辑器,输入公式时,就会产生一个影像档案(如GIF、PNG、SVG),把该HTML代码复制到博客即可。例如:

\sqrt{a^2+b^2}

选择输出为HTML,该编辑器就会产生以下的HTML代码:

<img src="http://latex.codecogs.com/gif.latex?\sqrt{a^2+b^2}" title="\sqrt{a^2+b^2}" />

这HTML码就能显示该公式

这个方法已算不错了,但还有3个小问题:

  1. 每次修改,都要从IMG找到\LaTeX代码,复制过去编辑器,再复制过来,比较麻烦。
  2. 希望像一般技术书籍,为公式加入编号,方便评论和沟通时使用。
  3. 万一想改变生成影象的服务、输出格式、大小设置等,就要修改每个地方。

于是,笔者想到使用jQuery,把放置\LaTeX代码的特定的HTML标记,自动变换成IMG标记,并使用CSS作编号。

jQuery作转换

笔者最近才得知jQuery,是百分百新手,请各位不吝赐教。

现时希望支持两种数学公式,一种是文字中的内联(inline)公式,另一种是整行独占的公式。笔者分別采用span和div标记,并共同使用math作为class:

<span class="math">latex code</span>
<div class="math">latex code</div>

之后,就使用以下JavaScript代码,在网页载入后做这个转换:

// math.js
$(document).ready(function() {
    $(".math").each(function(i) { $(this).html("<img src=\"http://latex.codecogs.com/png.latex?" + this.innerHTML + "\"/>"); });
});

CSS排版

最后,利用CSS2计数器(CSS2 counter),为非内联的公式加入编号。 编号的方式各有喜好,笔者博客里使用采用(节.公式编号)格式,笔者定义"节"(section)是以<h2>为层级,公式编号则是在一个章节里从1开始。 在博客园中,博客内文是在div.entry之内,以下CSS代码就能为公式加上编号和置中(可加进博客"修改设置 -> 通过CSS定制页面风格"):

body { counter-reset:section 0; }
div.entry h2:before { counter-increment:section; content: counter(section) ". " }
div.entry h2 { counter-reset:equation }
div.math:before { counter-increment:equation; content: "(" counter(section) "." counter(equation) ")"; float:right; }
div.math img { display: block; margin-left:auto; margin-right:auto; }
span.math img { border:none; vertical-align:middle; }

测试1

<p>牛顿力学第三定理是</p>
<div class="math">\vec{F}=m \frac{d \vec{v}}{dt} + \vec{v}\frac{dm}{dt}</div>
<p>当中<span class="math">\frac{d \vec{v}}{dt}</span>是速度相对于时间的改变。 </p>
<p>爱因斯坦的能质守衡公式是</p>
<div class="math">E=mc^2</div> 

牛顿力学第三定理是

\vec{F}=m \frac{d \vec{v}}{dt} + \vec{v}\frac{dm}{dt}

当中\frac{d \vec{v}}{dt}是速度相对于时间的改变。

爱因斯坦的能质守衡公式是

E=mc^2

(可看到方程计数器的递增,使编号由(4.1)变成(4.2)。)

测试2

<p>计算两个矢量<span class="math">\mathbf{A}</span>和<span class="math">\mathbf{B}</span>之间的夹角<span class="math">\theta</span>,可用</p>
<div class="math">\cos \theta = \frac{\mathbf{A} \cdot \mathbf{B}}{\left \| \mathbf{A} \right\| \cdot \left \| \mathbf{B} \right\|}</div>

计算两个矢量\mathbf{A}\mathbf{B}之间的夹角\theta,可用

\cos \theta = \frac{\mathbf{A} \cdot \mathbf{B}}{\left \| \mathbf{A} \right\| \cdot \left \| \mathbf{B} \right\|}

(可看到h2标记把计方程数器重置,使编号变成(5.1)。)

结语

对于简单的公式,笔者现在可以直接使用HTML编辑器输入\LaTeX代码,修改也容易。透过CSS把显示的格式和内容分离,将来改变皮肤、或\LaTeX影象生成服务等也变得容易。

一个缺点是,读者透过RSS等方式,只能看见\LaTeX源码。

读者可于这里下载代码

关于\LaTeX的进阶公式输入方法,可参考中文维基:数学公式

祝写博愉快!

Add your comment

21 条回复

  1. #1楼 xinghang      2010-04-26 01:44
    M 大辛苦了
     回复 引用 查看   
  2. #2楼 .COM 缺氧®      2010-04-26 03:13
    M 大,你好厉害哟。
     回复 引用 查看   
  3. #3楼       2010-04-26 03:23
    这个有点意思。可能是长尾理论了。针对小部分人,但是又非常有用。不用开word+mathtype
     回复 引用 查看   
  4. #4楼 Wuya      2010-04-26 08:15
    我一直用的word或者wps的公式编辑器,
    然后截图插入html文档,非常的麻烦。
     回复 引用 查看   
  5. #5楼 Gnie      2010-04-26 08:29
    不错!!
     回复 引用 查看   
  6. #6楼 1-2-3      2010-04-26 08:48
    收藏
     回复 引用 查看   
  7. #7楼 菩提树下的杨过      2010-04-26 09:07
    非常实用!
     回复 引用 查看   
  8. #8楼 Beliter Xiao      2010-04-26 09:08
    学习
     回复 引用 查看   
  9. #9楼 serf _lee      2010-04-26 09:11
    mark。 很好用
     回复 引用 查看   
  10. #10楼 亚历山大同志      2010-04-26 10:14
    这个在做教育行业的软件里头灰常灰常的有用
     回复 引用 查看   
  11. #11楼 skyaspnet      2010-04-26 12:01
    支持
     回复 引用 查看   
  12. #12楼 黄明      2010-04-26 12:28
    很受用
     回复 引用 查看   
  13. #13楼 Ariex      2010-04-26 12:42
    貌似有一点点小遗憾,长的数组自动折行了……
    比如这样的:
     回复 引用 查看   
  14. #14楼 Ariex      2010-04-26 12:42
    公式:
    <a href="http://www.codecogs.com/eqnedit.php?latex=\frac{1}{\frac{1}{F}@plus;\sum_{j=1}^{25}f_j^{-1}(x_1, x_2)}, where f_j(x_1,x_2)=c_j@plus;\sum_{i=1}^{2}(x_i-a_{ij}), where -65.536\leq x_i\leq 65.536,K=500,c_j=j,and [a_{ij}]=\begin{bmatrix} -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \\ -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \end{bmatrix}" target="_blank"><img src="http://latex.codecogs.com/gif.latex?\frac{1}{\frac{1}{F}+\sum_{j=1}^{25}f_j^{-1}(x_1, x_2)}, where f_j(x_1,x_2)=c_j+\sum_{i=1}^{2}(x_i-a_{ij}), where -65.536\leq x_i\leq 65.536,K=500,c_j=j,and [a_{ij}]=\begin{bmatrix} -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \\ -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \end{bmatrix}" title="\frac{1}{\frac{1}{F}+\sum_{j=1}^{25}f_j^{-1}(x_1, x_2)}, where f_j(x_1,x_2)=c_j+\sum_{i=1}^{2}(x_i-a_{ij}), where -65.536\leq x_i\leq 65.536,K=500,c_j=j,and [a_{ij}]=\begin{bmatrix} -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \\ -32 & -16 & 0 & 16 & 32 & -32 & -16 & 0 & \ldots & 0 & 16 & 32 \end{bmatrix}" /></a>
     回复 引用 查看   
  15. #15楼[楼主] Milo Yip      2010-04-26 12:59
    @Ariex
    引用Ariex:
    貌似有一点点小遗憾,长的数组自动折行了……
    比如这样的:


    嗯,這是一個問題。

    建議太長的可以分行。我個人會從where那裡分開成幾段,where為HTML。
    另外,在LaTeX裡也可以用 \\ 強制換行(像<br>),但where等文字應用\text{where}形式,否則其實是排版成w、h、e、r、e五個變量相乘。
     回复 引用 查看   
  16. #16楼 egmkang      2010-04-26 13:52
    这个东西很牛叉哈
     回复 引用 查看   
  17. #17楼 hayate      2010-04-26 15:04
    这样看来,最好的还是在后台生成的时候就解析出来,rss也照顾到了
     回复 引用 查看   
  18. #18楼[楼主] Milo Yip      2010-04-26 21:25
    @hayate
    引用hayate:这样看来,最好的还是在后台生成的时候就解析出来,rss也照顾到了

    是的,可以提議博客園這麼做……
     回复 引用 查看   
  19. #19楼 银河      2010-05-02 20:11
    很不错。
    mark
     回复 引用 查看   
  20. #20楼 小高子      2010-05-24 20:07
    Google Chart API也提供了LaTeX公式生成, 原理差不多, 也是转换成图片输出. 具体可以参照: http://moultano.blogspot.com/2009/11/google-can-generate-your-equations-for.html
     回复 引用 查看   
  21. #21楼 GiantIron      2010-05-29 16:39
    这个只能在博客园的博客里面用么?请问对于其它的,比如 msn spaces,有怎样比较方面的方法?
    WordPress也有一个比较方便的API,比如:
    http://l.wordpress.com/latex.php?latex=\LaTeX&bg=ffffff&fg=000000&s=0

    latex是代码部分,bg是背景颜色,fg是前景颜色,s是字体大小。
     回复 引用 查看