108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
| #let phd(doc) = {
 | |
|   set page(paper: "a4", numbering: "1")
 | |
| 
 | |
|   set par(first-line-indent: 1em, justify: true, leading: 1em)
 | |
| 
 | |
|   // Code formatting
 | |
|   show raw.where(block: true): it => {
 | |
|     set par(justify: false)
 | |
|     let split = it.text.split("\n")
 | |
|     let len = split.len()
 | |
|     grid(
 | |
|       columns: (100%, 100%),
 | |
|       column-gutter: -100%,
 | |
|       block(width: 100%, inset: 1em, for (i, line) in split.enumerate() {
 | |
|         if i != len - 1 {
 | |
|           box(width: 0pt, align(right, str(i + 1) + h(2em)))
 | |
|           hide(line)
 | |
|           linebreak()
 | |
|         }
 | |
|       }),
 | |
|       block(radius: 1em, fill: luma(246), width: 100%, inset: 1em, it),
 | |
|     )
 | |
|   }
 | |
| 
 | |
|   show heading: content => {
 | |
|     v(0.5em)
 | |
|     content
 | |
|     v(0.38em)
 | |
|   }
 | |
| 
 | |
|   show figure: content => {
 | |
|     content
 | |
|     v(1em)
 | |
|   }
 | |
| 
 | |
|   show link: content => {
 | |
|     set text(fill: blue)
 | |
|     content
 | |
|   }
 | |
| 
 | |
|   show cite: content => {
 | |
|     set text(fill: blue)
 | |
|     content
 | |
|   }
 | |
| 
 | |
|   show ref: content => {
 | |
|     set text(fill: blue)
 | |
|     content
 | |
|   }
 | |
| 
 | |
|   set heading(supplement: (..nums) =>
 | |
|     if (nums.pos().len() == 1) {
 | |
|       [Chapter]
 | |
|     } else {
 | |
|       [Section]
 | |
|     }
 | |
|   )
 | |
| 
 | |
|   set heading(numbering: (..nums) => {
 | |
|     if nums.pos().len() >= 4 {
 | |
|       none
 | |
|     } else {
 | |
|       nums.pos().map(str).join(".")
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   show heading.where(level: 1): it => {
 | |
|     if it.numbering != none {
 | |
|       set page(header: [], footer: [])
 | |
|       align(right, {
 | |
|         v(100pt)
 | |
|         if it.numbering != none {
 | |
|           text(size: 50pt, weight: "bold")[Chapter ]
 | |
|           set heading(numbering: (..nums) => str(nums.pos().at(0)))
 | |
|           text(counter(heading).display(), size: 150pt, fill: rgb(173, 216, 230))
 | |
|         }
 | |
|         v(50pt)
 | |
|         text(it.body, size: 40pt, weight: "bold")
 | |
|         v(40pt)
 | |
|       })
 | |
|     } else {
 | |
|       align(right, {
 | |
|         v(100pt)
 | |
|         if it.numbering != none {
 | |
|           text(size: 50pt, weight: "bold")[Chapter ]
 | |
|           set heading(numbering: (..nums) => str(nums.pos().at(0)))
 | |
|           text(counter(heading).display(), size: 150pt, fill: rgb(173, 216, 230))
 | |
|         }
 | |
|         v(50pt)
 | |
|         text(it.body, size: 40pt, weight: "bold")
 | |
|         v(40pt)
 | |
|       })
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   show heading.where(level: 2): set text(size: 15pt)
 | |
|   show heading.where(level: 3): set text(size: 13pt)
 | |
| 
 | |
|   doc
 | |
| }
 | |
| 
 | |
| #let beforeChapter = () => {
 | |
|   pagebreak(to: "odd")
 | |
| }
 | |
| 
 | |
| #let afterNumberedChapter = () => {
 | |
| }
 |