![在 ConTeXt 中使用 \structurelistuservariable 动态定义 metafun 位置变量](https://linux22.com/image/445645/%E5%9C%A8%20ConTeXt%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20%5Cstructurelistuservariable%20%E5%8A%A8%E6%80%81%E5%AE%9A%E4%B9%89%20metafun%20%E4%BD%8D%E7%BD%AE%E5%8F%98%E9%87%8F.png)
继这个问题,我现在正尝试使用位置叠加来实现相同的效果(在目录中使用 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 代码以避免重叠等。