寫數學方程式

市面上網頁用的數學方程式顯示/編輯解決方案,大致分成三大類:

  1. 使用java外掛程式。這種外掛程式是圖形介面,使用上很方便,但問題是使用者除了要裝java以外,必須另外加裝外掛程式。執行效率與穩定度通常不是很好。另外更重要的是方程式的coding沒有標準化,永續性是個大問題。
  2. 使用tex語法,用轉換程式將數學方程式轉成圖形檔。這種方式的歷史恐怕比java外掛程式還早。應該是早在www出現的時候就有了。這種方式的優點是tex語法非常標準化,寫網頁的人可以快速的輸入數學方程式,瀏覽者也不需要去安裝程式或是作特殊設定。缺點就是使用圖形檔來顯示數學方程式會造成使用者端搜尋與複製上的困難。
  3. 使用MathML。MathML是由W3C認可的xml數學方程式語法。目前已經有像是mozila與amaya等瀏覽器直接支援MathML的顯示,不過需要另外安裝特殊字形。IE的話可以經由裝plugin來支援。他最大的好處當然就是標準化,而且受到愈來愈多軟體商的支援,應該就會是將來網頁數學方程式的共通標準。缺點就是跟tex比起來,xml語法實在是非常的繁雜,寫起來很麻煩,看起來更困難。當然目前已經有很多軟體來解決這問題。有的是可以把tex碼轉成MathML,有的是圖形介面程式讓使用者可以用點選的方式來編輯方程式。

使用mimetex的方法

  1. 網路本站下載適合你的作業系統的mimetex 1.61版。這是cgi binary。抓完之後放到server上的cgi目錄中(如和html平行的cgi-bin),然後改權限為755。
  2. 此時<img src="路徑/cgi-bin/mimetex.cgi?公式" alt="" border=0 align=middle />會畫出公式的圖。

討論區加方程式功能[以small machine forum (smf)為例]

用MathML的問題

  1. 無MathML mod。
  2. 會將所有的tag (< ...>)轉成<>等html符號,導至xml失效。
  3. 每個網頁都要設定一些xml的標頭,需要修改程式碼。

使用mimetex及過濾函式

原理是在論壇程式smf上插入一個過濾器。將留言中有[tex]….[/tex]中的tex碼傳給mimetex的cgi,轉換成圖形檔,再將tex碼以圖形檔取代。

轉換時機有兩種作法,本例以下述的第二種為基礎再改良:

  1. 在留言存入資料表之前,資料表中的留言公式碼被換成<img src=".../">。搜尋及留言修改上都很麻煩。
  2. 從資料表中擷取留言顯示給讀者看時轉換。每看一次都要轉換,太耗資源。

實作如下:

  1. 同上段,裝上mimetex.cgi。
  2. 安裝過濾器函式mimetex():
    1. 網路本站抓latexrender.zip,將其中mimetex目錄放在smf目錄下的Sources子目錄。
    2. 過濾器其實只需要mimetex目錄下的mimetex.php,此即函式mimetex(),改函式的前四行指定伺服器mimetex.cgi所在路徑、網址、圖檔資料夾。
    3. 將mimetex目錄下的pictures目錄權限改為777。
    [說明]
    此時應可由瀏覽器看mimetex目錄底下的example.php,並正常顯示tex數學公式。example.php中靠以下兩行進行轉換:
        include_once("mimetex.php");
        echo nl2br(mimetex(含[tex]公式[/tex]之字串));
    過濾函式遇到一段[tex]…[/tex]碼時先計算這段文字的md5碼,查看有沒有以此md5碼為「檔名」的圖形檔存在:
    1. 已經有就直接取用。
    2. 如果沒有就將這段文字轉換成圖形檔,然後以這md5碼為檔名存起來,再取用。
    公式碼一樣,md5碼檔名就會一樣,公式碼不同,md5碼檔名就會不同。
  3. 修改論壇程式smf1.0.5,改Sources目錄底下的Subs.php。先找到Subs.php中下列這段程式碼:
                   }
            }
            $message = substr(implode('', $parts), 1);
            // Fix things.
            $message = str_replace(
                    array('{<{', '}>}', '  ', '\r', '\n'),

    然後在 $message = substr(implode('', $parts), 1); 之後以及 // Fix things.之前插入下列這段程式碼:
    include_once('Sources/mimetex/mimetex.php');
    $message = mimetex($message);