Re: write18の注意点

名前: ZR
日時: 2007-10-16 21:16:38
IPアドレス: 122.18.235.*

>>49855 >\write18を再定義してしまって, >表からはわからないような命令にしてしまうという方法を考えてみましたが, >うまくいくか不明です. >よいアドバイスありましたら,ご教授ください. "\write18" は単一の命令ではなく "\write" の後に数値 18 を置いたもの です。従って、"\write" が存在する限り、ユーザはいつでも "\write 18" を書き込むことができます。勿論、\write は LaTeX の実装中で頻繁に 用いられているので、\write を消してしまう訳にはいきません。 # >>49834, >>49837, >>49840 のやり取りの意味を確認して下さい。 そこで、次のようなことを考えてみました。 - \write を別の名前(例えば \@@@write)に変更する。 - フラグ(\if@@@shellok)を用意する。 - 次のようなマクロを \write として定義する。 * \write は次にある数値を検査する。 * それが 18 でなければ、\@@@write を用いて指定通りの動作をする。 * 18 である場合: \if@@@shellok が真ならば \@@@write18 を実行、 偽ならば代わりに \@@@write16 を実行。 これで、フラグが真の時だけ \write18 が動くようになります…が、こんなの は簡単に破られてしまいます。(理由はこの投稿の最後に!) >ZRさんのソースのコンパイルが通らなかったので, >もうすこしお尋ねしてよろしいでしょうか. すみません。私は plain TeX で実験していました。 LaTeX では次のようにすると通ります。 \documentclass{jarticle} \begin{document} \catcode`\^^R=12 % 追加 \chardef\shiba`^^R\escapechar=119\def~{t^^65} \csname\string\^^2\romannumeral1~\endcsname\shiba{touch hoge} \end{document} いずれにしても、これから判ることは「ソースのテキストを検査して \write が書かれていないかを確かめる」のは不可能ということです。 結局のところ、ユーザが自由に TeX ソースを書けるようにしている限りは、 ユーザが勝手な \write18 を実行することを阻止するのは至極困難であると 考えられます。 本当に \write18 が必要かを検討した方がよいのではないでしょうか。例えば、 適当な中間ファイルを使って、LaTeX の実行を複数回に分けるなどの手段 (LaTeX の \ref, \tableofcontents の動作、および BiBTeX の動作、等)が 有効かもしれません。 ## 答え: \meaning でマクロの中身を調べられるから。

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)