背景
在 ConTeXt 中,可以使用以下方法创建多级索引:
\index{level1+level2}text
如果 的值与level2
的前一个索引值匹配level2
,则 的文本level2
不会重复。
问题
我希望level2
按照如下所示的预期结果重复进行:
在图像中,SECTION A
重复了(以红色标识),但仅仅是因为在代码片段中中间的“ SECTION A
”实际上包含一个额外的空格(即“ SECTION A
”)。
当完全相同的章节标题实际上重复时(以橙色标识),该章节标题将被隐藏。
代码
为了说明问题:
\define[1]\AnimalName{%
\expanded{\index{#1+\namedstructurevariable{section}{title}}{#1}}%
}
\define[1]\AnimalQuant{#1}
\define[1]\AnimalGroup{#1}
\define[3]\Animal{
\startitem
\AnimalQuant{#1} \AnimalGroup{#2} \AnimalName{#3}
\stopitem
}
\setupregister[index][
textstyle=\em,
style=\tfa\bold,
balance=no,
command=\Word,
]
\starttext
\placeindex[compress=yes]
\startchapter[title={Chapter 1}]
\startsection[title={Section A}]
\Animal{6}{rookery}{albatross}
\Animal{12}{wisdom}{wombat}
\Animal{10}{plague}{locusts}
\Animal{11}{lounge}{lizard}
\Animal{6}{pride}{lion}
\startitem
5 array \index{hedgehog+SECTION A}hedgehog
\stopitem
\startitem
7 army \index{herring+SECTION A }herring
\stopitem
\startitem
100 bloat \index{hippopotamuses+SECTION A}hippopotamuses
\stopitem
\stopsection
\stopchapter
\stoptext
改变:
7 army \index{herring+SECTION A }herring
改为(删除 后面的多余空格SECTION A
):
7 army \index{herring+SECTION A}herring
做出完全相同的操作后SECTION A
,索引被折叠(隐藏/删除):
问题
如何防止 ConTeXt 折叠重复的 2 级索引标题?
答案1
这是 ConTeXt 的一个问题。解决方法如下:
- 编辑
context/tex/texmf-context/tex/context/base/strc-reg.lua/strc-reg.lua
。 从第 695 行开始更改:
for i=1,4 do -- max 4 if list[i] then e[i] = list[i][1] end if e[i] ~= done[i] then if e[i] and e[i] ~= "" then done[i] = e[i] for j=i+1,4 do done[j] = false end if n == i then context.stopregisterentries() context.startregisterentries(n) else while n > i do n = n - 1 context.stopregisterentries() end while n < i do n = n + 1 context.startregisterentries(n) end end local internal = entry.references.internal or 0 local seeparent = entry.references.seeparent or "" local processor = entry.processors and entry.processors[1] or "" if metadata then context.registerentry(processor,internal,seeparent,function() helpers.title(e[i],metadata) end) else -- ? context.registerentry(processor,internal,seeindex,e[i]) end else done[i] = false for j=i,4 do done[j] = false end end end end
保存文件然后使用重新编译context --make
。