A \ def és a \ define ugyanaz a ConTeXt-ben?

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.

Megjegyzések

  • Köszönöm ezt a hasznos választ. Pontosítás: amikor azt mondja, hogy " mkiv stílusú érvek ", akkor ez megnevezett argumentumokat jelent-e, például #optional a példádban? Van-e referenciád arra, hogy hol olvashatok bővebben ezekről?
  • @LarsH Igen, az Mk VI (nem az MkIV!) Makrók vannak (opcionális) paraméterekkel. Nem vagyok biztos benne, hogy a forráson kívül létezik-e felhasználói szintű dokumentáció: az előfeldolgozó kódja megtalálható a luat-mac.lua (a Kontextushoz) és luatex-preprocessor.lua a Luatex-Plain számára. Hth.
  • Sajnálom, hibám.
  • Nem tudom ' nem tudom, hogy ez volt-e a válasz megírásakor, de ma a \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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük