Changes

Jump to navigation Jump to search
m
no edit summary
< '''Prev:''' [[System Macros/Scratch Variables|Scratch Variables]] | '''Top:''' [[System Macros]] | '''Next:''' [[System Macros/Handling Arguments|Handling Arguments]] >
=== Expansion control macro shortcuts ===
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 equivalent of <code>\expandafter</code>. <code>\@EAEA</code> expands to two expandafters, <code>\@EAEAEA</code> to three, and the last one <code>\@EAEAEAEAEA</code> expands to <code>\@EA\@EAEAEA\@EA</code>. Sometimes we pass At first sight, these macros as arguments are simply shortcuts that are a bit easier to type and read, but there is a bit more to commands that don't expand them before interpretationit. 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 are not familiar with ConTeXt: this is This will prevent the same command as <code>\protect</code> macro from being expanded in LaTeX). It seems that protection is one of the burdens of developers of packagesplaces where no typesetting occurs, so maybe that's why in e-TeX protection is solved in a more robust way. ConTeXt uses that (more robust) solution if it is available, and otherwise tries it's best like when strings are written to emulate it using rather tricky macrosthe tuo file.
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 [[source:syst-gen.texmkii| syst-gen.texmkii]] ([[source:syst-aux.mkiv|syst-aux.mkiv]] for MkIV) source code.
< '''Prev:''' [[System Macros/Scratch Variables|Scratch Variables]] | '''Top:''' [[System Macros]] | '''Next:''' [[System Macros/Handling Arguments|Handling Arguments]] >
[[Category:System MacrosProgramming and Databases]][[Category:ConTeXt programmingTools]]

Navigation menu