# How do I declare an option that takes an input value?

I know I can declare and execute an option for my package using

\DeclareOption{myoption}{\typeout{I did it!}}
\ProcessOptions


but now I'd like to give the option a value:

\DeclareOption{type}{\typeout{You typed: \CurrentOptionValue}}


which would be used as follows:

\usepackage[type="hello, world!"]{mypackage}


Requirements on the value string is that it can contain at least some nonalphanumeric characters, like spaces, commas and dots (and maybe some others...).

-
Do you mean just any option or specifically a key-value one? –  Joseph Wright Nov 12 '10 at 15:11

For handling key-value input as package options, there are a few choices:

Of these, kvoptions is probably the most robust approach. The way that options are declared is to use \define@key (or \pgfkeys in the case of pgfopts) before processing the package options. With kvoptions you get some nicer wrappers, such as \DeclareBoolOption.

However, the LaTeX2e kernel does various bits of processing before the input gets anywhere near the key-value processor. As a result, I'd strongly advice considering using a post-loading macro to set keys rather than a load-time set of options. This is easy enough to implement:

\def\mysetupmacro#1{\setkeys{mypackage}{#1}}


which will then only need a basic key-value package: probably I would choose kvsetkeys, which provides \kvsetkeys as a more robust version of \setkeys.

-
Forgot about pgfopts and didn't know about kvoptions. Thanks for those. –  Matthew Leingang Nov 12 '10 at 16:08
"However, the LaTeX2e kernel does various bits of processing before..." In particular, the kernel gobbles punctuation, causing arguments like type="hello, world!" to fail. Not all is lost. Should you really need to pass spaces via package options, you can escape them like this: type="hello,\ world!" However, other punctuation can't be escaped (your ! will lead to trouble). Joseph is spot-on about this. PS, xkeyval more or less supersets kvoptions, is feature-rich, and is certainly equally robust. pgfopts exposes pgfkeys for package writers (for which, see the PGF\TikZ manual). –  Geoffrey Jones Nov 13 '10 at 0:18

The xkeyval package is your friend.

-