tex.inc.php †
概要 †
PukiWikiでTeXの数式を表示するためのプラグイン.
ref.inc.phpをベースに作成しました.なので強制的にGPLライセンスになるのかと思って一応GPLということにしておきます.
特徴 †
- Google Chart APIを使用するため,サーバ側のインストール作業がほとんど不要(math2やmimetexとの比較)
- ブラウザに依存しない(mathmlとの比較)
- TeXの数式なので数式が綺麗(mathmlとの比較)
- API経由で取得した数式画像をサーバ側にキャッシュするので2回目以降の表示が速い(jsmathとの比較)
- オプションが豊富(math2, mimetex, jsmath, mathmlとの比較)
使い方 †
#tex($数式$ [,options] [,parameters])
&tex($数式$ [,options] [,parameters]);
options
left: 左寄せ(デフォルト)
center: 中央揃え
right: 右寄せ
around: 回り込み
link: 元ファイルへのリンクを貼る
url: Google Chart API のURLを表示する
noimg: 画像を展開しない
zoom: 縦横比を保持する(拡大率の小さい方に合わせる)
parameters
WIDTHxHEIGHT: WIDTH px,HEIGHT pxにする ※WIDTH, HEIGHT は数値
NUM%: NUM%のサイズにする ※NUM は数値
#RRGGBB: 数式の色を16進数で指定(デフォルトは#000000)
bg#RRGGBBAA: 背景色を16進数で指定.AAは不透過度(デフォルトは#ffffff00)
TITLE: タイトルをTITLEにする
サンプル †
#tex($p(\bm t|\bm x, \bm w, \beta)=\prod_{n=1}^N \mathcal N(t_n|f(x_n, \bm w), \beta^{-1})$)
オプションやパラメータがなければドルマークで括らなくても大丈夫です
#tex(p(\bm t|\bm x, \bm w, \beta)=\prod_{n=1}^N \mathcal N(t_n|f(x_n, \bm w), \beta^{-1}))
Google Chart APIで対応している表現なら使用可能です
#tex(\begin{eqnarray} f(x) &=& (a+b)^2 \\ &=& a^2+2ab+b^2 \end{eqnarray})
※Google Chart API だと \bm が使えませんが,\bm を \mathbf に勝手に変換してくれます
※Google Chart API だと \mathbf xx は \mathbf{xx}と解釈されますが,\mathbf{x}x に勝手に変換してくれます
ダウンロード&インストール †
- WIKIHOMEディレクトリにteximgディレクトリをパーミッション707で作成する
- 以下のファイルから最新版をダウンロードし,tex.inc.phpという名前でWIKIHOME/pluginディレクトリに保存する
- プロキシを通さないとWebにアクセスできない場合はここを参考に$use_proxyを1にしてサーバとポートの設定をする
※PHPのcURLモジュールが無効で,かつallow_url_fopenがoffになっている場合はどちらかを有効にしてください
(ほとんどの環境ではどちらかは有効になっていると思います.特に後者は.)
数式を手軽に表示させる(PukiWiki 1.4.7のみで確認) †
LaTeXのようにドルマークで挟んだり,\[ \]などで挟んだりすることで数式を書きたい場合は以下のような変更を加えることで実現できます.
※この記法でオプションは使えません
数式をドルマークで挟むことでインライン要素として表示させる †
- WIKIHOME/lib/make_link.phpを書き換える
- InlineConverterクラスの$convertersを以下のように変更('TeX'を追加)
$converters = array(
'plugin', // Inline plugins
'TeX', // LaTeX Mathematical Expression
'note', // Footnotes
'url', // URLs
'url_interwiki', // URLs (interwiki definition)
'mailto', // mailto: URL schemes
'interwikiname', // InterWikiNames
'autolink', // AutoLinks
'bracketname', // BracketNames
'wikiname', // WikiNames
'autolink_a', // AutoLinks(alphabet)
);
- 以下の内容を適当なところに追加
// LaTeX Mathematical Expression
class Link_TeX extends Link_plugin
{
function Link_plugin($start)
{
parent::Link_plugin($start);
}
function get_pattern()
{
$this->pattern = '(?<!\\\\)\$((.+?))(?<!\\\\)\$';
return $this->pattern;
}
function get_count()
{
return 2;
}
function set($arr, $page)
{
list($all, $this->plain, $this->param) = $this->splice($arr);
$matches = array();
return parent::setParam($page, 'tex', '', 'plugin');
}
}
数式を\[ \]などで挟むことでブロック要素として表示させる †
- WIKIHOME/lib/convert_html.phpを書き換える
- Bodyクラスのparse関数内で //Default の前に以下の内容を追加
// LaTeX Mathematical Expression
if (substr($line, 0, 2) == '\[') {
if (strpos($line, '\]') === false){
while (! empty($lines)) {
$next_line = preg_replace("/[\r\n]*$/", '', array_shift($lines));
$line .= $next_line;
if (strpos($next_line, '\]') !== false) break;
}
}
$this->last = & $this->last->add(TeX($this, $line));
continue;
} else if (substr($line, 0, 6) == '\begin'){
if (strpos($line, '\end') === false){
while (! empty($lines)) {
$next_line = preg_replace("/[\r\n]*$/", '', array_shift($lines));
$line .= $next_line;
if (strpos($line, '\end') !== false) break;
}
}
$this->last = & $this->last->add(TeX($this, $line));
continue;
}
- 以下の内容を適当なところに追加
function & TeX(& $root, $text)
{
if(exist_plugin_convert('tex'))
return new Div(array('', 'tex', $text));
else
return new Paragraph($text);
}
- サンプル
2013/2/17 追記: こちらの PukiWiki では mathjax.inc.php に移行したので以下に表示されているのは mathjax.inc.php によって変換された数式です。
\[
p(\bm t|\bm x, \bm w, \beta)=\prod_{n=1}^N \mathcal N(t_n|f(x_n, \bm w), \beta^{-1})
\]
\[ p(\bm t|\bm x, \bm w, \beta)=\prod_{n=1}^N \mathcal N(t_n|f(x_n, \bm w), \beta^{-1}) \]
\begin{eqnarray}
f(x) &=& (a+b)^2 \\
&=& a^2+2ab+b^2
\end{eqnarray}
\begin{eqnarray} f(x) &=& (a+b)^2 \\ &=& a^2+2ab+b^2 \end{eqnarray}
不具合 †
- URLエンコード後の数式の文字数が200を超えると画像を取得できない(Google Chart APIの仕様)
※\bm x は \mathbf{x} に変換されるなどの処理をしているので,使用者が書いた数式の文字数が200文字を超えなくても画像を取得できないことがあります.
※スペースも文字数としてカウントされますが,不必要なスペースを削除してから画像を取得しにいくので,見やすいようにスペースを使っても文字数上問題ありません