luamplib:没有继承的全局定义

luamplib:没有继承的全局定义

有没有一种方法可以使用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提供了一种新方法来实现这一点:命名实例。所以你现在有三个选择:

  1. 使用everymplib而不用担心它是否有效。

  2. 使用\mplibcodeinherit{enable}并将每个mplibcode环境视为先前环境的延续。这里唯一要注意的是,要明确区分要继承的变量和要本地化的变量。因此,您可能需要在代码中考虑命名约定——例如全局变量的首字母大写。如果您想确保没有从之前继承值,您可以使用numericpair或其他方式重新声明它们,这将删除任何先前的值。

  3. 在环境中使用实例名称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}
    

    您可以根据需要使用任意多个单独的名称(显然)。

相关内容