Красивый перенос таблиц

This commit is contained in:
2026-05-26 15:26:18 +03:00
parent e3a615cb50
commit c117ecd9b2

View File

@@ -5,16 +5,76 @@
#let pz-appendix-title(body) = heading(level: 1)[#body] #let pz-appendix-title(body) = heading(level: 1)[#body]
#let pz-table(caption, columns, ..body) = figure( #let pz-column-count(columns) = if type(columns) == int {
columns
} else if type(columns) == array {
columns.len()
} else {
1
}
// Строка из ..range().map(i => ([a], [b])) в body.pos() — один аргумент-массив.
#let pz-flatten-cells(cells) = cells.fold((), (acc, cell) => {
if type(cell) == array { acc + cell } else { acc + (cell,) }
})
#let pz-table-inner(columns, header-cells, tab-num, start-page, ..rows) = {
let col-n = pz-column-count(columns)
let cont-cell = table.cell(
colspan: col-n,
stroke: none,
inset: (x: 0pt, y: 2pt),
align: left,
)[
#context {
if start-page.get() == none {
start-page.update(here().page())
}
let first-page = start-page.get()
if first-page != none and here().page() > first-page {
[Продолжение таблицы #tab-num]
}
}
]
let header-row = if header-cells.len() > 0 {
(cont-cell, ..header-cells)
} else {
(cont-cell,)
}
table( table(
columns: columns, columns: columns,
..body, table.header(..header-row),
), ..rows,
)
}
#let pz-table(caption, columns, ..body) = {
let pos = body.pos()
let has-header = pos.len() > 0 and pos.first().func() == table.header
let header-cells = if has-header { pos.first().children } else { () }
let tail = pz-flatten-cells(if has-header { pos.slice(1) } else { pos })
let start-page = state("pz-table-start-page", none)
figure(
kind: table,
context {
let fig-loc = here()
let tab-num = counter(figure.where(kind: table)).at(fig-loc).first()
start-page.update(none)
pz-table-inner(columns, header-cells, tab-num, start-page, ..arguments(..tail))
},
caption: caption, caption: caption,
) )
}
// Реестры unit-тестов: перенос длинных идентификаторов (camelCase, _); сетка как в примере Typst. // Реестры unit-тестов: перенос длинных идентификаторов (camelCase, _); сетка как в примере Typst.
#let pz-test-table(caption, columns, ..body) = figure( #let pz-test-table(caption, columns, ..body) = {
let pos = body.pos()
let has-header = pos.len() > 0 and pos.first().func() == table.header
let header-cells = if has-header { pos.first().children } else { () }
let tail = pz-flatten-cells(if has-header { pos.slice(1) } else { pos })
let start-page = state("pz-table-start-page", none)
figure(
kind: table,
{ {
show table: set text(hyphenate: true, size: 9pt) show table: set text(hyphenate: true, size: 9pt)
show table.cell: cell => { show table.cell: cell => {
@@ -24,13 +84,16 @@
show regex("[_]"): it => it + sym.zws show regex("[_]"): it => it + sym.zws
cell cell
} }
table( context {
columns: columns, let fig-loc = here()
..body, let tab-num = counter(figure.where(kind: table)).at(fig-loc).first()
) start-page.update(none)
pz-table-inner(columns, header-cells, tab-num, start-page, ..arguments(..tail))
}
}, },
caption: caption, caption: caption,
) )
}
#let pz-fig(path, caption, lbl) = [ #let pz-fig(path, caption, lbl) = [
#figure( #figure(