如何在 ConTeXt 中按章节或页显示百科全书式的主题范围?

如何在 ConTeXt 中按章节或页显示百科全书式的主题范围?

在许多参考书或百科全书的页面顶部,总会有一个范围,说明给定区域内涵盖的主题,例如:

  • 一本百科全书会写上“AB”,表示以“A”或“B”开头的主题将出现在其中。
  • 字典的标题会显示“土豚到动物”,表明可以在该特定页面上找到此类主题。

我有一个格式如下的文档:

\part{A}
    \chapter{Animals}
        \custommacro{Koalas}
        \custommacro{Kangaroos}
     \chapter{Animation}
        \custommacro{Disney}
        \custommacro{Japanese}
        \custommacro{South American}
\part{B}
    \chapter{Beans}
        \custommacro{Kidney Beans}
        \custommacro{Green Beans}
        \custommacro{Jelly Beans}

从这些数据中,我如何显示这类信息?

  • 本卷内容涵盖“AB”。
  • 有一个特别部分涵盖“动物动画”。
  • 有一章专门讨论“迪士尼-南美”。
  • 书中某一页包含有关“绿豆-软糖”的部分文章。

答案1

为了解决这个问题,我采用了标记列表。标明主题的卷与目录非常相似,所以我使用了该机制。而不是列出全部所包含的部分,只应显示第一个和最后一个。我定义了一个自定义列表替代方案,它正是这样做的。还包含一个额外的检查来捕获只有一个部分元素的情况,以防止输出如下“本部分涵盖 Beans - Beans”。章节摘要使用相同的机制。章节显示在页面的页脚中,并使用标记 机制,无需任何特殊修改即可运行。

使用 键将自定义列表挂接到部分和章节宏中 insidesection。此键仅适用于 MkIV 分段样式。因此您必须使用\startchapter … \stopchapter而不是 \chapter{…}

设置:

%% only for the screenshot %%%%%%%%%%%%%%%%%%%%%%%%
\setuppapersize   [A6] [A4, landscape]           %%
\setuparranging   [2SIDE]                        %%
\setuplayout      [marking=on, location=middle]  %%
\setupbodyfont    [16pt]                         %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\setuplist        [alternative=ListRange] %% a custom list alternative is used
\setupfootertexts [\setups{footer}]

%% displays the topic of the current page in the footer
\startsetups [footer]
  \getmarking [section] [top] --\space
  \getmarking [section] [bottom]
\stopsetups

\setuphead [part]    [insidesection=\PartIntro, footer=empty]
\setuphead [chapter] [insidesection=\ChapterIntro]

\starttexdefinition PartIntro
  This part covers:
  \placecontent [list=chapter]
\stoptexdefinition

\starttexdefinition ChapterIntro
  This chapter covers:
  \placecontent [list=section]
\stoptexdefinition

%% The default list alternatives don't meet the requirements, but it's easy to
%% define a custom one
\definelistalternative
  [ListRange]
  [renderingsetup=list:ListRange]

%% The default lists print a list of all structure elements, but in this case
%% only the first and last one is desired.
\startsetups [list:ListRange]
  %% catch the case of only one chapter per part
  \doifelse\structurelistsize1
    {\crlf\currentlistentrytitle}
    {\doif\currentlistindex1{\crlf\currentlistentrytitle\space--\space}
     \doif\currentlistindex\structurelistsize\currentlistentrytitle}
\stopsetups

内容:

\starttext

\noheaderandfooterlines
This volume covers: \placecontent [list=part]

\startpart [title=A]
  \startchapter [title=Animals]
    \startsection [title=Koalas]
    \stopsection
    \startsection [title=Kangaroos]
    \stopsection
  \stopchapter

  \startchapter [title=Animation]
    \startsection [title=Disney]
    \stopsection
    \startsection [title=Japanese]
    \stopsection
    \startsection [title=South American]
    \stopsection
  \stopchapter
\stoppart

\startpart [title=B]
  \startchapter [title=Beans]
    \startsection [title=Kidney Beans]
    \stopsection
    \startsection [title=Green Beans]
    \stopsection
    \startsection [title=Jelly Beans]
    \stopsection
  \stopchapter
\stoppart

\stoptext

截图1 截图2 截图3

相关内容