我不确定这个问题的标题,但这是上下文。
假设我有两种颜色定义如下
color red ; red = (1, 0, 0) ;
color lightred ; lightred = (1, .5, .5) ;
现在,假设......我想要分别draw
和fill
一条带有分别和的路径,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
其定义为suffix
或text
参数,MP 将直接将标记放入普通标记列表中,而无需进一步评估。然后它将使用此标记列表替换s
宏定义。
所以现在当您传递shade
给宏时,s
它将成为具有值的令牌列表shade
,并将根据需要withcolor s.light
扩展。withcolor shade.light
此时,您可能会问自己“text
和suffix
参数之间有什么区别?”。答案是“没什么区别”,只是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 的魅力之一就在于它简单易学。(除了变量后缀和下标的微妙之处…… :-)。