
긴 구절 내의 주요 위치를 표시하는 매크로를 문서 전체에 배치했습니다. 이는 장이나 섹션 제목과 관련이 없습니다.
_____________ _____________
| | |
| .....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