template.typ 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #let datetimeNow = datetime.today();
  2. #let fliPar(body)={
  3. par(
  4. [#h(2em)#body]
  5. )
  6. }
  7. #let ZRYGenericDocs(
  8. authors: ("ZRY",),
  9. title: "标题",
  10. subTitle: "副标题",
  11. titleDesc: "标题说明",
  12. date: datetimeNow.display("[year]-[month]-[day]"),
  13. docVer: "V0.1",
  14. pageSettings: (
  15. paper: "a4",
  16. leftMargin: 1.25in,
  17. topMargin: 1in,
  18. rightMargin: 1.25in,
  19. bottomMargin: 1in,
  20. foreground: none,
  21. background: none,
  22. columns: 1,
  23. flipped: false,
  24. ),
  25. fontSets: (
  26. sans: "Noto Sans CJK SC",
  27. //sans: "Source Han Sans",
  28. serif: "Noto Serif CJK SC",
  29. //serif: "Source Han Serif VF"
  30. ),
  31. headerSettings: (
  32. enable: false,
  33. ascent: 30%,
  34. content: none,
  35. ),
  36. footerSettings: (
  37. enable: false,
  38. descent: 30%,
  39. content: none,
  40. ),
  41. pageNumberingSettings:(
  42. content: none,
  43. align: center + bottom,
  44. ),
  45. coverStyle:(
  46. titleSize: 36pt,
  47. titleWeight: 600,
  48. subTitleSize: 24pt,
  49. subTitleWeight: 600,
  50. titleDescSize: 16pt,
  51. titleDescWeight: 400,
  52. dateSize: 16pt,
  53. dateWeight: 400,
  54. authorsSize: 16pt,
  55. authorsWeight: 600,
  56. docVerSize: 16pt,
  57. docVerWeight: 400,
  58. topMargin: 72pt,
  59. subTitleMargin: 72pt,
  60. dateMargin: 16pt,
  61. authorsMargin: 16pt,
  62. titleDescMargin: 72pt,
  63. authorsJoinSymbol: ","
  64. ),
  65. textStyle:(
  66. h1:(
  67. sans: false,
  68. size: 22pt,
  69. weight: 800,
  70. style: "italic",
  71. stretch: 100%,
  72. fill: rgb("#000000"),
  73. tracking: 0pt,
  74. spacing: 100%,
  75. overhang: true,
  76. vspaceBottom: 12pt,
  77. ),
  78. h2:(
  79. sans: true,
  80. size: 16pt,
  81. weight: 400,
  82. style: "normal",
  83. stretch: 100%,
  84. fill: rgb("#000000"),
  85. tracking: 0pt,
  86. spacing: 100%,
  87. overhang: true,
  88. vspaceBottom: 6pt,
  89. ),
  90. h3: (
  91. sans: false,
  92. size: 14pt,
  93. weight: 900,
  94. style: "normal",
  95. stretch: 100%,
  96. fill: rgb("#000000"),
  97. tracking: 0pt,
  98. spacing: 100%,
  99. overhang: true,
  100. vspaceBottom: 12pt,
  101. ),
  102. h4: (
  103. sans: true,
  104. size: 14pt,
  105. weight: 500,
  106. style: "normal",
  107. stretch: 100%,
  108. fill: rgb("#000000"),
  109. tracking: 0pt,
  110. spacing: 100%,
  111. overhang: true,
  112. vspaceBottom: 12pt,
  113. ),
  114. h5: (
  115. sans: true,
  116. size: 14pt,
  117. weight: 300,
  118. style: "italic",
  119. stretch: 100%,
  120. fill: rgb("#000000"),
  121. tracking: 0pt,
  122. spacing: 100%,
  123. overhang: true,
  124. vspaceBottom: 8pt,
  125. ),
  126. text: (
  127. size: 12pt,
  128. weight: 200,
  129. ),
  130. ),
  131. body
  132. ) = {
  133. let hdr = if headerSettings.enable {
  134. (
  135. header: headerSettings.content,
  136. header-ascent: headerSettings.ascent,
  137. )
  138. } else {
  139. (
  140. header: none,
  141. header-ascent: 30%,
  142. )
  143. }
  144. let ftr = if footerSettings.enable {
  145. (
  146. footer: footerSettings.content,
  147. footer-descent: footerSettings.descent,
  148. )
  149. } else {
  150. (
  151. footer: none,
  152. footer-descent: 30%,
  153. )
  154. }
  155. // Page Setting
  156. set page(
  157. paper: pageSettings.paper,
  158. margin: (
  159. left: pageSettings.leftMargin,
  160. right: pageSettings.rightMargin,
  161. top: pageSettings.topMargin,
  162. bottom: pageSettings.bottomMargin
  163. ),
  164. foreground: pageSettings.foreground,
  165. background: pageSettings.background,
  166. columns: pageSettings.columns,
  167. flipped: pageSettings.flipped,
  168. numbering: pageNumberingSettings.content,
  169. number-align: pageNumberingSettings.align,
  170. header: hdr.header,
  171. header-ascent: hdr.header-ascent,
  172. footer: ftr.footer,
  173. footer-descent: ftr.footer-descent,
  174. )
  175. // Document Meta Setting
  176. set document(
  177. title: title,
  178. author: authors
  179. )
  180. // ==== Cover Begin ====
  181. v(coverStyle.topMargin)
  182. // Title
  183. align(center, text(
  184. font: fontSets.sans,
  185. weight: coverStyle.titleWeight,
  186. size: coverStyle.titleSize,
  187. title
  188. ))
  189. v(coverStyle.subTitleMargin)
  190. // subTitle
  191. align(center, text(
  192. font: fontSets.sans,
  193. weight: coverStyle.subTitleWeight,
  194. size: coverStyle.subTitleSize,
  195. subTitle
  196. ))
  197. align(bottom, [
  198. // titleDesc
  199. #align(center, text(
  200. font: fontSets.sans,
  201. weight: coverStyle.titleDescWeight,
  202. size: coverStyle.titleDescSize,
  203. titleDesc
  204. ))
  205. #v(coverStyle.titleDescMargin)
  206. // authors
  207. #align(center, text(
  208. font: fontSets.sans,
  209. weight: coverStyle.authorsWeight,
  210. size: coverStyle.authorsSize,
  211. authors.join(coverStyle.authorsJoinSymbol)
  212. ))
  213. #v(coverStyle.authorsMargin)
  214. // date
  215. #align(center, text(
  216. font: fontSets.sans,
  217. weight: coverStyle.dateWeight,
  218. size: coverStyle.dateSize,
  219. date
  220. ))
  221. #v(coverStyle.dateMargin)
  222. // docVer
  223. #align(center, text(
  224. font: fontSets.sans,
  225. weight: coverStyle.docVerWeight,
  226. size: coverStyle.docVerSize,
  227. docVer
  228. ))
  229. ])
  230. // ==== Cover End ====
  231. pagebreak()
  232. // Default Font Setting
  233. set text(
  234. font: fontSets.serif,
  235. weight: textStyle.text.weight,
  236. size: textStyle.text.size,
  237. lang: "zh",
  238. )
  239. // Paragraph Setting
  240. /*
  241. show par: set block(spacing: 0.65em)
  242. set par(
  243. leading: 0.65em,
  244. //first-line-indent: 2em,
  245. justify: true,
  246. )
  247. */
  248. // ==== Heading Style Setting Begin ====
  249. set heading(numbering: "1.1.1.1.1")
  250. // H1
  251. show heading.where(level: 1): it => block(width: 100%)[
  252. #let fontFamily = if textStyle.h1.sans {
  253. fontSets.sans
  254. } else {
  255. fontSets.serif
  256. }
  257. #text(
  258. font: fontFamily,
  259. size: textStyle.h1.size,
  260. weight: textStyle.h1.weight,
  261. style: textStyle.h1.style,
  262. stretch: textStyle.h1.stretch,
  263. fill: textStyle.h1.fill,
  264. tracking: textStyle.h1.tracking,
  265. spacing: textStyle.h1.spacing,
  266. overhang: textStyle.h1.overhang,
  267. counter(heading).display() + h(1em) + it.body
  268. )
  269. #v(textStyle.h1.vspaceBottom)
  270. ]
  271. // H2
  272. show heading.where(level: 2): it => block(width: 100%)[
  273. #let fontFamily = if textStyle.h2.sans {
  274. fontSets.sans
  275. } else {
  276. fontSets.serif
  277. }
  278. #text(
  279. font: fontFamily,
  280. size: textStyle.h2.size,
  281. weight: textStyle.h2.weight,
  282. style: textStyle.h2.style,
  283. stretch: textStyle.h2.stretch,
  284. fill: textStyle.h2.fill,
  285. tracking: textStyle.h2.tracking,
  286. spacing: textStyle.h2.spacing,
  287. overhang: textStyle.h2.overhang,
  288. counter(heading).display() + h(1em) + it.body
  289. )
  290. #v(textStyle.h2.vspaceBottom)
  291. ]
  292. // H3
  293. show heading.where(level: 3): it => block(width: 100%)[
  294. #let fontFamily = if textStyle.h3.sans {
  295. fontSets.sans
  296. } else {
  297. fontSets.serif
  298. }
  299. #text(
  300. font: fontFamily,
  301. size: textStyle.h3.size,
  302. weight: textStyle.h3.weight,
  303. style: textStyle.h3.style,
  304. stretch: textStyle.h3.stretch,
  305. fill: textStyle.h3.fill,
  306. tracking: textStyle.h3.tracking,
  307. spacing: textStyle.h3.spacing,
  308. overhang: textStyle.h3.overhang,
  309. counter(heading).display() + h(1em) + it.body
  310. )
  311. #v(textStyle.h3.vspaceBottom)
  312. ]
  313. // H4
  314. show heading.where(level: 4): it => block(width: 100%)[
  315. #let fontFamily = if textStyle.h4.sans {
  316. fontSets.sans
  317. } else {
  318. fontSets.serif
  319. }
  320. #text(
  321. font: fontFamily,
  322. size: textStyle.h4.size,
  323. weight: textStyle.h4.weight,
  324. style: textStyle.h4.style,
  325. stretch: textStyle.h4.stretch,
  326. fill: textStyle.h4.fill,
  327. tracking: textStyle.h4.tracking,
  328. spacing: textStyle.h4.spacing,
  329. overhang: textStyle.h4.overhang,
  330. counter(heading).display() + h(1em) + it.body
  331. )
  332. #v(textStyle.h4.vspaceBottom)
  333. ]
  334. // H5
  335. show heading.where(level: 5): it => block(width: 100%)[
  336. #let fontFamily = if textStyle.h5.sans {
  337. fontSets.sans
  338. } else {
  339. fontSets.serif
  340. }
  341. #text(
  342. font: fontFamily,
  343. size: textStyle.h5.size,
  344. weight: textStyle.h5.weight,
  345. style: textStyle.h5.style,
  346. stretch: textStyle.h5.stretch,
  347. fill: textStyle.h5.fill,
  348. tracking: textStyle.h5.tracking,
  349. spacing: textStyle.h5.spacing,
  350. overhang: textStyle.h5.overhang,
  351. counter(heading).display() + h(1em) + it.body
  352. )
  353. #v(textStyle.h5.vspaceBottom)
  354. ]
  355. // ==== Title Style Setting End ====
  356. // ==== Body Begin ====
  357. body
  358. // ==== Body End ====
  359. }