我创建了一个包,我想接收选项并将它们转换为新宏(每个选项一个新宏)。我还希望这些新宏依次生成新宏。例如,这样调用我的包:
\usepackage[foo]{mypackage}
应有效运行以下内容:
\newcommand{\foo}[1]{%
\def\fooMagic{some handling of #1}
}
以下是我迄今为止的尝试 - 以示例形式。
\ProvidesPackage{mypackage}
\RequirePackage{xkeyval}
% Create a macro to create the macro that will create the macros:
\newcommand{\@mypackage@addnewmacro}[1]{%
\expandafter\newcommand\expandafter{\csname #1\endcsname}[1]{%
% Point A is here (for explanatory reasons that will become apparent)
\expandafter\def\csname #1Magic\endcsname{some handling of ##1}
}
}
% Interpret (unrecognised) options supplied to the package as new macro names:
\DeclareOptionX*{%
\@mypackage@addnewmacro{\CurrentOption}
}
% Process the options:
\ProcessOptionsX*
运行这个:
\documentclass{report}
\usepackage[foo]{mypackage}
\foo{bar}
\begin{document}
\fooMagic
\end{document}
应该打印:
some handling of bar
但它却导致了一个错误(在日志中):
Undefined control sequence.\fooMagic
如果在 处插入以下内容Point A
:
\PackageWarning{mypackage}{'#1','##1'}
日志显示为#1
空,打印:
'','bar'
我不太清楚为什么会发生这种情况。我猜这可能与定义所有选项然后处理它们有关,此时原始#1
值已被删除。尽管无论原因如何,任何帮助解决/修复此问题的帮助都将不胜感激。
答案1
如果你插入\show\foo
到你的文档中,你会看到它定义为
\foo=\long macro:
#1->\expandafter \def \csname \CurrentOption Magic\endcsname {some handling of
#1} .
因此没有根据“foo”进行定义,但是\CurrentOption
当您执行此操作时它没有有用的定义。
由于一些额外的措施\expandafter
可以治愈所有已知的疾病,我建议:
\DeclareOptionX*{%
\expandafter\@mypackage@addnewmacro\expandafter{\CurrentOption}
}
然后就可以让你的文档按照你希望的方式运行了。