Inside ConTeXt
< Main Page >
Contents
Programming Topics
Commands and Arguments
- Processing Lists: Processing lists of values.
Using variables
\setvariables[namespace][key=value] \getvariable{namespace}{key}
TODO: This could really use a specific example or two. (See: To-Do List) |
Defining new commands
Special characters in command names
Some commands have special characters in their names, that TeX normally does not consider to be letters: @, ! and ?. Before and after the use or definition of such protected commands in your input files, the catcode of these characters has to be changed. This is done by \unprotect and \protect:
\unprotect \def\!test{alfa} \protect
The newly defined command \!test can of course only be called upon when we are in the \unprotected state, otherwise TeX reads the command \!, followed by the word test (and probably complains loudly about not being in math mode). These protection/unprotection commands can be nested. When the nesting becomes deeper than one level, the system reports the current protection level. It is a good habit to always start your macro files with \unprotect and end them with \protect.
See also
Commands with Key=Value arguments, Commands with optional arguments
Passing verbatim text as macro parameter
In case you want to write macros that should handle verbatim text, you can use the tex primitives \obeyspaces and \obeylines. \obeyspaces changes the category code of the space character, so that spaces become significant. \obeylines does the same for the newline character.
This works fine for the following example:
\framed{\obeyspaces{A gap from here to there!}}
But if you pass this text as a parameter for your own macro \TextWithSpaces
\def\TextWithSpaces#1{\framed{\obeyspaces#1}}% \TextWithSpaces{A gap from here to there!}
the additional spaces are ignored. This happens because the category code change is not yet in effect when the argument is parsed, and the spaces are removed during parsing. To keep the spaces, the catcode change must be done before the argument is parsed.
Here is a two-part solution for the problem (suggested by Taco Hoekwater):
\def\TextWithSpaces{\bgroup\obeyspaces\doTextWithSpaces} \def\doTextWithSpaces#1{\framed{#1}\egroup}
Another way is to postpone argument loading (suggested by Hans Hagen).
\def \TextWithSpaces {\framed\bgroup\obeyspaces\doTextWithSpaces} \def\doTextWithSpaces #1{#1\egroup}
Both of these produce the desired result: