在 ConTeXt 中使用 \structurelistuservariable 动态定义 metafun 位置变量

在 ConTeXt 中使用 \structurelistuservariable 动态定义 metafun 位置变量

这个问题,我现在正尝试使用位置叠加来实现相同的效果(在目录中使用 metafun 绘图,从章节编号到页面边缘)。

但是,我使用 structurelistuservariable 动态定义的位置变量(即 \hpos)似乎不起作用。

一个简单的例子:

\setuppapersize[letter][letter]


\define[1]\TOCDynamic{ 
  \hpos{X-\structurelistuservariable{short}}{X-\structurelistuservariable{short}} 
}
\define[1]\TOCStatic{ 
  \hpos{X-A}{X-A} 
}

\setuplist[chapter][number=yes, width=1em,  numbercommand=\TOCDynamic,  width=5em, alternative=c]
\setuplist[section][number=yes, width=1em,  numbercommand=\TOCStatic,  width=7em, alternative=c]


\startMPpositiongraphic{ExampleFromManual}
  initialize_box(\MPpos{\MPvar{self}}) ;
  path p ; p := llxy..lrxy..urxy..ulxy..cycle ;
  pickup pencircle scaled 1pt ;
  fill p withcolor .800white ;
  draw p withcolor .625yellow ;
  anchor_box(\MPanchor{\MPvar{self}})
\stopMPpositiongraphic


\starttext

  \placecontent[criterium=all]
  \startpositionoverlay{TOClayer}
    \setMPpositiongraphic{X-A}{ExampleFromManual}
    \setMPpositiongraphic{X-What}{ExampleFromManual}
    \setMPpositiongraphic{X-Why}{ExampleFromManual}
  \stoppositionoverlay
  \defineoverlay [TOClayer] [\positionoverlay{TOClayer}]
  \setupbackgrounds [page] [background={TOClayer}]


\startchapter[title=A Vision of The Future][short=What]
  \input tufte
  \section{What will happen?}
  \section{What will cause it?}
\stopchapter

\startchapter[title=A Causal Account][short=Why]
  \input tufte
  \section{Why did it happen?}
  \section{Why wasn't it stopped?}
\stopchapter

\stoptext

在此处输入图片描述

这会在最后定义的“XA”处生成一个图形,但在动态定义的 X-What 和 X-Why 位置处不生成任何图形。我们可以看到,structurelistuservariable 命令确实在范围内输出了预期值,因为值(例如“X-What”)出现在目录中,所以我们的位置变量应该正确命名。有没有办法打印所有定义的位置变量的名称来检查这一点?

更一般地说,我真的很难找到一种有效的工作流程来解决 metafun 和 ConTeXt 这类问题。经验丰富的 ConTeXt 用户遇到这种情况时会怎么做?您会在哪里寻找相关信息?

答案1

要了解发生了什么,首先查看该.tuc文件:

 ["user"]={
    ...
  ["X-A"]={
   ["h"]=561204,
   ["n"]=6,
   ["p"]=1,
   ["r"]="textarea:1",
   ["w"]=1410084,
   ["x"]=4917992,
   ["y"]=40749956,
  },
  ["X-\\structurelistuservariable {short}"]={
   ["d"]=160344,
   ["h"]=545484,
   ["n"]=4,
   ["p"]=1,
   ["r"]="textarea:1",
   ["w"]=2436600,
   ["x"]=4917992,
   ["y"]=42647046,
  },
 },
}

这表明 \hpos标签没有被展开。要了解为什么会出现这种情况,让我们看看中的定义strc-lst.mklx

\permanent\protected\def\structurelistuservariable#name%
  {\dostarttagged\t!listdata{#name}%
   \clf_listuserdata{\currentlist}\currentlistindex{#name}%
   \dostoptagged}

它被定义为\protected宏,因此不会被展开。包装 a\expanded{\hpos{...}{...}}也无济于事。宏受到保护的原因是由于\dostarttagged... \dostoptagged。下面有一个定义:

\permanent\def\rawstructurelistuservariable#name%
  {\clf_listuserdata{\currentlist}\currentlistindex{#name}}

这不是\protected。所以,如果你只是\structurelistuservariable用替换\rawstructurelistuservariable,一切就都正常了!你可以通过查看.tuc文件来确认这一点,该文件现在有:

 ["user"]={
  ...
  ["X-A"]={
   ["h"]=561204,
   ["n"]=6,
   ["p"]=1,
   ["r"]="textarea:1",
   ["w"]=1410084,
   ["x"]=4917992,
   ["y"]=40749956,
  },
  ["X-What"]={
   ["d"]=16506,
   ["h"]=545484,
   ["n"]=1,
   ["p"]=1,
   ["r"]="textarea:1",
   ["w"]=2736066,
   ["x"]=4917992,
   ["y"]=46204089,
  },
  ["X-Why"]={
   ["d"]=160344,
   ["h"]=545484,
   ["n"]=4,
   ["p"]=1,
   ["r"]="textarea:1",
   ["w"]=2436600,
   ["x"]=4917992,
   ["y"]=42647046,
  },
 },

输出如下所示。您可能需要调整 MP 代码以避免重叠等。

在此处输入图片描述

相关内容