Van-e különbség a \def
használatával egy változó meghatározása és a \define
, ha szögletes zárójelben szám nélkül használják, pl \def\somecommand{\percent}
és \define\somecommand{\percent}
? Mindig használhatom a \define
alkalmazást olyan helyeken, ahol \def
használható?
Megjegyzések
- Amit látok,
\define\xyz{...}
, amikor a\xyz
már meg van adva, figyelmeztetést ad ki, de végrehajtja a meghatározást egyébként is. Természetesen a\def
nem ad ki ' figyelmeztetést.
Válasz
Tájékoztatásul: A \define
két meghatározást tartalmaz: Az első a syst-aux.mkiv ben megmutatja azt a viselkedést, amelyet Egreg kommentben említett: ha a makró már definiálva van, akkor azt úgy hagyja, ahogy van. (Egy társ, \redefine
lehetővé teszi, hogy felülírja a makró jelenlegi meghatározását, függetlenül attól, hogy használatban van-e.) Ironikus módon ez az előzetes meghatározás megjegyzés nélkül felülíródik, amint a formátum betöltődik core-sys.mkiv (míg \redefine
örökké körül marad).
A tényleges A \define
makró definíciója , amelyet a felhasználói felület biztosít, nemcsak az azonos nevű, korábban definiált vezérlési szekvenciákat ellenőrzi, hanem valamiféle rövid jelölésként is szolgál a kötelező érvek. Megvan a
\define [<digit>] <macro> {<definition>}
séma, ahol az első argumentum, egy számjegy, megadja az új makró által elfogadni kívánt argumentumok számát. Ez nyilvánvalóan rövidebb meghatározásokat eredményezhet. Összehasonlításképpen: a választó
\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext
kevésbé igényel gépelést a \define
makróval:
\define[9]\sevenofnine{#7}
Így ezek a definíciók olvashatóbb kódot eredményezhetnek – ami mindig jó dolog a TEX írásakor.
Sajnos a \define
wrapper elveszi a sima \def
s kifejezõképességét. A Kontextusban észrevette, hogy az opcionális argumentumokat tartalmazó makrók mindennaposak a felhasználói felület tekintetében. Például egyszerűen nem cserélheti le az alábbi kódrészlet második \def
szakaszát egy egyenértékű kifejezéssel a \define
használatával:
\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
Ez azért van így, mert a \define
opcióval nem adhatja meg az ehhez szükséges argumentumhatárolókat (itt: zárójeleket) opcionális argumentumok, tehát alapvetően a makrói csak a kötelező (kapcsos) argumentumokra korlátozódnak. Ugyanezen okból nincs mód olcsó \{start|stop}something
környezetek meghatározására sem:
\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext
(A felhasználói felület ez egyébként \definestartstop
(vö. core-sys.mkiv ).)
Végül manapság a \define
az, hogy nem engedi meg az mkvi stílusú argumentumokat. Egy paraméterre egyszerűen nem lehet hivatkozni a neve alapján, ha eleve nem rendelhet hozzá.
% 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
Tehát, ha komoly makróírást szeretne végezni, hamarosan megtanulja kerülni a \define
t, miközben kevésbé bonyolult feladatok esetén is biztonságos.
#optional
a példádban? Van-e referenciád arra, hogy hol olvashatok bővebben ezekről?luat-mac.lua
(a Kontextushoz) ésluatex-preprocessor.lua
a Luatex-Plain számára. Hth.\define
használatával definiált makrók e-TeX védettek. A bővítéshez\defineexpandable
-et (vagy sima\def
) kell használni.