\ Def e \ define sono la stessa cosa in ConTeXt?

Cè qualche differenza tra la definizione di una variabile utilizzando \def e lutilizzo di \define, se utilizzato senza un numero allinterno di parentesi quadre, ad es \def\somecommand{\percent} e \define\somecommand{\percent}? Posso sempre utilizzare \define nei punti in cui \def può essere utilizzato?

Commenti

  • Da quello che vedo, \define\xyz{...}, quando \xyz è già definito emette un avviso, ma esegue la definizione Comunque. Ovviamente \def ' non emette alcun avviso.

Risposta

Per riferimento: esistono due definizioni di \define: la prima in syst-aux.mkiv mostra il comportamento menzionato da Egreg nel suo commento: se la macro è già definita, la lascia così comè. (Un compagno, \redefine consente di sovrascrivere la definizione corrente di macro indipendentemente dal suo utilizzo.) Ironia della sorte, questa definizione preliminare viene sovrascritta senza nota non appena il formato viene caricato core-sys.mkiv (mentre \redefine rimane per sempre).

Il effettivo la definizione della macro \define fornita dallinterfaccia utente non solo controlla le sequenze di controllo precedentemente definite con lo stesso nome, ma serve anche come una sorta di notazione breve per argomenti obbligatori. Ha lo schema

\define [<digit>] <macro> {<definition>} 

dove il primo argomento, una cifra, specifica il numero di argomenti che la nuova macro accetterà. Ovviamente questo può portare a definizioni più brevi. Per confronto, il selettore

\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext 

richiede un po meno di digitazione con la macro \define:

\define[9]\sevenofnine{#7} 

Quindi queste definizioni possono risultare in un codice più leggibile, il che è sempre una buona cosa quando si scrive TEX.

Sfortunatamente il \define wrapper toglie buona parte dellespressività dei semplici \def. Nel contesto, avrai notato, le macro che accettano argomenti opzionali sono comuni rispetto allinterfaccia utente. Ad esempio, semplicemente non puoi sostituire la seconda \def inizione nello snippet sottostante con unespressione equivalente utilizzando \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 

Questo perché con \define non puoi specificare i delimitatori di argomento (qui: parentesi) necessari per argomenti opzionali, quindi fondamentalmente le tue macro sono limitate ad accettare solo argomenti obbligatori (contro parentesi). Per lo stesso motivo non cè modo di definire ambienti \{start|stop}something economici:

\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext 

(linterfaccia utente per questo è \definestartstop (cfr. core-sys.mkiv ), comunque.)

Infine, oggigiorno lo svantaggio più importante di \define è che non consente argomenti in stile mkvi . Semplicemente non cè modo di fare riferimento a un parametro con il suo nome se non puoi assegnargli uno in primo luogo.

% 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 

Quindi, se vuoi scrivere una macro seria, imparerai presto a evitare \define, mentre è sicuro per attività meno complesse.

Commenti

  • Grazie per questa utile risposta. Chiarimento: quando dici " argomenti in stile mkiv ", significa argomenti con nome, come #optional nel tuo esempio? Hai un riferimento per sapere dove posso leggere di più su questi?
  • @LarsH Sì, le macro Mk VI (non MkIV!) Sono quelle con i nomi dei parametri (opzionali). Non sono sicuro che esista una documentazione a livello di utente oltre alla fonte: il codice del preprocessore può essere trovato in luat-mac.lua (per Context) e luatex-preprocessor.lua per Luatex-Plain. Hth.
  • Scusa, errore mio.
  • Non ' non so se questo fosse il caso al momento della scrittura di questa risposta ma oggi le macro definite utilizzando \define sono protette da e-TeX. Per poterlo espandere è necessario utilizzare \defineexpandable (o semplice \def).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *