I’m working on another project which provides a LATEX-like typesetting system (but not using TEX for its engine) and I was thinking about how the loading of extensions (its equivalent of LATEX packages) would work.
In particular, I wanted to be able to allow users to do things like
\LoadExtension{ams:amssymb}[\eqcirc -> \eq,\circeq ->\eqcirc]
to enable commands defined in an extension to be renamed at load time.¹ Of course, it would be nice to be able to also do things like give a list of only the commands that should be imported from an extension, or to give a list of commands that should be excluded from the extension.
As I thought about this, I realized that the xparse syntax for argument specifications provides a simple and convenient way to have multiple context-dependent optional arguments. I could define \LoadExtension
with an argument template like:
o m o s o s o
The arguments would then be:
- options to the package (akin to options on
\usepackage
in LATEX) - package name
- command remappings when all commands are imported
*
(value ignored)- list of commands that should be imported. Only the named commands would be imported.
*
(value ignored)- all commands will be imported except those listed
Then a user could write something like:
\LoadExtension{ams:amssymb}*[\eqcirc]
to import only the \eqcirc
command from the extension.
\LoadExtension{ams:amssymb}[\circeq->\ceq]*[\eqcirc]
or even
\LoadExtension{ams:amssymb}[\circeq->\ceq][\eqcirc]
would import two commands, \circeq
as \ceq
and \eqcirc
Although the user would probably prefer
\LoadExtension{ams:amssymb}*[\eqcirc,\circeq->\ceq]
Using
\LoadExtension{ams:amssymb}[\circeq->\ceq]**[\eqcirc]
would import all the commands except \eqcirc
and rename \circeq
to \ceq
I’m not sure that this is necessarily better than having something like:
\LoadExtension{ams:amssymb}[rename -> {…}, exclude -> {…}]
as the syntax but it’s interesting to note that xparse
allows such things to happen.
- This particular example doesn’t actually apply for finl. All the AMS symbol fonts will be part of the kernel character set.