Onko muuttujan määrittelyssä \def
ja \define
, kun sitä käytetään ilman numeroa hakasulkeissa, esim \def\somecommand{\percent}
ja \define\somecommand{\percent}
? Voinko aina käyttää \define
paikoissa, joissa \def
voidaan käyttää?
Kommentit
- Näkemieni perusteella
\define\xyz{...}
, kun\xyz
on jo määritetty, antaa varoituksen, mutta suorittaa määritelmän joka tapauksessa. Tietysti\def
ei anna ' varoitusta.
Vastaa
Viitteeksi: \define
: lle on kaksi määritelmää: Ensimmäinen syst-aux.mkiv näyttää Egregin kommentissa mainitun käyttäytymisen: jos makro on jo määritelty, se jättää sen sellaisenaan. (Kumppanin, \redefine
avulla voit korvata makron nykyisen määritelmän riippumatta sen käytöstä.) Ironista kyllä, tämä alustava määritelmä korvataan ilman huomautusta heti, kun muoto latautuu core-sys.mkiv (kun \redefine
pysyy ikuisesti).
todellinen Käyttöliittymän tarjoama \define
-makron määritelmä ei tarkista vain aiemmin määriteltyjä saman nimisiä ohjausjaksoja, vaan toimii myös jonkinlaisena lyhyt merkintänä pakolliset perustelut. Siinä on kaava
\define [<digit>] <macro> {<definition>}
jossa ensimmäinen argumentti, luku, määrittää uuden makron hyväksymien argumenttien lukumäärän. Tämä voi tietysti johtaa lyhyempiin määritelmiin. Vertailun vuoksi valitsin
\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext
vaatii vähemmän kirjoittamista makroilla \define
:
\define[9]\sevenofnine{#7}
Siksi nämä määritelmät voivat johtaa luettavampaan koodiin – mikä on aina hyvä asia kirjoitettaessa TEX.
Valitettavasti \define
kääre vie paljon tavallisten \def
-sivujen ilmaisuvoimaa. Asiayhteydessä olet huomannut, että makrot, joissa on valinnaiset argumentit , ovat yleisiä käyttäjän käyttöliittymän suhteen. Esimerkiksi et yksinkertaisesti voi korvata toista \def
-aloitetta alla olevassa katkelmassa vastaavalla lausekkeella, joka käyttää \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
Tämä johtuu siitä, että \define
-asetuksella et voi määrittää argumentin erottimia (tässä: suluissa) valinnaiset argumentit, joten makrosi rajoittuvat periaatteessa vain pakollisten argumenttien ottamiseen. Samasta syystä ei ole mitään tapaa määritellä halpoja \{start|stop}something
ympäristöjä:
\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext
(Käyttäjän käyttöliittymä tämä on \definestartstop
(vrt. core-sys.mkiv ).)
Lopuksi, nykyään tärkein haittapuoli \define
on, että se ei salli mkvi -tyyppisiä argumentteja. Parametria ei yksinkertaisesti voida viitata sen nimellä , jos et voi määrittää sitä ensin.
% 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
Joten jos haluat tehdä vakavia makrokirjoituksia, opit pian välttämään \define
, vaikka se on turvallista vähemmän monimutkaisille tehtäville.
#optional
esimerkissäsi? Onko sinulla viitteitä siitä, mistä voin lukea lisää niistä?luat-mac.lua
(kontekstille) jaluatex-preprocessor.lua
Luatex-Plainille. Hth.\define
, ovat e-TeX-suojattuja. Laajennettavaksi on käytettävä\defineexpandable
(tai tavallista\def
).