有没有一种方法可以使用luamplib
和不启用mplibcode
代码块继承来全局定义 metapost 宏?这似乎是可能的,因为这似乎是luamplib
在设置格式时所做的。
我在 Windows 上运行 MikTex,因此metafun
格式不起作用。因此,我使用mp-tool.mpiv
为每个mplibcode
块输入\everymplib
。我想这很好用,但似乎效率很低。我查看了文件luamplib.cfg
,但这似乎只接受 latex 宏,因此任何 metapost 定义都需要包含在一个mplibcode
块中,并启用继承才能在后续块中使用它们。
我可以简单地启用继承,但据我了解,这适用于全局,所以我担心这样做可能会导致难以诊断的错误(我只是在学习)。
同样,有没有办法让后续代码块从某些给定的代码块继承定义,但不继承其他代码块的定义?
“MWE”:
\documentclass{article}
\usepackage{luamplib}
% Is there somewhere that I can place this code so that it does not
% have to be read for each and every mplibcode block and without resorting
% to global inheritance between all code blocks. Something like
% \mplibsetformat{} but \mplibsetdefinitions{}.
\everymplib{
vardef mympfun (expr a,b) =
save pta,ptb;
pta:= xpart a;
ptb:= ypart b;
draw origin--(pta,ptb);
enddef;
}
\begin{document}
\begin{mplibcode}
u:=1cm;
pair a,b;
a:=u*(1,0);
b:=u*(0,1);
beginfig(0);
mympfun(a,b);
endfig;
\end{mplibcode}
\begin{mplibcode}
u:=1cm;
pair a,b;
a:=u*(-1,0);
b:=u*(0,3);
beginfig(0);
mympfun(a,b);
endfig;
\end{mplibcode}
\end{document}
答案1
从 V2.22 开始,luamplib
提供了一种新方法来实现这一点:命名实例。所以你现在有三个选择:
使用
everymplib
而不用担心它是否有效。使用
\mplibcodeinherit{enable}
并将每个mplibcode
环境视为先前环境的延续。这里唯一要注意的是,要明确区分要继承的变量和要本地化的变量。因此,您可能需要在代码中考虑命名约定——例如全局变量的首字母大写。如果您想确保没有从之前继承值,您可以使用numeric
或pair
或其他方式重新声明它们,这将删除任何先前的值。在环境中使用实例名称
mplibcode
。这在手册第 4 页. 这个想法是你写\begin{mplibcode}[common] % your MP figure, with useful definitions \end{mplibcode}
稍后你就可以拥有一个没有名称的常规环境
\begin{mplibcode} % MP figure that is completely independent \end{mplibcode}
然后另一个与第一个共享内容
\begin{mplibcode}[common] % your MP figure, that shares everything with earlier % "common" instances \end{mplibcode}
您可以根据需要使用任意多个单独的名称(显然)。