以下代码如何工作?来源:邮件列表上的讨论
\setuplayout
[header=0cm,
topspace=1.625cm,
footer=0cm,
width=fit,
height=fit]
\startMPinclusions
numeric MyTitlePageDone[] ;
\stopMPinclusions
\startuseMPgraphic{background:normal}
StartPage ;
fill
(topboundary Page --cycle) enlarged(0,5mm) shifted (0,-5mm)
withcolor \MPcolor{color:background:\namedstructureuservariable{chapter}{mycolor}} ;
StopPage ;
\stopuseMPgraphic
\defineoverlay
[background:normal]
[\useMPgraphic{background:normal}]
\startuseMPgraphic{background:title}
if unknown MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} :
StartPage ;
fill ((topboundary Page --cycle) enlarged(0,5mm))
shifted (0,-20mm)
withcolor \MPcolor{color:title:\namedstructureuservariable{chapter}{mycolor}} ;
StopPage ;
MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} := 1 ;
fi ;
\stopuseMPgraphic
\defineoverlay
[background:title]
[\useMPgraphic{background:title}]
\setupbackgrounds
[page]
[background={background:normal,background:title}]
\definecolor [color:title:one] [r=0.86,g=0.88,b=0.76]
\definecolor [color:background:one] [.9(color:title:one)]
\definecolor [color:title:two] [g=0.86,r=0.88,b=0.76]
\definecolor [color:background:two] [.9(color:title:two)]
\starttext
\startchapter[title=One][mycolor=one]
\input tufte \page
\input knuth
\stopchapter
\startchapter[title=Two][mycolor=two]
\input tufte \page
\input knuth
\stopchapter
\stoptext
为什么背景是条件性应用的?为什么标题页背景不应用于普通页面?代码中似乎没有任何条件或检查页面类型的检查。标题背景也应用于通过 \startstandardmakeup 实现的封面页,但由于未定义用户变量,因此变为黑色。
非常感谢您提供任何有助于理解此代码的帮助。
答案1
让我们看一下代码。我跳过了与理解条件处理无关的部分。首先创建一个空的 MetaPost 数组。
\startMPinclusions
numeric MyTitlePageDone[] ;
\stopMPinclusions
现在来到实际打印章节标题下方彩色条的部分。
\startuseMPgraphic{background:title}
if unknown MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} :
StartPage ;
fill ((topboundary Page --cycle) enlarged(0,5mm))
shifted (0,-20mm)
withcolor \MPcolor{color:title:\namedstructureuservariable{chapter}{mycolor}} ;
StopPage ;
MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} := 1 ;
fi ;
\stopuseMPgraphic
让我们进一步简化此代码:
\startuseMPgraphic{background:title}
if unknown MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} :
%%
%% code for printing colourful bar skipped
%%
MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} := 1 ;
fi ;
\stopuseMPgraphic
宏扩展为提供给命令的第二个参数的\namedstructureuservariable{chapter}{mycolor}
变量的参数,在本例中 为:mycolor
\startchapter
one
\startchapter[title=One][mycolor=one]
这意味着
if unknown MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} :
最终变成
if unknown MyTitlePageDone.one ;
这是一种寻址数组元素的方法一在 MetaPost 中。在每个新章节中,此条件的计算结果为,true
因为MyTitlePageDone[one]
确实是未知的。它以前从未被设置过。以下代码绘制彩色条,直到达到此代码:
MyTitlePageDone.\namedstructureuservariable{chapter}{mycolor} := 1 ;
变成
MyTitlePageDone.one := 1 ;
并由此定义此数组元素。数字无关紧要,因为它检查的是unknown
,而不是特定值。在下一页中,条件
if unknown MyTitlePageDone.one ;
false
因为这个值是已知的(在上一页它被设置为 1),所以计算结果为,并且打印条形的代码被跳过。
此代码依赖于每个章节都有唯一颜色的事实。尝试一下如果为不同的章节选择相同的颜色会发生什么(使用设置
mycolor=
),然后再次检查代码以找出原因。