main
  1// 部分取自 modern-nju-thesis
  2
  3#let  = (
  4  : 42pt,
  5  : 36pt,
  6  : 26pt,
  7  : 24pt,
  8  : 22pt,
  9  : 18pt,
 10  : 16pt,
 11  : 15pt,
 12  : 14pt,
 13  : 13pt,
 14  : 12pt,
 15  : 10.5pt,
 16  : 9pt,
 17  : 7.5pt,
 18  : 6.5pt,
 19  : 5.5pt,
 20  : 5pt,
 21)
 22
 23#let  = (
 24  // 宋体,属于「有衬线字体」,一般可以等同于英文中的 Serif Font
 25  // 这一行分别是「新罗马体(有衬线英文字体)」、「思源宋体(简体)」、「思源宋体」、「宋体(Windows)」、「宋体(MacOS)」
 26  : (
 27    (name: "Times New Roman", covers: "latin-in-cjk"),
 28    "Source Han Serif SC",
 29    "Source Han Serif",
 30    "Noto Serif CJK SC",
 31    "SimSun",
 32    "Songti SC",
 33    "STSongti",
 34  ),
 35  // 黑体,属于「无衬线字体」,一般可以等同于英文中的 Sans Serif Font
 36  // 这一行分别是「Arial(无衬线英文字体)」、「思源黑体(简体)」、「思源黑体」、「黑体(Windows)」、「黑体(MacOS)」
 37  : (
 38    (name: "Arial", covers: "latin-in-cjk"),
 39    "Source Han Sans SC",
 40    "Source Han Sans",
 41    "Noto Sans CJK SC",
 42    "SimHei",
 43    "Heiti SC",
 44    "STHeiti",
 45  ),
 46  // 楷体
 47  : (
 48    (name: "Times New Roman", covers: "latin-in-cjk"),
 49    "KaiTi",
 50    "Kaiti SC",
 51    "STKaiti",
 52    "FZKai-Z03S",
 53  ),
 54  // 仿宋
 55  仿: (
 56    (name: "Times New Roman", covers: "latin-in-cjk"),
 57    "FangSong",
 58    "FangSong SC",
 59    "STFangSong",
 60    "FZFangSong-Z02S",
 61  ),
 62  // 等宽字体,用于代码块环境,一般可以等同于英文中的 Monospaced Font
 63  // 这一行分别是「Courier New(Windows 等宽英文字体)」、「思源等宽黑体(简体)」、「思源等宽黑体」、「黑体(Windows)」、「黑体(MacOS)」
 64  : (
 65    (name: "Courier New", covers: "latin-in-cjk"),
 66    (name: "Menlo", covers: "latin-in-cjk"),
 67    (name: "IBM Plex Mono", covers: "latin-in-cjk"),
 68    "Source Han Sans HW SC",
 69    "Source Han Sans HW",
 70    "Noto Sans Mono CJK SC",
 71    "SimHei",
 72    "Heiti SC",
 73    "STHeiti",
 74  ),
 75)
 76
 77// 获取字体中的英文部分,选取带有 `covers = "latin-in-cjk"` 的字体
 78//
 79// - fonts (array, str): 字体列表\
 80//   接受与 typst 内建 `text` 函数中的 `font` 参数类似的数组\
 81//   当传入字符串时,将直接返回该字符串\
 82//   当传入的数组中不存在满足要求的元素时,将返回原数组\
 83// -> array, str
 84#let (fonts) = {
 85  if type(fonts) == str {
 86    return fonts
 87  }
 88  let en-fonts = fonts
 89    .filter(font => type(font) == dictionary)
 90    .filter(font => font.covers == "latin-in-cjk")
 91    .map(font => font.name)
 92  if en-fonts.len() == 0 {
 93    return fonts
 94  }
 95  return en-fonts
 96}
 97
 98// 修复英文引号 `'` 和 `"` 显示为中文字形的问题
 99//
100// - body (content):
101// -> content
102#let fix-smartquote(body) = context {
103  show smartquote: set text(font: (text.font))
104  body
105}