Ovatko \ def ja \ määritellä sama ConTeXt: ssä?

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.

Kommentit

  • Kiitos tästä hyödyllisestä vastauksesta. Selvennys: kun sanot " mkiv-tyyliset argumentit ", tarkoittaakö tämä nimettyjä argumentteja, kuten #optional esimerkissäsi? Onko sinulla viitteitä siitä, mistä voin lukea lisää niistä?
  • @LarsH Kyllä, Mk VI (ei MkIV!) -Makrot ovat (valinnaisten) parametrien nimiä. En ole varma, onko lähdetietojen lisäksi olemassa käyttäjätason dokumentaatiota: esiprosessorikoodi löytyy kohdasta luat-mac.lua (kontekstille) ja luatex-preprocessor.lua Luatex-Plainille. Hth.
  • Anteeksi, erehdykseni.
  • En tiedä ' en tiedä oliko näin vastauksen kirjoittaessani, mutta tänään makroja, jotka on määritelty käyttämällä \define, ovat e-TeX-suojattuja. Laajennettavaksi on käytettävä \defineexpandable (tai tavallista \def).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *