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 \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.
#optional
in Ihrem Beispiel? Haben Sie eine Referenz, wo ich mehr darüber lesen kann?luat-mac.lua
(für Kontext) undluatex-preprocessor.lua
für Luatex-Plain. Hth.\define
definiert wurden, e-TeX-geschützt. Um es erweiterbar zu haben, muss\defineexpandable
(oder einfach\def
) verwendet werden.