从包选项生成新宏时嵌套参数丢失

从包选项生成新宏时嵌套参数丢失

我创建了一个包,我想接收选项并将它们转换为新宏(每个选项一个新宏)。我还希望这些新宏依次生成新宏。例如,这样调用我的包:

\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}
}

然后就可以让你的文档按照你希望的方式运行了。

相关内容