Re: LuaLaTeXとMetaPostをluamplibで使う時のマクロの事

名前: ZR
日時: 2014-07-21 12:11:47
IPアドレス: 124.211.189.*

>>57475 >次のように「環境」を設定して >\def\qbPMP[#1]{% >\begin{mplibcode}% 結論を言うと、残念ながら「それは無理」ということになります。 その理由は「verbatim 系の環境をラップする環境を作れない」のと概ね同じです。 ■詳細 TeX が LaTeX の環境の使用を処理する場合、そのまま \begin を実行 → 中身を実行 → \end を実行 という手順を取り、「\end が実行」されたことで「環境の終了」を判定します。 ところが、mplibcode では明らかにこの普通の手順は取れないはずです (「中見を実行」しているのは MetaPost のエンジンのはず)。 一般に、こういう特殊な「環境」の実装は、何か別の方法で「環境の終了」 を判断する必要があり、多くの場合は "\end{環境名}" という記述をスキャンして そこで「終了」と見做すという手段を取っています。 mplibcode の場合は、"\end{mplibcode}" というトークン列を探しているようです。 従って、\end{mplibcode} が文書ソースに直接書かれずに、別のマクロの定義の 中に隠れてしまうと、「環境の終了」の判定が失敗してしまい、その結果、 判定のために後続のテキストを全部メモリ上に読み込む羽目になって 最終的に容量超過になったと考えられます。 どうしても、このような「特殊な環境をラップする環境」を定義したければ、 「環境の終了」の処理を自力で行って、\begin{qbPMP}〜\end{qbPMP} の塊を 読み込んで \begin{mplibcode}〜\end{mplibcode} に「展開」するという 一連の処理を実装する必要があります。 luamplib.sty にある処理を真似ればよいわけですが、TeX 言語の初級者には 難しいでしょう。 ■対処方法 luamplib パッケージに \everymplib/\everyendmplib という命令が用意されて いるので、これを使うのが簡単でしょう。 マニュアルには plain TeX の例しか載っていませんが、もちろん LaTeX でも 使えます。 %<例>--------------- % 単位を1cmに固定する場合 \everymplib{beginfig(1);w=1cm;h=1cm;pickup pencircle scaled 0.6pt;} \everyendmplib{endfig;} \begin{mplibcode} \qbPointsDef O(0,0)A(1,0)B(1,1). \qbGlines OAB. \end{mplibcode} %<END>-------------- 「環境の中身の先頭に \everymplib で指定したトークン列を挿入する」 という動作を考えると、少しトリッキーですが、次のようにすれば 「引数」を導入することができる……はずです。 %<例>--------------- \everymplib{beginfig(1);\qbPMPsub} \def\qbPMPsub[#1]{w=#1;h=#1;pickup pencircle scaled 0.6pt;} \everyendmplib{endfig;} \begin{mplibcode}[1cm] \qbPointsDef O(0,0)A(1,0)B(1,1). \qbGlines OAB. \end{mplibcode} %<END>-------------- mplibcode は引数を全く取らないので、この "[1cm]" は単に「中身の冒頭部分」 であり、この前に \everymplib の内容が挿入されれば beginfig(1);\qbPMPsub[1cm] \qbPointsDef …… となり、mplibcode 内のマクロの出現は展開されるので、\qbPMPsub が展開されて beginfig(1);w=1cm;h=1cm;pickup …… となり所望の結果が得られます。 ところが、実際には上のコードは期待通りに動かないようです。詳細は略しますが、 前処理で、一旦中身を Lua に渡している関係で、実際には "\qbPMPsub" と "[1cm]" の間に“普通の文字扱いの改行文字”が入ってしまうのが失敗の原因です。 そこで、対処療法になりますが、\qbPMPsub の定義を変更して、この“謎の文字” を飲み込んでしまうことにします。 %<例>--------------- \everymplib{beginfig(1);\qbPMPsub} % #1が"謎の改行文字"にマッチする \def\qbPMPsub#1[#2]{w=#2;h=#2;pickup pencircle scaled 0.6pt;} \everyendmplib{endfig;} \begin{mplibcode}[1cm] \qbPointsDef O(0,0)A(1,0)B(1,1). \qbGlines OAB. \end{mplibcode} %<END>-------------- 私の手元の環境では、これで期待通りの出力が得られています。 ■補足 mplibcode 環境の中身に書いたマクロは「展開」されます。 つまり、完全展開可能でないもの(\@ifnextchar 等)は使えません。

この書き込みへの返事:

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