Commit be81c4d

HPCesia <me@hpcesia.com>
2026-04-30 05:01:43
style: format with typstyle
1 parent b496db1
layouts/mainmatter.typ
@@ -1,7 +1,7 @@
 #import "@preview/i-figured:0.2.4"
 #import "@preview/numbly:0.1.0": numbly
 #import "@preview/hydra:0.6.1": hydra
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 #import "../utils/unpairs.typ": unpairs
 
 #let mainmatter(
@@ -116,13 +116,20 @@
       font: array-at(heading-font, it.level),
       size: array-at(heading-size, it.level),
       weight: array-at(heading-weight, it.level),
-      ..unpairs(heading-text-args-lists.map(pair => (pair.at(0), array-at(pair.at(1), it.level)))),
+      ..unpairs(heading-text-args-lists.map(pair => (
+        pair.at(0),
+        array-at(pair.at(1), it.level),
+      ))),
     )
     set block(
       above: array-at(heading-above, it.level),
       below: array-at(heading-below, it.level),
     )
-    if it.level == 1 and it.numbering != none and counter(heading).display(it.numbering) != none {
+    if (
+      it.level == 1
+        and it.numbering != none
+        and counter(heading).display(it.numbering) != none
+    ) {
       block({
         counter(heading).display(it.numbering)
         h(2em)
@@ -154,27 +161,25 @@
   }
 
   // 5.  页眉配置
-  set page(
-    header: {
-      // 重置 footnote 计数器
-      if reset-footnote {
-        counter(footnote).update(0)
-      }
-      context {
-        set text(font: fonts.宋体, size: 字号.小五)
-        align(
-          center,
-          if calc.odd(here().page()) {
-            hydra(skip-starting: false, use-last: true, 1)
-          } else {
-            info.title.join()
-          },
-        )
-      }
-      // 分隔线
-      place(bottom, dy: 0.35em, line(length: 100%, stroke: 0.5pt))
-    },
-  )
+  set page(header: {
+    // 重置 footnote 计数器
+    if reset-footnote {
+      counter(footnote).update(0)
+    }
+    context {
+      set text(font: fonts.宋体, size: 字号.小五)
+      align(
+        center,
+        if calc.odd(here().page()) {
+          hydra(skip-starting: false, use-last: true, 1)
+        } else {
+          info.title.join()
+        },
+      )
+    }
+    // 分隔线
+    place(bottom, dy: 0.35em, line(length: 100%, stroke: 0.5pt))
+  })
 
   set page(
     numbering: "1",
layouts/preface.typ
@@ -1,4 +1,4 @@
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 
 #let preface(
   // documentclass 传入的参数
pages/acknowledgement.typ
@@ -1,4 +1,4 @@
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 #import "../utils/invisible-heading.typ": invisible-heading
 
 #let acknowledgement(
@@ -19,14 +19,21 @@
   // 2.  正式渲染
   pagebreak(weak: true, to: if twoside { "odd" })
 
-  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((en: outline-title-en))])
+  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((
+      en: outline-title-en,
+    ))])
 
   v(spacing)
   align(center, text(size: 字号.小三, font: fonts.黑体)[致#h(1.5em)谢])
   v(spacing * 2)
 
   [
-    #set par(justify: true, first-line-indent: (amount: 2em, all: true), leading: leading, spacing: spacing)
+    #set par(
+      justify: true,
+      first-line-indent: (amount: 2em, all: true),
+      leading: leading,
+      spacing: spacing,
+    )
     #set text(size: 字号.小四, font: fonts.宋体)
 
     #body
pages/bachelor-abstract-en.typ
@@ -1,4 +1,4 @@
-#import "../utils/style.typ": 字号, 字体, 英文
+#import "../utils/style.typ": 字体, 字号, 英文
 #import "../utils/invisible-heading.typ": invisible-heading
 
 // 本科生英文摘要页
@@ -21,14 +21,25 @@
   // 2.  正式渲染
   pagebreak(weak: true, to: if twoside { "odd" })
 
-  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((en: outline-title-en))])
+  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((
+      en: outline-title-en,
+    ))])
 
   v(spacing)
-  align(center, text(size: 字号.小三, font: 英文(fonts.宋体), weight: "bold")[Abstract])
+  align(center, text(
+    size: 字号.小三,
+    font: 英文(fonts.宋体),
+    weight: "bold",
+  )[Abstract])
   v(spacing * 2)
 
   [
-    #set par(justify: true, first-line-indent: (amount: 2em, all: true), leading: leading, spacing: spacing)
+    #set par(
+      justify: true,
+      first-line-indent: (amount: 2em, all: true),
+      leading: leading,
+      spacing: spacing,
+    )
     #set text(size: 字号.小四, font: 英文(fonts.宋体))
 
     #body
@@ -37,5 +48,9 @@
   v(spacing)
 
   text(size: 字号.小四, font: 英文(fonts.宋体), weight: "bold")[Key Words: ]
-  text(size: 字号.小四, font: 英文(fonts.宋体), (("",) + keywords.intersperse("; ")).sum())
+  text(
+    size: 字号.小四,
+    font: 英文(fonts.宋体),
+    (("",) + keywords.intersperse("; ")).sum(),
+  )
 }
pages/bachelor-abstract.typ
@@ -1,4 +1,4 @@
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 #import "../utils/invisible-heading.typ": invisible-heading
 
 // 本科生中文摘要页
@@ -21,14 +21,21 @@
   // 2.  正式渲染
   pagebreak(weak: true, to: if twoside { "odd" })
 
-  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((en: outline-title-en))])
+  invisible-heading(level: 1, outlined: outlined, [#outline-title#metadata((
+      en: outline-title-en,
+    ))])
 
   v(spacing)
   align(center, text(size: 字号.小三, font: fonts.黑体)[摘#h(1.5em)要])
   v(spacing * 2)
 
   [
-    #set par(justify: true, first-line-indent: (amount: 2em, all: true), leading: leading, spacing: spacing)
+    #set par(
+      justify: true,
+      first-line-indent: (amount: 2em, all: true),
+      leading: leading,
+      spacing: spacing,
+    )
     #set text(size: 字号.小四, font: fonts.宋体)
 
     #body
@@ -37,5 +44,9 @@
   v(spacing)
 
   text(size: 字号.小四, font: fonts.黑体)[关键词:]
-  text(size: 字号.小四, font: fonts.宋体, (("",) + keywords.intersperse(";")).sum())
+  text(
+    size: 字号.小四,
+    font: fonts.宋体,
+    (("",) + keywords.intersperse(";")).sum(),
+  )
 }
pages/bachelor-cover.typ
@@ -1,5 +1,5 @@
 #import "../utils/datetime-display.typ": datetime-display-full
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 
 // 本科生封面
 #let bachelor-cover(
@@ -62,9 +62,16 @@
   v(3em)
 
   // 将中文之间的空格间隙从 0.25em 调整到 1em
-  text(size: 字号.小二, font: fonts.宋体, spacing: 400%, weight: "bold")[本 科 毕 业 #if isdesign [设 计] else [论 文]]
+  text(
+    size: 字号.小二,
+    font: fonts.宋体,
+    spacing: 400%,
+    weight: "bold",
+  )[本 科 毕 业 #if isdesign [设 计] else [论 文]]
   v(0pt)
-  if isminor { text(size: 字号.三号, font: fonts.宋体, weight: "bold")[(辅修)] }
+  if isminor {
+    text(size: 字号.三号, font: fonts.宋体, weight: "bold")[(辅修)]
+  }
 
   v(2em)
 
@@ -72,7 +79,12 @@
 
   v(1em)
 
-  text(size: 字号.三号, font: fonts.宋体, info.title-en.join("\n"), weight: "bold")
+  text(
+    size: 字号.三号,
+    font: fonts.宋体,
+    info.title-en.join("\n"),
+    weight: "bold",
+  )
 
   v(2em)
 
@@ -90,7 +102,8 @@
       info-key-short("专业"), info.major,
       info-key-short("年级"), info.grade + "级",
       info-key-long("校内指导老师"), info.supervisor.join(" "),
-      info-key-long("校外指导老师"), if info.supervisor-outside != () { info.supervisor-outside.join(" ") },
+      info-key-long("校外指导老师"),
+      if info.supervisor-outside != () { info.supervisor-outside.join(" ") },
     ),
   )
 
pages/bachelor-integrity.typ
@@ -1,4 +1,4 @@
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 
 // 本科生诚信承诺书页
 #let bachelor-integrity(twoside: false, fonts: (:)) = {
@@ -10,13 +10,23 @@
 
   set page(margin: (x: 3cm, top: 2.5cm, bottom: 2cm))
 
-  align(center, text(font: fonts.宋体, size: 字号.三号, weight: "bold", "厦门大学本科学位论文诚信承诺书"))
+  align(center, text(
+    font: fonts.宋体,
+    size: 字号.三号,
+    weight: "bold",
+    "厦门大学本科学位论文诚信承诺书",
+  ))
 
   v(3em)
 
   block[
     #set text(font: fonts.宋体, size: 字号.四号)
-    #set par(justify: true, first-line-indent: (amount: 2em, all: true), leading: 1.5em, spacing: 1.5em)
+    #set par(
+      justify: true,
+      first-line-indent: (amount: 2em, all: true),
+      leading: 1.5em,
+      spacing: 1.5em,
+    )
 
     本人呈交的学位论文是在导师指导下独立完成的研究成果。本人在论文写作中参考其他个人或集体已经发表的研究成果,均在文中以适当方式
     明确标明,并符合相关法律规范及《厦门大学本科毕业论文(设计)规范》。
pages/bachelor-outline-page-en.typ
@@ -1,5 +1,5 @@
 #import "../utils/invisible-heading.typ": invisible-heading
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 #import "@preview/numbly:0.1.0": numbly
 
 // 本科生英文目录
@@ -56,7 +56,9 @@
   v(title-vspace)
 
   // 目录样式
-  set outline(indent: level => indent.slice(0, calc.min(level + 1, indent.len())).sum())
+  set outline(indent: level => indent
+    .slice(0, calc.min(level + 1, indent.len()))
+    .sum())
   show outline.entry: entry => block(
     above: above.at(entry.level - 1, default: above.last()),
     below: below.at(entry.level - 1, default: below.last()),
@@ -70,14 +72,22 @@
             size: size.at(entry.level - 1, default: size.last()),
             weight: weight.at(entry.level - 1, default: weight.last()),
             {
-              if entry.prefix() not in (none, []) and entry.element.numbering != none {
+              if (
+                entry.prefix() not in (none, [])
+                  and entry.element.numbering != none
+              ) {
                 let enentry-numbering-len = entry-numbering.len()
-                let used-numbering = if entry.element.level <= enentry-numbering-len {
+                let used-numbering = if (
+                  entry.element.level <= enentry-numbering-len
+                ) {
                   numbly(..entry-numbering)
                 } else {
                   entry.element.numbering
                 }
-                numbering(used-numbering, ..counter(outline.target).at(entry.element.location()))
+                numbering(
+                  used-numbering,
+                  ..counter(outline.target).at(entry.element.location()),
+                )
                 h(gap)
               }
               {
@@ -99,7 +109,10 @@
               }
             },
           )
-          box(width: 1fr, inset: (x: .25em), fill.at(entry.level - 1, default: fill.last()))
+          box(width: 1fr, inset: (x: .25em), fill.at(
+            entry.level - 1,
+            default: fill.last(),
+          ))
           entry.page()
         },
         gap: 0pt,
pages/bachelor-outline-page.typ
@@ -1,5 +1,5 @@
 #import "../utils/invisible-heading.typ": invisible-heading
-#import "../utils/style.typ": 字号, 字体
+#import "../utils/style.typ": 字体, 字号
 
 // 本科生中文目录
 #let bachelor-outline-page(
@@ -53,7 +53,9 @@
   v(title-vspace)
 
   // 目录样式
-  set outline(indent: level => indent.slice(0, calc.min(level + 1, indent.len())).sum())
+  set outline(indent: level => indent
+    .slice(0, calc.min(level + 1, indent.len()))
+    .sum())
   show outline.entry: entry => block(
     above: above.at(entry.level - 1, default: above.last()),
     below: below.at(entry.level - 1, default: below.last()),
@@ -73,7 +75,10 @@
               entry.body()
             },
           )
-          box(width: 1fr, inset: (x: .25em), fill.at(entry.level - 1, default: fill.last()))
+          box(width: 1fr, inset: (x: .25em), fill.at(
+            entry.level - 1,
+            default: fill.last(),
+          ))
           entry.page()
         },
         gap: 0pt,
pages/bilingual-bibliography.typ
@@ -12,7 +12,10 @@
   allow-comma-in-name: false,
   // 如果使用的 CSL 中,英文姓名中会出现逗号,请设置为 true
 ) = {
-  assert(bibliography != none, message: "请传入带有 source 的 bibliography 函数。")
+  assert(
+    bibliography != none,
+    message: "请传入带有 source 的 bibliography 函数。",
+  )
 
   // Please fill in the remaining mapping table here
   mapping = (
@@ -45,7 +48,10 @@
     // 后续的操作是对 string 进行的。
     let ittext = to-string(it)
     // 判断是否为中文文献:去除特定词组后,仍有至少两个连续汉字。
-    let pureittext = ittext.replace(regex("[等卷册和版本章期页篇译间者(不详)]"), "")
+    let pureittext = ittext.replace(
+      regex("[等卷册和版本章期页篇译间者(不详)]"),
+      "",
+    )
     let ittext = if pureittext.find(regex("\p{sc=Hani}{2,}")) != none {
       ittext
     } else {
@@ -121,7 +127,27 @@
           "et al."
           // 如果原文就是 `等.`,则仅需简单替换,不需要额外处理
           // 如果原文 `等` 后没有跟随英文标点,则需要补充一个空格
-          if not itt.text.last() in (".", ",", ";", ":", "[", "]", "/", "\\", "<", ">", "?", "(", ")", " ", "\"", "'") {
+          if not (
+            itt.text.last()
+              in (
+                ".",
+                ",",
+                ";",
+                ":",
+                "[",
+                "]",
+                "/",
+                "\\",
+                "<",
+                ">",
+                "?",
+                "(",
+                ")",
+                " ",
+                "\"",
+                "'",
+              )
+          ) {
             " "
           }
           // 原文有英文句号时不需要重复句号,否则需要将匹配到的最后一个字符吐回来
template/thesis.typ
@@ -256,11 +256,11 @@ VSCode + Tinymist 需要先在官网#footnote[https://code.visualstudio.com/down
 
 #figure(
   {
-    import "@preview/fletcher:0.5.8": diagram, node, edge
+    import "@preview/fletcher:0.5.8": diagram, edge, node
     diagram(
       cell-size: 15mm,
       $
-        G edge(f, ->) edge("d", pi, ->>) & im(f) \
+                      G edge(f, ->) edge("d", pi, ->>) & im(f) \
         G slash ker(f) edge("ur", tilde(f), "hook-->")
       $,
     )
@@ -380,7 +380,9 @@ $ F_n = floor(1 / sqrt(5) phi.alt^n). $
 
 附录中图表和公式编号均以大写字母开头,区别于正文部分的编号。
 
-$ 1 / pi = (2 sqrt(2)) / (99^2) sum_(k=0)^oo ((4k)!) / (k!^4) (26390k + 1103) / (396^(4k)) $
+$
+  1 / pi = (2 sqrt(2)) / (99^2) sum_(k=0)^oo ((4k)!) / (k!^4) (26390k + 1103) / (396^(4k))
+$
 
 == 厦门大学本科毕业论文(设计)规范摘要#metadata((en: "Abstract of Xiamen University Undergraduate Dissertation (Design) Specification"))
 
utils/datetime-display.typ
@@ -8,7 +8,10 @@
 // 显示全中文日期
 #let datetime-display-full(date) = {
   let cap-nums = "〇一二三四五六七八九".codepoints()
-  str(date.year()).codepoints().map(n => cap-nums.at(n.to-unicode() - 48)).join()
+  str(date.year())
+    .codepoints()
+    .map(n => cap-nums.at(n.to-unicode() - 48))
+    .join()
   "年"
   numbering("一", date.month())
   "月"
utils/style.typ
@@ -44,9 +44,21 @@
     "STHeiti",
   ),
   // 楷体
-  楷体: ((name: "Times New Roman", covers: "latin-in-cjk"), "KaiTi", "Kaiti SC", "STKaiti", "FZKai-Z03S"),
+  楷体: (
+    (name: "Times New Roman", covers: "latin-in-cjk"),
+    "KaiTi",
+    "Kaiti SC",
+    "STKaiti",
+    "FZKai-Z03S",
+  ),
   // 仿宋
-  仿宋: ((name: "Times New Roman", covers: "latin-in-cjk"), "FangSong", "FangSong SC", "STFangSong", "FZFangSong-Z02S"),
+  仿宋: (
+    (name: "Times New Roman", covers: "latin-in-cjk"),
+    "FangSong",
+    "FangSong SC",
+    "STFangSong",
+    "FZFangSong-Z02S",
+  ),
   // 等宽字体,用于代码块环境,一般可以等同于英文中的 Monospaced Font
   // 这一行分别是「Courier New(Windows 等宽英文字体)」、「思源等宽黑体(简体)」、「思源等宽黑体」、「黑体(Windows)」、「黑体(MacOS)」
   等宽: (