¿Cómo mostrar el rango de páginas de ubicaciones marcadas en un pasaje en ConTeXt?

¿Cómo mostrar el rango de páginas de ubicaciones marcadas en un pasaje en ConTeXt?

Tengo una macro colocada a lo largo de mi documento que marca lugares clave dentro de un pasaje largo. Estos no tienen relación con los títulos de los capítulos o secciones.

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

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

Necesito colocar información en los encabezados para indicarles a los lectores el rango de páginas actual de las marcas de la parte del texto que están leyendo actualmente, por ejemplo:

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

 _____________ _____________
| e: 2-3      | j: 4-4      |
| ........... | ........... |
| ........... | ........... |
| ........... | .....j..... |
| ........... | ........... |
| ........... | Section.... |
| ........... | ........... |
| ........... | ..........k |
|______3______|______4______|
  • Como algunas páginas tienen múltiples rangos, se puede mostrar el último rango que aparece en la página.

¿Cómo puedo colocar información en los encabezados de mi documento para indicarles a los lectores el rango de páginas de la parte actual del texto que están leyendo?

Respuesta1

Cree una macro \rangestart{rangename}y \rangestop{rangename}, haga que almacenen los números de página en todas las ejecuciones y cree una función para seleccionar e imprimir cualquier rango que esté activo en un número de página determinado.

Robé la sintaxis job.datasets.setdata/ job.datasets.getdatadeConstrucción de phg para una pregunta de pases múltiples diferente. ¡Espero que esto ayude!

\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

información relacionada