I'm setting some fonts and font-related commands using l3keys, and that works just fine—but it seems there's an issue when setting the same keys via l3keys2e. Is this expected behavior? Is there a way around it?

Here's an MWE:



    {keydebug} {2019/00/00}
    {0.0}      {}


\keys_define:nn { keydebug } {
    myfont      .tl_set:N       = \myfont,
    myfont      .initial:n      = \it,               % 1

\ProcessKeysOptions { keydebug }

% \keys_set:nn { keydebug } { myfont = \it }         % 4


\usepackage{keydebug}                                % 1
% \usepackage[myfont=\relax]{keydebug}               % 2
% \usepackage[myfont=\it]{keydebug}                  % 3-4

{\myfont Hello, world!}

The numbers to the right indicates four scenarios, and which of the given lines should be uncommented/active in each.

Scenario 1

Initializing via the .initial property works just fine, and results in the following:

using .initial

Scenario 2

Here I supply a command via the package options—in this case \relax, but other commands seem generally to work just fine. In this case, the result is the following, as expected:

with \relax

Scenario 3

Now comes the problem. If I try to supply a font command such as \it or \bfseries or the like, I get the following error:

./keydebug.tex:27: Missing control sequence inserted.
<inserted text>

Scenario 4

It's not supplying the command that's the problem—it's using it later. If I ensure that I overwrite it (still in the preamble, here), things are just fine:


So … any suggestions for fixes or workarounds?

  • Off topic: please don't use \it, rather use \textit.
    – Joseph Wright
    Apr 16, 2019 at 14:00
  • In a per-document basis you can load the kvoptions-patch package before loading your keydebug package, which changes LaTeX's package option handling and inhibits the \edef Joseph mentioned. (It seems that in total there are two \edefs in the process, so \usepackage[myfont=\noexpand\noexpand\noexpand\itshape]{keydebug} should work as well). Apr 16, 2019 at 14:02
  • @JosephWright I think you meant \itshape :-) Apr 16, 2019 at 14:02
  • I know :-) This is partly for insertion in places where I can't wrap the argument in braces, which I'm using \itseries and \bfseries etc., there. But where I can, I use \textit (for automatic italics correction), etc. But \textit doesn't fare much better, here. Apr 16, 2019 at 14:04
  • Right, though \itshape doesn't fare any better either :-) Apr 16, 2019 at 14:05

1 Answer 1


This is out of the control of l3keys2e. The LaTeX2e kernel processes options before they are passed to packages, and the code which does that (written in the early 1990s) carries out \edef expansion. It was written on the basis that options would be simple lists of words, not keyvals and certainly not commands. The LaTeX team are exploring approaches to 'fixing' this, but there are non-trivial issues. At present, you should stick to using a 'setup' approach for any keys that do not strictly expect strings.

  • Right. Yeah, I have a separate setup command too, of course, so I guess I'll just mention this in the docs, then :-) Apr 16, 2019 at 14:06
  • Ended up (for now) placing \ProcessKeysOptions between two blocks of \keys_define:nn, with the first defining those keys that may be set in \usepackage. Apr 16, 2019 at 14:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .