我使用“gmp”包,它允许在 LaTeX 源文件中插入 MetaPost 编码(放置在mpost
或mpost*
环境中)。简而言之,它的功能与“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}