├── .github ├── dependabot.yml └── workflows │ ├── dissertation.yml │ ├── progress-report.yml │ └── specification.yml ├── .gitignore ├── LICENSE ├── README.md ├── common ├── bibliography.bib ├── common.tex ├── line.png ├── plainnat.bst ├── project.tex └── titlepage.tex ├── dissertation ├── abstract.tex ├── background.tex ├── conclusions.tex ├── design.tex ├── dissertation.tex ├── evaluation.tex ├── implementation.tex └── introduction.tex ├── progress-report ├── background.tex ├── introduction.tex ├── progress-report.tex ├── progress.tex └── project-management.tex ├── shell.nix └── specification └── specification.tex /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | assignees: 8 | - "mbg" 9 | -------------------------------------------------------------------------------- /.github/workflows/dissertation.yml: -------------------------------------------------------------------------------- 1 | name: dissertation 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/dissertation.yml' 7 | - 'dissertation/**' 8 | - 'common/**' 9 | pull_request: 10 | workflow_dispatch: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - name: Compile report 21 | uses: dante-ev/latex-action@v0.2.0 22 | with: 23 | working_directory: dissertation 24 | root_file: dissertation.tex 25 | args: -f -bibtex -pdflatex -latexoption=-file-line-error -latexoption=-interaction=nonstopmode -latexoption=-shell-escape -latexoption=-synctex=1 26 | 27 | - name: Upload artifact 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: dissertation.pdf 31 | path: dissertation/dissertation.pdf 32 | -------------------------------------------------------------------------------- /.github/workflows/progress-report.yml: -------------------------------------------------------------------------------- 1 | name: Progress report 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/progress-report.yml' 7 | - 'progress-report/**' 8 | - 'common/**' 9 | pull_request: 10 | workflow_dispatch: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - name: Compile report 21 | uses: dante-ev/latex-action@v0.2.0 22 | with: 23 | working_directory: progress-report 24 | root_file: progress-report.tex 25 | args: -f -bibtex -pdflatex -latexoption=-file-line-error -latexoption=-interaction=nonstopmode -latexoption=-shell-escape -latexoption=-synctex=1 26 | 27 | - name: Upload artifact 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: progress-report.pdf 31 | path: progress-report/progress-report.pdf 32 | -------------------------------------------------------------------------------- /.github/workflows/specification.yml: -------------------------------------------------------------------------------- 1 | name: Specification 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/specification.yml' 7 | - 'specification/**' 8 | - 'common/**' 9 | pull_request: 10 | workflow_dispatch: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - name: Compile report 21 | uses: dante-ev/latex-action@v0.2.0 22 | with: 23 | working_directory: specification 24 | root_file: specification.tex 25 | args: -f -bibtex -pdflatex -latexoption=-file-line-error -latexoption=-interaction=nonstopmode -latexoption=-shell-escape -latexoption=-synctex=1 26 | 27 | - name: Upload artifact 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: specification.pdf 31 | path: specification/specification.pdf 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Core latex/pdflatex auxiliary files: 2 | *.aux 3 | *.lof 4 | *.log 5 | *.lot 6 | *.fls 7 | *.out 8 | *.toc 9 | *.fmt 10 | *.fot 11 | *.cb 12 | *.cb2 13 | .*.lb 14 | 15 | ## Intermediate documents: 16 | *.dvi 17 | *.xdv 18 | *-converted-to.* 19 | # these rules might exclude image files for figures etc. 20 | # *.ps 21 | # *.eps 22 | # *.pdf 23 | 24 | ## Generated if empty string is given at "Please type another file name for output:" 25 | .pdf 26 | 27 | ## Bibliography auxiliary files (bibtex/biblatex/biber): 28 | *.bbl 29 | *.bcf 30 | *.blg 31 | *-blx.aux 32 | *-blx.bib 33 | *.run.xml 34 | 35 | ## Build tool auxiliary files: 36 | *.fdb_latexmk 37 | *.synctex 38 | *.synctex(busy) 39 | *.synctex.gz 40 | *.synctex.gz(busy) 41 | *.pdfsync 42 | 43 | ## Build tool directories for auxiliary files 44 | # latexrun 45 | latex.out/ 46 | 47 | ## Auxiliary and intermediate files from other packages: 48 | # algorithms 49 | *.alg 50 | *.loa 51 | 52 | # achemso 53 | acs-*.bib 54 | 55 | # amsthm 56 | *.thm 57 | 58 | # beamer 59 | *.nav 60 | *.pre 61 | *.snm 62 | *.vrb 63 | 64 | # changes 65 | *.soc 66 | 67 | # comment 68 | *.cut 69 | 70 | # cprotect 71 | *.cpt 72 | 73 | # elsarticle (documentclass of Elsevier journals) 74 | *.spl 75 | 76 | # endnotes 77 | *.ent 78 | 79 | # fixme 80 | *.lox 81 | 82 | # feynmf/feynmp 83 | *.mf 84 | *.mp 85 | *.t[1-9] 86 | *.t[1-9][0-9] 87 | *.tfm 88 | 89 | #(r)(e)ledmac/(r)(e)ledpar 90 | *.end 91 | *.?end 92 | *.[1-9] 93 | *.[1-9][0-9] 94 | *.[1-9][0-9][0-9] 95 | *.[1-9]R 96 | *.[1-9][0-9]R 97 | *.[1-9][0-9][0-9]R 98 | *.eledsec[1-9] 99 | *.eledsec[1-9]R 100 | *.eledsec[1-9][0-9] 101 | *.eledsec[1-9][0-9]R 102 | *.eledsec[1-9][0-9][0-9] 103 | *.eledsec[1-9][0-9][0-9]R 104 | 105 | # glossaries 106 | *.acn 107 | *.acr 108 | *.glg 109 | *.glo 110 | *.gls 111 | *.glsdefs 112 | *.lzo 113 | *.lzs 114 | 115 | # uncomment this for glossaries-extra (will ignore makeindex's style files!) 116 | # *.ist 117 | 118 | # gnuplottex 119 | *-gnuplottex-* 120 | 121 | # gregoriotex 122 | *.gaux 123 | *.gtex 124 | 125 | # htlatex 126 | *.4ct 127 | *.4tc 128 | *.idv 129 | *.lg 130 | *.trc 131 | *.xref 132 | 133 | # hyperref 134 | *.brf 135 | 136 | # knitr 137 | *-concordance.tex 138 | # TODO Comment the next line if you want to keep your tikz graphics files 139 | *.tikz 140 | *-tikzDictionary 141 | 142 | # listings 143 | *.lol 144 | 145 | # luatexja-ruby 146 | *.ltjruby 147 | 148 | # makeidx 149 | *.idx 150 | *.ilg 151 | *.ind 152 | 153 | # minitoc 154 | *.maf 155 | *.mlf 156 | *.mlt 157 | *.mtc[0-9]* 158 | *.slf[0-9]* 159 | *.slt[0-9]* 160 | *.stc[0-9]* 161 | 162 | # minted 163 | _minted* 164 | *.pyg 165 | 166 | # morewrites 167 | *.mw 168 | 169 | # nomencl 170 | *.nlg 171 | *.nlo 172 | *.nls 173 | 174 | # pax 175 | *.pax 176 | 177 | # pdfpcnotes 178 | *.pdfpc 179 | 180 | # sagetex 181 | *.sagetex.sage 182 | *.sagetex.py 183 | *.sagetex.scmd 184 | 185 | # scrwfile 186 | *.wrt 187 | 188 | # sympy 189 | *.sout 190 | *.sympy 191 | sympy-plots-for-*.tex/ 192 | 193 | # pdfcomment 194 | *.upa 195 | *.upb 196 | 197 | # pythontex 198 | *.pytxcode 199 | pythontex-files-*/ 200 | 201 | # tcolorbox 202 | *.listing 203 | 204 | # thmtools 205 | *.loe 206 | 207 | # TikZ & PGF 208 | *.dpth 209 | *.md5 210 | *.auxlock 211 | 212 | # todonotes 213 | *.tdo 214 | 215 | # vhistory 216 | *.hst 217 | *.ver 218 | 219 | # easy-todo 220 | *.lod 221 | 222 | # xcolor 223 | *.xcp 224 | 225 | # xmpincl 226 | *.xmpi 227 | 228 | # xindy 229 | *.xdy 230 | 231 | # xypic precompiled matrices and outlines 232 | *.xyc 233 | *.xyd 234 | 235 | # endfloat 236 | *.ttt 237 | *.fff 238 | 239 | # Latexian 240 | TSWLatexianTemp* 241 | 242 | ## Editors: 243 | # WinEdt 244 | *.bak 245 | *.sav 246 | 247 | # Texpad 248 | .texpadtmp 249 | 250 | # LyX 251 | *.lyx~ 252 | 253 | # Kile 254 | *.backup 255 | 256 | # gummi 257 | .*.swp 258 | 259 | # KBibTeX 260 | *~[0-9]* 261 | 262 | # TeXnicCenter 263 | *.tps 264 | 265 | # auto folder when using emacs and auctex 266 | ./auto/* 267 | *.el 268 | 269 | # expex forward references with \gathertags 270 | *-tags.tex 271 | 272 | # standalone packages 273 | *.sta 274 | 275 | # Makeindex log files 276 | *.lpz 277 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution 4.0 International Public License 2 | 3 | By exercising the Licensed Rights (defined below), You accept and agree 4 | to be bound by the terms and conditions of this Creative Commons 5 | Attribution 4.0 International Public License ("Public License"). To the 6 | extent this Public License may be interpreted as a contract, You are 7 | granted the Licensed Rights in consideration of Your acceptance of 8 | these terms and conditions, and the Licensor grants You such rights in 9 | consideration of benefits the Licensor receives from making the 10 | Licensed Material available under these terms and conditions. 11 | 12 | 13 | Section 1 -- Definitions. 14 | 15 | a. Adapted Material means material subject to Copyright and Similar 16 | Rights that is derived from or based upon the Licensed Material 17 | and in which the Licensed Material is translated, altered, 18 | arranged, transformed, or otherwise modified in a manner requiring 19 | permission under the Copyright and Similar Rights held by the 20 | Licensor. For purposes of this Public License, where the Licensed 21 | Material is a musical work, performance, or sound recording, 22 | Adapted Material is always produced where the Licensed Material is 23 | synched in timed relation with a moving image. 24 | 25 | b. Adapter's License means the license You apply to Your Copyright 26 | and Similar Rights in Your contributions to Adapted Material in 27 | accordance with the terms and conditions of this Public License. 28 | 29 | c. Copyright and Similar Rights means copyright and/or similar rights 30 | closely related to copyright including, without limitation, 31 | performance, broadcast, sound recording, and Sui Generis Database 32 | Rights, without regard to how the rights are labeled or 33 | categorized. For purposes of this Public License, the rights 34 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 35 | Rights. 36 | 37 | d. Effective Technological Measures means those measures that, in the 38 | absence of proper authority, may not be circumvented under laws 39 | fulfilling obligations under Article 11 of the WIPO Copyright 40 | Treaty adopted on December 20, 1996, and/or similar international 41 | agreements. 42 | 43 | e. Exceptions and Limitations means fair use, fair dealing, and/or 44 | any other exception or limitation to Copyright and Similar Rights 45 | that applies to Your use of the Licensed Material. 46 | 47 | f. Licensed Material means the artistic or literary work, database, 48 | or other material to which the Licensor applied this Public 49 | License. 50 | 51 | g. Licensed Rights means the rights granted to You subject to the 52 | terms and conditions of this Public License, which are limited to 53 | all Copyright and Similar Rights that apply to Your use of the 54 | Licensed Material and that the Licensor has authority to license. 55 | 56 | h. Licensor means the individual(s) or entity(ies) granting rights 57 | under this Public License. 58 | 59 | i. Share means to provide material to the public by any means or 60 | process that requires permission under the Licensed Rights, such 61 | as reproduction, public display, public performance, distribution, 62 | dissemination, communication, or importation, and to make material 63 | available to the public including in ways that members of the 64 | public may access the material from a place and at a time 65 | individually chosen by them. 66 | 67 | j. Sui Generis Database Rights means rights other than copyright 68 | resulting from Directive 96/9/EC of the European Parliament and of 69 | the Council of 11 March 1996 on the legal protection of databases, 70 | as amended and/or succeeded, as well as other essentially 71 | equivalent rights anywhere in the world. 72 | 73 | k. You means the individual or entity exercising the Licensed Rights 74 | under this Public License. Your has a corresponding meaning. 75 | 76 | 77 | Section 2 -- Scope. 78 | 79 | a. License grant. 80 | 81 | 1. Subject to the terms and conditions of this Public License, 82 | the Licensor hereby grants You a worldwide, royalty-free, 83 | non-sublicensable, non-exclusive, irrevocable license to 84 | exercise the Licensed Rights in the Licensed Material to: 85 | 86 | a. reproduce and Share the Licensed Material, in whole or 87 | in part; and 88 | 89 | b. produce, reproduce, and Share Adapted Material. 90 | 91 | 2. Exceptions and Limitations. For the avoidance of doubt, where 92 | Exceptions and Limitations apply to Your use, this Public 93 | License does not apply, and You do not need to comply with 94 | its terms and conditions. 95 | 96 | 3. Term. The term of this Public License is specified in Section 97 | 6(a). 98 | 99 | 4. Media and formats; technical modifications allowed. The 100 | Licensor authorizes You to exercise the Licensed Rights in 101 | all media and formats whether now known or hereafter created, 102 | and to make technical modifications necessary to do so. The 103 | Licensor waives and/or agrees not to assert any right or 104 | authority to forbid You from making technical modifications 105 | necessary to exercise the Licensed Rights, including 106 | technical modifications necessary to circumvent Effective 107 | Technological Measures. For purposes of this Public License, 108 | simply making modifications authorized by this Section 2(a) 109 | (4) never produces Adapted Material. 110 | 111 | 5. Downstream recipients. 112 | 113 | a. Offer from the Licensor -- Licensed Material. Every 114 | recipient of the Licensed Material automatically 115 | receives an offer from the Licensor to exercise the 116 | Licensed Rights under the terms and conditions of this 117 | Public License. 118 | 119 | b. No downstream restrictions. You may not offer or impose 120 | any additional or different terms or conditions on, or 121 | apply any Effective Technological Measures to, the 122 | Licensed Material if doing so restricts exercise of the 123 | Licensed Rights by any recipient of the Licensed 124 | Material. 125 | 126 | 6. No endorsement. Nothing in this Public License constitutes or 127 | may be construed as permission to assert or imply that You 128 | are, or that Your use of the Licensed Material is, connected 129 | with, or sponsored, endorsed, or granted official status by, 130 | the Licensor or others designated to receive attribution as 131 | provided in Section 3(a)(1)(A)(i). 132 | 133 | b. Other rights. 134 | 135 | 1. Moral rights, such as the right of integrity, are not 136 | licensed under this Public License, nor are publicity, 137 | privacy, and/or other similar personality rights; however, to 138 | the extent possible, the Licensor waives and/or agrees not to 139 | assert any such rights held by the Licensor to the limited 140 | extent necessary to allow You to exercise the Licensed 141 | Rights, but not otherwise. 142 | 143 | 2. Patent and trademark rights are not licensed under this 144 | Public License. 145 | 146 | 3. To the extent possible, the Licensor waives any right to 147 | collect royalties from You for the exercise of the Licensed 148 | Rights, whether directly or through a collecting society 149 | under any voluntary or waivable statutory or compulsory 150 | licensing scheme. In all other cases the Licensor expressly 151 | reserves any right to collect such royalties. 152 | 153 | 154 | Section 3 -- License Conditions. 155 | 156 | Your exercise of the Licensed Rights is expressly made subject to the 157 | following conditions. 158 | 159 | a. Attribution. 160 | 161 | 1. If You Share the Licensed Material (including in modified 162 | form), You must: 163 | 164 | a. retain the following if it is supplied by the Licensor 165 | with the Licensed Material: 166 | 167 | i. identification of the creator(s) of the Licensed 168 | Material and any others designated to receive 169 | attribution, in any reasonable manner requested by 170 | the Licensor (including by pseudonym if 171 | designated); 172 | 173 | ii. a copyright notice; 174 | 175 | iii. a notice that refers to this Public License; 176 | 177 | iv. a notice that refers to the disclaimer of 178 | warranties; 179 | 180 | v. a URI or hyperlink to the Licensed Material to the 181 | extent reasonably practicable; 182 | 183 | b. indicate if You modified the Licensed Material and 184 | retain an indication of any previous modifications; and 185 | 186 | c. indicate the Licensed Material is licensed under this 187 | Public License, and include the text of, or the URI or 188 | hyperlink to, this Public License. 189 | 190 | 2. You may satisfy the conditions in Section 3(a)(1) in any 191 | reasonable manner based on the medium, means, and context in 192 | which You Share the Licensed Material. For example, it may be 193 | reasonable to satisfy the conditions by providing a URI or 194 | hyperlink to a resource that includes the required 195 | information. 196 | 197 | 3. If requested by the Licensor, You must remove any of the 198 | information required by Section 3(a)(1)(A) to the extent 199 | reasonably practicable. 200 | 201 | 4. If You Share Adapted Material You produce, the Adapter's 202 | License You apply must not prevent recipients of the Adapted 203 | Material from complying with this Public License. 204 | 205 | 206 | Section 4 -- Sui Generis Database Rights. 207 | 208 | Where the Licensed Rights include Sui Generis Database Rights that 209 | apply to Your use of the Licensed Material: 210 | 211 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 212 | to extract, reuse, reproduce, and Share all or a substantial 213 | portion of the contents of the database; 214 | 215 | b. if You include all or a substantial portion of the database 216 | contents in a database in which You have Sui Generis Database 217 | Rights, then the database in which You have Sui Generis Database 218 | Rights (but not its individual contents) is Adapted Material; and 219 | 220 | c. You must comply with the conditions in Section 3(a) if You Share 221 | all or a substantial portion of the contents of the database. 222 | 223 | For the avoidance of doubt, this Section 4 supplements and does not 224 | replace Your obligations under this Public License where the Licensed 225 | Rights include other Copyright and Similar Rights. 226 | 227 | 228 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 229 | 230 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 231 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 232 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 233 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 234 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 235 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 236 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 237 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 238 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 239 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 240 | 241 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 242 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 243 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 244 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 245 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 246 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 247 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 248 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 249 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 250 | 251 | c. The disclaimer of warranties and limitation of liability provided 252 | above shall be interpreted in a manner that, to the extent 253 | possible, most closely approximates an absolute disclaimer and 254 | waiver of all liability. 255 | 256 | 257 | Section 6 -- Term and Termination. 258 | 259 | a. This Public License applies for the term of the Copyright and 260 | Similar Rights licensed here. However, if You fail to comply with 261 | this Public License, then Your rights under this Public License 262 | terminate automatically. 263 | 264 | b. Where Your right to use the Licensed Material has terminated under 265 | Section 6(a), it reinstates: 266 | 267 | 1. automatically as of the date the violation is cured, provided 268 | it is cured within 30 days of Your discovery of the 269 | violation; or 270 | 271 | 2. upon express reinstatement by the Licensor. 272 | 273 | For the avoidance of doubt, this Section 6(b) does not affect any 274 | right the Licensor may have to seek remedies for Your violations 275 | of this Public License. 276 | 277 | c. For the avoidance of doubt, the Licensor may also offer the 278 | Licensed Material under separate terms or conditions or stop 279 | distributing the Licensed Material at any time; however, doing so 280 | will not terminate this Public License. 281 | 282 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 283 | License. 284 | 285 | 286 | Section 7 -- Other Terms and Conditions. 287 | 288 | a. The Licensor shall not be bound by any additional or different 289 | terms or conditions communicated by You unless expressly agreed. 290 | 291 | b. Any arrangements, understandings, or agreements regarding the 292 | Licensed Material not stated herein are separate from and 293 | independent of the terms and conditions of this Public License. 294 | 295 | 296 | Section 8 -- Interpretation. 297 | 298 | a. For the avoidance of doubt, this Public License does not, and 299 | shall not be interpreted to, reduce, limit, restrict, or impose 300 | conditions on any use of the Licensed Material that could lawfully 301 | be made without permission under this Public License. 302 | 303 | b. To the extent possible, if any provision of this Public License is 304 | deemed unenforceable, it shall be automatically reformed to the 305 | minimum extent necessary to make it enforceable. If the provision 306 | cannot be reformed, it shall be severed from this Public License 307 | without affecting the enforceability of the remaining terms and 308 | conditions. 309 | 310 | c. No term or condition of this Public License will be waived and no 311 | failure to comply consented to unless expressly agreed to by the 312 | Licensor. 313 | 314 | d. Nothing in this Public License constitutes or may be interpreted 315 | as a limitation upon, or waiver of, any privileges and immunities 316 | that apply to the Licensor or You, including from the legal 317 | processes of any jurisdiction or authority. 318 | 319 | 320 | ======================================================================= 321 | 322 | Creative Commons is not a party to its public licenses. 323 | Notwithstanding, Creative Commons may elect to apply one of its public 324 | licenses to material it publishes and in those instances will be 325 | considered the “Licensor.” The text of the Creative Commons public 326 | licenses is dedicated to the public domain under the CC0 Public Domain 327 | Dedication. Except for the limited purpose of indicating that material 328 | is shared under a Creative Commons public license or as otherwise 329 | permitted by the Creative Commons policies published at 330 | creativecommons.org/policies, Creative Commons does not authorize the 331 | use of the trademark "Creative Commons" or any other trademark or logo 332 | of Creative Commons without its prior written consent including, 333 | without limitation, in connection with any unauthorized modifications 334 | to any of its public licenses or any other arrangements, 335 | understandings, or agreements concerning use of licensed material. For 336 | the avoidance of doubt, this paragraph does not form part of the public 337 | licenses. 338 | 339 | Creative Commons may be contacted at creativecommons.org. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Starter pack for CS310 etc. 2 | 3 | This repository contains a starter pack of resources for CS310 and other, similar modules. It is comprised of: 4 | 5 | - LaTeX templates for the project specification, progress report, and dissertation. 6 | - GitHub Actions workflows for building each report and making them available as build artifacts. 7 | - Generic advice for writing the reports. 8 | 9 | ## Getting started 10 | 11 | Click on the green "Use this template" button to fork the template to your account. You can customise a few settings, such as the repository name and visibility, during that process. You probably want to make the repository private. 12 | 13 | ### Continuous integration 14 | 15 | This repository is configured with [GitHub Actions](https://docs.github.com/en/actions) workflows which will build your reports every time you push changes to your fork of the repository. For example, if you change `specification/specification.tex` locally, commit your changes, and push them to GitHub, then the workflow defined in `.github/workflows/specification.yml` will run and build your specification for you. You will be able to find the corresponding job in the "Actions" tab on your repository. If the build is successful, the resulting PDF will be uploaded as a build artifact and can be downloaded from the summary page of the corresponding job. 16 | 17 | ### Compiling locally 18 | 19 | You will need to have a LaTeX distribution, such as [TeX Live](https://www.tug.org/texlive/) installed for the platform you are working on. 20 | 21 | The template also supports syntax highlighting using the `minted` package, which requires [Pygments](https://pygments.org) to be installed using e.g. `pip install Pygments` or `pip3 install Pygments` (assuming your platform already has Python installed on it). If this causes you problems or you do not wish to use `minted` for syntax highlighting in your reports, you can remove `\usepackage{minted}` from `common/common.tex`. Alternatively, you can follow the instructions below. 22 | 23 | To compile your reports locally, you can use `latexmk` or `pdflatex`. For example, to compile the specification using `latexmk`: 24 | 25 | ``` 26 | $ cd specification 27 | $ latexmk specification.tex -pdflatex -bibtex -latexoption=-shell-escape 28 | ``` 29 | 30 | ### Compiling locally using Nix 31 | 32 | If you are using [the Nix package manager](https://nixos.org/download.html#download-nix) or are curious about using it, this repository comes with a `shell.nix` file which allows you to enter a Nix shell (using `nix-shell`) that will provide the environment needed to compile the reports. The `nix-shell` will take a little while to start up the first time you open it, because it will download and install all dependencies you need. Once loaded, you can navigate the file system as normal and run a suitable build command: 33 | 34 | ``` 35 | $ nix-shell 36 | [nix-shell:~/cs310]$ cd specification 37 | [nix-shell:~/cs310/specification]$ latexmk specification.tex -pdflatex -bibtex -latexoption=-shell-escape 38 | ``` 39 | 40 | ## Advice for writing reports 41 | 42 | Before you do anything else, read [Writing for Computer Science](http://encore.lib.warwick.ac.uk/iii/encore/record/C__Rb2777534): I recommend Chapters 1 to 8 and Chapter 13. Then have a look at some samples of _good_ reports that students in previous years have written. 43 | 44 | Some summary advice for avoiding common mistakes: 45 | 46 | - All three documents should be _self-contained_. Don't assume the person reading your progress report has read your specification. Don't assume the person reading your dissertation has read the specification or progress report. 47 | - Keep your _audience_ in mind: they don't know anything that a general Computer Scientist doesn't know. I.e. they don't know what your project is about, they don't know why it is worth doing, and they don't know literature you have read related to it. 48 | - Think about your _narrative_: there should be a logical structure that flows through your document. For example, a common structure for a dissertation is the following (the project specification and progress report may only use parts of this): 49 | - _Motivation_: Establishing the context of the work by gently easing the reader into the domain and identifying a problem in it. 50 | - _Related work_: Discussing what existing solutions there are, how they compare, and why they don't yet address the problem you have identified. 51 | - _Objectives_: Clearly and concisely stating how you are going to solve the problem. 52 | - _Background_: Your literature review consisting of explanations and discussions of academic literature you have read that relates to or is required to understand your report. 53 | - _Design_: A discussion of your solution for the problem you identified. This should explore the design space: i.e. a comparative discussion of different options that were available to you to justify the ones you chose in the end. 54 | - _Implementation_: A discussion of the most challenging parts of implementing your solution. This should ideally be comprised of solutions to implementation problems that would not be obvious to a Computer Science graduate. 55 | - _Evaluation_: Evidence that your work does indeed solve the problem you identified. This is ideally backed up by data and comprised of tables, graphs, statistics, etc. 56 | - _Conclusions_: A summary of what is accomplished and what future work could build on the work you have done. 57 | - Write in _present tense_ for anything that is true at the time of writing. This includes references to later parts of a report (i.e. instead of "In Chapter 5, we will describe [..]" you should write "In Chapter 5, we describe [..]"). Use past tense for anything that was once true, but is no longer true (e.g. "people once believed the Earth was flat"). Use future tense only when describing work you have not yet done (e.g. in the project specification or progress report). It would not be unusual for there to be no future tense at all in the dissertation. 58 | - Avoid the passive voice and always use the _active voice_. Ideally first-person plural ("we"), although first-person singular is also acceptable ("I"). 59 | - Be _explicit_. For example, don't write "There are many applications for this technique.". Instead write "This technique can be applied to e.g. cakes, pastries, and waffles.". 60 | - Keep sentences _short_. 61 | - Be _accurate_. Read what you write and ensure that your wording is technically accurate and makes logical sense. 62 | - _Use terminology consistently_: there is nothing wrong with repeating the same term several times, even in close proximity. Do not use synonyms to refer to the same concept. 63 | 64 | ## Getting feedback 65 | 66 | - Get feedback early, ideally for a single chapter at-a-time. 67 | - Use GitHub/diffs to make it easier to see what has changed: 68 | - Do all work for a new report in a separate branch and open a pull request against your main branch, then ask for reviews on that pull request. This will make it easier to see what has changed since the last review, provided you do not force-push to the branch. 69 | - Alternatively, use GitHub's diff compare feature and link to a diff of the current commit compared to the one that was last reviewed. 70 | - Say what you want feedback on and, if you aren't using PRs/diffs, summarise what has changed. 71 | -------------------------------------------------------------------------------- /common/bibliography.bib: -------------------------------------------------------------------------------- 1 | @article{hughes1989functional, 2 | title={Why functional programming matters}, 3 | author={Hughes, John}, 4 | journal={The computer journal}, 5 | volume={32}, 6 | number={2}, 7 | pages={98--107}, 8 | year={1989}, 9 | publisher={Oxford University Press} 10 | } -------------------------------------------------------------------------------- /common/common.tex: -------------------------------------------------------------------------------- 1 | 2 | \usepackage[]{geometry} 3 | \usepackage[latin1]{inputenc} 4 | \usepackage[UKenglish]{babel} 5 | \usepackage[UKenglish]{isodate} 6 | \usepackage{amsmath} 7 | \usepackage{amsfonts} 8 | \usepackage{amssymb} 9 | \usepackage{amsthm} 10 | \usepackage{graphicx} 11 | \usepackage{chngpage} 12 | \usepackage{calc} 13 | \PassOptionsToPackage{hyphens}{url} 14 | \usepackage{hyperref} 15 | \usepackage[nameinlink]{cleveref} 16 | \usepackage{fancyhdr} 17 | \usepackage{titletoc} 18 | \usepackage[explicit]{titlesec} 19 | \usepackage{natbib} 20 | \usepackage[dvipsnames]{xcolor} 21 | \usepackage[sc]{mathpazo} 22 | \linespread{1.05} 23 | \usepackage[T1]{fontenc} 24 | \usepackage{minted} 25 | 26 | \hypersetup{ 27 | colorlinks=true, 28 | linkcolor=black, 29 | urlcolor=black, 30 | citecolor=black 31 | } 32 | 33 | \setlength{\parindent}{0mm} 34 | \setlength{\parskip}{\medskipamount} 35 | \renewcommand\baselinestretch{1.2} 36 | 37 | \cleanlookdateon 38 | 39 | \makeatletter 40 | \newcommand{\@assignment}[0]{Assignment} 41 | \newcommand{\assignment}[1]{\renewcommand{\@assignment}{#1}} 42 | \newcommand{\@supervisor}[0]{} 43 | \newcommand{\supervisor}[1]{\renewcommand{\@supervisor}{#1}} 44 | \newcommand{\@yearofstudy}[0]{} 45 | \newcommand{\yearofstudy}[1]{\renewcommand{\@yearofstudy}{#1}} 46 | \makeatletter 47 | 48 | \newtoggle{IsDissertation} 49 | -------------------------------------------------------------------------------- /common/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbg/cs310/117cd73ff025c863b01249f6d86bac5391b04557/common/line.png -------------------------------------------------------------------------------- /common/plainnat.bst: -------------------------------------------------------------------------------- 1 | %% File: `plainnat.bst' 2 | %% A modification of `plain.bst' for use with natbib package 3 | %% 4 | %% Copyright 1993-2007 Patrick W Daly 5 | %% Max-Planck-Institut f\"ur Sonnensystemforschung 6 | %% Max-Planck-Str. 2 7 | %% D-37191 Katlenburg-Lindau 8 | %% Germany 9 | %% E-mail: daly@mps.mpg.de 10 | %% 11 | %% This program can be redistributed and/or modified under the terms 12 | %% of the LaTeX Project Public License Distributed from CTAN 13 | %% archives in directory macros/latex/base/lppl.txt; either 14 | %% version 1 of the License, or any later version. 15 | %% 16 | % Version and source file information: 17 | % \ProvidesFile{natbst.mbs}[2007/11/26 1.93 (PWD)] 18 | % 19 | % BibTeX `plainnat' family 20 | % version 0.99b for BibTeX versions 0.99a or later, 21 | % for LaTeX versions 2.09 and 2e. 22 | % 23 | % For use with the `natbib.sty' package; emulates the corresponding 24 | % member of the `plain' family, but with author-year citations. 25 | % 26 | % With version 6.0 of `natbib.sty', it may also be used for numerical 27 | % citations, while retaining the commands \citeauthor, \citefullauthor, 28 | % and \citeyear to print the corresponding information. 29 | % 30 | % For version 7.0 of `natbib.sty', the KEY field replaces missing 31 | % authors/editors, and the date is left blank in \bibitem. 32 | % 33 | % Includes field EID for the sequence/citation number of electronic journals 34 | % which is used instead of page numbers. 35 | % 36 | % Includes fields ISBN and ISSN. 37 | % 38 | % Includes field URL for Internet addresses. 39 | % 40 | % Includes field DOI for Digital Object Idenfifiers. 41 | % 42 | % Works best with the url.sty package of Donald Arseneau. 43 | % 44 | % Works with identical authors and year are further sorted by 45 | % citation key, to preserve any natural sequence. 46 | % 47 | ENTRY 48 | { address 49 | author 50 | booktitle 51 | chapter 52 | doi 53 | eid 54 | edition 55 | editor 56 | howpublished 57 | institution 58 | isbn 59 | issn 60 | journal 61 | key 62 | month 63 | note 64 | number 65 | organization 66 | pages 67 | publisher 68 | school 69 | series 70 | title 71 | type 72 | url 73 | volume 74 | year 75 | } 76 | {} 77 | { label extra.label sort.label short.list } 78 | 79 | INTEGERS { output.state before.all mid.sentence after.sentence after.block } 80 | 81 | FUNCTION {init.state.consts} 82 | { #0 'before.all := 83 | #1 'mid.sentence := 84 | #2 'after.sentence := 85 | #3 'after.block := 86 | } 87 | 88 | STRINGS { s t } 89 | 90 | FUNCTION {output.nonnull} 91 | { 's := 92 | output.state mid.sentence = 93 | { ", " * write$ } 94 | { output.state after.block = 95 | { add.period$ write$ 96 | newline$ 97 | "\newblock " write$ 98 | } 99 | { output.state before.all = 100 | 'write$ 101 | { add.period$ " " * write$ } 102 | if$ 103 | } 104 | if$ 105 | mid.sentence 'output.state := 106 | } 107 | if$ 108 | s 109 | } 110 | 111 | FUNCTION {output} 112 | { duplicate$ empty$ 113 | 'pop$ 114 | 'output.nonnull 115 | if$ 116 | } 117 | 118 | FUNCTION {output.check} 119 | { 't := 120 | duplicate$ empty$ 121 | { pop$ "empty " t * " in " * cite$ * warning$ } 122 | 'output.nonnull 123 | if$ 124 | } 125 | 126 | FUNCTION {fin.entry} 127 | { add.period$ 128 | write$ 129 | newline$ 130 | } 131 | 132 | FUNCTION {new.block} 133 | { output.state before.all = 134 | 'skip$ 135 | { after.block 'output.state := } 136 | if$ 137 | } 138 | 139 | FUNCTION {new.sentence} 140 | { output.state after.block = 141 | 'skip$ 142 | { output.state before.all = 143 | 'skip$ 144 | { after.sentence 'output.state := } 145 | if$ 146 | } 147 | if$ 148 | } 149 | 150 | FUNCTION {not} 151 | { { #0 } 152 | { #1 } 153 | if$ 154 | } 155 | 156 | FUNCTION {and} 157 | { 'skip$ 158 | { pop$ #0 } 159 | if$ 160 | } 161 | 162 | FUNCTION {or} 163 | { { pop$ #1 } 164 | 'skip$ 165 | if$ 166 | } 167 | 168 | FUNCTION {new.block.checka} 169 | { empty$ 170 | 'skip$ 171 | 'new.block 172 | if$ 173 | } 174 | 175 | FUNCTION {new.block.checkb} 176 | { empty$ 177 | swap$ empty$ 178 | and 179 | 'skip$ 180 | 'new.block 181 | if$ 182 | } 183 | 184 | FUNCTION {new.sentence.checka} 185 | { empty$ 186 | 'skip$ 187 | 'new.sentence 188 | if$ 189 | } 190 | 191 | FUNCTION {new.sentence.checkb} 192 | { empty$ 193 | swap$ empty$ 194 | and 195 | 'skip$ 196 | 'new.sentence 197 | if$ 198 | } 199 | 200 | FUNCTION {field.or.null} 201 | { duplicate$ empty$ 202 | { pop$ "" } 203 | 'skip$ 204 | if$ 205 | } 206 | 207 | FUNCTION {emphasize} 208 | { duplicate$ empty$ 209 | { pop$ "" } 210 | { "\emph{" swap$ * "}" * } 211 | if$ 212 | } 213 | 214 | INTEGERS { nameptr namesleft numnames } 215 | 216 | FUNCTION {format.names} 217 | { 's := 218 | #1 'nameptr := 219 | s num.names$ 'numnames := 220 | numnames 'namesleft := 221 | { namesleft #0 > } 222 | { s nameptr "{jj}{vv~}{ll,~}{ff}" format.name$ 't := 223 | nameptr #1 > 224 | { namesleft #1 > 225 | { " \& " * t * } 226 | { numnames #2 > 227 | { "" * } 228 | 'skip$ 229 | if$ 230 | t "others" = 231 | { " et~al." * } 232 | { " \& " * t * } 233 | if$ 234 | } 235 | if$ 236 | } 237 | 't 238 | if$ 239 | nameptr #1 + 'nameptr := 240 | namesleft #1 - 'namesleft := 241 | } 242 | while$ 243 | } 244 | 245 | FUNCTION {format.key} 246 | { empty$ 247 | { key field.or.null } 248 | { "" } 249 | if$ 250 | } 251 | 252 | FUNCTION {format.authors} 253 | { author empty$ 254 | { "" } 255 | { author format.names } 256 | if$ 257 | } 258 | 259 | FUNCTION {format.editors} 260 | { editor empty$ 261 | { "" } 262 | { editor format.names 263 | editor num.names$ #1 > 264 | { ", editors" * } 265 | { ", editor" * } 266 | if$ 267 | } 268 | if$ 269 | } 270 | 271 | FUNCTION {format.isbn} 272 | { isbn empty$ 273 | { "" } 274 | { new.block "ISBN " isbn * } 275 | if$ 276 | } 277 | 278 | FUNCTION {format.issn} 279 | { issn empty$ 280 | { "" } 281 | { new.block "ISSN " issn * } 282 | if$ 283 | } 284 | 285 | FUNCTION {format.url} 286 | { url empty$ 287 | { "" } 288 | { new.block "URL \url{" url * "}" * } 289 | if$ 290 | } 291 | 292 | FUNCTION {format.doi} 293 | { doi empty$ 294 | { "" } 295 | { new.block "\doi{" doi * "}" * } 296 | if$ 297 | } 298 | 299 | FUNCTION {format.title} 300 | { title empty$ 301 | { "" } 302 | { title "t" change.case$ } 303 | if$ 304 | } 305 | 306 | FUNCTION {format.full.names} 307 | {'s := 308 | #1 'nameptr := 309 | s num.names$ 'numnames := 310 | numnames 'namesleft := 311 | { namesleft #0 > } 312 | { s nameptr 313 | "{vv~}{ll}" format.name$ 't := 314 | nameptr #1 > 315 | { 316 | namesleft #1 > 317 | { ", " * t * } 318 | { 319 | numnames #2 > 320 | { "," * } 321 | 'skip$ 322 | if$ 323 | t "others" = 324 | { " et~al." * } 325 | { " and " * t * } 326 | if$ 327 | } 328 | if$ 329 | } 330 | 't 331 | if$ 332 | nameptr #1 + 'nameptr := 333 | namesleft #1 - 'namesleft := 334 | } 335 | while$ 336 | } 337 | 338 | FUNCTION {author.editor.full} 339 | { author empty$ 340 | { editor empty$ 341 | { "" } 342 | { editor format.full.names } 343 | if$ 344 | } 345 | { author format.full.names } 346 | if$ 347 | } 348 | 349 | FUNCTION {author.full} 350 | { author empty$ 351 | { "" } 352 | { author format.full.names } 353 | if$ 354 | } 355 | 356 | FUNCTION {editor.full} 357 | { editor empty$ 358 | { "" } 359 | { editor format.full.names } 360 | if$ 361 | } 362 | 363 | FUNCTION {make.full.names} 364 | { type$ "book" = 365 | type$ "inbook" = 366 | or 367 | 'author.editor.full 368 | { type$ "proceedings" = 369 | 'editor.full 370 | 'author.full 371 | if$ 372 | } 373 | if$ 374 | } 375 | 376 | FUNCTION {output.bibitem} 377 | { newline$ 378 | "\bibitem[" write$ 379 | label write$ 380 | ")" make.full.names duplicate$ short.list = 381 | { pop$ } 382 | { * } 383 | if$ 384 | "]{" * write$ 385 | cite$ write$ 386 | "}" write$ 387 | newline$ 388 | "" 389 | before.all 'output.state := 390 | } 391 | 392 | FUNCTION {n.dashify} 393 | { 't := 394 | "" 395 | { t empty$ not } 396 | { t #1 #1 substring$ "-" = 397 | { t #1 #2 substring$ "--" = not 398 | { "--" * 399 | t #2 global.max$ substring$ 't := 400 | } 401 | { { t #1 #1 substring$ "-" = } 402 | { "-" * 403 | t #2 global.max$ substring$ 't := 404 | } 405 | while$ 406 | } 407 | if$ 408 | } 409 | { t #1 #1 substring$ * 410 | t #2 global.max$ substring$ 't := 411 | } 412 | if$ 413 | } 414 | while$ 415 | } 416 | 417 | FUNCTION {format.date} 418 | { year duplicate$ empty$ 419 | { "empty year in " cite$ * warning$ 420 | pop$ "" } 421 | 'skip$ 422 | if$ 423 | month empty$ 424 | 'skip$ 425 | { month 426 | " " * swap$ * 427 | } 428 | if$ 429 | extra.label * 430 | } 431 | 432 | FUNCTION {format.btitle} 433 | { title emphasize 434 | } 435 | 436 | FUNCTION {tie.or.space.connect} 437 | { duplicate$ text.length$ #3 < 438 | { "~" } 439 | { " " } 440 | if$ 441 | swap$ * * 442 | } 443 | 444 | FUNCTION {either.or.check} 445 | { empty$ 446 | 'pop$ 447 | { "can't use both " swap$ * " fields in " * cite$ * warning$ } 448 | if$ 449 | } 450 | 451 | FUNCTION {format.bvolume} 452 | { volume empty$ 453 | { "" } 454 | { "volume" volume tie.or.space.connect 455 | series empty$ 456 | 'skip$ 457 | { " of " * series emphasize * } 458 | if$ 459 | "volume and number" number either.or.check 460 | } 461 | if$ 462 | } 463 | 464 | FUNCTION {format.number.series} 465 | { volume empty$ 466 | { number empty$ 467 | { series field.or.null } 468 | { output.state mid.sentence = 469 | { "number" } 470 | { "Number" } 471 | if$ 472 | number tie.or.space.connect 473 | series empty$ 474 | { "there's a number but no series in " cite$ * warning$ } 475 | { " in " * series * } 476 | if$ 477 | } 478 | if$ 479 | } 480 | { "" } 481 | if$ 482 | } 483 | 484 | FUNCTION {format.edition} 485 | { edition empty$ 486 | { "" } 487 | { output.state mid.sentence = 488 | { edition "l" change.case$ " edition" * } 489 | { edition "t" change.case$ " edition" * } 490 | if$ 491 | } 492 | if$ 493 | } 494 | 495 | INTEGERS { multiresult } 496 | 497 | FUNCTION {multi.page.check} 498 | { 't := 499 | #0 'multiresult := 500 | { multiresult not 501 | t empty$ not 502 | and 503 | } 504 | { t #1 #1 substring$ 505 | duplicate$ "-" = 506 | swap$ duplicate$ "," = 507 | swap$ "+" = 508 | or or 509 | { #1 'multiresult := } 510 | { t #2 global.max$ substring$ 't := } 511 | if$ 512 | } 513 | while$ 514 | multiresult 515 | } 516 | 517 | FUNCTION {format.pages} 518 | { pages empty$ 519 | { "" } 520 | { pages multi.page.check 521 | { "pages" pages n.dashify tie.or.space.connect } 522 | { "page" pages tie.or.space.connect } 523 | if$ 524 | } 525 | if$ 526 | } 527 | 528 | FUNCTION {format.eid} 529 | { eid empty$ 530 | { "" } 531 | { "art." eid tie.or.space.connect } 532 | if$ 533 | } 534 | 535 | FUNCTION {format.vol.num.pages} 536 | { volume field.or.null 537 | number empty$ 538 | 'skip$ 539 | { "\penalty0 (" number * ")" * * 540 | volume empty$ 541 | { "there's a number but no volume in " cite$ * warning$ } 542 | 'skip$ 543 | if$ 544 | } 545 | if$ 546 | pages empty$ 547 | 'skip$ 548 | { duplicate$ empty$ 549 | { pop$ format.pages } 550 | { ":\penalty0 " * pages n.dashify * } 551 | if$ 552 | } 553 | if$ 554 | } 555 | 556 | FUNCTION {format.vol.num.eid} 557 | { volume field.or.null 558 | number empty$ 559 | 'skip$ 560 | { "\penalty0 (" number * ")" * * 561 | volume empty$ 562 | { "there's a number but no volume in " cite$ * warning$ } 563 | 'skip$ 564 | if$ 565 | } 566 | if$ 567 | eid empty$ 568 | 'skip$ 569 | { duplicate$ empty$ 570 | { pop$ format.eid } 571 | { ":\penalty0 " * eid * } 572 | if$ 573 | } 574 | if$ 575 | } 576 | 577 | FUNCTION {format.chapter.pages} 578 | { chapter empty$ 579 | 'format.pages 580 | { type empty$ 581 | { "chapter" } 582 | { type "l" change.case$ } 583 | if$ 584 | chapter tie.or.space.connect 585 | pages empty$ 586 | 'skip$ 587 | { ", " * format.pages * } 588 | if$ 589 | } 590 | if$ 591 | } 592 | 593 | FUNCTION {format.in.ed.booktitle} 594 | { booktitle empty$ 595 | { "" } 596 | { editor empty$ 597 | { "In " booktitle emphasize * } 598 | { "In " format.editors * ", " * booktitle emphasize * } 599 | if$ 600 | } 601 | if$ 602 | } 603 | 604 | FUNCTION {empty.misc.check} 605 | { author empty$ title empty$ howpublished empty$ 606 | month empty$ year empty$ note empty$ 607 | and and and and and 608 | key empty$ not and 609 | { "all relevant fields are empty in " cite$ * warning$ } 610 | 'skip$ 611 | if$ 612 | } 613 | 614 | FUNCTION {format.thesis.type} 615 | { type empty$ 616 | 'skip$ 617 | { pop$ 618 | type "t" change.case$ 619 | } 620 | if$ 621 | } 622 | 623 | FUNCTION {format.tr.number} 624 | { type empty$ 625 | { "Technical Report" } 626 | 'type 627 | if$ 628 | number empty$ 629 | { "t" change.case$ } 630 | { number tie.or.space.connect } 631 | if$ 632 | } 633 | 634 | FUNCTION {format.article.crossref} 635 | { key empty$ 636 | { journal empty$ 637 | { "need key or journal for " cite$ * " to crossref " * crossref * 638 | warning$ 639 | "" 640 | } 641 | { "In \emph{" journal * "}" * } 642 | if$ 643 | } 644 | { "In " } 645 | if$ 646 | " \citet{" * crossref * "}" * 647 | } 648 | 649 | FUNCTION {format.book.crossref} 650 | { volume empty$ 651 | { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ 652 | "In " 653 | } 654 | { "Volume" volume tie.or.space.connect 655 | " of " * 656 | } 657 | if$ 658 | editor empty$ 659 | editor field.or.null author field.or.null = 660 | or 661 | { key empty$ 662 | { series empty$ 663 | { "need editor, key, or series for " cite$ * " to crossref " * 664 | crossref * warning$ 665 | "" * 666 | } 667 | { "\emph{" * series * "}" * } 668 | if$ 669 | } 670 | 'skip$ 671 | if$ 672 | } 673 | 'skip$ 674 | if$ 675 | " \citet{" * crossref * "}" * 676 | } 677 | 678 | FUNCTION {format.incoll.inproc.crossref} 679 | { editor empty$ 680 | editor field.or.null author field.or.null = 681 | or 682 | { key empty$ 683 | { booktitle empty$ 684 | { "need editor, key, or booktitle for " cite$ * " to crossref " * 685 | crossref * warning$ 686 | "" 687 | } 688 | { "In \emph{" booktitle * "}" * } 689 | if$ 690 | } 691 | { "In " } 692 | if$ 693 | } 694 | { "In " } 695 | if$ 696 | " \citet{" * crossref * "}" * 697 | } 698 | 699 | FUNCTION {article} 700 | { output.bibitem 701 | format.authors "author" output.check 702 | author format.key output 703 | new.block 704 | format.title "title" output.check 705 | new.block 706 | crossref missing$ 707 | { journal emphasize "journal" output.check 708 | eid empty$ 709 | { format.vol.num.pages output } 710 | { format.vol.num.eid output } 711 | if$ 712 | format.date "year" output.check 713 | } 714 | { format.article.crossref output.nonnull 715 | eid empty$ 716 | { format.pages output } 717 | { format.eid output } 718 | if$ 719 | } 720 | if$ 721 | format.issn output 722 | format.doi output 723 | format.url output 724 | new.block 725 | note output 726 | fin.entry 727 | } 728 | 729 | FUNCTION {book} 730 | { output.bibitem 731 | author empty$ 732 | { format.editors "author and editor" output.check 733 | editor format.key output 734 | } 735 | { format.authors output.nonnull 736 | crossref missing$ 737 | { "author and editor" editor either.or.check } 738 | 'skip$ 739 | if$ 740 | } 741 | if$ 742 | new.block 743 | format.btitle "title" output.check 744 | crossref missing$ 745 | { format.bvolume output 746 | new.block 747 | format.number.series output 748 | new.sentence 749 | publisher "publisher" output.check 750 | address output 751 | } 752 | { new.block 753 | format.book.crossref output.nonnull 754 | } 755 | if$ 756 | format.edition output 757 | format.date "year" output.check 758 | format.isbn output 759 | format.doi output 760 | format.url output 761 | new.block 762 | note output 763 | fin.entry 764 | } 765 | 766 | FUNCTION {booklet} 767 | { output.bibitem 768 | format.authors output 769 | author format.key output 770 | new.block 771 | format.title "title" output.check 772 | howpublished address new.block.checkb 773 | howpublished output 774 | address output 775 | format.date output 776 | format.isbn output 777 | format.doi output 778 | format.url output 779 | new.block 780 | note output 781 | fin.entry 782 | } 783 | 784 | FUNCTION {inbook} 785 | { output.bibitem 786 | author empty$ 787 | { format.editors "author and editor" output.check 788 | editor format.key output 789 | } 790 | { format.authors output.nonnull 791 | crossref missing$ 792 | { "author and editor" editor either.or.check } 793 | 'skip$ 794 | if$ 795 | } 796 | if$ 797 | new.block 798 | format.btitle "title" output.check 799 | crossref missing$ 800 | { format.bvolume output 801 | format.chapter.pages "chapter and pages" output.check 802 | new.block 803 | format.number.series output 804 | new.sentence 805 | publisher "publisher" output.check 806 | address output 807 | } 808 | { format.chapter.pages "chapter and pages" output.check 809 | new.block 810 | format.book.crossref output.nonnull 811 | } 812 | if$ 813 | format.edition output 814 | format.date "year" output.check 815 | format.isbn output 816 | format.doi output 817 | format.url output 818 | new.block 819 | note output 820 | fin.entry 821 | } 822 | 823 | FUNCTION {incollection} 824 | { output.bibitem 825 | format.authors "author" output.check 826 | author format.key output 827 | new.block 828 | format.title "title" output.check 829 | new.block 830 | crossref missing$ 831 | { format.in.ed.booktitle "booktitle" output.check 832 | format.bvolume output 833 | format.number.series output 834 | format.chapter.pages output 835 | new.sentence 836 | publisher "publisher" output.check 837 | address output 838 | format.edition output 839 | format.date "year" output.check 840 | } 841 | { format.incoll.inproc.crossref output.nonnull 842 | format.chapter.pages output 843 | } 844 | if$ 845 | format.isbn output 846 | format.doi output 847 | format.url output 848 | new.block 849 | note output 850 | fin.entry 851 | } 852 | 853 | FUNCTION {inproceedings} 854 | { output.bibitem 855 | format.authors "author" output.check 856 | author format.key output 857 | new.block 858 | format.title "title" output.check 859 | new.block 860 | crossref missing$ 861 | { format.in.ed.booktitle "booktitle" output.check 862 | format.bvolume output 863 | format.number.series output 864 | format.pages output 865 | address empty$ 866 | { organization publisher new.sentence.checkb 867 | organization output 868 | publisher output 869 | format.date "year" output.check 870 | } 871 | { address output.nonnull 872 | format.date "year" output.check 873 | new.sentence 874 | organization output 875 | publisher output 876 | } 877 | if$ 878 | } 879 | { format.incoll.inproc.crossref output.nonnull 880 | format.pages output 881 | } 882 | if$ 883 | format.isbn output 884 | format.doi output 885 | format.url output 886 | new.block 887 | note output 888 | fin.entry 889 | } 890 | 891 | FUNCTION {conference} { inproceedings } 892 | 893 | FUNCTION {manual} 894 | { output.bibitem 895 | format.authors output 896 | author format.key output 897 | new.block 898 | format.btitle "title" output.check 899 | organization address new.block.checkb 900 | organization output 901 | address output 902 | format.edition output 903 | format.date output 904 | format.url output 905 | new.block 906 | note output 907 | fin.entry 908 | } 909 | 910 | FUNCTION {mastersthesis} 911 | { output.bibitem 912 | format.authors "author" output.check 913 | author format.key output 914 | new.block 915 | format.title "title" output.check 916 | new.block 917 | "Master's thesis" format.thesis.type output.nonnull 918 | school "school" output.check 919 | address output 920 | format.date "year" output.check 921 | format.url output 922 | new.block 923 | note output 924 | fin.entry 925 | } 926 | 927 | FUNCTION {misc} 928 | { output.bibitem 929 | format.authors output 930 | author format.key output 931 | title howpublished new.block.checkb 932 | format.title output 933 | howpublished new.block.checka 934 | howpublished output 935 | format.date output 936 | format.issn output 937 | format.url output 938 | new.block 939 | note output 940 | fin.entry 941 | empty.misc.check 942 | } 943 | 944 | FUNCTION {phdthesis} 945 | { output.bibitem 946 | format.authors "author" output.check 947 | author format.key output 948 | new.block 949 | format.btitle "title" output.check 950 | new.block 951 | "PhD thesis" format.thesis.type output.nonnull 952 | school "school" output.check 953 | address output 954 | format.date "year" output.check 955 | format.url output 956 | new.block 957 | note output 958 | fin.entry 959 | } 960 | 961 | FUNCTION {thesis} 962 | { output.bibitem 963 | format.authors "author" output.check 964 | author format.key output 965 | new.block 966 | format.btitle "title" output.check 967 | new.block 968 | "PhD thesis" format.thesis.type output.nonnull 969 | institution 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | "institution" output.check 1035 | address output 1036 | format.date "year" output.check 1037 | format.url output 1038 | new.block 1039 | note output 1040 | fin.entry 1041 | 1042 | } 1043 | 1044 | FUNCTION {proceedings} 1045 | { output.bibitem 1046 | format.editors output 1047 | editor format.key output 1048 | new.block 1049 | format.btitle "title" output.check 1050 | format.bvolume output 1051 | format.number.series output 1052 | address output 1053 | format.date "year" output.check 1054 | new.sentence 1055 | organization output 1056 | publisher output 1057 | format.isbn output 1058 | format.doi output 1059 | format.url output 1060 | new.block 1061 | note output 1062 | fin.entry 1063 | } 1064 | 1065 | FUNCTION {techreport} 1066 | { output.bibitem 1067 | format.authors "author" output.check 1068 | author format.key output 1069 | new.block 1070 | format.title "title" output.check 1071 | new.block 1072 | format.tr.number output.nonnull 1073 | institution "institution" output.check 1074 | address output 1075 | format.date "year" output.check 1076 | format.url output 1077 | new.block 1078 | note output 1079 | fin.entry 1080 | } 1081 | 1082 | FUNCTION {unpublished} 1083 | { output.bibitem 1084 | format.authors "author" output.check 1085 | author format.key output 1086 | new.block 1087 | format.title "title" output.check 1088 | new.block 1089 | note "note" output.check 1090 | format.date output 1091 | format.url output 1092 | fin.entry 1093 | } 1094 | 1095 | FUNCTION {default.type} { misc } 1096 | 1097 | 1098 | MACRO {jan} {"January"} 1099 | 1100 | MACRO {feb} {"February"} 1101 | 1102 | MACRO {mar} {"March"} 1103 | 1104 | MACRO {apr} {"April"} 1105 | 1106 | MACRO {may} {"May"} 1107 | 1108 | MACRO {jun} {"June"} 1109 | 1110 | MACRO {jul} {"July"} 1111 | 1112 | MACRO {aug} {"August"} 1113 | 1114 | MACRO {sep} {"September"} 1115 | 1116 | MACRO {oct} {"October"} 1117 | 1118 | MACRO {nov} {"November"} 1119 | 1120 | MACRO {dec} {"December"} 1121 | 1122 | 1123 | 1124 | MACRO {acmcs} {"ACM Computing Surveys"} 1125 | 1126 | MACRO {acta} {"Acta Informatica"} 1127 | 1128 | MACRO {cacm} {"Communications of the ACM"} 1129 | 1130 | MACRO {ibmjrd} {"IBM Journal of Research and Development"} 1131 | 1132 | MACRO {ibmsj} {"IBM Systems Journal"} 1133 | 1134 | MACRO {ieeese} {"IEEE Transactions on Software Engineering"} 1135 | 1136 | MACRO {ieeetc} {"IEEE Transactions on Computers"} 1137 | 1138 | MACRO {ieeetcad} 1139 | {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} 1140 | 1141 | MACRO {ipl} {"Information Processing Letters"} 1142 | 1143 | MACRO {jacm} {"Journal of the ACM"} 1144 | 1145 | MACRO {jcss} {"Journal of Computer and System Sciences"} 1146 | 1147 | MACRO {scp} {"Science of Computer Programming"} 1148 | 1149 | MACRO {sicomp} {"SIAM Journal on Computing"} 1150 | 1151 | MACRO {tocs} {"ACM Transactions on Computer Systems"} 1152 | 1153 | MACRO {tods} {"ACM Transactions on Database Systems"} 1154 | 1155 | MACRO {tog} {"ACM Transactions on Graphics"} 1156 | 1157 | MACRO {toms} {"ACM Transactions on Mathematical Software"} 1158 | 1159 | MACRO {toois} {"ACM Transactions on Office Information Systems"} 1160 | 1161 | MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} 1162 | 1163 | MACRO {tcs} {"Theoretical Computer Science"} 1164 | 1165 | 1166 | READ 1167 | 1168 | FUNCTION {sortify} 1169 | { purify$ 1170 | "l" change.case$ 1171 | } 1172 | 1173 | INTEGERS { len } 1174 | 1175 | FUNCTION {chop.word} 1176 | { 's := 1177 | 'len := 1178 | s #1 len substring$ = 1179 | { s len #1 + global.max$ substring$ } 1180 | 's 1181 | if$ 1182 | } 1183 | 1184 | FUNCTION {format.lab.names} 1185 | { 's := 1186 | s #1 "{vv~}{ll}" format.name$ 1187 | s num.names$ duplicate$ 1188 | #2 > 1189 | { pop$ " et~al." * } 1190 | { #2 < 1191 | 'skip$ 1192 | { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = 1193 | { " et~al." * } 1194 | { " and " * s #2 "{vv~}{ll}" format.name$ * } 1195 | if$ 1196 | } 1197 | if$ 1198 | } 1199 | if$ 1200 | } 1201 | 1202 | FUNCTION {author.key.label} 1203 | { author empty$ 1204 | { key empty$ 1205 | { cite$ #1 #3 substring$ } 1206 | 'key 1207 | if$ 1208 | } 1209 | { author format.lab.names } 1210 | if$ 1211 | } 1212 | 1213 | FUNCTION {author.editor.key.label} 1214 | { author empty$ 1215 | { editor empty$ 1216 | { key empty$ 1217 | { cite$ #1 #3 substring$ } 1218 | 'key 1219 | if$ 1220 | } 1221 | { editor format.lab.names } 1222 | if$ 1223 | } 1224 | { author format.lab.names } 1225 | if$ 1226 | } 1227 | 1228 | FUNCTION {author.key.organization.label} 1229 | { author empty$ 1230 | { key empty$ 1231 | { organization empty$ 1232 | { cite$ #1 #3 substring$ } 1233 | { "The " #4 organization chop.word #3 text.prefix$ } 1234 | if$ 1235 | } 1236 | 'key 1237 | if$ 1238 | } 1239 | { author format.lab.names } 1240 | if$ 1241 | } 1242 | 1243 | FUNCTION {editor.key.organization.label} 1244 | { editor empty$ 1245 | { key empty$ 1246 | { organization empty$ 1247 | { cite$ #1 #3 substring$ } 1248 | { "The " #4 organization chop.word #3 text.prefix$ } 1249 | if$ 1250 | } 1251 | 'key 1252 | if$ 1253 | } 1254 | { editor format.lab.names } 1255 | if$ 1256 | } 1257 | 1258 | FUNCTION {calc.short.authors} 1259 | { type$ "book" = 1260 | type$ "inbook" = 1261 | or 1262 | 'author.editor.key.label 1263 | { type$ "proceedings" = 1264 | 'editor.key.organization.label 1265 | { type$ "manual" = 1266 | 'author.key.organization.label 1267 | 'author.key.label 1268 | if$ 1269 | } 1270 | if$ 1271 | } 1272 | if$ 1273 | 'short.list := 1274 | } 1275 | 1276 | FUNCTION {calc.label} 1277 | { calc.short.authors 1278 | short.list 1279 | "(" 1280 | * 1281 | year duplicate$ empty$ 1282 | short.list key field.or.null = or 1283 | { pop$ "" } 1284 | 'skip$ 1285 | if$ 1286 | * 1287 | 'label := 1288 | } 1289 | 1290 | FUNCTION {sort.format.names} 1291 | { 's := 1292 | #1 'nameptr := 1293 | "" 1294 | s num.names$ 'numnames := 1295 | numnames 'namesleft := 1296 | { namesleft #0 > } 1297 | { 1298 | s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := 1299 | nameptr #1 > 1300 | { 1301 | " " * 1302 | namesleft #1 = t "others" = and 1303 | { "zzzzz" * } 1304 | { numnames #2 > nameptr #2 = and 1305 | { "zz" * year field.or.null * " " * } 1306 | 'skip$ 1307 | if$ 1308 | t sortify * 1309 | } 1310 | if$ 1311 | } 1312 | { t sortify * } 1313 | if$ 1314 | nameptr #1 + 'nameptr := 1315 | namesleft #1 - 'namesleft := 1316 | } 1317 | while$ 1318 | } 1319 | 1320 | FUNCTION {sort.format.title} 1321 | { 't := 1322 | "A " #2 1323 | "An " #3 1324 | "The " #4 t chop.word 1325 | chop.word 1326 | chop.word 1327 | sortify 1328 | #1 global.max$ substring$ 1329 | } 1330 | 1331 | FUNCTION {author.sort} 1332 | { author empty$ 1333 | { key empty$ 1334 | { "to sort, need author or key in " cite$ * warning$ 1335 | "" 1336 | } 1337 | { key sortify } 1338 | if$ 1339 | } 1340 | { author sort.format.names } 1341 | if$ 1342 | } 1343 | 1344 | FUNCTION {author.editor.sort} 1345 | { author empty$ 1346 | { editor empty$ 1347 | { key empty$ 1348 | { "to sort, need author, editor, or key in " cite$ * warning$ 1349 | "" 1350 | } 1351 | { key sortify } 1352 | if$ 1353 | } 1354 | { editor sort.format.names } 1355 | if$ 1356 | } 1357 | { author sort.format.names } 1358 | if$ 1359 | } 1360 | 1361 | FUNCTION {author.organization.sort} 1362 | { author empty$ 1363 | { organization empty$ 1364 | { key empty$ 1365 | { "to sort, need author, organization, or key in " cite$ * warning$ 1366 | "" 1367 | } 1368 | { key sortify } 1369 | if$ 1370 | } 1371 | { "The " #4 organization chop.word sortify } 1372 | if$ 1373 | } 1374 | { author sort.format.names } 1375 | if$ 1376 | } 1377 | 1378 | FUNCTION {editor.organization.sort} 1379 | { editor empty$ 1380 | { organization empty$ 1381 | { key empty$ 1382 | { "to sort, need editor, organization, or key in " cite$ * warning$ 1383 | "" 1384 | } 1385 | { key sortify } 1386 | if$ 1387 | } 1388 | { "The " #4 organization chop.word sortify } 1389 | if$ 1390 | } 1391 | { editor sort.format.names } 1392 | if$ 1393 | } 1394 | 1395 | 1396 | FUNCTION {presort} 1397 | { calc.label 1398 | label sortify 1399 | " " 1400 | * 1401 | type$ "book" = 1402 | type$ "inbook" = 1403 | or 1404 | 'author.editor.sort 1405 | { type$ "proceedings" = 1406 | 'editor.organization.sort 1407 | { type$ "manual" = 1408 | 'author.organization.sort 1409 | 'author.sort 1410 | if$ 1411 | } 1412 | if$ 1413 | } 1414 | if$ 1415 | " " 1416 | * 1417 | year field.or.null sortify 1418 | * 1419 | " " 1420 | * 1421 | cite$ 1422 | * 1423 | #1 entry.max$ substring$ 1424 | 'sort.label := 1425 | sort.label * 1426 | #1 entry.max$ substring$ 1427 | 'sort.key$ := 1428 | } 1429 | 1430 | ITERATE {presort} 1431 | 1432 | SORT 1433 | 1434 | STRINGS { longest.label last.label next.extra } 1435 | 1436 | INTEGERS { longest.label.width last.extra.num number.label } 1437 | 1438 | FUNCTION {initialize.longest.label} 1439 | { "" 'longest.label := 1440 | #0 int.to.chr$ 'last.label := 1441 | "" 'next.extra := 1442 | #0 'longest.label.width := 1443 | #0 'last.extra.num := 1444 | #0 'number.label := 1445 | } 1446 | 1447 | FUNCTION {forward.pass} 1448 | { last.label label = 1449 | { last.extra.num #1 + 'last.extra.num := 1450 | last.extra.num int.to.chr$ 'extra.label := 1451 | } 1452 | { "a" chr.to.int$ 'last.extra.num := 1453 | "" 'extra.label := 1454 | label 'last.label := 1455 | } 1456 | if$ 1457 | number.label #1 + 'number.label := 1458 | } 1459 | 1460 | FUNCTION {reverse.pass} 1461 | { next.extra "b" = 1462 | { "a" 'extra.label := } 1463 | 'skip$ 1464 | if$ 1465 | extra.label 'next.extra := 1466 | extra.label 1467 | duplicate$ empty$ 1468 | 'skip$ 1469 | { "{\natexlab{" swap$ * "}}" * } 1470 | if$ 1471 | 'extra.label := 1472 | label extra.label * 'label := 1473 | } 1474 | 1475 | EXECUTE {initialize.longest.label} 1476 | 1477 | ITERATE {forward.pass} 1478 | 1479 | REVERSE {reverse.pass} 1480 | 1481 | FUNCTION {bib.sort.order} 1482 | { sort.label 'sort.key$ := 1483 | } 1484 | 1485 | ITERATE {bib.sort.order} 1486 | 1487 | SORT 1488 | 1489 | FUNCTION {begin.bib} 1490 | { preamble$ empty$ 1491 | 'skip$ 1492 | { preamble$ write$ newline$ } 1493 | if$ 1494 | "\begin{thebibliography}{" number.label int.to.str$ * "}" * 1495 | write$ newline$ 1496 | "\providecommand{\natexlab}[1]{#1}" 1497 | write$ newline$ 1498 | "\providecommand{\url}[1]{\texttt{#1}}" 1499 | write$ newline$ 1500 | "\expandafter\ifx\csname urlstyle\endcsname\relax" 1501 | write$ newline$ 1502 | " \providecommand{\doi}[1]{doi: #1}\else" 1503 | write$ newline$ 1504 | " \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi" 1505 | write$ newline$ 1506 | } 1507 | 1508 | EXECUTE {begin.bib} 1509 | 1510 | EXECUTE {init.state.consts} 1511 | 1512 | ITERATE {call.type$} 1513 | 1514 | FUNCTION {end.bib} 1515 | { newline$ 1516 | "\end{thebibliography}" write$ newline$ 1517 | } 1518 | 1519 | EXECUTE {end.bib} 1520 | -------------------------------------------------------------------------------- /common/project.tex: -------------------------------------------------------------------------------- 1 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 | %% Project-specific configuration 3 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 | 5 | \author{Your name} 6 | \title{Project title} 7 | % \supervisor{Your supervisor's name} 8 | % \yearofstudy{3\textsuperscript{rd}} 9 | 10 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 | -------------------------------------------------------------------------------- /common/titlepage.tex: -------------------------------------------------------------------------------- 1 | \makeatletter 2 | \begin{titlepage} 3 | 4 | % do not show the assignment name for the dissertation 5 | \iftoggle{IsDissertation} 6 | { 7 | \textbf{\Huge \@title} \\[1.5cm] 8 | } 9 | { 10 | \textbf{\Huge \@title} \\ 11 | \Large \@assignment \\[1.5cm] 12 | } 13 | \Large \textbf{\@author} \\ 14 | Department of Computer Science \\ 15 | University of Warwick \\ 16 | 17 | % include the supervisor and year of study if the are specified and its the disseration 18 | \iftoggle{IsDissertation}{ 19 | \ifdefempty{\@supervisor}{}{ 20 | Supervised by \@supervisor \\ 21 | }\ifdefempty{\@yearofstudy}{}{ 22 | Year of Study: \@yearofstudy \\ 23 | } 24 | }{} 25 | 26 | \vfill 27 | 28 | % include the current date for the dissertation 29 | \iftoggle{IsDissertation}{\today}{} 30 | 31 | \begin{adjustwidth}{-\oddsidemargin-1in}{-\rightmargin} 32 | \centering 33 | \includegraphics[width=\paperwidth]{../common/line.png} 34 | \end{adjustwidth} 35 | 36 | \vspace*{-3.5cm} 37 | 38 | \end{titlepage} 39 | \makeatother 40 | -------------------------------------------------------------------------------- /dissertation/abstract.tex: -------------------------------------------------------------------------------- 1 | \begin{abstract} 2 | Your abstract goes here. This should be about 2-3 paragraphs summarising the motivation for your project and the main outcomes (software, results, etc.) of your project. 3 | \end{abstract} -------------------------------------------------------------------------------- /dissertation/background.tex: -------------------------------------------------------------------------------- 1 | \chapter{Background} 2 | \label{ch:background} 3 | 4 | Your literature review goes here. \citet{hughes1989functional} discusses the advantages of functional programming by exploring \emph{e.g.}\ lists, trees, and noughts and crosses in a functional programming language. 5 | -------------------------------------------------------------------------------- /dissertation/conclusions.tex: -------------------------------------------------------------------------------- 1 | \chapter{Conclusions} 2 | \label{ch:conclusions} 3 | 4 | The project is a success. Summarise what you have done and accomplished. 5 | 6 | \section{Future work} 7 | 8 | Suggest what projects might follow up on this. The suggestions here should \textbf{not} be small improvements to what you have done, but more substantial work that can now be done thanks to the work you have done or research questions that have resulted from your work. -------------------------------------------------------------------------------- /dissertation/design.tex: -------------------------------------------------------------------------------- 1 | \chapter{Design} 2 | \label{ch:design} 3 | 4 | In this chapter, we describe the overall design of our solution to the problem identified in \Cref{ch:introduction}, building on work described in \Cref{ch:background}. 5 | -------------------------------------------------------------------------------- /dissertation/dissertation.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,fleqn,twoside,12pt]{report} 2 | 3 | %%%%%%%%%%%%%%%%%%%% 4 | 5 | \input{../common/common.tex} 6 | \input{../common/project.tex} 7 | 8 | \toggletrue{IsDissertation} 9 | 10 | %%%%%%%%%%%%%%%%%%%% 11 | 12 | \pagestyle{plain} 13 | \renewcommand{\headrulewidth}{0.0pt} 14 | 15 | \makeatletter 16 | \fancypagestyle{plain}{ 17 | \fancyhf{} 18 | \fancyhead[LE]{\thepage} 19 | \fancyhead[RE]{\textit{\@author}} 20 | \fancyhead[RO]{\thepage} 21 | \fancyhead[LO]{\textit{\@title}} 22 | } 23 | \makeatother 24 | 25 | %%%%%%%%%%%%%%%%%%%% 26 | 27 | \begin{document} 28 | 29 | \input{../common/titlepage.tex} 30 | 31 | \pagestyle{plain} 32 | 33 | \input{abstract.tex} 34 | 35 | \tableofcontents 36 | 37 | \input{introduction.tex} 38 | \input{background.tex} 39 | \input{design.tex} 40 | \input{implementation.tex} 41 | \input{evaluation.tex} 42 | \input{conclusions.tex} 43 | 44 | \bibliographystyle{../common/plainnat} 45 | \bibliography{../common/bibliography} 46 | 47 | \end{document} -------------------------------------------------------------------------------- /dissertation/evaluation.tex: -------------------------------------------------------------------------------- 1 | \chapter{Evaluation} 2 | \label{ch:evaluation} 3 | 4 | Describe the approaches you have used to evaluate that the solution you have designed in \Cref{ch:design} and executed in \Cref{ch:implementation} actually solves the problem identified in \Cref{ch:introduction}. 5 | 6 | While you can discuss unit testing etc. you have carried here a little bit, that is the minimum. You should present data here and discuss that. This might include \emph{e.g.} performance data you have obtained from benchmarks, survey results, or application telemetry / analytics. Tables and graphs displaying this data are good. 7 | -------------------------------------------------------------------------------- /dissertation/implementation.tex: -------------------------------------------------------------------------------- 1 | \chapter{Implementation} 2 | \label{ch:implementation} 3 | 4 | In this chapter, we describe the implementation of the design we described in \Cref{ch:design}. You should \textbf{not} describe every line of code in your implementation. Instead, you should focus on the interesting aspects of the implementation: that is, the most challenging parts that would not be obvious to an average Computer Scientist. Include diagrams, short code snippets, etc. for illustration. 5 | -------------------------------------------------------------------------------- /dissertation/introduction.tex: -------------------------------------------------------------------------------- 1 | \chapter{Introduction} 2 | \label{ch:introduction} 3 | 4 | Write around four paragraphs establishing the context and motivating your project. 5 | 6 | \section{Related work} 7 | 8 | Discuss related work. 9 | 10 | \section{Objectives} 11 | 12 | One sentence summary of your project. Followed by a short list of concrete objectives: 13 | 14 | \begin{itemize} 15 | \item Objective 1 16 | \item Objective 2 17 | \item Objective 3 18 | \end{itemize} -------------------------------------------------------------------------------- /progress-report/background.tex: -------------------------------------------------------------------------------- 1 | \section{Background} 2 | \label{sec:background} 3 | 4 | Your literature review goes here. \citet{hughes1989functional} discusses the advantages of functional programming by exploring \emph{e.g.}\ lists, trees, and noughts and crosses in a functional programming language. 5 | -------------------------------------------------------------------------------- /progress-report/introduction.tex: -------------------------------------------------------------------------------- 1 | \section{Introduction} 2 | 3 | Write around four paragraphs establishing the context and motivating your project. 4 | 5 | \subsection{Related work} 6 | 7 | Discuss related work. 8 | 9 | \subsection{Objectives} 10 | 11 | One sentence summary of your project. Followed by a short list of concrete objectives: 12 | 13 | \begin{itemize} 14 | \item Objective 1 15 | \item Objective 2 16 | \item Objective 3 17 | \end{itemize} -------------------------------------------------------------------------------- /progress-report/progress-report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,fleqn,twoside,12pt]{article} 2 | 3 | %%%%%%%%%%%%%%%%%%%% 4 | 5 | \input{../common/common.tex} 6 | \input{../common/project.tex} 7 | 8 | \assignment{Progress report} 9 | 10 | %%%%%%%%%%%%%%%%%%%% 11 | 12 | \pagestyle{plain} 13 | \renewcommand{\headrulewidth}{0.0pt} 14 | 15 | \makeatletter 16 | \fancypagestyle{plain}{ 17 | \fancyhf{} 18 | \fancyhead[LE]{\thepage} 19 | \fancyhead[RE]{\textit{\@author}} 20 | \fancyhead[RO]{\thepage} 21 | \fancyhead[LO]{\textit{\@title}} 22 | } 23 | \makeatother 24 | 25 | %%%%%%%%%%%%%%%%%%%% 26 | 27 | \begin{document} 28 | 29 | \input{../common/titlepage.tex} 30 | 31 | \pagestyle{plain} 32 | \input{introduction.tex} 33 | \input{background.tex} 34 | \input{progress.tex} 35 | \input{project-management.tex} 36 | 37 | \bibliographystyle{../common/plainnat} 38 | \bibliography{../common/bibliography} 39 | 40 | \end{document} -------------------------------------------------------------------------------- /progress-report/progress.tex: -------------------------------------------------------------------------------- 1 | \section{Progress} 2 | \label{sec:progress} 3 | 4 | Summarise the progress you have made so far. You can cross-reference other sections (\Cref{sec:background}). -------------------------------------------------------------------------------- /progress-report/project-management.tex: -------------------------------------------------------------------------------- 1 | \section{Project management} 2 | 3 | Include a timetable (in 2 week chunks) for the remainder of the academic year, up until the submission deadline. -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import {} }: 2 | let 3 | python = pkgs.python3; 4 | python-with-packages = python.withPackages (p: with p; [ 5 | pygments 6 | ]); 7 | in 8 | pkgs.mkShell { 9 | # packages = [ python-with-packages ]; 10 | buildInputs = [ 11 | pkgs.which 12 | python-with-packages 13 | (pkgs.texlive.combine { 14 | inherit (pkgs.texlive) scheme-small 15 | latexmk 16 | hyperref isodate substr cleveref 17 | titlesec xcolor changepage 18 | metafont upquote catchfile xstring 19 | minted fvextra framed mathpazo; 20 | }) 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /specification/specification.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,fleqn,12pt]{article} 2 | 3 | %%%%%%%%%%%%%%%%%%%% 4 | 5 | \input{../common/common.tex} 6 | \input{../common/project.tex} 7 | 8 | \assignment{Project specification} 9 | 10 | %%%%%%%%%%%%%%%%%%%% 11 | 12 | \pagestyle{plain} 13 | \renewcommand{\headrulewidth}{0.0pt} 14 | 15 | \makeatletter 16 | \fancypagestyle{plain}{ 17 | \fancyhf{} 18 | \fancyhead[R]{\textit{\@title} - \textit{\@assignment}} 19 | \fancyhead[L]{\textit{\@author}} 20 | \fancyfoot[C]{\thepage} 21 | } 22 | \makeatother 23 | 24 | %%%%%%%%%%%%%%%%%%%% 25 | 26 | \begin{document} 27 | 28 | \input{../common/titlepage.tex} 29 | 30 | \pagestyle{plain} 31 | 32 | \section{Introduction} 33 | 34 | % \input{introduction.tex} 35 | % \input{background.tex} 36 | % \input{progress.tex} 37 | % \input{project-management.tex} 38 | 39 | \bibliographystyle{../common/plainnat} 40 | \bibliography{../common/bibliography} 41 | 42 | \end{document} 43 | --------------------------------------------------------------------------------