ConTeXt で文章内のマークされた場所のページ範囲を表示するにはどうすればよいですか?

ConTeXt で文章内のマークされた場所のページ範囲を表示するにはどうすればよいですか?

長い文章内の重要な箇所をマークするマクロを文書全体に配置しています。これらは章やセクションのタイトルとは関係ありません。

 _____________ _____________
|             |             |
| .....a..... | ........... |
| .........b. | ..d........ |
| ........... | ........... |
| ........... | ........... |
| ........... | ........... |
| ....c...... | .......e... |
| ........... | ........... |
|______1______|______2______|

 _____________ _____________
|             |             |
| ....f...... | ........... |
| .......g... | ........... |
| ...h....... | .....j..... |
| ........... | ........... |
| ........... | Section.... |
| .......i... | ..........k |
| ........... | ........... |
|______3______|______4______|

読者に現在読んでいるテキスト部分のマークの現在のページ範囲を伝えるために、ヘッダーに情報を配置する必要があります。例:

 _____________ _____________
| c: 1-2      | e: 2-3      |
| .....a..... | ........... |
| .........b. | ..d........ |
| ........... | ........... |
| ........... | ........... |
| ........... | ........... |
| ....c...... | .......e... |
| ........... | ........... |
|______1______|______2______|

 _____________ _____________
| e: 2-3      | j: 4-4      |
| ........... | ........... |
| ........... | ........... |
| ........... | .....j..... |
| ........... | ........... |
| ........... | Section.... |
| ........... | ........... |
| ........... | ..........k |
|______3______|______4______|
  • 一部のページには複数の範囲があるため、ページに表示される最後の範囲が表示される場合があります。

読者が現在読んでいるテキスト部分のページ範囲を伝えるために、ドキュメントのヘッダーに情報を配置するにはどうすればよいでしょうか?

答え1

\rangestart{rangename}マクロを作成し\rangestop{rangename}、実行全体にわたってページ番号を保存するようにし、指定されたページ番号でアクティブな範囲を選択して印刷する関数を作成します。

job.datasets.setdata/job.datasets.getdata構文は以下から盗用しました異なるマルチパス質問に対するphgの構築。 お役に立てれば!

\startluacode
    userdata = userdata or {}
    local ranges_start_tmp = {}

    -- record range name and start in temp. array, to be
    -- flushed to the .tuc file when we also know the stop.
    function userdata.rangestart(rangename, page)
        ranges_start_tmp[rangename] = page
    end

    -- flush range name, start, and stop to the .tuc file.
    function userdata.rangestop(rangename, page)
        job.datasets.setdata({
            name = "ranges",
            data = {
                ["name"]  = rangename,
                ["start"] = ranges_start_tmp[rangename],
                ["stop"]  = page,
            }
        })
        ranges_start_tmp[rangename] = nil
    end

    -- Takes 3 arguments: the page whose active ranges to describe,
    -- a template{name, start, stop} for formatting a single range,
    -- and a separator to print between multiple ranges
    function userdata.printranges(page, template, sep)
        local ranges = {}

        local i = 1
        local range = job.datasets.getdata("ranges", i) -- default: nil
        while range do
            if range.start <= page and page <= range.stop then
                ranges[#ranges + 1] = string.formatters[template](
                    range.name, range.start, range.stop
                )
            end
            i = i + 1
            range = job.datasets.getdata("ranges", i)
        end

        context(table.concat(ranges, sep))
    end
\stopluacode

% The TeX side of the mechanism
\define[1]\rangestart{\ctxlua{userdata.rangestart([[#1]], \userpage)}}
\define[1]\rangestop{\ctxlua{userdata.rangestop([[#1]], \userpage)}}
\define[3]\printranges{\ctxlua{userdata.printranges(#1, #2, #3)}}

% -------------------------
% Let's try it out

% Templates contain percent signs -- better to write them in a lua
% block.
\startluacode
    userdata.mytemplate = "%s, from %i to %i"
\stopluacode
\setupheadertexts[\printranges{\userpage}{userdata.mytemplate}{"; "}]
\setupfootertexts[\userpage]

\setuppapersize[A6, landscape]

\starttext
    \section{A}
        \input knuth
        \input knuth
    \section{B}
        \rangestart{a}
        \input knuth
        \rangestop{a}
        \rangestart{b}
    \section{C}
        \input knuth
        \rangestop{b}
\stoptext

関連情報