
Ich habe in meinem Dokument ein Makro platziert, das wichtige Stellen in einem langen Abschnitt markiert. Diese haben keinen Bezug zu den Kapitel- oder Abschnittsüberschriften.
_____________ _____________
| | |
| .....a..... | ........... |
| .........b. | ..d........ |
| ........... | ........... |
| ........... | ........... |
| ........... | ........... |
| ....c...... | .......e... |
| ........... | ........... |
|______1______|______2______|
_____________ _____________
| | |
| ....f...... | ........... |
| .......g... | ........... |
| ...h....... | .....j..... |
| ........... | ........... |
| ........... | Section.... |
| .......i... | ..........k |
| ........... | ........... |
|______3______|______4______|
Ich muss Informationen in die Kopfzeilen einfügen, um den Lesern den aktuellen Seitenbereich der Markierungen des Textabschnitts mitzuteilen, den sie gerade lesen, z. B.:
_____________ _____________
| c: 1-2 | e: 2-3 |
| .....a..... | ........... |
| .........b. | ..d........ |
| ........... | ........... |
| ........... | ........... |
| ........... | ........... |
| ....c...... | .......e... |
| ........... | ........... |
|______1______|______2______|
_____________ _____________
| e: 2-3 | j: 4-4 |
| ........... | ........... |
| ........... | ........... |
| ........... | .....j..... |
| ........... | ........... |
| ........... | Section.... |
| ........... | ........... |
| ........... | ..........k |
|______3______|______4______|
- Da einige Seiten mehrere Bereiche haben, kann der letzte auf der Seite erscheinende Bereich angezeigt werden.
Wie kann ich in die Kopfzeilen meines Dokuments Informationen einfügen, um den Lesern den Seitenbereich des aktuellen Textabschnitts mitzuteilen, den sie lesen?
Antwort1
Erstellen Sie ein \rangestart{rangename}
und \rangestop{rangename}
ein Makro, lassen Sie sie die Seitenzahlen über alle Durchläufe hinweg speichern und erstellen Sie eine Funktion zum Auswählen und Drucken aller Bereiche, die auf einer bestimmten Seitenzahl aktiv sind.
Ich habe die job.datasets.setdata
/ job.datasets.getdata
-Syntax geklaut vonphgs Konstruktion für eine andere Multi-Pass-Frage. Hoffe das hilft!
\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