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\xyzon jo määritetty, antaa varoituksen, mutta suorittaa määritelmän joka tapauksessa. Tietysti\defei 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.
#optionalesimerkissäsi? Onko sinulla viitteitä siitä, mistä voin lukea lisää niistä?luat-mac.lua(kontekstille) jaluatex-preprocessor.luaLuatex-Plainille. Hth.\define, ovat e-TeX-suojattuja. Laajennettavaksi on käytettävä\defineexpandable(tai tavallista\def).