\def
を使用した変数の定義と\define
、角括弧内に数字を付けずに使用する場合、例: \def\somecommand{\percent}
および\define\somecommand{\percent}
? \def
を使用できる場所で常に\define
を使用できますか?
コメント
回答
参考:\define
には2つの定義があります。 syst-aux.mkiv の最初の定義Egregがコメントで言及した動作を示しています。マクロがすでに定義されている場合は、そのままにします。 (コンパニオンである\redefine
を使用すると、使用中のマクロの現在の定義を上書きできます。)皮肉なことに、この予備定義は、フォーマットが読み込まれるとすぐに、メモなしで上書きされます。 core-sys.mkiv (\redefine
は永遠に存在します)
実際ユーザーインターフェイスによって提供される\define
マクロの定義は、同じ名前の以前に定義された制御シーケンスをチェックするだけでなく、のある種の短い表記としても機能します。必須の引数。スキームがあります
\define [<digit>] <macro> {<definition>}
最初の引数である数字は、新しいマクロが受け入れる引数の数を指定します。明らかに、これにより定義が短くなる可能性があります。比較のために、セレクター
\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext
は、\define
マクロを使用した入力が少し少なくて済みます。
\define[9]\sevenofnine{#7}
したがって、これらの定義により、コードが読みやすくなる可能性があります。これは、TEXを作成するときに常に適しています。
残念ながら、\define
ラッパーは、プレーンな\def
の表現力をかなり取り除きます。コンテキストでは、オプションの引数をとるマクロがユーザーインターフェイスに関して一般的であることに気付くでしょう。たとえば、以下のスニペットの2番目の\def
のイニシエーションを、\define
を使用して同等の式に置き換えることはできません:
\unprotect \def\myfoo{\dosingleempty\do_my_foo} \def\do_my_foo[#1]#2{% \iffirstargument{\bf\WORD#1}\fi #2\par% } \protect \starttext \myfoo{bar} \myfoo[foo]{bar} \stoptext
これは、\define
では、に必要な引数区切り文字(ここではブラケット)を指定できないためです。オプションの引数。したがって、基本的に、マクロは必須の(中括弧で囲まれた)引数のみを取るように制限されています。同じ理由で、安価な\{start|stop}something
環境を定義する方法もありません。
\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext
(のユーザーインターフェイスこれは\definestartstop
( core-sys.mkiv を参照)です。)
最後に、今日では<の最も重要な欠点はdiv id = "0af02cbd4c">
は、 mkvi スタイルの引数を許可しないということです。そもそもパラメータを割り当てることができない場合、パラメータを名前で参照する方法はありません。
% macros=mkvi \unprotect \def\foo{\dosingleempty\do_foo} \def\do_foo[#optional]#mandatory{% \bgroup\sansbold#optional\space\egroup #mandatory\par% } \protect \starttext \foo{bar} \foo[foo]{bar} \stoptext
したがって、本格的なマクロ書き込みを行いたい場合は、すぐに\define
を回避する方法を学びますが、それほど複雑でないタスクには安全です。
コメント
- この有益な回答をありがとうございます。明確化のポイント:" mkivスタイルの引数"と言う場合、それはあなたの例では?それらについてもっと読むことができる場所のリファレンスはありますか?
- @LarsHはい、Mk VI (MkIVではありません!)マクロは(オプションの)パラメーター名を持つマクロです。ソース以外にユーザーレベルのドキュメントが存在するかどうかはわかりません。プリプロセッサコードは
luat-mac.lua
aにあります。 >(コンテキストの場合)およびLuatex-Plainの場合はluatex-preprocessor.lua
。 Hth。 - 申し訳ありませんが、私の間違いです。
- 'この回答を書いている時点では、これが当てはまるかどうかはわかりませんが、現在、
\define
を使用して定義されたマクロはe-TeXで保護されています。拡張可能にするには、\defineexpandable
(またはプレーンな\def
)を使用する必要があります。
\define\xyz{...}
は、\xyz
がすでに定義されている場合、警告を発行しますが、定義を実行しますとにかく。もちろん、\def
は'警告を発しません。