如何扩展变量

如何扩展变量

我不确定这个问题的标题,但这是上下文。

假设我有两种颜色定义如下

color red      ; red      = (1, 0, 0) ;
color lightred ; lightred = (1, .5, .5) ;

现在,假设......我想要分别drawfill一条带有分别和的路径,red就像lightred这样

def drawerfiller(expr p, c) =
  fill p withcolor lightred ;
  draw p withcolor red ;
enddef ;

我可以通过扩展(?)来使用该变量,c以便得到类似

def drawerfiller(expr p, c) =
  fill p withcolor light{c} ;
  draw p withcolor {c} ;
enddef ;

答案1

是的,您可以对颜色进行计算。尝试以下操作:

def drawerfiller(expr p, c) =
  fill p withcolor 1/2[c, background];
  draw p withcolor c;
enddef;

或者,对于你的特定示例:

def drawerfiller(expr p, c) =
  fill p withcolor (c + (1/2, 1/2, 1/2));
  draw p withcolor c ;
enddef ;

您不需要明确地“扩展”变量,因此这里(或实际上 MP 中的任何地方)不需要花括号。

(第二个示例假设您使用 RGB 颜色。)

如果您想要更加复杂,您可以使用后缀来定义颜色:

color shade.light, shade.medium;
shade.medium = (1/2, 0, 0);
shade.light = (1, 1/2, 1/2);

并明确将第二个参数定义为后缀而不是表达式:

vardef fillerdrawer(expr p)(suffix s) = 
  fill p withcolor s.light; 
  draw p withcolor s.medium;
enddef;

同样正确的是,你也可以写:

vardef fillerdrawer(expr p)(text s) = 
  fill p withcolor s.light; 
  draw p withcolor s.medium;
enddef;

这里发生了什么? 如果参数定义为expr,则 MP 将对其进行评估并将其放入特殊的“胶囊”标记中,该标记将替换替换文本中的参数。这是通常的情况。

但是在这个例子中,如果你创建了s一个expr,并将shade其作为的值传递s,它将被评估为一个未知数字,所以你会得到一个错误,withcolor因为<<unknown numeric capsule>>.light它不是一个color变量。

另一方面,如果你将s其定义为suffixtext参数,MP 将直接将标记放入普通标记列表中,而无需进一步评估。然后它将使用此标记列表替换s宏定义。

所以现在当您传递shade给宏时,s它将成为具有值的令牌列表shade,并将根据需要withcolor s.light扩展。withcolor shade.light

此时,您可能会问自己“textsuffix参数之间有什么区别?”。答案是“没什么区别”,只是suffix参数中的任何下标都将被评估为数字标记,但在text参数中它们将保持不变。

第 18、19 和 20 章Metafont 书籍是这一层面的宏观细节的主要参考。

作为一个完整(有效)的示例:

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}

color shade.light, shade.medium;
shade.medium = (1/2, 0, 0);
shade.light = (1, 1/2, 1/2);
    
vardef fillerdrawer(expr p)(suffix s) = 
  fill p withcolor s.light; 
  draw p withcolor s.medium;
enddef;

beginfig(1);
fillerdrawer(unitsquare scaled 20, shade);
endfig;

\end{mplibcode}
\end{document}

编译它lualatex(或者使其适合普通 MP)以获得:

在此处输入图片描述

请注意,作为语法上的一种友善,MP 允许,而不是)(在您调用这样定义的宏时使用。

但是,要做出这样的事情,你需要的聪明程度是有限的。越复杂,就越难记住。普通 MP 的魅力之一就在于它简单易学。(除了变量后缀和下标的微妙之处…… :-)。

相关内容