软件包 gmp 有问题(或者 xkeyval 有问题?)

软件包 gmp 有问题(或者 xkeyval 有问题?)

我使用“gmp”包,它允许在 LaTeX 源文件中插入 MetaPost 编码(放置在mpostmpost*环境中)。简而言之,它的功能与“emp”或“mpgraphics”等其他包大致相同,但具有与此无关的附加功能。

具体来说,“gmp”定义为一个名为 (xkeyval-type) 的选项键,everymp该键应该包含一些代码,这些代码将插入到生成的每个 MetaPost 文件的开头。这是一个最小示例:

\documentclass{minimal}
\usepackage[everymp= {input boxes;}]{gmp}
\begin{document}
\begin{mpost*}
    % here the MetaPost code
\end{mpost*}
\end{document}

此处的everymp密钥包含 metapost 指令input boxes ;,因此该指令应该插入到编译生成的 MetaPost 文件的开头。但我得到的结果却不同:

%% Do not edit, this file has been generated
%% automatically by bug-everymp.tex via gmp.sty

inputboxes;
outputtemplate:= "%j.mps";
beginfig(1);

endfig;
end.

正如你所看到的,这一行对于 MetaPost 来说input boxes;已经变得inputboxes;毫无意义了……

我已经找到了触发此错误的原因,但是这使它变得更加奇怪:它来自于选项声明中=和之间插入的空格:{input boxes;}

everymp= {input boxes;}

如果我隐藏这个空间,即如果我写

everymp={input boxes;}

我得到

input boxes ; 

在 MetaPost 中,即预期的内容。

当然,这个问题并不重要,但它让我很困惑。为什么在=和 之间插入一个空格字符会产生这种行为?这是 gmp 包的问题,​​还是 (x)keyval 包的问题?在后一种情况下,应该在其他地方注意到了,但到目前为止我还没有发现类似的东西。

我在 Mac OS X Snow Leopard(10.6.8)上使用 MacTeX 2012 发行版(即 TeX Live 2012)以及 gmp 包的第一个也是迄今为止唯一的版本(1.0)。

答案1

input和之间的空格boxes;是由 LaTeX 内核删除的,而不是由 xkeyval 包删除的。我们在这里看到:

\@pass@ptions #1#2#3->\expandafter \xdef \csname opt@#3.#1\endcsname {\@ifundef
ined {opt@#3.#1}\@empty {\csname opt@#3.#1\endcsname ,}\zap@space #2 \@empty }
#1<-\@currext 
#2<-everymp=input boxes;
#3<-gmp

解决方案:加载期权包在 之前\usepackage[everymp=input boxes;]{gmp}。这样就无需用input boxes;括号括起来。

\documentclass{article}
\usepackage{catoptions}
\usepackage[everymp=input boxes;]{gmp}

\begin{document}
\begin{mpost*}
    % here the MetaPost code
\end{mpost*}
\end{document}

相关内容