diff --git a/docs/FAQ/continued-table.md b/docs/FAQ/continued-table.md index 3c482a5..4fa8aa4 100644 --- a/docs/FAQ/continued-table.md +++ b/docs/FAQ/continued-table.md @@ -3,6 +3,8 @@ tags: [code, table] --- # 跨页的表格如何显示“续表”? +## 手动方法 + ```typst #let xubiao = state("xubiao") #set table(stroke: (x, y) => { @@ -28,3 +30,85 @@ tags: [code, table] } ) ``` + +## 包起来 + +```typst +#import "@preview/pointless-size:0.1.2": zh + +#set page(paper: "a8") + +#let continue-table-state = state("continue-table") + +#let header-attach-cell(columns) = table.cell(colspan: columns, { + context if continue-table-state.get() != false { + place(right + top, dy: -1.4em)[ + #set text(size: zh("五号")) + 续表 + ] + v(-0.9em) + } else { + v(-0.9em) + continue-table-state.update(true) + } +}) + +#let continued-table = it => continue-table-state.update(false) + context { + if it.children.any(c => c.func() == table.header) { + return it + } + + let meta = it.fields() + meta.remove("children") + + let header = it.children.filter(c => c.func() == table.header) + let cells = it.children.filter(c => c.func() != table.header) + if header.len() == 0 { + let columns = meta.columns.len() + header = table.header( + header-attach-cell(columns), + ..cells.slice(0, columns), + ) + cells = cells.slice(columns) + } else { + let columns = meta.columns.len() + let children = if type(header) != array { header.children } else { + header.map(h => h.children).flatten() + } + header = table.header( + header-attach-cell(columns), + ..children, + ) + } + + return table( + ..meta, + header, + ..cells, + ) +} + +#show table: continued-table + +#show figure: set block(breakable: true) + +#set figure(numbering: "1-1") + +#figure(table( + columns: 4, + stroke: red, + ..range(50).map(str), +)) + +#figure(table( + columns: 4, + // table.header(), + ..range(50).map(str), +)) + +#figure(table( + columns: 4, + // table.header(), + ..range(50).map(str), +)) +```