Gibt es einen Unterschied zwischen der Definition einer Variablen mit \def und der Verwendung von \define, wenn ohne Zahl in eckigen Klammern verwendet, z \def\somecommand{\percent} und \define\somecommand{\percent}? Kann ich \define immer an Stellen verwenden, an denen \def verwendet werden kann? 
Kommentare
-  Nach dem, was ich sehe, gibt \define\xyz{...}, wenn\xyzbereits definiert ist, eine Warnung aus, führt jedoch die Definition aus wie auch immer. Natürlich gibt\def' keine Warnung aus.
Antwort
 Als Referenz: Es gibt zwei Definitionen von \define: Die erste in  syst-aux.mkiv  zeigt das in seinem Kommentar erwähnte Verhalten Egreg: Wenn das Makro bereits definiert ist, lässt es es so wie es ist. (Mit einem Begleiter, \redefine, können Sie die aktuelle Definition des Makros unabhängig von seiner Verwendung überschreiben.) Ironischerweise wird diese vorläufige Definition ohne Notiz überschrieben, sobald das Format \redefine für immer bleibt). 
 Die  Ist Die Definition  des Makros \define, wie sie von der Benutzeroberfläche bereitgestellt wird, sucht nicht nur nach zuvor definierten gleichnamigen Steuersequenzen, sondern dient auch als Kurznotation für verbindliche Argumente. Es hat das Schema 
\define [<digit>] <macro> {<definition>} , wobei das erste Argument, eine Ziffer, die Anzahl der Argumente angibt, die das neue Makro akzeptieren wird. Dies kann natürlich zu kürzeren Definitionen führen. Zum Vergleich erfordert der Selektor
\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext  weniger Eingabe mit dem Makro \define: 
\define[9]\sevenofnine{#7} Daher können diese Definitionen zu besser lesbarem Code führen – was beim Schreiben von TEX immer gut ist.
 Leider ist die \define Wrapper nimmt einen Großteil der Ausdruckskraft von einfachen \def. Im Kontext haben Sie bemerkt, dass Makros mit  optionalen Argumenten  in Bezug auf die Benutzerschnittstelle üblich sind. Zum Beispiel können Sie die zweite \def -Inition im folgenden Snippet einfach nicht durch einen äquivalenten Ausdruck ersetzen, indem Sie \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  Das liegt daran, dass Sie mit \define nicht die  Argumentbegrenzer  (hier: Klammern) angeben können, die für erforderlich sind Optionale Argumente, daher beschränken sich Ihre Makros grundsätzlich darauf, nur obligatorische (geschweifte) Argumente zu verwenden. Aus dem gleichen Grund gibt es auch keine Möglichkeit, billige \{start|stop}something -Umgebungen zu definieren: 
\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext  (Die Benutzeroberfläche für Dies ist jedenfalls \definestartstop (vgl.  core-sys.mkiv ).) 
 Schließlich ist heutzutage der wichtigste Nachteil von \define ist, dass keine Argumente im  mkvi  -Stil zulässig sind. Es gibt einfach keine Möglichkeit, einen Parameter mit seinem  Namen  zu referenzieren, wenn Sie ihm überhaupt keinen zuweisen können. 
% 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  Wenn Sie also ernsthaft Makros schreiben möchten, werden Sie bald lernen, \define zu vermeiden, während es für weniger komplexe Aufgaben sicher ist. 
#optionalin Ihrem Beispiel? Haben Sie eine Referenz, wo ich mehr darüber lesen kann?luat-mac.lua(für Kontext) undluatex-preprocessor.luafür Luatex-Plain. Hth.\definedefiniert wurden, e-TeX-geschützt. Um es erweiterbar zu haben, muss\defineexpandable(oder einfach\def) verwendet werden.