# Changes

,  16:51, 8 June 2020
m
no edit summary
== Expansion control ==< '''Prev:''' [[System Macros/Scratch Variables|Scratch Variables]] | '''Top:''' [[System Macros]] | '''Next:''' [[System Macros/Handling Arguments|Handling Arguments]] >
When in unprotected mode, to be entered with <code>\unprotect</code>, one can use <code>\@EA</code> as equivalent of <code>\expandafter</code>. <code>\@EAEA</code> expands to two expandafters, <code>\@EAEAEA</code> to three, and the last one expands to <code>\@EA\@EAEAEA\@EA</code>.=== Expansion control macro shortcuts ===
Sometimes we pass macros When in unprotected mode, to be entered with <code>\unprotect</code>, one can use <code>\@NX</code> as equivalent of <code>\noexpand</code>, and <code>\@EA</code> as arguments equivalent of <code>\expandafter</code>. <code>\@EAEA</code> expands to two expandafters, <code>\@EAEAEA</code> to three, and <code>\@EAEAEAEAEA</code> expands to commands <code>\@EA\@EAEAEA\@EA</code>. At first sight, these macros are simply shortcuts that don't expand them before interpretationare a bit easier to type and read, but there is a bit more to it. Such commands can be enclosed by Here is an example where <code>\expanded@EA\@EAEAEA\@EA</code>, likeis not the same as five \expandafters in a row:
<texcode>
\expandeddef\complexdoblank {\setupsomething[flushnotes \ifmmode \@EA\nocomplexdoblank \else \ifopelkaar \ifinpagebody \@EA\@EAEAEA\@EA\docomplexdoblank \else \@EA\@EAEAEA\@EA\nocomplexdoblank \fi \else \@EAEAEA\docomplexdoblank \fi \alfa]fi}
</texcode>
Such situations occur for instance when The two commands <code>\alfaexpandoneargafter</code> is a commalist or when data stored in macros is fed to index of list commands. If needed, one should use and <code>\noexpandexpandtwoargsafter</code> inside the argument. Later on we will meet some more clever alternatives to this command. These two commands make macros more readable by hiding a lot of <code>\expandafter</code>'s. They first expand the arguments after that follow the command, then the first command.
<texcode>
</texcode>
These commands expect the arguments to be macros, the <code>\full...</code> versions do a ''deep expansion''. === Expanding all arguments === Sometimes we pass macros as arguments to commands that don't expand them before interpretation. Such commands can be enclosed by <code>\expanded</code>, like: <texcode>\expanded{\setupsomething[\alfa]}</texcode> Such situations occur for instance when <code>\alfa</code> is a commalist or when data stored in macros is fed to indexing or list generation commands. If needed, one could use <code>\noexpand</code> inside the argument, but some very often occuring problems with expansion (like accents) are intercepted by a somewhat smarter version with the same basic functionality: <texcode>\safeexpanded{\bookmark{\alfa}}</texcode> The <code>\safe...</code> form is actually so useful that there are ''safe'' versions of <code>\edef</code> and <code>\xdef</code> avialable: <code>\safeedef</code> and <code>\safexdef</code> (only usable for definitions that do not need arguments). === Preventing expansion ===
When expansion of a macro gives problems we can precede it by <code>\unexpanded</code>, like so:
</texcode>
(if you This will prevent the macro from being expanded in places where no typesetting occurs, like when strings are not familiar with ConTeXt: this is written to the same command as <code>\protect</code> in LaTeX)tuo file. Expansion problems can get quite complex. It seems There are some other internal macros that protection can help harnassing it, but it is one of fairly unlikely that you will need them. If you believe you do, read the burdens of developers of packages, so maybe that's why in e[[source:syst-gen.mkii| syst-TeX protection is solved in a more robust waygen. ConTeXt uses that mkii]] (more robust[[source:syst-aux.mkiv|syst-aux.mkiv]] for MkIV) solution if it is available, and otherwise tries itsource code. < '''Prev:''' [[System Macros/Scratch Variables|Scratch Variables]] | '''Top:''' [[System Macros]] | '''Next:'''s best to emulate it using rather tricky macros.[[System Macros/Handling Arguments|Handling Arguments]] >
Expansion problems can get quite complex. There are some other internal macros that can help harnassing it, but it is fairly unlikely that you will need them. If you believe you do, read the [[sourceCategory:syst-gen.tex| syst-gen.texProgramming and Databases]][[Category:Tools]] source code.