ConTeXtで\ defと\ defineは同じですか?

\defを使用した変数の定義と\define、角括弧内に数字を付けずに使用する場合、例: \def\somecommand{\percent}および\define\somecommand{\percent}\defを使用できる場所で常に\defineを使用できますか?

コメント

  • 私が見たところ、\define\xyz{...}は、\xyzがすでに定義されている場合、警告を発行しますが、定義を実行しますとにかく。もちろん、\defは'警告を発しません。

回答

参考:\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 (コンテキストの場合)およびLuatex-Plainの場合は luatex-preprocessor.lua 。 Hth。
  • 申し訳ありませんが、私の間違いです。
  • 'この回答を書いている時点では、これが当てはまるかどうかはわかりませんが、現在、\defineを使用して定義されたマクロはe-TeXで保護されています。拡張可能にするには、\defineexpandable(またはプレーンな\def)を使用する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です