跳转至

Typst Learning Record

约 17 个字 139 行代码 预计阅读时间 2 分钟

#set text(
    font: "Source Han Serif SC",
    size: 11pt,
)
#set par(
    leading: 11pt, 
    first-line-indent: 2.8em, 
    justify: true
)

#let fakepar = style(styles => {
    let b = par[#box()]
    let t = measure(b + b, styles);

    b
    v(-t.height)
})

#show heading: it => {
    it
    fakepar
}

#show raw.where(block: false): box.with(
    fill: luma(240),
    inset: (x: 3pt, y: 0pt),
    outset: (y: 3pt),
    radius: 2pt,
)

#let style-number(number) = text(gray)[#number]
#show raw.where(block: true): it => {
    set text(font: ("Monaco", "Menlo", "'Courier New'", "monospace"))
    set par(leading: 7pt)
    h(0em); v(-1.2em)
    block(
        width: 100%,
        fill: luma(240),
        inset: 10pt,
        radius: 10pt,
        grid(
            columns: (10pt,400pt),
            align: (right, left),
            gutter: 0.5em,
            ..it.lines
                .enumerate()
                .map(((i, line)) => (style-number(i + 1), line))
                .flatten()
        )
    )  
}

#set heading(numbering: (..args) => {
    let nums = args.pos()
    let level = nums.len()
    if level == 2 {
        numbering("1", nums.at(1))
    } else if level == 3 {
        [#numbering("1.1", nums.at(1),nums.at(2))]
    } else if level == 4 {
        numbering("1.1.1", nums.at(1),nums.at(2),nums.at(3))
    } else if level == 5 {
        [#numbering("1.1.1.1", nums.at(1),nums.at(2),nums.at(3),nums.at(4))]
    }
})

#show heading.where(
    level: 1
): it => {
    set align(center)
    set text(weight: "bold", size: 20pt, font: "Source Han Serif SC")
    it
    h(0em) 
    v(-1.2em)
}

#show heading.where(
    level: 2
): it => {
    set text(weight: "bold", size: 18pt, font: "Source Han Serif SC")
    set block(above: 1.5em, below: 15pt)
    it
}

#show heading.where(
    level: 3
): it => {
    set text(weight: "bold", size: 13pt, font: "Source Han Serif SC")
    set block(above: 1.5em, below: 1em)
    it
}

#let thickness = 0.8pt
#let offset = 4pt
#let ubox(..) = box(
    width: 1fr,
    baseline: offset,
    stroke: (bottom: thickness),
)
#let uline(body) = {
    ubox()
    underline(
        stroke: thickness,
        offset: offset,
    )[#body]
    ubox()
}

#set list(marker: ([], [], []))

#show figure: it => {it; h(0em); v(-1.2em)}

#show figure.caption: it => [
    #set text(size: 8pt, font: "LXGW WenKai Mono")
    #it.counter.display(it.numbering):#it.body
]

#set page(
    paper: "a4",

    header: [
        #set text(size: 10pt, baseline: 8pt, spacing: 3pt)
        #smallcaps[ZJU SYSTEM II]
        #h(1fr) _Lab 1 Report_
        #v(0.2em)
        #line(length: 100%, stroke: 0.7pt)
    ],
    footer: {
        set align(center)
        grid(
            columns: (5fr, 1fr, 5fr),
            line(length: 100%, stroke: 0.7pt),
            text(size: 10pt, baseline: -3pt, 
            counter(page).display("1")
            ),
            line(length: 100%, stroke: 0.7pt)
        )
    },
)

每次需要修改 page 里的 header 就可以了。