&size(24){''perl との連携''}; 数値計算を,perl に外注し,その結果を受け取ります。 #contents #br *定義されているスタイルファイル [#b997f2e5] emathPl.sty など *解説 [#f91cda68] ** 趣旨 [#j8b074b8] -tex は数値計算ソフトではありません。~ 128.0×128.0 でオーバーフローします。~ また,計算精度もあまりよくありません。 -そこで,emath パッケージでは,計算を perl に外注し,~ その結果を補助ファイルを通じて取得する方法も用意しています。 **連携の準備 [#s99873d0] +perl のインストール~ Unix, Mac では標準でインストールされていますから,この項はスキップです。次の 2. に進みます。~ Windows の場合は~ http://www.activestate.com/activeperl/downloads~ からインストールします。 +perl に path を通します。~ ( perl を c:\perl にインストールした場合は,path に~ c:\perl\bin~ を追加します)~ path の設定は,OS(あるいはそのバージョン)によって異なります。~ それぞれの OS の解説書,あるいは web の解説ページでお調べください。 +emath のライブラリファイル~ emath では,perl のライブラリファイル emath.pl などを用いますから,~ 修正パックに含まれる最新の~ emath.pl, degsine.pl, nCr.pl~ などをしかるべき場所に配置します。~ しかるべき場所とは,環境により異なりますので,次のようにして調べます。~ コマンドプロンプト(ターミナル)で~ perl -V~ を実行したとき,一番最後の方に登場するメッセージ~ @INC:~ の次の行から,perl のライブラリファイルを配置し得る場所が列記されます。~ そのうちのどこかに emath.pl などを置きます。 **サンプルリスト [#u62c3bd6] -次のサンプルリストは,2 の平方根を perl に計算させて,その結果を \foo という制御綴に取得します。~ 以下,このサンプルリストを rootii.tex と名付けます。 \documentclass{jarticle} \usepackage{emath} \usepackage{emathPl} \begin{document} \calcval[s]{sqrt(2)}\foo \foo \end{document} #ref(rootii.tex,center,上のソースファイル) -コマンド \calcval については,[[その解説ページ>calcval]]をご覧ください。 **実行の前に [#c56873cb] 上のサンプルリスト rootii.tex は,普通にタイプセットしたのではエラーになります。~ perl との連携を実現するには,emath から tex のコマンド \write18{......} を呼び出しますが,このコマンドは危険なコマンドであるため,デフォルトでは使用禁止となっています。~ これを使用可能とする方法はありますが,\write18 の危険性は失われません。~ \write18 を使用するのは,自分の作ったソースリストなどに限定して用いないといけません。 **実行時オプション -shell-escape [#f66cf510] \write18 の使用を認めるオプションが -shell-escape です。~ すなわち,コマンドプロンプトで,~ カレントディレクトリを rootii.tex が存在するディレクトリ~ とした上で platex -shell-escape rootii.tex を実行します。 エラーなく実行できたら,引き続きコマンドプロンプトで~ dvipdfm rootii.dvi~ を実行します。rootii.tex と同じディレクトリに rootii.pdf が作成されるはずです。~ それを PDF-viewer で開くと,2 の平方根の近似値~ 1.4142135623731~ が画面に表示されます。~ もしエラーが起きるなら,上の~ 連携の準備~ の3つの項を見直しましょう。見直しても解決しない,という場合は掲示板で質問します。 -(注1) 古い platex では,オプション -shell-escape の省略形として -sh も有効でしたが,近年の platex では(-shell-restricted オプションが新設され) -sh とした場合 -shell-escape -shell-restricted のいずれの省略形であるかが判断できませんから,platex は platex: option `-sh' is ambiguous という警告を出力します。ただし,これはログファイルには記録されません。~ (この場合,\write18 は無効で,perl との連携は出来ません。)~ 省略形を用いるなら,少なくとも -shell-e までは書かないといけません。 -(注2) platex コマンドのオプションは -shell-escape です。 -shell -escape と,-shell, -escape の間に空白を入れてはいけません。~ 前者の場合,platex には一つのオプション -shell-escape を与えたことになりますが,~ 後者の場合,platex には二つのオプション~ -shell~ -escape~ が与えられたことになり,platex は~ platex: option `-shell' is ambiguous~ platex: unrecognized option `-escape'~ を出力します(ログファイルには記録されません)。 -(注3) 歴史的(?)変遷~ LaTeX2e のはじめの頃は,\write18 はデフォルトで使用可能となっていました。~ すなわち,-shell-escape オプションは不要であった時代があります。~ その後,\write18 の危険性が問題となり,デフォルトでは \write18 が使用禁止となりました。~ すなわち,-shell-escape オプション(省略形:-sh)を付加しなければ \write18 は使えなくなりました。~ ところが「それでは不便だ」ということでしょうか,~ 「限定付きで使えるようにしよう」~ ということで,-shell-restricted オプションが新設され,これがデフォルトとなりました。 **実行時オプション -shell-restricted [#ce331fd0] 近年の tex では,\write18 を全面禁止ではなく,制限付きで許可する方式に変わりました。この方式では,いくつかの手順を踏めば platex rootii.tex とするだけで,perl との連携を実現することが出来ます。 ***-shell-restricted は使用可能か(1) [#v54e8d25] --shell-restricted が有効になったのは,比較的近年ですから,使用している tex 環境が対応しているかどうかを確認します。 --コマンドプロンプトで platex --help を実行すると,使用可能オプションが(アルファベット順に)列記されます。~ その中に,~ -shell-restricted~ が無い場合は,「古い」tex で,-shell-restricted は使えません。-shell-escape に頼ることになります。 ***-shell-restricted は使用可能か(2) [#a48dd486] --さらに次のチェックも必要です。~ tex をインストールしたディレクトリの下 ....\texmf\web2c\texmf.cnf というテキストファイルをエディタで開き~ shell_escape~ で検索します。いくつかヒットしますが,等号を伴った~ shell_escape = . の右辺値を見ます。右辺値が ~ f, n, 0 のいずれかであれば,何らかの事情で -shell-restricted は使用不可とされています。~ p の場合は,-shell-restricted が使用可能です。~ ***-shell-restricted の使用準備(0) [#e2065fba] --上の二つのチェックに合格した場合,-shell-restricted をどのように使用するかを述べます。以下 hoge hugahuga は仮名で,それぞれ別の(ヒミツの)名前で読み替えてください。~ (その名前を他人に知られると,\write18 の危険性が身に及びます。)~ ***-shell-restricted の使用準備(1) [#t5000130] --次の二行からなるファイルを hoge.bat として,latex.exe と同じディレクトリに置きます。 @echo off perl %1 (ただし,Windows の場合であって,他の OS では,これに相当するシェルスクリプトを作ることになります。~ わたしは Windows 以外の OS を使用したことがありませんから,具体的なことはかけません。) --hoge を置き換えるヒミツのファイル名は,既に存在する実行可能ファイルと同じ名前ではいけません。確認するには,コマンドプロンプトで hoge (ヒミツの名前) としたとき, 'hoge' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と返ってくれば OK です。 ***-shell-restricted の使用準備(2) [#yd631185] --次の一行からなるファイルを hugahuga.sty として,emath.sty と同じディレクトリに置きます。 \setPerlName{hoge}% --hugahuga を置き換えたヒミツの名前は,既に存在するスタイルファイルとは別の名前でなければなりません。 ***-shell-restricted の使用準備(3) [#u2e430d9] --tex をインストールしたディレクトリの下 ....\texmf\web2c\texmf.cnf というテキストファイルをエディタで開き~ shell_escape_commands = で始まる行を見つけます。行末に \~ とあるマークは継続行を表します。何行か続きますが,その最後に ,hoge を追加し,上書き保存します。 --tex システムを更新したときは,texmf.cnf も更新されるのが常です。~ その場合,hoge を追加し直す必要があります。 ***-shell-restricted の使用法 [#e636d041] --さて,いよいよ実行の段階になりました。~ perl との連携が必要なファイルには \usepackage{hugahuga} を追加します。上の rootii.tex に追加した \documentclass{jarticle} \usepackage{emath} \usepackage{emathPl} \usepackage{hugahuga} \begin{document} \calcval[s]{sqrt(2)}\foo \foo \end{document} を rootiia.tex として platex rootiia とすれば 2 の平方根が得られるはずです。すなわち,実行時オプション -shell-... は不要ということになりました。 --注1: emath のバージョンについて~ 丸ごとパックだけではダメで,修正パックを当ててあることが条件です。 --注2: log ファイルには,ファイル名 hoge が記録されます。~ log ファイルをさらすことは危険を伴います。 --注3: ls-R を使用している場合は,mktexlsr を実行する必要があります。 *関連事項 [#nbd3aa3c] -統合環境で,実行時オプション -shell-escape を付加する方法 ++WinShell の場合については,[[BBS #9526 からのスレッド>http://hpcgi3.nifty.com/emath/treebbs.cgi?all=9526&s=9526]]をご参照ください。 ++TeXShop の場合については~ http://hpcgi3.nifty.com/emath/treebbs.cgi?kako=1&log=9194~ http://www2.kumagaku.ac.jp/teacher/herogw/shell.html *注意事項 [#note] -shell-escape, shell-restricted いずれを用いるにせよ,程度の差こそあれ,\write18 の危険性はなくなりません。~ 自分が作ったものなど,信頼できるソースリストにのみ適用しましょう。 -shell-restricted を用いたソースリストを掲示板にさらすときは,~ ヒミツの名前を出さず,hoge, hugahuga と書き換えておかないと,あなたのヒミツがばれてしまいます。 -ログファイルについても同様です。 -tex システムを更新したときは,texmf.cnf も更新されるのが常です。~ shell-restricted の機能を用いる場合,hoge を追加し直す必要があります。 RIGHT:&counter;