Changes

Jump to navigation Jump to search
no edit summary
< [[Inside ConTeXt]]


(a post on the mailing list by Taco Hoekwater from 2004-06-28:)

The 'key' to the keyval functionality in ConTeXt are two macros called
<tt>\getparameters</tt> and <tt>\processaction</tt>.

Here is a 'quickstart', assuming you want to define <tt>\MyZigzag</tt>:

<pre>
\unprotect % enable exclamations in macro names

\def\MyZigzag#1[#2]{%
% the #1 makes sure we allow a space before the bracket

\getparameters[ZZ][Dir=,Linewidth=1pt,Color=Red,Width=3em,#2]
</pre>

Now you have a set of new macros that all start with ZZ.
At least there are <tt>\ZZDir</tt>,<tt>\ZZLinewidth</tt>, <tt>\ZZColor</tt> and <tt>\ZZWidth</tt> (these have default values) but possibly others as well, depending on user input.

Here's a usage example:

<pre>
\edef\mywidth{\ZZWidth}%
</pre>

If you want to use keyword values, then you also need to use <tt>\processaction</tt>.

Say you want "Dir" to be mandatory and that it accepts 4 directional keywords, as well as a direct angle specification.

I've used all mixed case keywords, because otherwise you might run into conflicts with the multilingual interface

<pre>
\expandafter\processaction\expandafter[\ZZDir]
[Down =>\def\Dir{270},
Left =>\def\Dir{180},
Up =>\def\Dir{90},
Right =>\def\Dir{0},
\s!default =>\errorDir,
\s!unknown =>\checkDir{\ZZDir}]
} % this brace belongs to \def!
</pre>

<tt>\s!default</tt> may be triggered because <tt>\ZZDir</tt>'s expansion is empty unless the user supplied something.

The first argument to \processaction has to be expanded, so you need the <tt>\expandafter</tt>s.

for completeness, here is an example definition of <tt>\checkDir</tt> and <tt>\errorDir</tt>:

<pre>
\def\errorDir{%
\def\Dir{0}% error recovery
\message{Please supply "Dir" argument}%
}

\def\checkDir#1{%
\doifnumberelse {#1}
{\def\Dir{#1}}
{\message{Invalid "Dir" argument! (#1)}}
}

\protect % end of definitions
</pre>

Navigation menu