PukiWiki改造/数式プラグイン
をテンプレートにして作成
[
凌宮
|
初基
|
一覧
|
検索
|
最新
] [
ソース
]
開始行:
TITLE:数式プラグインの導入
#contents
%indent
/////////////////////////////////////////////////////////...
* 方針 [#m1f9dc5e]
- 基本仕様は [[wikihouse.com>http://www.wikihouse.com/fem...
[[math2.inc.php>http://www.wikihouse.com/fem/index.php?...
-- ただし、ハッシュの衝突が心配のため、数式の同定は生のTe...
-- プラグインの同時呼出しで作業ファイルが衝突するため、全...
-- LaTeX、dvipngにより数式画像生成後に、[[Imagemagic>http...
- 数式の解像度、位置決めは、それなりに拘る。
-- 少なくとも IE7、IE8、Firefox3 の100% ズームを満足し、F...
/////////////////////////////////////////////////////////...
* 仕様 [#g2292a0a]
- パスを通した platex、dvipng と convert を要求。
- 引数をそのままLaTeXに渡し、最終的にpng画像に変換して出...
-- ブロックプラグインの場合は、##align##環境(##\begin(al...
-- インラインプラグインの場合は、ディスプレイ数式モードに...
- 作業ファイルと出力ファイルの名前には、数式に基づくハッ...
-- ##eq/{ハッシュキー}.eq ## に生のTeX式を保存し、数式の...
-- ##eq/{ハッシュキー}.png## に数式画像を出力。
- ブラウザのズーム対策として、画像を高解像度で出力し、##I...
- インライン数式は垂直中心揃え(##vertical-align: middle;...
-- dviには位置決めのために数式に枠を付けて出力。convert ...
- 数式がコンパイルできない場合、代わりに TeX のエラーを出...
/////////////////////////////////////////////////////////...
* 改造 [#b3d347a1]
- ##plugin/eq.inc.php## を作成して、
#code(php){{{{
<?php
function plugin_eq_convert()
{
$arg = rtrim(join(func_get_args(), ','), ','); ...
return '<div class="eq">'.plugin_eq_core($arg, 'c...
}
function plugin_eq_inline()
{
$arg = rtrim(join(func_get_args(), ','), ','); ...
return '<span class="eq">'.plugin_eq_core($arg, '...
}
function plugin_eq_core($arg, $mode)
{
$eq_dir = './eq/'; ...
$err_msg_end_phrase = 'No pages of output.'.PHP_E...
$prefix_convert = 'eq-nc-'; // ブロ...
$prefix_inline = 'eq-ni-'; // インラ...
$tex_frame_convert = 'convert.tex'; // ブロ...
$tex_frame_inline = 'inline.tex' ; // インラ...
$eq_replace_phrase = '\input{eq}' ; // フレー...
$key = ($mode=='inline') ? $prefix_inline.md5($ar...
$eq = $key.'.eq'; // 照合用引数出力(保存フ...
$img = $key.'.png'; // 数式の画像出力(保存フ...
$old_dir = getcwd();
chdir($eq_dir);
if (!file_exists($img) || $arg != file_get_conten...
{
// 一時ファイル
$tex = $key.'.tex';
$std = $key.'.std.log'; // Tex の標準出力...
$dvi = $key.'.dvi';
$aux = $key.'.aux';
$log = $key.'.log';
$box = $key.'.box.png';
$face = $key.'.face.png';
$edge = $key.'.edge.png';
$bold = $key.'.bold.png';
flush(); // Timeout 対策
$tex_code = file_get_contents(($mode=='inlin...
$tex_code = str_replace($eq_replace_phrase, ...
file_put_contents($eq ,$arg );
file_put_contents($tex ,$tex_code);
exec('platex -halt-on-error '.$tex.' > '.$std);
flush(); // Timeout 対策
if (!file_exists($dvi)) // Tex Error
{
$err_flag = false;
$err_code = "Tex Error:\n\n";
if ($log_code = fopen($std, 'r'))
{
while (!feof($log_code))
{
$tex_msg = fgets($log_code);
if ($tex_msg[0] == '!' ...
else if ($tex_msg == $err_msg_...
if ($err_flag) {$err_code .= $tex...
}
fclose($log_code);
}
chdir($old_dir);
return '<pre class=eq_error_title>'.$arg....
}
exec('dvipng -D 720 -T tight --gamma 2.5 -o '...
if ($mode=='inline') {
list($width, $height) = getimages...
exec('convert '.$box.' -crop '.($...
} else {
exec('convert '.$box.' ...
}
exec('convert '.$face.' -edge 1 -negate '.$ed...
exec('composite -compose multiply '.$face.' '...
exec('convert '.$bold.' -black-threshold 90% ...
flush(); // Timeout 対策
unlink($tex );
unlink($std );
unlink($dvi );
unlink($aux );
unlink($log );
unlink($box );
unlink($face);
unlink($edge);
unlink($bold);
}
list($width, $height) = getimagesize($img);
$zoom = 0.01;
$width *= $zoom;
$height *= $zoom;
$depth = 0.35 - $height/2; // unit:em
chdir($old_dir);
return '<img style="width:'.$width.'em; height:'....
}
?>
}}}}
-- 17行目は数式のパスを指定。数式のキャッシュとみなせるた...
-- 26行目は数式のハッシュキー。プラグインの種別と数式の m...
-- 34〜98行目は変換処理。数式が変換済みの場合は分岐が成立...
-- 47行目、55行目と88行目の ##flash();## はタイムアウト対...
-- 48、49行目は TeX コードの雛形の読み込みと数式の組み込...
-- 56〜76行目は TeX がエラーのときの処理。エラーの場合、...
--- 67行目と68行目はそれぞれエラー部の開始と終了の検出。...
-- 77〜86行目は画像処理。インラインプラグインでは位置決め...
-- 99行目、102行目は数式画像のサイズを取得し、表示サイズ...
--- 数式画像の解像度は、77行目の dvipng の解像度 ##-D 720...
--- 数式画像の表示サイズは、解像度 と100行目の ##$zoom## ...
//
- ##eq/convert.tex## を作成して、
#code(tex){{{{
\documentclass[12pt]{jarticle}
\usepackage{amsmath,amssymb,bm}
\usepackage{pukiwiki}
\pagestyle{empty}
\begin{document}
\thispagestyle{empty}
\begin{align*}
\input{eq}
\end{align*}
\end{document}
}}}}
-- ##\input{eq}## をプラグインに渡されるTeXコードで置換し...
//
- ##eq/inline.tex## を作成して、
#code(tex){{{{
\documentclass[12pt]{jarticle}
\usepackage{amsmath,amssymb,bm}
\usepackage{pukiwiki}
\pagestyle{empty}
\makeatletter
\newcommand\inlineframe[1]%
{%
\setbox0=\hbox{\mathstrut}% 基字「(」相当
\setbox1=\hbox{#1}% 対象
\dimen0=\ht0 \advance \dimen0 by -\dp0
\dimen1=\dp1 \advance \dimen1 by \dimen0
\dimen2=\ht1 \advance \dimen2 by -\dimen0
\fbox{%
\rule{0pt}{\dimen1}%
{#1}%
\rule[-\dimen2]{0pt}{\dimen2}%
}%
}%
\makeatother
\begin{document}
\thispagestyle{empty}
\inlineframe{$ \displaystyle \mathstrut {
\input{eq}
} $}
\end{document}
}}}}
-- 6〜20行目で定義した ##\eqframe## は位置決めするための...
-- ##\input{eq}## をプラグインに渡されるTeXコードで置換し...
/////////////////////////////////////////////////////////...
* 参考:柱の算出 [#va87e0bb]
&attachref(./TexEqMiddleAlign.png,35%);
- TeXでは、「(」に相当する ##\mathstruct## の中心を通る線...
- 数式画像の範囲は赤線が示すようになっており、中線が図の...
数式は中線で揃えるため、中線が図の中央を通ると都合が良...
- 中線を図の中心に合わせるため、柱&eq(H_m);と&eq(D_m);が...
-- 柱&eq(H_m = -d_m);は、&eq(\ffd{x}{\ffd{x}{x}});のよう...
-- 柱&eq(D_m = -h_m);は、&eq(\ffd{\ffd{x}{x}}{x});のよう...
- 実際はTeXは基線(ベースライン)基準のため、換算した柱&e...
- 高度&eq(h_0);と深度&eq(d_0);の ##\mathstrut## の中心を...
ここで、##\mathstrut## は「(」の高さと深さを持つ幅 0 の...
- &eq(H = H_m + m = -d_m + m = -d + 2m);、##\dimen1##&eq(...
&eq(D = D_m + m = -h_m + m = -h + 2m);、##\dimen2##&eq(...
また、##\dimen0##&eq( = 2m);、&eq(h_0 = );##\ht0##、&eq...
よって、
-- 11行目、##\dimen0## = ##\ht0## + ##\dp0##~
-- 12行目、##\dimen1## = ##\dp1## + ##\dimen0##~
-- 13行目、##\dimen2## = ##\ht1## − ##\dimen0##~
/////////////////////////////////////////////////////////...
* 課題 [#c8f4d2f8]
- IE と Firefox では ex と em の扱いが異なり、共通の CSS ...
-- プラグインの中で PHP コードレベルでブラウザを識別し、C...
- 中線を図の中央にすると、行間に余分な余白が生じる。
-- 余白あった方が行のバランスが良くないか?
-- 無くすとしたら、TeX から数式の高さと深さの情報を出力し...
/////////////////////////////////////////////////////////...
終了行:
TITLE:数式プラグインの導入
#contents
%indent
/////////////////////////////////////////////////////////...
* 方針 [#m1f9dc5e]
- 基本仕様は [[wikihouse.com>http://www.wikihouse.com/fem...
[[math2.inc.php>http://www.wikihouse.com/fem/index.php?...
-- ただし、ハッシュの衝突が心配のため、数式の同定は生のTe...
-- プラグインの同時呼出しで作業ファイルが衝突するため、全...
-- LaTeX、dvipngにより数式画像生成後に、[[Imagemagic>http...
- 数式の解像度、位置決めは、それなりに拘る。
-- 少なくとも IE7、IE8、Firefox3 の100% ズームを満足し、F...
/////////////////////////////////////////////////////////...
* 仕様 [#g2292a0a]
- パスを通した platex、dvipng と convert を要求。
- 引数をそのままLaTeXに渡し、最終的にpng画像に変換して出...
-- ブロックプラグインの場合は、##align##環境(##\begin(al...
-- インラインプラグインの場合は、ディスプレイ数式モードに...
- 作業ファイルと出力ファイルの名前には、数式に基づくハッ...
-- ##eq/{ハッシュキー}.eq ## に生のTeX式を保存し、数式の...
-- ##eq/{ハッシュキー}.png## に数式画像を出力。
- ブラウザのズーム対策として、画像を高解像度で出力し、##I...
- インライン数式は垂直中心揃え(##vertical-align: middle;...
-- dviには位置決めのために数式に枠を付けて出力。convert ...
- 数式がコンパイルできない場合、代わりに TeX のエラーを出...
/////////////////////////////////////////////////////////...
* 改造 [#b3d347a1]
- ##plugin/eq.inc.php## を作成して、
#code(php){{{{
<?php
function plugin_eq_convert()
{
$arg = rtrim(join(func_get_args(), ','), ','); ...
return '<div class="eq">'.plugin_eq_core($arg, 'c...
}
function plugin_eq_inline()
{
$arg = rtrim(join(func_get_args(), ','), ','); ...
return '<span class="eq">'.plugin_eq_core($arg, '...
}
function plugin_eq_core($arg, $mode)
{
$eq_dir = './eq/'; ...
$err_msg_end_phrase = 'No pages of output.'.PHP_E...
$prefix_convert = 'eq-nc-'; // ブロ...
$prefix_inline = 'eq-ni-'; // インラ...
$tex_frame_convert = 'convert.tex'; // ブロ...
$tex_frame_inline = 'inline.tex' ; // インラ...
$eq_replace_phrase = '\input{eq}' ; // フレー...
$key = ($mode=='inline') ? $prefix_inline.md5($ar...
$eq = $key.'.eq'; // 照合用引数出力(保存フ...
$img = $key.'.png'; // 数式の画像出力(保存フ...
$old_dir = getcwd();
chdir($eq_dir);
if (!file_exists($img) || $arg != file_get_conten...
{
// 一時ファイル
$tex = $key.'.tex';
$std = $key.'.std.log'; // Tex の標準出力...
$dvi = $key.'.dvi';
$aux = $key.'.aux';
$log = $key.'.log';
$box = $key.'.box.png';
$face = $key.'.face.png';
$edge = $key.'.edge.png';
$bold = $key.'.bold.png';
flush(); // Timeout 対策
$tex_code = file_get_contents(($mode=='inlin...
$tex_code = str_replace($eq_replace_phrase, ...
file_put_contents($eq ,$arg );
file_put_contents($tex ,$tex_code);
exec('platex -halt-on-error '.$tex.' > '.$std);
flush(); // Timeout 対策
if (!file_exists($dvi)) // Tex Error
{
$err_flag = false;
$err_code = "Tex Error:\n\n";
if ($log_code = fopen($std, 'r'))
{
while (!feof($log_code))
{
$tex_msg = fgets($log_code);
if ($tex_msg[0] == '!' ...
else if ($tex_msg == $err_msg_...
if ($err_flag) {$err_code .= $tex...
}
fclose($log_code);
}
chdir($old_dir);
return '<pre class=eq_error_title>'.$arg....
}
exec('dvipng -D 720 -T tight --gamma 2.5 -o '...
if ($mode=='inline') {
list($width, $height) = getimages...
exec('convert '.$box.' -crop '.($...
} else {
exec('convert '.$box.' ...
}
exec('convert '.$face.' -edge 1 -negate '.$ed...
exec('composite -compose multiply '.$face.' '...
exec('convert '.$bold.' -black-threshold 90% ...
flush(); // Timeout 対策
unlink($tex );
unlink($std );
unlink($dvi );
unlink($aux );
unlink($log );
unlink($box );
unlink($face);
unlink($edge);
unlink($bold);
}
list($width, $height) = getimagesize($img);
$zoom = 0.01;
$width *= $zoom;
$height *= $zoom;
$depth = 0.35 - $height/2; // unit:em
chdir($old_dir);
return '<img style="width:'.$width.'em; height:'....
}
?>
}}}}
-- 17行目は数式のパスを指定。数式のキャッシュとみなせるた...
-- 26行目は数式のハッシュキー。プラグインの種別と数式の m...
-- 34〜98行目は変換処理。数式が変換済みの場合は分岐が成立...
-- 47行目、55行目と88行目の ##flash();## はタイムアウト対...
-- 48、49行目は TeX コードの雛形の読み込みと数式の組み込...
-- 56〜76行目は TeX がエラーのときの処理。エラーの場合、...
--- 67行目と68行目はそれぞれエラー部の開始と終了の検出。...
-- 77〜86行目は画像処理。インラインプラグインでは位置決め...
-- 99行目、102行目は数式画像のサイズを取得し、表示サイズ...
--- 数式画像の解像度は、77行目の dvipng の解像度 ##-D 720...
--- 数式画像の表示サイズは、解像度 と100行目の ##$zoom## ...
//
- ##eq/convert.tex## を作成して、
#code(tex){{{{
\documentclass[12pt]{jarticle}
\usepackage{amsmath,amssymb,bm}
\usepackage{pukiwiki}
\pagestyle{empty}
\begin{document}
\thispagestyle{empty}
\begin{align*}
\input{eq}
\end{align*}
\end{document}
}}}}
-- ##\input{eq}## をプラグインに渡されるTeXコードで置換し...
//
- ##eq/inline.tex## を作成して、
#code(tex){{{{
\documentclass[12pt]{jarticle}
\usepackage{amsmath,amssymb,bm}
\usepackage{pukiwiki}
\pagestyle{empty}
\makeatletter
\newcommand\inlineframe[1]%
{%
\setbox0=\hbox{\mathstrut}% 基字「(」相当
\setbox1=\hbox{#1}% 対象
\dimen0=\ht0 \advance \dimen0 by -\dp0
\dimen1=\dp1 \advance \dimen1 by \dimen0
\dimen2=\ht1 \advance \dimen2 by -\dimen0
\fbox{%
\rule{0pt}{\dimen1}%
{#1}%
\rule[-\dimen2]{0pt}{\dimen2}%
}%
}%
\makeatother
\begin{document}
\thispagestyle{empty}
\inlineframe{$ \displaystyle \mathstrut {
\input{eq}
} $}
\end{document}
}}}}
-- 6〜20行目で定義した ##\eqframe## は位置決めするための...
-- ##\input{eq}## をプラグインに渡されるTeXコードで置換し...
/////////////////////////////////////////////////////////...
* 参考:柱の算出 [#va87e0bb]
&attachref(./TexEqMiddleAlign.png,35%);
- TeXでは、「(」に相当する ##\mathstruct## の中心を通る線...
- 数式画像の範囲は赤線が示すようになっており、中線が図の...
数式は中線で揃えるため、中線が図の中央を通ると都合が良...
- 中線を図の中心に合わせるため、柱&eq(H_m);と&eq(D_m);が...
-- 柱&eq(H_m = -d_m);は、&eq(\ffd{x}{\ffd{x}{x}});のよう...
-- 柱&eq(D_m = -h_m);は、&eq(\ffd{\ffd{x}{x}}{x});のよう...
- 実際はTeXは基線(ベースライン)基準のため、換算した柱&e...
- 高度&eq(h_0);と深度&eq(d_0);の ##\mathstrut## の中心を...
ここで、##\mathstrut## は「(」の高さと深さを持つ幅 0 の...
- &eq(H = H_m + m = -d_m + m = -d + 2m);、##\dimen1##&eq(...
&eq(D = D_m + m = -h_m + m = -h + 2m);、##\dimen2##&eq(...
また、##\dimen0##&eq( = 2m);、&eq(h_0 = );##\ht0##、&eq...
よって、
-- 11行目、##\dimen0## = ##\ht0## + ##\dp0##~
-- 12行目、##\dimen1## = ##\dp1## + ##\dimen0##~
-- 13行目、##\dimen2## = ##\ht1## − ##\dimen0##~
/////////////////////////////////////////////////////////...
* 課題 [#c8f4d2f8]
- IE と Firefox では ex と em の扱いが異なり、共通の CSS ...
-- プラグインの中で PHP コードレベルでブラウザを識別し、C...
- 中線を図の中央にすると、行間に余分な余白が生じる。
-- 余白あった方が行のバランスが良くないか?
-- 無くすとしたら、TeX から数式の高さと深さの情報を出力し...
/////////////////////////////////////////////////////////...
ページ名:
Anatomy_of_the_Human_Ear_ja.svg
363件
[
詳細
]
line.pukiwiki.php
459件
[
詳細
]
line.diff.php
449件
[
詳細
]
inline.tex
437件
[
詳細
]
convert_html.php
470件
[
詳細
]
eq.inc.php
506件
[
詳細
]
convert.tex
422件
[
詳細
]
codehighlight.php
438件
[
詳細
]
code.inc.php
474件
[
詳細
]
ToHeader.png
234件
[
詳細
]
ToFooter_0.png
202件
[
詳細
]
ToFooter.png
239件
[
詳細
]
ParaEdit.png
245件
[
詳細
]
TexEqMiddleAlign.png
484件
[
詳細
]
[
凌宮
|
初基
|
一覧
|
検索
|
最新
] [
ソース
]