了解 ConTeXt 中的条件页面背景

了解 ConTeXt 中的条件页面背景

以下代码如何工作?来源:邮件列表上的讨论

\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\startchapterone

\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=),然后再次检查代码以找出原因。

相关内容