Sind \ def und \ in ConTeXt gleich?

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 \xyz bereits 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 core-sys.mkiv (während \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.

Kommentare

  • Vielen Dank für diese hilfreiche Antwort. Klarstellung: Wenn Sie " Argumente im mkiv-Stil " sagen, bedeutet dies benannte Argumente wie #optional in Ihrem Beispiel? Haben Sie eine Referenz, wo ich mehr darüber lesen kann?
  • @LarsH Ja, Mk VI (nicht MkIV!) Makros sind diejenigen mit (optionalen) Parameternamen. Ich bin mir nicht sicher, ob es neben der Quelle eine Dokumentation auf Benutzerebene gibt: Der Präprozessorcode befindet sich in luat-mac.lua (für Kontext) und luatex-preprocessor.lua für Luatex-Plain. Hth.
  • Entschuldigung, mein Fehler.
  • Ich ' weiß nicht, ob dies zum Zeitpunkt des Schreibens dieser Antwort der Fall war, aber Heute sind Makros, die mit \define definiert wurden, e-TeX-geschützt. Um es erweiterbar zu haben, muss \defineexpandable (oder einfach \def) verwendet werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.