目次
サンプル・プログラムの実行例

サンプル・プログラム
mimetex.php | サンプル・プログラム本体。 |
mimetex.zip | mimeTeXのソースコード、Windows実行プログラムなど。 |
TeX と mimeTeX
これにマクロパッケージを組み込み、さらに組版処理を手軽にしたものが LaTeX である。
たとえば、二次方程式の解の公式

\frac{-b\pm\sqrt{b^2-4ac}}{2a}mimeTeX は、LaTeX のサブセットを画像表示するためのソフトウェアである。
mimeTeX は単独の小さな実行ファイルであり、Webとの相性もよい。
mimeTeX のインストール

SSH が利用できない環境であれば、PHP を介して gcc を起動すればいいだろう。
ダウンロードしたソースをアップロードし、同じディレクトリに以下のようなPHPスクリプトを配置し、CGIモードで実行すればよい。
#!/usr/local/bin/phpコンパイルできた mimetex.cgi(Windowsでは mimetex.exe)は、実行可能なディレクトリに設置する。
system("gcc -DAA mimetex.c gifsave.c -lm -o mimetex.cgi");
print "*** Compile finished ***\n"
ただし、Windows の場合は、ディレクトリ名にスペースが含まれていると関数 system で実行できないことがあるので、"Program Files" 以下や、"Apache Group" 以下には配置しない方がいいだろう。
サンプル・プログラムの流れ

HTML FORMで入力した TeX 文を読み取り、ラジオボタンによって、後述する2つの処理へ分岐する。
解説:初期化処理
11: // 初期化処理 ================================================================
12: define('INTERNAL_ENCODING', 'UTF-8');
13: mb_internal_encoding(INTERNAL_ENCODING);
14: mb_regex_encoding(INTERNAL_ENCODING);
15: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
16: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/phpgd/phpgd-10-01.shtm');
17:
18: //TeXのHTML
19: define('TeX', 'T<span style="text-transform: uppercase; margin-left: -0.1667em; vertical-align: -0.5ex; line-height: 0; margin-right: -0.125em">e</span>X');

処理選択は配列変数 $SelectFuncs に記述している。この要素を書き換えることで、処理の追加/削除ができる。
解説:画像表示処理
170: /**
171: * mimeTeX実行処理
172: * @param string $tex TeX文
173: * @return string 実行結果
174: */
175: function exec_mimetex($tex) {
176: //コマンドライン
177: $cmd = EXECMimeTeX . " \"{$tex}\" -e";
178:
179: //実行結果取得(バイナリ)
180: $data = '';
181: $fp = popen($cmd, 'rb');
182: while (! feof($fp)) {
183: $data .= fread($fp, 1024);
184: }
185: pclose($fp);
186:
187: return $data;
188: }
解説:画像表示処理
260: /**
261: * 画面表示処理(imgタグ生成)
262: * @param string $tex TeX文
263: * @return string 表示HTML
264: */
265: function display($tex) {
266: global $HtmlHeader, $HtmlFooter;
267:
268: //mimeTeX実行
269: $data = exec_mimetex($tex);
270: //BASE64化
271: $data = 'data:image/gif;base64,' . base64_encode($data);
272:
273: $html = "<img src=\"{$data}\" />";
274: $body = makeCommonBody($tex, $html);
275:
276: return($HtmlHeader . $body . $HtmlFooter);
277: }
結果はバイナリのGIFデータであるため、これを base64_encode 関数を使ってBASE64コード化し、imgのsrc属性にセットする。

次に、makeCommonBody 関数を呼び出し、入力やヘルプに関わるHTMLタグを追加する。
解説:ダウンロード処理
279: /**
280: * ダウンロード処理
281: * @param string $tex TeX文
282: * @return なし
283: */
284: function download($tex) {
285: $fname = DOWNLOAD_FNAME;
286:
287: //mimeTeX実行
288: $data = exec_mimetex($tex);
289:
290: //ダウンロード出力
291: header("Content-Type: image/gif");
292: header("Content-Disposition: attachment; filename={$fname}");
293: echo $data;
294: }

ダウンロード出力の際、関数 header を使って必要な http ヘッダを送信するようにした。
解説:処理の分岐
56: * 処理選択肢
57: * @global array $SelectFuncs
58: */
59: $SelectFuncs = array(
60: //関数名 タイトル ラジオボタンcheked
61: 'display' => array('title'=>'画面表示', 'checked'=>'checked'),
62: 'download' => array('title'=>'ダウンロード', 'checked'=>''),
63: );
142: /**
143: * checkedされている処理を検索する
144: * @return string 選択された関数名/FALSE=checkedされている処理がない
145: */
146: function getSelectFunc() {
147: global $SelectFuncs;
148:
149: foreach ($SelectFuncs as $key=>$val) {
150: if ($val['checked'] == 'checked') return $key;
151: }
152: return FALSE;
153: }
155: /**
156: * 処理をchekedする
157: * @param string $func 処理関数名
158: * @return bool TRUE/FALSE
159: */
160: function setSelectFunc($func) {
161: global $SelectFuncs;
162:
163: $old = getSelectFunc();
164: if ($func != FALSE) $SelectFuncs[$old]['checked'] = '';
165: $SelectFuncs[$func]['checked'] = 'checked';
166:
167: return TRUE;
168: }
300: echo $func($tex); //選択した処理を実行する
301:

処理の分岐は、可変関数を使っている。つまり、変数 $func に代入された関数名にしたがって処理を分岐するようになっている。
参考サイト
- TeX Users Group:公式サイト
- PHPでmimeTeXを使って数式を作成(Windowsアプリ版):ぱふぅ家のホームページ
- C++ で TeX画像を作成:ぱふぅ家のホームページ
(2021年9月22日)PHP8対応,リファラ・チェック改良,等