From 2948ec58fbc6cbe1f135b18c6a62e07998907f4b Mon Sep 17 00:00:00 2001 From: moo Date: Mon, 1 Jun 2026 21:09:06 -0700 Subject: [PATCH 1/1] first commit --- .github/copilot-instructions.md | 259 + .github/workflows/copilot-setup-steps.yml | 48 + .github/workflows/docs-preview.yml | 154 + .github/workflows/test.yml | 51 + .gitignore | 7 + LICENSE | 20 + README.md | 337 + changelog.md | 473 ++ docs/README.md | 72 + docs/en/changelog.md | 476 ++ docs/en/external/_category_.json | 8 + docs/en/external/gistd.md | 112 + docs/en/external/pdfpc.md | 58 + docs/en/external/pympress.md | 46 + docs/en/external/touying-exporter.md | 104 + docs/en/external/typst-preview.md | 15 + docs/en/faq.md | 1040 +++ docs/en/integration/_category_.json | 8 + docs/en/integration/cetz.md | 99 + docs/en/integration/codly.md | 84 + docs/en/integration/fletcher.md | 91 + docs/en/integration/mitex.md | 38 + docs/en/integration/pinit.md | 110 + docs/en/integration/theorion.md | 88 + docs/en/intro.md | 48 + docs/en/start.md | 267 + docs/en/themes/_category_.json | 8 + docs/en/themes/aqua.md | 149 + docs/en/themes/custom.md | 62 + docs/en/themes/dewdrop.md | 177 + docs/en/themes/metropolis.md | 189 + docs/en/themes/simple.md | 126 + docs/en/themes/stargazer.md | 197 + docs/en/themes/university.md | 174 + docs/en/tutorials/_category_.json | 8 + docs/en/tutorials/build-your-own-theme.md | 449 ++ docs/en/tutorials/code-styles.md | 142 + docs/en/tutorials/dynamic/_category_.json | 8 + docs/en/tutorials/dynamic/complex.md | 105 + docs/en/tutorials/dynamic/cover.md | 66 + docs/en/tutorials/dynamic/equation.md | 51 + docs/en/tutorials/dynamic/handout.md | 78 + docs/en/tutorials/dynamic/other.md | 143 + docs/en/tutorials/dynamic/simple.md | 55 + docs/en/tutorials/dynamic/waypoints.md | 154 + docs/en/tutorials/layout.md | 259 + docs/en/tutorials/multi-file.md | 108 + docs/en/tutorials/progress/_category_.json | 8 + docs/en/tutorials/progress/counters.md | 90 + docs/en/tutorials/progress/sections.md | 172 + docs/en/tutorials/sections.md | 138 + docs/en/tutorials/settings.md | 219 + docs/en/tutorials/utilities/_category_.json | 8 + docs/en/tutorials/utilities/fit-to.md | 83 + docs/zh/changelog.md | 476 ++ docs/zh/external/_category_.json | 8 + docs/zh/external/gistd.md | 112 + docs/zh/external/pdfpc.md | 60 + docs/zh/external/pympress.md | 46 + docs/zh/external/touying-exporter.md | 102 + docs/zh/external/typst-preview.md | 15 + docs/zh/faq.md | 1046 +++ docs/zh/integration/_category_.json | 8 + docs/zh/integration/cetz.md | 99 + docs/zh/integration/codly.md | 84 + docs/zh/integration/fletcher.md | 91 + docs/zh/integration/mitex.md | 38 + docs/zh/integration/pinit.md | 112 + docs/zh/integration/theorion.md | 89 + docs/zh/intro.md | 47 + docs/zh/start.md | 265 + docs/zh/themes/_category_.json | 8 + docs/zh/themes/aqua.md | 147 + docs/zh/themes/custom.md | 62 + docs/zh/themes/dewdrop.md | 174 + docs/zh/themes/metropolis.md | 189 + docs/zh/themes/simple.md | 124 + docs/zh/themes/stargazer.md | 195 + docs/zh/themes/university.md | 173 + docs/zh/tutorials/_category_.json | 8 + docs/zh/tutorials/build-your-own-theme.md | 511 ++ docs/zh/tutorials/code-styles.md | 143 + docs/zh/tutorials/dynamic/_category_.json | 8 + docs/zh/tutorials/dynamic/complex.md | 101 + docs/zh/tutorials/dynamic/cover.md | 74 + docs/zh/tutorials/dynamic/equation.md | 47 + docs/zh/tutorials/dynamic/handout.md | 78 + docs/zh/tutorials/dynamic/other.md | 144 + docs/zh/tutorials/dynamic/simple.md | 50 + docs/zh/tutorials/dynamic/waypoints.md | 155 + docs/zh/tutorials/layout.md | 262 + docs/zh/tutorials/multi-file.md | 111 + docs/zh/tutorials/progress/_category_.json | 8 + docs/zh/tutorials/progress/counters.md | 90 + docs/zh/tutorials/progress/sections.md | 138 + docs/zh/tutorials/sections.md | 140 + docs/zh/tutorials/settings.md | 212 + docs/zh/tutorials/utilities/_category_.json | 8 + docs/zh/tutorials/utilities/fit-to.md | 86 + examples/aqua-zh.typ | 43 + examples/aqua.typ | 38 + examples/default.typ | 56 + examples/dewdrop.typ | 64 + examples/example.typ | 235 + examples/metropolis.typ | 61 + examples/simple.typ | 38 + examples/stargazer.typ | 67 + examples/university.typ | 47 + examples/waypoints.typ | 744 ++ ironclaw.png | Bin 0 -> 107262 bytes lib.typ | 66 + logo.png | Bin 0 -> 33941 bytes poster.png | Bin 0 -> 161479 bytes src/components.typ | 1093 +++ src/configs.typ | 986 +++ src/core.typ | 5966 +++++++++++++++++ src/exports.typ | 51 + src/extern.typ | 5 + src/magic.typ | 225 + src/pdfpc.typ | 202 + src/slides.typ | 124 + src/utils.typ | 2735 ++++++++ tests/.gitignore | 4 + tests/examples/example/ref/1.png | Bin 0 -> 9655 bytes tests/examples/example/ref/10.png | Bin 0 -> 32082 bytes tests/examples/example/ref/11.png | Bin 0 -> 32096 bytes tests/examples/example/ref/12.png | Bin 0 -> 16004 bytes tests/examples/example/ref/13.png | Bin 0 -> 21295 bytes tests/examples/example/ref/14.png | Bin 0 -> 28014 bytes tests/examples/example/ref/15.png | Bin 0 -> 13551 bytes tests/examples/example/ref/16.png | Bin 0 -> 13775 bytes tests/examples/example/ref/17.png | Bin 0 -> 14079 bytes tests/examples/example/ref/18.png | Bin 0 -> 27576 bytes tests/examples/example/ref/19.png | Bin 0 -> 30525 bytes tests/examples/example/ref/2.png | Bin 0 -> 57489 bytes tests/examples/example/ref/20.png | Bin 0 -> 40680 bytes tests/examples/example/ref/21.png | Bin 0 -> 3133 bytes tests/examples/example/ref/22.png | Bin 0 -> 50849 bytes tests/examples/example/ref/23.png | Bin 0 -> 56688 bytes tests/examples/example/ref/24.png | Bin 0 -> 26213 bytes tests/examples/example/ref/25.png | Bin 0 -> 2782 bytes tests/examples/example/ref/26.png | Bin 0 -> 13091 bytes tests/examples/example/ref/27.png | Bin 0 -> 44554 bytes tests/examples/example/ref/28.png | Bin 0 -> 102413 bytes tests/examples/example/ref/29.png | Bin 0 -> 68389 bytes tests/examples/example/ref/3.png | Bin 0 -> 3169 bytes tests/examples/example/ref/30.png | Bin 0 -> 3264 bytes tests/examples/example/ref/31.png | Bin 0 -> 14308 bytes tests/examples/example/ref/4.png | Bin 0 -> 14728 bytes tests/examples/example/ref/5.png | Bin 0 -> 20602 bytes tests/examples/example/ref/6.png | Bin 0 -> 27623 bytes tests/examples/example/ref/7.png | Bin 0 -> 27739 bytes tests/examples/example/ref/8.png | Bin 0 -> 31223 bytes tests/examples/example/ref/9.png | Bin 0 -> 28627 bytes tests/examples/example/test.typ | 233 + tests/features/alert/ref/1.png | Bin 0 -> 22619 bytes tests/features/alert/ref/2.png | Bin 0 -> 33284 bytes tests/features/alert/ref/3.png | Bin 0 -> 42879 bytes tests/features/alert/ref/4.png | Bin 0 -> 29477 bytes tests/features/alert/ref/5.png | Bin 0 -> 43650 bytes tests/features/alert/test.typ | 20 + tests/features/animation/ref/1.png | Bin 0 -> 2616 bytes tests/features/animation/ref/10.png | Bin 0 -> 8086 bytes tests/features/animation/ref/11.png | Bin 0 -> 11301 bytes tests/features/animation/ref/12.png | Bin 0 -> 15059 bytes tests/features/animation/ref/13.png | Bin 0 -> 3928 bytes tests/features/animation/ref/14.png | Bin 0 -> 4060 bytes tests/features/animation/ref/15.png | Bin 0 -> 4255 bytes tests/features/animation/ref/16.png | Bin 0 -> 7071 bytes tests/features/animation/ref/17.png | Bin 0 -> 7520 bytes tests/features/animation/ref/18.png | Bin 0 -> 7712 bytes tests/features/animation/ref/19.png | Bin 0 -> 20424 bytes tests/features/animation/ref/2.png | Bin 0 -> 7239 bytes tests/features/animation/ref/20.png | Bin 0 -> 23193 bytes tests/features/animation/ref/21.png | Bin 0 -> 33746 bytes tests/features/animation/ref/22.png | Bin 0 -> 4107 bytes tests/features/animation/ref/23.png | Bin 0 -> 6079 bytes tests/features/animation/ref/24.png | Bin 0 -> 8233 bytes tests/features/animation/ref/25.png | Bin 0 -> 8093 bytes tests/features/animation/ref/26.png | Bin 0 -> 5803 bytes tests/features/animation/ref/27.png | Bin 0 -> 7352 bytes tests/features/animation/ref/28.png | Bin 0 -> 7255 bytes tests/features/animation/ref/29.png | Bin 0 -> 1776 bytes tests/features/animation/ref/3.png | Bin 0 -> 11206 bytes tests/features/animation/ref/30.png | Bin 0 -> 10100 bytes tests/features/animation/ref/31.png | Bin 0 -> 10293 bytes tests/features/animation/ref/32.png | Bin 0 -> 14304 bytes tests/features/animation/ref/33.png | Bin 0 -> 14304 bytes tests/features/animation/ref/34.png | Bin 0 -> 14476 bytes tests/features/animation/ref/35.png | Bin 0 -> 13266 bytes tests/features/animation/ref/36.png | Bin 0 -> 14530 bytes tests/features/animation/ref/37.png | Bin 0 -> 14927 bytes tests/features/animation/ref/38.png | Bin 0 -> 6335 bytes tests/features/animation/ref/39.png | Bin 0 -> 5991 bytes tests/features/animation/ref/4.png | Bin 0 -> 15455 bytes tests/features/animation/ref/5.png | Bin 0 -> 15220 bytes tests/features/animation/ref/6.png | Bin 0 -> 17765 bytes tests/features/animation/ref/7.png | Bin 0 -> 15830 bytes tests/features/animation/ref/8.png | Bin 0 -> 18376 bytes tests/features/animation/ref/9.png | Bin 0 -> 18378 bytes tests/features/animation/test.typ | 321 + tests/features/appendix/ref/1.png | Bin 0 -> 3083 bytes tests/features/appendix/ref/2.png | Bin 0 -> 6908 bytes tests/features/appendix/ref/3.png | Bin 0 -> 2610 bytes tests/features/appendix/ref/4.png | Bin 0 -> 7146 bytes tests/features/appendix/test.typ | 18 + tests/features/bibliography/ref/1.png | Bin 0 -> 1679 bytes tests/features/bibliography/ref/2.png | Bin 0 -> 8470 bytes tests/features/bibliography/ref/3.png | Bin 0 -> 13918 bytes tests/features/bibliography/test.typ | 27 + tests/features/breakable/ref/1.png | Bin 0 -> 17957 bytes tests/features/breakable/ref/2.png | Bin 0 -> 318988 bytes tests/features/breakable/ref/3.png | Bin 0 -> 284755 bytes tests/features/breakable/test.typ | 24 + tests/features/colors-config/ref/1.png | Bin 0 -> 13796 bytes tests/features/colors-config/ref/2.png | Bin 0 -> 9515 bytes tests/features/colors-config/ref/3.png | Bin 0 -> 2612 bytes tests/features/colors-config/ref/4.png | Bin 0 -> 2287 bytes tests/features/colors-config/ref/5.png | Bin 0 -> 4086 bytes tests/features/colors-config/ref/6.png | Bin 0 -> 3463 bytes tests/features/colors-config/test.typ | 62 + tests/features/complex/ref/1.png | Bin 0 -> 3851 bytes tests/features/complex/ref/10.png | Bin 0 -> 5416 bytes tests/features/complex/ref/11.png | Bin 0 -> 5742 bytes tests/features/complex/ref/12.png | Bin 0 -> 5742 bytes tests/features/complex/ref/13.png | Bin 0 -> 7332 bytes tests/features/complex/ref/14.png | Bin 0 -> 7302 bytes tests/features/complex/ref/15.png | Bin 0 -> 7742 bytes tests/features/complex/ref/16.png | Bin 0 -> 7303 bytes tests/features/complex/ref/17.png | Bin 0 -> 7345 bytes tests/features/complex/ref/18.png | Bin 0 -> 7782 bytes tests/features/complex/ref/2.png | Bin 0 -> 15840 bytes tests/features/complex/ref/3.png | Bin 0 -> 18237 bytes tests/features/complex/ref/4.png | Bin 0 -> 15963 bytes tests/features/complex/ref/5.png | Bin 0 -> 18567 bytes tests/features/complex/ref/6.png | Bin 0 -> 18570 bytes tests/features/complex/ref/7.png | Bin 0 -> 5140 bytes tests/features/complex/ref/8.png | Bin 0 -> 5515 bytes tests/features/complex/ref/9.png | Bin 0 -> 5303 bytes tests/features/complex/test.typ | 69 + tests/features/cover-spacing/ref/1.png | Bin 0 -> 1214 bytes tests/features/cover-spacing/ref/10.png | Bin 0 -> 8293 bytes tests/features/cover-spacing/ref/11.png | Bin 0 -> 9349 bytes tests/features/cover-spacing/ref/12.png | Bin 0 -> 10759 bytes tests/features/cover-spacing/ref/13.png | Bin 0 -> 12289 bytes tests/features/cover-spacing/ref/14.png | Bin 0 -> 11633 bytes tests/features/cover-spacing/ref/15.png | Bin 0 -> 15872 bytes tests/features/cover-spacing/ref/16.png | Bin 0 -> 12366 bytes tests/features/cover-spacing/ref/17.png | Bin 0 -> 17009 bytes tests/features/cover-spacing/ref/18.png | Bin 0 -> 12245 bytes tests/features/cover-spacing/ref/19.png | Bin 0 -> 16837 bytes tests/features/cover-spacing/ref/2.png | Bin 0 -> 3032 bytes tests/features/cover-spacing/ref/20.png | Bin 0 -> 7858 bytes tests/features/cover-spacing/ref/21.png | Bin 0 -> 5802 bytes tests/features/cover-spacing/ref/22.png | Bin 0 -> 12003 bytes tests/features/cover-spacing/ref/23.png | Bin 0 -> 11319 bytes tests/features/cover-spacing/ref/24.png | Bin 0 -> 12331 bytes tests/features/cover-spacing/ref/25.png | Bin 0 -> 13291 bytes tests/features/cover-spacing/ref/26.png | Bin 0 -> 11923 bytes tests/features/cover-spacing/ref/27.png | Bin 0 -> 12226 bytes tests/features/cover-spacing/ref/28.png | Bin 0 -> 11838 bytes tests/features/cover-spacing/ref/29.png | Bin 0 -> 12252 bytes tests/features/cover-spacing/ref/3.png | Bin 0 -> 3481 bytes tests/features/cover-spacing/ref/4.png | Bin 0 -> 3525 bytes tests/features/cover-spacing/ref/5.png | Bin 0 -> 4901 bytes tests/features/cover-spacing/ref/6.png | Bin 0 -> 6679 bytes tests/features/cover-spacing/ref/7.png | Bin 0 -> 9455 bytes tests/features/cover-spacing/ref/8.png | Bin 0 -> 3593 bytes tests/features/cover-spacing/ref/9.png | Bin 0 -> 4700 bytes tests/features/cover-spacing/test.typ | 364 + tests/features/cover/ref/1.png | Bin 0 -> 3952 bytes tests/features/cover/ref/10.png | Bin 0 -> 12541 bytes tests/features/cover/ref/11.png | Bin 0 -> 14222 bytes tests/features/cover/ref/12.png | Bin 0 -> 14684 bytes tests/features/cover/ref/13.png | Bin 0 -> 21665 bytes tests/features/cover/ref/14.png | Bin 0 -> 22942 bytes tests/features/cover/ref/15.png | Bin 0 -> 23307 bytes tests/features/cover/ref/16.png | Bin 0 -> 12470 bytes tests/features/cover/ref/17.png | Bin 0 -> 14438 bytes tests/features/cover/ref/18.png | Bin 0 -> 15000 bytes tests/features/cover/ref/19.png | Bin 0 -> 22701 bytes tests/features/cover/ref/2.png | Bin 0 -> 15246 bytes tests/features/cover/ref/20.png | Bin 0 -> 24715 bytes tests/features/cover/ref/21.png | Bin 0 -> 25143 bytes tests/features/cover/ref/3.png | Bin 0 -> 17694 bytes tests/features/cover/ref/4.png | Bin 0 -> 12615 bytes tests/features/cover/ref/5.png | Bin 0 -> 13290 bytes tests/features/cover/ref/6.png | Bin 0 -> 14011 bytes tests/features/cover/ref/7.png | Bin 0 -> 14373 bytes tests/features/cover/ref/8.png | Bin 0 -> 9401 bytes tests/features/cover/ref/9.png | Bin 0 -> 14385 bytes tests/features/cover/test.typ | 126 + tests/features/custom-outline/ref/1.png | Bin 0 -> 7852 bytes tests/features/custom-outline/ref/2.png | Bin 0 -> 5525 bytes tests/features/custom-outline/ref/3.png | Bin 0 -> 10182 bytes tests/features/custom-outline/ref/4.png | Bin 0 -> 6318 bytes tests/features/custom-outline/ref/5.png | Bin 0 -> 35292 bytes tests/features/custom-outline/ref/6.png | Bin 0 -> 7573 bytes tests/features/custom-outline/ref/7.png | Bin 0 -> 6833 bytes tests/features/custom-outline/ref/8.png | Bin 0 -> 8115 bytes tests/features/custom-outline/ref/9.png | Bin 0 -> 6242 bytes tests/features/custom-outline/test.typ | 65 + tests/features/default-composer/ref/1.png | Bin 0 -> 152334 bytes tests/features/default-composer/ref/2.png | Bin 0 -> 145982 bytes tests/features/default-composer/test.typ | 26 + tests/features/equation/ref/1.png | Bin 0 -> 4558 bytes tests/features/equation/ref/10.png | Bin 0 -> 29262 bytes tests/features/equation/ref/2.png | Bin 0 -> 10590 bytes tests/features/equation/ref/3.png | Bin 0 -> 11224 bytes tests/features/equation/ref/4.png | Bin 0 -> 11721 bytes tests/features/equation/ref/5.png | Bin 0 -> 20443 bytes tests/features/equation/ref/6.png | Bin 0 -> 23068 bytes tests/features/equation/ref/7.png | Bin 0 -> 26325 bytes tests/features/equation/ref/8.png | Bin 0 -> 26097 bytes tests/features/equation/ref/9.png | Bin 0 -> 27862 bytes tests/features/equation/test.typ | 52 + tests/features/fit-to/ref/1.png | Bin 0 -> 1823 bytes tests/features/fit-to/ref/2.png | Bin 0 -> 43214 bytes tests/features/fit-to/ref/3.png | Bin 0 -> 48761 bytes tests/features/fit-to/ref/4.png | Bin 0 -> 51102 bytes tests/features/fit-to/ref/5.png | Bin 0 -> 6342 bytes tests/features/fit-to/test.typ | 30 + tests/features/footnote/ref/1.png | Bin 0 -> 22678 bytes tests/features/footnote/ref/2.png | Bin 0 -> 46489 bytes tests/features/footnote/ref/3.png | Bin 0 -> 63531 bytes tests/features/footnote/test.typ | 15 + tests/features/get-config/ref/1.png | Bin 0 -> 9498 bytes tests/features/get-config/ref/2.png | Bin 0 -> 16381 bytes tests/features/get-config/test.typ | 31 + tests/features/handout-only/ref/1.png | Bin 0 -> 51245 bytes tests/features/handout-only/ref/2.png | Bin 0 -> 38599 bytes tests/features/handout-only/test.typ | 17 + tests/features/handout-subslides/ref/1.png | Bin 0 -> 8949 bytes tests/features/handout-subslides/ref/2.png | Bin 0 -> 8423 bytes tests/features/handout-subslides/ref/3.png | Bin 0 -> 8475 bytes tests/features/handout-subslides/ref/4.png | Bin 0 -> 9735 bytes tests/features/handout-subslides/ref/5.png | Bin 0 -> 9738 bytes tests/features/handout-subslides/ref/6.png | Bin 0 -> 9370 bytes tests/features/handout-subslides/ref/7.png | Bin 0 -> 9375 bytes tests/features/handout-subslides/test.typ | 50 + tests/features/handout/ref/1.png | Bin 0 -> 3673 bytes tests/features/handout/ref/2.png | Bin 0 -> 12258 bytes tests/features/handout/ref/3.png | Bin 0 -> 9291 bytes tests/features/handout/test.typ | 28 + tests/features/headers-footers/ref/1.png | Bin 0 -> 10468 bytes tests/features/headers-footers/ref/2.png | Bin 0 -> 13869 bytes tests/features/headers-footers/ref/3.png | Bin 0 -> 12729 bytes tests/features/headers-footers/ref/4.png | Bin 0 -> 4136 bytes tests/features/headers-footers/ref/5.png | Bin 0 -> 5989 bytes tests/features/headers-footers/test.typ | 61 + tests/features/here/ref/1.png | Bin 0 -> 25620 bytes tests/features/here/ref/10.png | Bin 0 -> 33568 bytes tests/features/here/ref/11.png | Bin 0 -> 30297 bytes tests/features/here/ref/12.png | Bin 0 -> 35854 bytes tests/features/here/ref/13.png | Bin 0 -> 38097 bytes tests/features/here/ref/2.png | Bin 0 -> 20111 bytes tests/features/here/ref/3.png | Bin 0 -> 23667 bytes tests/features/here/ref/4.png | Bin 0 -> 22290 bytes tests/features/here/ref/5.png | Bin 0 -> 19907 bytes tests/features/here/ref/6.png | Bin 0 -> 25411 bytes tests/features/here/ref/7.png | Bin 0 -> 22087 bytes tests/features/here/ref/8.png | Bin 0 -> 37113 bytes tests/features/here/ref/9.png | Bin 0 -> 37113 bytes tests/features/here/test.typ | 39 + tests/features/inversion/ref/1.png | Bin 0 -> 26336 bytes tests/features/inversion/ref/10.png | Bin 0 -> 29629 bytes tests/features/inversion/ref/2.png | Bin 0 -> 32974 bytes tests/features/inversion/ref/3.png | Bin 0 -> 35327 bytes tests/features/inversion/ref/4.png | Bin 0 -> 31623 bytes tests/features/inversion/ref/5.png | Bin 0 -> 30100 bytes tests/features/inversion/ref/6.png | Bin 0 -> 28748 bytes tests/features/inversion/ref/7.png | Bin 0 -> 31016 bytes tests/features/inversion/ref/8.png | Bin 0 -> 27332 bytes tests/features/inversion/ref/9.png | Bin 0 -> 24919 bytes tests/features/inversion/test.typ | 33 + tests/features/item-by-item/ref/1.png | Bin 0 -> 9588 bytes tests/features/item-by-item/ref/2.png | Bin 0 -> 18532 bytes tests/features/item-by-item/ref/3.png | Bin 0 -> 24547 bytes tests/features/item-by-item/ref/4.png | Bin 0 -> 13223 bytes tests/features/item-by-item/ref/5.png | Bin 0 -> 22494 bytes tests/features/item-by-item/ref/6.png | Bin 0 -> 27284 bytes tests/features/item-by-item/test.typ | 103 + tests/features/layout/ref/1.png | Bin 0 -> 4020 bytes tests/features/layout/ref/2.png | Bin 0 -> 6360 bytes tests/features/layout/ref/3.png | Bin 0 -> 8628 bytes tests/features/layout/ref/4.png | Bin 0 -> 16315 bytes tests/features/layout/test.typ | 36 + tests/features/lazy-layout/ref/1.png | Bin 0 -> 2849 bytes tests/features/lazy-layout/ref/2.png | Bin 0 -> 11089 bytes tests/features/lazy-layout/ref/3.png | Bin 0 -> 24910 bytes tests/features/lazy-layout/ref/4.png | Bin 0 -> 22149 bytes tests/features/lazy-layout/ref/5.png | Bin 0 -> 23966 bytes tests/features/lazy-layout/ref/6.png | Bin 0 -> 29050 bytes tests/features/lazy-layout/ref/7.png | Bin 0 -> 2821 bytes tests/features/lazy-layout/ref/8.png | Bin 0 -> 8154 bytes tests/features/lazy-layout/ref/9.png | Bin 0 -> 13886 bytes tests/features/lazy-layout/test.typ | 132 + tests/features/math-numbering/ref/1.png | Bin 0 -> 5077 bytes tests/features/math-numbering/ref/2.png | Bin 0 -> 9400 bytes tests/features/math-numbering/ref/3.png | Bin 0 -> 11941 bytes tests/features/math-numbering/test.typ | 20 + tests/features/outline/ref/1.png | Bin 0 -> 14471 bytes tests/features/outline/ref/2.png | Bin 0 -> 3064 bytes tests/features/outline/ref/3.png | Bin 0 -> 6579 bytes tests/features/outline/ref/4.png | Bin 0 -> 7121 bytes tests/features/outline/ref/5.png | Bin 0 -> 3468 bytes tests/features/outline/ref/6.png | Bin 0 -> 6778 bytes tests/features/outline/test.typ | 27 + tests/features/pagination/ref/1.png | Bin 0 -> 2827 bytes tests/features/pagination/ref/2.png | Bin 0 -> 53956 bytes tests/features/pagination/ref/3.png | Bin 0 -> 49973 bytes tests/features/pagination/test.typ | 10 + tests/features/raw/ref/1.png | Bin 0 -> 35856 bytes tests/features/raw/ref/2.png | Bin 0 -> 44636 bytes tests/features/raw/ref/3.png | Bin 0 -> 28752 bytes tests/features/raw/ref/4.png | Bin 0 -> 32731 bytes tests/features/raw/ref/5.png | Bin 0 -> 21626 bytes tests/features/raw/ref/6.png | Bin 0 -> 28122 bytes tests/features/raw/test.typ | 40 + tests/features/recall-subslide/ref/1.png | Bin 0 -> 4120 bytes tests/features/recall-subslide/ref/10.png | Bin 0 -> 5702 bytes tests/features/recall-subslide/ref/11.png | Bin 0 -> 6910 bytes tests/features/recall-subslide/ref/12.png | Bin 0 -> 7974 bytes tests/features/recall-subslide/ref/13.png | Bin 0 -> 7180 bytes tests/features/recall-subslide/ref/14.png | Bin 0 -> 6019 bytes tests/features/recall-subslide/ref/15.png | Bin 0 -> 8558 bytes tests/features/recall-subslide/ref/16.png | Bin 0 -> 8803 bytes tests/features/recall-subslide/ref/17.png | Bin 0 -> 5711 bytes tests/features/recall-subslide/ref/18.png | Bin 0 -> 7977 bytes tests/features/recall-subslide/ref/19.png | Bin 0 -> 8035 bytes tests/features/recall-subslide/ref/2.png | Bin 0 -> 4716 bytes tests/features/recall-subslide/ref/20.png | Bin 0 -> 7077 bytes tests/features/recall-subslide/ref/21.png | Bin 0 -> 8173 bytes tests/features/recall-subslide/ref/22.png | Bin 0 -> 6848 bytes tests/features/recall-subslide/ref/23.png | Bin 0 -> 7288 bytes tests/features/recall-subslide/ref/3.png | Bin 0 -> 5883 bytes tests/features/recall-subslide/ref/4.png | Bin 0 -> 4151 bytes tests/features/recall-subslide/ref/5.png | Bin 0 -> 4761 bytes tests/features/recall-subslide/ref/6.png | Bin 0 -> 6248 bytes tests/features/recall-subslide/ref/7.png | Bin 0 -> 4907 bytes tests/features/recall-subslide/ref/8.png | Bin 0 -> 8128 bytes tests/features/recall-subslide/ref/9.png | Bin 0 -> 5778 bytes tests/features/recall-subslide/test.typ | 61 + tests/features/recall/ref/1.png | Bin 0 -> 4346 bytes tests/features/recall/ref/10.png | Bin 0 -> 6585 bytes tests/features/recall/ref/11.png | Bin 0 -> 10352 bytes tests/features/recall/ref/12.png | Bin 0 -> 9983 bytes tests/features/recall/ref/2.png | Bin 0 -> 13493 bytes tests/features/recall/ref/3.png | Bin 0 -> 10363 bytes tests/features/recall/ref/4.png | Bin 0 -> 8092 bytes tests/features/recall/ref/5.png | Bin 0 -> 13518 bytes tests/features/recall/ref/6.png | Bin 0 -> 8516 bytes tests/features/recall/ref/7.png | Bin 0 -> 10442 bytes tests/features/recall/ref/8.png | Bin 0 -> 11265 bytes tests/features/recall/ref/9.png | Bin 0 -> 13526 bytes tests/features/recall/test.typ | 47 + tests/features/show-notes/ref/1.png | Bin 0 -> 3160 bytes tests/features/show-notes/ref/2.png | Bin 0 -> 15339 bytes tests/features/show-notes/ref/3.png | Bin 0 -> 4370 bytes tests/features/show-notes/ref/4.png | Bin 0 -> 5388 bytes tests/features/show-notes/ref/5.png | Bin 0 -> 8968 bytes tests/features/show-notes/ref/6.png | Bin 0 -> 8849 bytes tests/features/show-notes/ref/7.png | Bin 0 -> 14996 bytes tests/features/show-notes/test.typ | 44 + tests/features/show-rules/ref/1.png | Bin 0 -> 3696 bytes tests/features/show-rules/ref/10.png | Bin 0 -> 9208 bytes tests/features/show-rules/ref/11.png | Bin 0 -> 13429 bytes tests/features/show-rules/ref/12.png | Bin 0 -> 15843 bytes tests/features/show-rules/ref/13.png | Bin 0 -> 18407 bytes tests/features/show-rules/ref/14.png | Bin 0 -> 4325 bytes tests/features/show-rules/ref/15.png | Bin 0 -> 15777 bytes tests/features/show-rules/ref/16.png | Bin 0 -> 16256 bytes tests/features/show-rules/ref/17.png | Bin 0 -> 4499 bytes tests/features/show-rules/ref/18.png | Bin 0 -> 15696 bytes tests/features/show-rules/ref/19.png | Bin 0 -> 15987 bytes tests/features/show-rules/ref/2.png | Bin 0 -> 7672 bytes tests/features/show-rules/ref/20.png | Bin 0 -> 4663 bytes tests/features/show-rules/ref/21.png | Bin 0 -> 20417 bytes tests/features/show-rules/ref/22.png | Bin 0 -> 28110 bytes tests/features/show-rules/ref/3.png | Bin 0 -> 9375 bytes tests/features/show-rules/ref/4.png | Bin 0 -> 11203 bytes tests/features/show-rules/ref/5.png | Bin 0 -> 4576 bytes tests/features/show-rules/ref/6.png | Bin 0 -> 8929 bytes tests/features/show-rules/ref/7.png | Bin 0 -> 13877 bytes tests/features/show-rules/ref/8.png | Bin 0 -> 13930 bytes tests/features/show-rules/ref/9.png | Bin 0 -> 15209 bytes tests/features/show-rules/test.typ | 125 + tests/features/simple/ref/1.png | Bin 0 -> 3726 bytes tests/features/simple/ref/2.png | Bin 0 -> 3435 bytes tests/features/simple/ref/3.png | Bin 0 -> 4267 bytes tests/features/simple/ref/4.png | Bin 0 -> 4828 bytes tests/features/simple/ref/5.png | Bin 0 -> 4657 bytes tests/features/simple/ref/6.png | Bin 0 -> 5970 bytes tests/features/simple/test.typ | 30 + tests/features/slide-levels/ref/1.png | Bin 0 -> 5252 bytes tests/features/slide-levels/ref/10.png | Bin 0 -> 22140 bytes tests/features/slide-levels/ref/2.png | Bin 0 -> 15172 bytes tests/features/slide-levels/ref/3.png | Bin 0 -> 13186 bytes tests/features/slide-levels/ref/4.png | Bin 0 -> 13575 bytes tests/features/slide-levels/ref/5.png | Bin 0 -> 8851 bytes tests/features/slide-levels/ref/6.png | Bin 0 -> 9036 bytes tests/features/slide-levels/ref/7.png | Bin 0 -> 25381 bytes tests/features/slide-levels/ref/8.png | Bin 0 -> 9320 bytes tests/features/slide-levels/ref/9.png | Bin 0 -> 4577 bytes tests/features/slide-levels/test.typ | 69 + .../ref/1.png | Bin 0 -> 13956 bytes .../ref/2.png | Bin 0 -> 12331 bytes .../ref/3.png | Bin 0 -> 13283 bytes .../ref/4.png | Bin 0 -> 18257 bytes .../ref/5.png | Bin 0 -> 13959 bytes .../speaker-note-after-section-slide/test.typ | 31 + .../speaker-note-after-slide/ref/1.png | Bin 0 -> 6981 bytes .../speaker-note-after-slide/ref/2.png | Bin 0 -> 19107 bytes .../speaker-note-after-slide/ref/3.png | Bin 0 -> 18518 bytes .../speaker-note-after-slide/ref/4.png | Bin 0 -> 19653 bytes .../speaker-note-after-slide/ref/5.png | Bin 0 -> 18927 bytes .../speaker-note-after-slide/ref/6.png | Bin 0 -> 19776 bytes .../speaker-note-after-slide/test.typ | 43 + tests/features/speaker-notes/ref/1.png | Bin 0 -> 6114 bytes tests/features/speaker-notes/ref/2.png | Bin 0 -> 21623 bytes tests/features/speaker-notes/ref/3.png | Bin 0 -> 27852 bytes tests/features/speaker-notes/ref/4.png | Bin 0 -> 26134 bytes tests/features/speaker-notes/ref/5.png | Bin 0 -> 20486 bytes tests/features/speaker-notes/ref/6.png | Bin 0 -> 26096 bytes tests/features/speaker-notes/test.typ | 54 + tests/features/waypoints/ref/1.png | Bin 0 -> 5351 bytes tests/features/waypoints/ref/10.png | Bin 0 -> 5314 bytes tests/features/waypoints/ref/100.png | Bin 0 -> 10890 bytes tests/features/waypoints/ref/101.png | Bin 0 -> 6536 bytes tests/features/waypoints/ref/102.png | Bin 0 -> 11384 bytes tests/features/waypoints/ref/103.png | Bin 0 -> 7856 bytes tests/features/waypoints/ref/104.png | Bin 0 -> 10046 bytes tests/features/waypoints/ref/105.png | Bin 0 -> 7112 bytes tests/features/waypoints/ref/106.png | Bin 0 -> 7339 bytes tests/features/waypoints/ref/107.png | Bin 0 -> 12185 bytes tests/features/waypoints/ref/108.png | Bin 0 -> 10900 bytes tests/features/waypoints/ref/109.png | Bin 0 -> 13892 bytes tests/features/waypoints/ref/11.png | Bin 0 -> 6198 bytes tests/features/waypoints/ref/110.png | Bin 0 -> 21663 bytes tests/features/waypoints/ref/111.png | Bin 0 -> 6258 bytes tests/features/waypoints/ref/112.png | Bin 0 -> 7002 bytes tests/features/waypoints/ref/113.png | Bin 0 -> 7567 bytes tests/features/waypoints/ref/114.png | Bin 0 -> 13475 bytes tests/features/waypoints/ref/115.png | Bin 0 -> 4108 bytes tests/features/waypoints/ref/116.png | Bin 0 -> 4752 bytes tests/features/waypoints/ref/117.png | Bin 0 -> 8994 bytes tests/features/waypoints/ref/118.png | Bin 0 -> 5474 bytes tests/features/waypoints/ref/119.png | Bin 0 -> 5839 bytes tests/features/waypoints/ref/12.png | Bin 0 -> 10053 bytes tests/features/waypoints/ref/120.png | Bin 0 -> 10429 bytes tests/features/waypoints/ref/121.png | Bin 0 -> 8767 bytes tests/features/waypoints/ref/122.png | Bin 0 -> 9442 bytes tests/features/waypoints/ref/123.png | Bin 0 -> 18978 bytes tests/features/waypoints/ref/124.png | Bin 0 -> 9525 bytes tests/features/waypoints/ref/125.png | Bin 0 -> 12703 bytes tests/features/waypoints/ref/126.png | Bin 0 -> 11140 bytes tests/features/waypoints/ref/127.png | Bin 0 -> 5955 bytes tests/features/waypoints/ref/128.png | Bin 0 -> 6398 bytes tests/features/waypoints/ref/129.png | Bin 0 -> 10114 bytes tests/features/waypoints/ref/13.png | Bin 0 -> 2414 bytes tests/features/waypoints/ref/130.png | Bin 0 -> 26840 bytes tests/features/waypoints/ref/131.png | Bin 0 -> 7967 bytes tests/features/waypoints/ref/132.png | Bin 0 -> 12651 bytes tests/features/waypoints/ref/133.png | Bin 0 -> 11330 bytes tests/features/waypoints/ref/134.png | Bin 0 -> 11812 bytes tests/features/waypoints/ref/135.png | Bin 0 -> 13313 bytes tests/features/waypoints/ref/136.png | Bin 0 -> 14577 bytes tests/features/waypoints/ref/137.png | Bin 0 -> 7212 bytes tests/features/waypoints/ref/138.png | Bin 0 -> 8273 bytes tests/features/waypoints/ref/139.png | Bin 0 -> 8868 bytes tests/features/waypoints/ref/14.png | Bin 0 -> 7124 bytes tests/features/waypoints/ref/140.png | Bin 0 -> 6906 bytes tests/features/waypoints/ref/141.png | Bin 0 -> 3273 bytes tests/features/waypoints/ref/142.png | Bin 0 -> 8584 bytes tests/features/waypoints/ref/143.png | Bin 0 -> 5597 bytes tests/features/waypoints/ref/144.png | Bin 0 -> 11811 bytes tests/features/waypoints/ref/145.png | Bin 0 -> 3973 bytes tests/features/waypoints/ref/146.png | Bin 0 -> 11485 bytes tests/features/waypoints/ref/147.png | Bin 0 -> 10415 bytes tests/features/waypoints/ref/148.png | Bin 0 -> 11217 bytes tests/features/waypoints/ref/149.png | Bin 0 -> 10998 bytes tests/features/waypoints/ref/15.png | Bin 0 -> 8291 bytes tests/features/waypoints/ref/150.png | Bin 0 -> 9889 bytes tests/features/waypoints/ref/151.png | Bin 0 -> 9380 bytes tests/features/waypoints/ref/152.png | Bin 0 -> 12937 bytes tests/features/waypoints/ref/153.png | Bin 0 -> 12552 bytes tests/features/waypoints/ref/154.png | Bin 0 -> 13136 bytes tests/features/waypoints/ref/16.png | Bin 0 -> 5819 bytes tests/features/waypoints/ref/17.png | Bin 0 -> 7025 bytes tests/features/waypoints/ref/18.png | Bin 0 -> 6646 bytes tests/features/waypoints/ref/19.png | Bin 0 -> 9050 bytes tests/features/waypoints/ref/2.png | Bin 0 -> 12572 bytes tests/features/waypoints/ref/20.png | Bin 0 -> 5997 bytes tests/features/waypoints/ref/21.png | Bin 0 -> 4504 bytes tests/features/waypoints/ref/22.png | Bin 0 -> 11382 bytes tests/features/waypoints/ref/23.png | Bin 0 -> 6387 bytes tests/features/waypoints/ref/24.png | Bin 0 -> 3976 bytes tests/features/waypoints/ref/25.png | Bin 0 -> 5297 bytes tests/features/waypoints/ref/26.png | Bin 0 -> 4062 bytes tests/features/waypoints/ref/27.png | Bin 0 -> 7081 bytes tests/features/waypoints/ref/28.png | Bin 0 -> 7250 bytes tests/features/waypoints/ref/29.png | Bin 0 -> 7764 bytes tests/features/waypoints/ref/3.png | Bin 0 -> 13762 bytes tests/features/waypoints/ref/30.png | Bin 0 -> 5944 bytes tests/features/waypoints/ref/31.png | Bin 0 -> 6685 bytes tests/features/waypoints/ref/32.png | Bin 0 -> 7139 bytes tests/features/waypoints/ref/33.png | Bin 0 -> 5609 bytes tests/features/waypoints/ref/34.png | Bin 0 -> 6549 bytes tests/features/waypoints/ref/35.png | Bin 0 -> 7344 bytes tests/features/waypoints/ref/36.png | Bin 0 -> 4793 bytes tests/features/waypoints/ref/37.png | Bin 0 -> 7165 bytes tests/features/waypoints/ref/38.png | Bin 0 -> 6617 bytes tests/features/waypoints/ref/39.png | Bin 0 -> 11152 bytes tests/features/waypoints/ref/4.png | Bin 0 -> 8878 bytes tests/features/waypoints/ref/40.png | Bin 0 -> 4955 bytes tests/features/waypoints/ref/41.png | Bin 0 -> 7257 bytes tests/features/waypoints/ref/42.png | Bin 0 -> 6399 bytes tests/features/waypoints/ref/43.png | Bin 0 -> 6202 bytes tests/features/waypoints/ref/44.png | Bin 0 -> 7457 bytes tests/features/waypoints/ref/45.png | Bin 0 -> 10688 bytes tests/features/waypoints/ref/46.png | Bin 0 -> 13478 bytes tests/features/waypoints/ref/47.png | Bin 0 -> 10631 bytes tests/features/waypoints/ref/48.png | Bin 0 -> 7746 bytes tests/features/waypoints/ref/49.png | Bin 0 -> 9435 bytes tests/features/waypoints/ref/5.png | Bin 0 -> 7120 bytes tests/features/waypoints/ref/50.png | Bin 0 -> 3531 bytes tests/features/waypoints/ref/51.png | Bin 0 -> 7362 bytes tests/features/waypoints/ref/52.png | Bin 0 -> 5267 bytes tests/features/waypoints/ref/53.png | Bin 0 -> 9380 bytes tests/features/waypoints/ref/54.png | Bin 0 -> 10121 bytes tests/features/waypoints/ref/55.png | Bin 0 -> 10646 bytes tests/features/waypoints/ref/56.png | Bin 0 -> 12003 bytes tests/features/waypoints/ref/57.png | Bin 0 -> 7975 bytes tests/features/waypoints/ref/58.png | Bin 0 -> 16366 bytes tests/features/waypoints/ref/59.png | Bin 0 -> 9622 bytes tests/features/waypoints/ref/6.png | Bin 0 -> 11725 bytes tests/features/waypoints/ref/60.png | Bin 0 -> 6804 bytes tests/features/waypoints/ref/61.png | Bin 0 -> 8199 bytes tests/features/waypoints/ref/62.png | Bin 0 -> 8625 bytes tests/features/waypoints/ref/63.png | Bin 0 -> 6049 bytes tests/features/waypoints/ref/64.png | Bin 0 -> 6748 bytes tests/features/waypoints/ref/65.png | Bin 0 -> 5818 bytes tests/features/waypoints/ref/66.png | Bin 0 -> 9179 bytes tests/features/waypoints/ref/67.png | Bin 0 -> 10315 bytes tests/features/waypoints/ref/68.png | Bin 0 -> 11088 bytes tests/features/waypoints/ref/69.png | Bin 0 -> 4433 bytes tests/features/waypoints/ref/7.png | Bin 0 -> 6723 bytes tests/features/waypoints/ref/70.png | Bin 0 -> 5073 bytes tests/features/waypoints/ref/71.png | Bin 0 -> 5609 bytes tests/features/waypoints/ref/72.png | Bin 0 -> 7948 bytes tests/features/waypoints/ref/73.png | Bin 0 -> 6823 bytes tests/features/waypoints/ref/74.png | Bin 0 -> 7233 bytes tests/features/waypoints/ref/75.png | Bin 0 -> 8305 bytes tests/features/waypoints/ref/76.png | Bin 0 -> 7276 bytes tests/features/waypoints/ref/77.png | Bin 0 -> 5122 bytes tests/features/waypoints/ref/78.png | Bin 0 -> 3480 bytes tests/features/waypoints/ref/79.png | Bin 0 -> 7572 bytes tests/features/waypoints/ref/8.png | Bin 0 -> 8296 bytes tests/features/waypoints/ref/80.png | Bin 0 -> 11069 bytes tests/features/waypoints/ref/81.png | Bin 0 -> 8586 bytes tests/features/waypoints/ref/82.png | Bin 0 -> 7861 bytes tests/features/waypoints/ref/83.png | Bin 0 -> 10846 bytes tests/features/waypoints/ref/84.png | Bin 0 -> 11462 bytes tests/features/waypoints/ref/85.png | Bin 0 -> 3657 bytes tests/features/waypoints/ref/86.png | Bin 0 -> 9027 bytes tests/features/waypoints/ref/87.png | Bin 0 -> 4313 bytes tests/features/waypoints/ref/88.png | Bin 0 -> 7622 bytes tests/features/waypoints/ref/89.png | Bin 0 -> 10563 bytes tests/features/waypoints/ref/9.png | Bin 0 -> 7475 bytes tests/features/waypoints/ref/90.png | Bin 0 -> 5410 bytes tests/features/waypoints/ref/91.png | Bin 0 -> 5973 bytes tests/features/waypoints/ref/92.png | Bin 0 -> 7943 bytes tests/features/waypoints/ref/93.png | Bin 0 -> 5047 bytes tests/features/waypoints/ref/94.png | Bin 0 -> 8838 bytes tests/features/waypoints/ref/95.png | Bin 0 -> 9439 bytes tests/features/waypoints/ref/96.png | Bin 0 -> 10267 bytes tests/features/waypoints/ref/97.png | Bin 0 -> 9218 bytes tests/features/waypoints/ref/98.png | Bin 0 -> 8488 bytes tests/features/waypoints/ref/99.png | Bin 0 -> 5382 bytes tests/features/waypoints/test.typ | 1035 +++ tests/integration/cetz/ref/1.png | Bin 0 -> 6061 bytes tests/integration/cetz/ref/10.png | Bin 0 -> 7973 bytes tests/integration/cetz/ref/11.png | Bin 0 -> 8161 bytes tests/integration/cetz/ref/12.png | Bin 0 -> 8260 bytes tests/integration/cetz/ref/2.png | Bin 0 -> 6132 bytes tests/integration/cetz/ref/3.png | Bin 0 -> 6264 bytes tests/integration/cetz/ref/4.png | Bin 0 -> 9476 bytes tests/integration/cetz/ref/5.png | Bin 0 -> 9702 bytes tests/integration/cetz/ref/6.png | Bin 0 -> 10008 bytes tests/integration/cetz/ref/7.png | Bin 0 -> 10879 bytes tests/integration/cetz/ref/8.png | Bin 0 -> 12269 bytes tests/integration/cetz/ref/9.png | Bin 0 -> 14111 bytes tests/integration/cetz/test.typ | 105 + tests/integration/codly/ref/1.png | Bin 0 -> 13348 bytes tests/integration/codly/test.typ | 21 + tests/integration/fletcher/ref/1.png | Bin 0 -> 22935 bytes tests/integration/fletcher/ref/10.png | Bin 0 -> 11494 bytes tests/integration/fletcher/ref/2.png | Bin 0 -> 25931 bytes tests/integration/fletcher/ref/3.png | Bin 0 -> 36167 bytes tests/integration/fletcher/ref/4.png | Bin 0 -> 10821 bytes tests/integration/fletcher/ref/5.png | Bin 0 -> 11471 bytes tests/integration/fletcher/ref/6.png | Bin 0 -> 13251 bytes tests/integration/fletcher/ref/7.png | Bin 0 -> 11092 bytes tests/integration/fletcher/ref/8.png | Bin 0 -> 13046 bytes tests/integration/fletcher/ref/9.png | Bin 0 -> 11391 bytes tests/integration/fletcher/test.typ | 106 + tests/integration/mitex/ref/1.png | Bin 0 -> 23548 bytes tests/integration/mitex/ref/2.png | Bin 0 -> 49840 bytes tests/integration/mitex/ref/3.png | Bin 0 -> 52732 bytes tests/integration/mitex/ref/4.png | Bin 0 -> 55124 bytes tests/integration/mitex/test.typ | 21 + tests/integration/pinit/ref/1.png | Bin 0 -> 12543 bytes tests/integration/pinit/ref/2.png | Bin 0 -> 34938 bytes tests/integration/pinit/ref/3.png | Bin 0 -> 40980 bytes tests/integration/pinit/ref/4.png | Bin 0 -> 47400 bytes tests/integration/pinit/ref/5.png | Bin 0 -> 57785 bytes tests/integration/pinit/ref/6.png | Bin 0 -> 61015 bytes tests/integration/pinit/ref/7.png | Bin 0 -> 65554 bytes tests/integration/pinit/ref/8.png | Bin 0 -> 73907 bytes tests/integration/pinit/test.typ | 92 + tests/integration/theorion/ref/1.png | Bin 0 -> 2807 bytes tests/integration/theorion/ref/2.png | Bin 0 -> 26314 bytes tests/integration/theorion/ref/3.png | Bin 0 -> 47571 bytes tests/integration/theorion/ref/4.png | Bin 0 -> 53901 bytes tests/integration/theorion/ref/5.png | Bin 0 -> 23826 bytes tests/integration/theorion/test.typ | 52 + .../i164-slides-after-show-rule/ref/1.png | Bin 0 -> 13454 bytes .../i164-slides-after-show-rule/ref/2.png | Bin 0 -> 17829 bytes .../i164-slides-after-show-rule/ref/3.png | Bin 0 -> 32259 bytes .../i164-slides-after-show-rule/test.typ | 19 + tests/issues/i203-ratio-in-margin/ref/1.png | Bin 0 -> 1928 bytes tests/issues/i203-ratio-in-margin/ref/2.png | Bin 0 -> 6744 bytes tests/issues/i203-ratio-in-margin/test.typ | 18 + tests/issues/i204-meanwhile-in-cetz/ref/1.png | Bin 0 -> 19127 bytes tests/issues/i204-meanwhile-in-cetz/ref/2.png | Bin 0 -> 21231 bytes tests/issues/i204-meanwhile-in-cetz/test.typ | 34 + .../i216-styled-in-first-slide/ref/1.png | Bin 0 -> 11916 bytes .../i216-styled-in-first-slide/test.typ | 15 + .../i239-new-section-slide-fn/ref/1.png | Bin 0 -> 5073 bytes .../i239-new-section-slide-fn/ref/2.png | Bin 0 -> 4872 bytes .../i239-new-section-slide-fn/ref/3.png | Bin 0 -> 5201 bytes .../i239-new-section-slide-fn/ref/4.png | Bin 0 -> 5066 bytes .../test-typst-pages.typ | 11 + .../issues/i239-new-section-slide-fn/test.typ | 40 + .../issues/i259-meanwhile-in-grids/ref/1.png | Bin 0 -> 12188 bytes .../issues/i259-meanwhile-in-grids/ref/2.png | Bin 0 -> 34909 bytes .../issues/i259-meanwhile-in-grids/ref/3.png | Bin 0 -> 37332 bytes .../issues/i259-meanwhile-in-grids/ref/4.png | Bin 0 -> 24968 bytes .../issues/i259-meanwhile-in-grids/ref/5.png | Bin 0 -> 25701 bytes tests/issues/i259-meanwhile-in-grids/test.typ | 36 + .../ref/1.png | Bin 0 -> 41383 bytes .../ref/2.png | Bin 0 -> 35344 bytes .../i312-empty-slide-after-show-rule/test.typ | 19 + tests/themes/aqua/default/.gitignore | 4 + tests/themes/aqua/default/ref/1.png | Bin 0 -> 12849 bytes tests/themes/aqua/default/ref/2.png | Bin 0 -> 14673 bytes tests/themes/aqua/default/ref/3.png | Bin 0 -> 14454 bytes tests/themes/aqua/default/ref/4.png | Bin 0 -> 29005 bytes tests/themes/aqua/default/ref/5.png | Bin 0 -> 9196 bytes tests/themes/aqua/default/ref/6.png | Bin 0 -> 11626 bytes tests/themes/aqua/default/test.typ | 38 + tests/themes/dewdrop/default/.gitignore | 4 + tests/themes/dewdrop/default/ref/1.png | Bin 0 -> 7444 bytes tests/themes/dewdrop/default/ref/10.png | Bin 0 -> 15218 bytes tests/themes/dewdrop/default/ref/11.png | Bin 0 -> 19736 bytes tests/themes/dewdrop/default/ref/12.png | Bin 0 -> 28475 bytes tests/themes/dewdrop/default/ref/13.png | Bin 0 -> 10403 bytes tests/themes/dewdrop/default/ref/2.png | Bin 0 -> 30954 bytes tests/themes/dewdrop/default/ref/3.png | Bin 0 -> 28790 bytes tests/themes/dewdrop/default/ref/4.png | Bin 0 -> 7869 bytes tests/themes/dewdrop/default/ref/5.png | Bin 0 -> 11479 bytes tests/themes/dewdrop/default/ref/6.png | Bin 0 -> 29026 bytes tests/themes/dewdrop/default/ref/7.png | Bin 0 -> 52585 bytes tests/themes/dewdrop/default/ref/8.png | Bin 0 -> 2442 bytes tests/themes/dewdrop/default/ref/9.png | Bin 0 -> 10613 bytes tests/themes/dewdrop/default/test.typ | 63 + tests/themes/dewdrop/mini-slides/.gitignore | 4 + tests/themes/dewdrop/mini-slides/ref/1.png | Bin 0 -> 7444 bytes tests/themes/dewdrop/mini-slides/ref/10.png | Bin 0 -> 18323 bytes tests/themes/dewdrop/mini-slides/ref/11.png | Bin 0 -> 22795 bytes tests/themes/dewdrop/mini-slides/ref/12.png | Bin 0 -> 28395 bytes tests/themes/dewdrop/mini-slides/ref/13.png | Bin 0 -> 13442 bytes tests/themes/dewdrop/mini-slides/ref/2.png | Bin 0 -> 31042 bytes tests/themes/dewdrop/mini-slides/ref/3.png | Bin 0 -> 28906 bytes tests/themes/dewdrop/mini-slides/ref/4.png | Bin 0 -> 10973 bytes tests/themes/dewdrop/mini-slides/ref/5.png | Bin 0 -> 14611 bytes tests/themes/dewdrop/mini-slides/ref/6.png | Bin 0 -> 29024 bytes tests/themes/dewdrop/mini-slides/ref/7.png | Bin 0 -> 55605 bytes tests/themes/dewdrop/mini-slides/ref/8.png | Bin 0 -> 2442 bytes tests/themes/dewdrop/mini-slides/ref/9.png | Bin 0 -> 13669 bytes tests/themes/dewdrop/mini-slides/test.typ | 63 + tests/themes/dewdrop/section-body/ref/1.png | Bin 0 -> 34955 bytes tests/themes/dewdrop/section-body/test.typ | 14 + tests/themes/dewdrop/sidebar/.gitignore | 4 + tests/themes/dewdrop/sidebar/ref/1.png | Bin 0 -> 7444 bytes tests/themes/dewdrop/sidebar/ref/10.png | Bin 0 -> 23997 bytes tests/themes/dewdrop/sidebar/ref/11.png | Bin 0 -> 29108 bytes tests/themes/dewdrop/sidebar/ref/12.png | Bin 0 -> 24923 bytes tests/themes/dewdrop/sidebar/ref/13.png | Bin 0 -> 19773 bytes tests/themes/dewdrop/sidebar/ref/2.png | Bin 0 -> 26747 bytes tests/themes/dewdrop/sidebar/ref/3.png | Bin 0 -> 25234 bytes tests/themes/dewdrop/sidebar/ref/4.png | Bin 0 -> 17358 bytes tests/themes/dewdrop/sidebar/ref/5.png | Bin 0 -> 20773 bytes tests/themes/dewdrop/sidebar/ref/6.png | Bin 0 -> 25276 bytes tests/themes/dewdrop/sidebar/ref/7.png | Bin 0 -> 66452 bytes tests/themes/dewdrop/sidebar/ref/8.png | Bin 0 -> 2442 bytes tests/themes/dewdrop/sidebar/ref/9.png | Bin 0 -> 19840 bytes tests/themes/dewdrop/sidebar/test.typ | 63 + tests/themes/metropolis/default/.gitignore | 4 + tests/themes/metropolis/default/ref/1.png | Bin 0 -> 7980 bytes tests/themes/metropolis/default/ref/10.png | Bin 0 -> 18463 bytes tests/themes/metropolis/default/ref/11.png | Bin 0 -> 2139 bytes tests/themes/metropolis/default/ref/12.png | Bin 0 -> 10922 bytes tests/themes/metropolis/default/ref/2.png | Bin 0 -> 11613 bytes tests/themes/metropolis/default/ref/3.png | Bin 0 -> 2236 bytes tests/themes/metropolis/default/ref/4.png | Bin 0 -> 12524 bytes tests/themes/metropolis/default/ref/5.png | Bin 0 -> 85326 bytes tests/themes/metropolis/default/ref/6.png | Bin 0 -> 57137 bytes tests/themes/metropolis/default/ref/7.png | Bin 0 -> 2572 bytes tests/themes/metropolis/default/ref/8.png | Bin 0 -> 2450 bytes tests/themes/metropolis/default/ref/9.png | Bin 0 -> 11279 bytes tests/themes/metropolis/default/test.typ | 66 + tests/themes/simple/default/.gitignore | 4 + tests/themes/simple/default/ref/1.png | Bin 0 -> 8655 bytes tests/themes/simple/default/ref/2.png | Bin 0 -> 13798 bytes tests/themes/simple/default/ref/3.png | Bin 0 -> 5421 bytes tests/themes/simple/default/ref/4.png | Bin 0 -> 3981 bytes tests/themes/simple/default/ref/5.png | Bin 0 -> 6384 bytes tests/themes/simple/default/ref/6.png | Bin 0 -> 10522 bytes tests/themes/simple/default/test.typ | 38 + tests/themes/stargazer/default/.gitignore | 4 + tests/themes/stargazer/default/ref/1.png | Bin 0 -> 22875 bytes tests/themes/stargazer/default/ref/10.png | Bin 0 -> 21676 bytes tests/themes/stargazer/default/ref/11.png | Bin 0 -> 26449 bytes tests/themes/stargazer/default/ref/12.png | Bin 0 -> 14473 bytes tests/themes/stargazer/default/ref/13.png | Bin 0 -> 16077 bytes tests/themes/stargazer/default/ref/2.png | Bin 0 -> 15560 bytes tests/themes/stargazer/default/ref/3.png | Bin 0 -> 14400 bytes tests/themes/stargazer/default/ref/4.png | Bin 0 -> 18167 bytes tests/themes/stargazer/default/ref/5.png | Bin 0 -> 18484 bytes tests/themes/stargazer/default/ref/6.png | Bin 0 -> 14372 bytes tests/themes/stargazer/default/ref/7.png | Bin 0 -> 59261 bytes tests/themes/stargazer/default/ref/8.png | Bin 0 -> 2548 bytes tests/themes/stargazer/default/ref/9.png | Bin 0 -> 16944 bytes tests/themes/stargazer/default/test.typ | 66 + tests/themes/university/default/.gitignore | 4 + tests/themes/university/default/ref/1.png | Bin 0 -> 11153 bytes tests/themes/university/default/ref/2.png | Bin 0 -> 3361 bytes tests/themes/university/default/ref/3.png | Bin 0 -> 41043 bytes tests/themes/university/default/ref/4.png | Bin 0 -> 11221 bytes tests/themes/university/default/ref/5.png | Bin 0 -> 2660 bytes tests/themes/university/default/ref/6.png | Bin 0 -> 2212 bytes tests/themes/university/default/ref/7.png | Bin 0 -> 41569 bytes tests/themes/university/default/test.typ | 46 + themes/aqua.typ | 422 ++ themes/default.typ | 67 + themes/dewdrop.typ | 454 ++ themes/ironclaw.typ | 177 + themes/metropolis.typ | 405 ++ themes/simple.typ | 224 + themes/stargazer.typ | 565 ++ themes/themes.typ | 8 + themes/university.typ | 438 ++ typst.toml | 15 + 864 files changed, 34004 insertions(+) create mode 100644 .github/copilot-instructions.md create mode 100644 .github/workflows/copilot-setup-steps.yml create mode 100644 .github/workflows/docs-preview.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 changelog.md create mode 100644 docs/README.md create mode 100644 docs/en/changelog.md create mode 100644 docs/en/external/_category_.json create mode 100644 docs/en/external/gistd.md create mode 100644 docs/en/external/pdfpc.md create mode 100644 docs/en/external/pympress.md create mode 100644 docs/en/external/touying-exporter.md create mode 100644 docs/en/external/typst-preview.md create mode 100644 docs/en/faq.md create mode 100644 docs/en/integration/_category_.json create mode 100644 docs/en/integration/cetz.md create mode 100644 docs/en/integration/codly.md create mode 100644 docs/en/integration/fletcher.md create mode 100644 docs/en/integration/mitex.md create mode 100644 docs/en/integration/pinit.md create mode 100644 docs/en/integration/theorion.md create mode 100644 docs/en/intro.md create mode 100644 docs/en/start.md create mode 100644 docs/en/themes/_category_.json create mode 100644 docs/en/themes/aqua.md create mode 100644 docs/en/themes/custom.md create mode 100644 docs/en/themes/dewdrop.md create mode 100644 docs/en/themes/metropolis.md create mode 100644 docs/en/themes/simple.md create mode 100644 docs/en/themes/stargazer.md create mode 100644 docs/en/themes/university.md create mode 100644 docs/en/tutorials/_category_.json create mode 100644 docs/en/tutorials/build-your-own-theme.md create mode 100644 docs/en/tutorials/code-styles.md create mode 100644 docs/en/tutorials/dynamic/_category_.json create mode 100644 docs/en/tutorials/dynamic/complex.md create mode 100644 docs/en/tutorials/dynamic/cover.md create mode 100644 docs/en/tutorials/dynamic/equation.md create mode 100644 docs/en/tutorials/dynamic/handout.md create mode 100644 docs/en/tutorials/dynamic/other.md create mode 100644 docs/en/tutorials/dynamic/simple.md create mode 100644 docs/en/tutorials/dynamic/waypoints.md create mode 100644 docs/en/tutorials/layout.md create mode 100644 docs/en/tutorials/multi-file.md create mode 100644 docs/en/tutorials/progress/_category_.json create mode 100644 docs/en/tutorials/progress/counters.md create mode 100644 docs/en/tutorials/progress/sections.md create mode 100644 docs/en/tutorials/sections.md create mode 100644 docs/en/tutorials/settings.md create mode 100644 docs/en/tutorials/utilities/_category_.json create mode 100644 docs/en/tutorials/utilities/fit-to.md create mode 100644 docs/zh/changelog.md create mode 100644 docs/zh/external/_category_.json create mode 100644 docs/zh/external/gistd.md create mode 100644 docs/zh/external/pdfpc.md create mode 100644 docs/zh/external/pympress.md create mode 100644 docs/zh/external/touying-exporter.md create mode 100644 docs/zh/external/typst-preview.md create mode 100644 docs/zh/faq.md create mode 100644 docs/zh/integration/_category_.json create mode 100644 docs/zh/integration/cetz.md create mode 100644 docs/zh/integration/codly.md create mode 100644 docs/zh/integration/fletcher.md create mode 100644 docs/zh/integration/mitex.md create mode 100644 docs/zh/integration/pinit.md create mode 100644 docs/zh/integration/theorion.md create mode 100644 docs/zh/intro.md create mode 100644 docs/zh/start.md create mode 100644 docs/zh/themes/_category_.json create mode 100644 docs/zh/themes/aqua.md create mode 100644 docs/zh/themes/custom.md create mode 100644 docs/zh/themes/dewdrop.md create mode 100644 docs/zh/themes/metropolis.md create mode 100644 docs/zh/themes/simple.md create mode 100644 docs/zh/themes/stargazer.md create mode 100644 docs/zh/themes/university.md create mode 100644 docs/zh/tutorials/_category_.json create mode 100644 docs/zh/tutorials/build-your-own-theme.md create mode 100644 docs/zh/tutorials/code-styles.md create mode 100644 docs/zh/tutorials/dynamic/_category_.json create mode 100644 docs/zh/tutorials/dynamic/complex.md create mode 100644 docs/zh/tutorials/dynamic/cover.md create mode 100644 docs/zh/tutorials/dynamic/equation.md create mode 100644 docs/zh/tutorials/dynamic/handout.md create mode 100644 docs/zh/tutorials/dynamic/other.md create mode 100644 docs/zh/tutorials/dynamic/simple.md create mode 100644 docs/zh/tutorials/dynamic/waypoints.md create mode 100644 docs/zh/tutorials/layout.md create mode 100644 docs/zh/tutorials/multi-file.md create mode 100644 docs/zh/tutorials/progress/_category_.json create mode 100644 docs/zh/tutorials/progress/counters.md create mode 100644 docs/zh/tutorials/progress/sections.md create mode 100644 docs/zh/tutorials/sections.md create mode 100644 docs/zh/tutorials/settings.md create mode 100644 docs/zh/tutorials/utilities/_category_.json create mode 100644 docs/zh/tutorials/utilities/fit-to.md create mode 100644 examples/aqua-zh.typ create mode 100644 examples/aqua.typ create mode 100644 examples/default.typ create mode 100644 examples/dewdrop.typ create mode 100644 examples/example.typ create mode 100644 examples/metropolis.typ create mode 100644 examples/simple.typ create mode 100644 examples/stargazer.typ create mode 100644 examples/university.typ create mode 100644 examples/waypoints.typ create mode 100644 ironclaw.png create mode 100644 lib.typ create mode 100644 logo.png create mode 100644 poster.png create mode 100644 src/components.typ create mode 100644 src/configs.typ create mode 100644 src/core.typ create mode 100644 src/exports.typ create mode 100644 src/extern.typ create mode 100644 src/magic.typ create mode 100644 src/pdfpc.typ create mode 100644 src/slides.typ create mode 100644 src/utils.typ create mode 100644 tests/.gitignore create mode 100644 tests/examples/example/ref/1.png create mode 100644 tests/examples/example/ref/10.png create mode 100644 tests/examples/example/ref/11.png create mode 100644 tests/examples/example/ref/12.png create mode 100644 tests/examples/example/ref/13.png create mode 100644 tests/examples/example/ref/14.png create mode 100644 tests/examples/example/ref/15.png create mode 100644 tests/examples/example/ref/16.png create mode 100644 tests/examples/example/ref/17.png create mode 100644 tests/examples/example/ref/18.png create mode 100644 tests/examples/example/ref/19.png create mode 100644 tests/examples/example/ref/2.png create mode 100644 tests/examples/example/ref/20.png create mode 100644 tests/examples/example/ref/21.png create mode 100644 tests/examples/example/ref/22.png create mode 100644 tests/examples/example/ref/23.png create mode 100644 tests/examples/example/ref/24.png create mode 100644 tests/examples/example/ref/25.png create mode 100644 tests/examples/example/ref/26.png create mode 100644 tests/examples/example/ref/27.png create mode 100644 tests/examples/example/ref/28.png create mode 100644 tests/examples/example/ref/29.png create mode 100644 tests/examples/example/ref/3.png create mode 100644 tests/examples/example/ref/30.png create mode 100644 tests/examples/example/ref/31.png create mode 100644 tests/examples/example/ref/4.png create mode 100644 tests/examples/example/ref/5.png create mode 100644 tests/examples/example/ref/6.png create mode 100644 tests/examples/example/ref/7.png create mode 100644 tests/examples/example/ref/8.png create mode 100644 tests/examples/example/ref/9.png create mode 100644 tests/examples/example/test.typ create mode 100644 tests/features/alert/ref/1.png create mode 100644 tests/features/alert/ref/2.png create mode 100644 tests/features/alert/ref/3.png create mode 100644 tests/features/alert/ref/4.png create mode 100644 tests/features/alert/ref/5.png create mode 100644 tests/features/alert/test.typ create mode 100644 tests/features/animation/ref/1.png create mode 100644 tests/features/animation/ref/10.png create mode 100644 tests/features/animation/ref/11.png create mode 100644 tests/features/animation/ref/12.png create mode 100644 tests/features/animation/ref/13.png create mode 100644 tests/features/animation/ref/14.png create mode 100644 tests/features/animation/ref/15.png create mode 100644 tests/features/animation/ref/16.png create mode 100644 tests/features/animation/ref/17.png create mode 100644 tests/features/animation/ref/18.png create mode 100644 tests/features/animation/ref/19.png create mode 100644 tests/features/animation/ref/2.png create mode 100644 tests/features/animation/ref/20.png create mode 100644 tests/features/animation/ref/21.png create mode 100644 tests/features/animation/ref/22.png create mode 100644 tests/features/animation/ref/23.png create mode 100644 tests/features/animation/ref/24.png create mode 100644 tests/features/animation/ref/25.png create mode 100644 tests/features/animation/ref/26.png create mode 100644 tests/features/animation/ref/27.png create mode 100644 tests/features/animation/ref/28.png create mode 100644 tests/features/animation/ref/29.png create mode 100644 tests/features/animation/ref/3.png create mode 100644 tests/features/animation/ref/30.png create mode 100644 tests/features/animation/ref/31.png create mode 100644 tests/features/animation/ref/32.png create mode 100644 tests/features/animation/ref/33.png create mode 100644 tests/features/animation/ref/34.png create mode 100644 tests/features/animation/ref/35.png create mode 100644 tests/features/animation/ref/36.png create mode 100644 tests/features/animation/ref/37.png create mode 100644 tests/features/animation/ref/38.png create mode 100644 tests/features/animation/ref/39.png create mode 100644 tests/features/animation/ref/4.png create mode 100644 tests/features/animation/ref/5.png create mode 100644 tests/features/animation/ref/6.png create mode 100644 tests/features/animation/ref/7.png create mode 100644 tests/features/animation/ref/8.png create mode 100644 tests/features/animation/ref/9.png create mode 100644 tests/features/animation/test.typ create mode 100644 tests/features/appendix/ref/1.png create mode 100644 tests/features/appendix/ref/2.png create mode 100644 tests/features/appendix/ref/3.png create mode 100644 tests/features/appendix/ref/4.png create mode 100644 tests/features/appendix/test.typ create mode 100644 tests/features/bibliography/ref/1.png create mode 100644 tests/features/bibliography/ref/2.png create mode 100644 tests/features/bibliography/ref/3.png create mode 100644 tests/features/bibliography/test.typ create mode 100644 tests/features/breakable/ref/1.png create mode 100644 tests/features/breakable/ref/2.png create mode 100644 tests/features/breakable/ref/3.png create mode 100644 tests/features/breakable/test.typ create mode 100644 tests/features/colors-config/ref/1.png create mode 100644 tests/features/colors-config/ref/2.png create mode 100644 tests/features/colors-config/ref/3.png create mode 100644 tests/features/colors-config/ref/4.png create mode 100644 tests/features/colors-config/ref/5.png create mode 100644 tests/features/colors-config/ref/6.png create mode 100644 tests/features/colors-config/test.typ create mode 100644 tests/features/complex/ref/1.png create mode 100644 tests/features/complex/ref/10.png create mode 100644 tests/features/complex/ref/11.png create mode 100644 tests/features/complex/ref/12.png create mode 100644 tests/features/complex/ref/13.png create mode 100644 tests/features/complex/ref/14.png create mode 100644 tests/features/complex/ref/15.png create mode 100644 tests/features/complex/ref/16.png create mode 100644 tests/features/complex/ref/17.png create mode 100644 tests/features/complex/ref/18.png create mode 100644 tests/features/complex/ref/2.png create mode 100644 tests/features/complex/ref/3.png create mode 100644 tests/features/complex/ref/4.png create mode 100644 tests/features/complex/ref/5.png create mode 100644 tests/features/complex/ref/6.png create mode 100644 tests/features/complex/ref/7.png create mode 100644 tests/features/complex/ref/8.png create mode 100644 tests/features/complex/ref/9.png create mode 100644 tests/features/complex/test.typ create mode 100644 tests/features/cover-spacing/ref/1.png create mode 100644 tests/features/cover-spacing/ref/10.png create mode 100644 tests/features/cover-spacing/ref/11.png create mode 100644 tests/features/cover-spacing/ref/12.png create mode 100644 tests/features/cover-spacing/ref/13.png create mode 100644 tests/features/cover-spacing/ref/14.png create mode 100644 tests/features/cover-spacing/ref/15.png create mode 100644 tests/features/cover-spacing/ref/16.png create mode 100644 tests/features/cover-spacing/ref/17.png create mode 100644 tests/features/cover-spacing/ref/18.png create mode 100644 tests/features/cover-spacing/ref/19.png create mode 100644 tests/features/cover-spacing/ref/2.png create mode 100644 tests/features/cover-spacing/ref/20.png create mode 100644 tests/features/cover-spacing/ref/21.png create mode 100644 tests/features/cover-spacing/ref/22.png create mode 100644 tests/features/cover-spacing/ref/23.png create mode 100644 tests/features/cover-spacing/ref/24.png create mode 100644 tests/features/cover-spacing/ref/25.png create mode 100644 tests/features/cover-spacing/ref/26.png create mode 100644 tests/features/cover-spacing/ref/27.png create mode 100644 tests/features/cover-spacing/ref/28.png create mode 100644 tests/features/cover-spacing/ref/29.png create mode 100644 tests/features/cover-spacing/ref/3.png create mode 100644 tests/features/cover-spacing/ref/4.png create mode 100644 tests/features/cover-spacing/ref/5.png create mode 100644 tests/features/cover-spacing/ref/6.png create mode 100644 tests/features/cover-spacing/ref/7.png create mode 100644 tests/features/cover-spacing/ref/8.png create mode 100644 tests/features/cover-spacing/ref/9.png create mode 100644 tests/features/cover-spacing/test.typ create mode 100644 tests/features/cover/ref/1.png create mode 100644 tests/features/cover/ref/10.png create mode 100644 tests/features/cover/ref/11.png create mode 100644 tests/features/cover/ref/12.png create mode 100644 tests/features/cover/ref/13.png create mode 100644 tests/features/cover/ref/14.png create mode 100644 tests/features/cover/ref/15.png create mode 100644 tests/features/cover/ref/16.png create mode 100644 tests/features/cover/ref/17.png create mode 100644 tests/features/cover/ref/18.png create mode 100644 tests/features/cover/ref/19.png create mode 100644 tests/features/cover/ref/2.png create mode 100644 tests/features/cover/ref/20.png create mode 100644 tests/features/cover/ref/21.png create mode 100644 tests/features/cover/ref/3.png create mode 100644 tests/features/cover/ref/4.png create mode 100644 tests/features/cover/ref/5.png create mode 100644 tests/features/cover/ref/6.png create mode 100644 tests/features/cover/ref/7.png create mode 100644 tests/features/cover/ref/8.png create mode 100644 tests/features/cover/ref/9.png create mode 100644 tests/features/cover/test.typ create mode 100644 tests/features/custom-outline/ref/1.png create mode 100644 tests/features/custom-outline/ref/2.png create mode 100644 tests/features/custom-outline/ref/3.png create mode 100644 tests/features/custom-outline/ref/4.png create mode 100644 tests/features/custom-outline/ref/5.png create mode 100644 tests/features/custom-outline/ref/6.png create mode 100644 tests/features/custom-outline/ref/7.png create mode 100644 tests/features/custom-outline/ref/8.png create mode 100644 tests/features/custom-outline/ref/9.png create mode 100644 tests/features/custom-outline/test.typ create mode 100644 tests/features/default-composer/ref/1.png create mode 100644 tests/features/default-composer/ref/2.png create mode 100644 tests/features/default-composer/test.typ create mode 100644 tests/features/equation/ref/1.png create mode 100644 tests/features/equation/ref/10.png create mode 100644 tests/features/equation/ref/2.png create mode 100644 tests/features/equation/ref/3.png create mode 100644 tests/features/equation/ref/4.png create mode 100644 tests/features/equation/ref/5.png create mode 100644 tests/features/equation/ref/6.png create mode 100644 tests/features/equation/ref/7.png create mode 100644 tests/features/equation/ref/8.png create mode 100644 tests/features/equation/ref/9.png create mode 100644 tests/features/equation/test.typ create mode 100644 tests/features/fit-to/ref/1.png create mode 100644 tests/features/fit-to/ref/2.png create mode 100644 tests/features/fit-to/ref/3.png create mode 100644 tests/features/fit-to/ref/4.png create mode 100644 tests/features/fit-to/ref/5.png create mode 100644 tests/features/fit-to/test.typ create mode 100644 tests/features/footnote/ref/1.png create mode 100644 tests/features/footnote/ref/2.png create mode 100644 tests/features/footnote/ref/3.png create mode 100644 tests/features/footnote/test.typ create mode 100644 tests/features/get-config/ref/1.png create mode 100644 tests/features/get-config/ref/2.png create mode 100644 tests/features/get-config/test.typ create mode 100644 tests/features/handout-only/ref/1.png create mode 100644 tests/features/handout-only/ref/2.png create mode 100644 tests/features/handout-only/test.typ create mode 100644 tests/features/handout-subslides/ref/1.png create mode 100644 tests/features/handout-subslides/ref/2.png create mode 100644 tests/features/handout-subslides/ref/3.png create mode 100644 tests/features/handout-subslides/ref/4.png create mode 100644 tests/features/handout-subslides/ref/5.png create mode 100644 tests/features/handout-subslides/ref/6.png create mode 100644 tests/features/handout-subslides/ref/7.png create mode 100644 tests/features/handout-subslides/test.typ create mode 100644 tests/features/handout/ref/1.png create mode 100644 tests/features/handout/ref/2.png create mode 100644 tests/features/handout/ref/3.png create mode 100644 tests/features/handout/test.typ create mode 100644 tests/features/headers-footers/ref/1.png create mode 100644 tests/features/headers-footers/ref/2.png create mode 100644 tests/features/headers-footers/ref/3.png create mode 100644 tests/features/headers-footers/ref/4.png create mode 100644 tests/features/headers-footers/ref/5.png create mode 100644 tests/features/headers-footers/test.typ create mode 100644 tests/features/here/ref/1.png create mode 100644 tests/features/here/ref/10.png create mode 100644 tests/features/here/ref/11.png create mode 100644 tests/features/here/ref/12.png create mode 100644 tests/features/here/ref/13.png create mode 100644 tests/features/here/ref/2.png create mode 100644 tests/features/here/ref/3.png create mode 100644 tests/features/here/ref/4.png create mode 100644 tests/features/here/ref/5.png create mode 100644 tests/features/here/ref/6.png create mode 100644 tests/features/here/ref/7.png create mode 100644 tests/features/here/ref/8.png create mode 100644 tests/features/here/ref/9.png create mode 100644 tests/features/here/test.typ create mode 100644 tests/features/inversion/ref/1.png create mode 100644 tests/features/inversion/ref/10.png create mode 100644 tests/features/inversion/ref/2.png create mode 100644 tests/features/inversion/ref/3.png create mode 100644 tests/features/inversion/ref/4.png create mode 100644 tests/features/inversion/ref/5.png create mode 100644 tests/features/inversion/ref/6.png create mode 100644 tests/features/inversion/ref/7.png create mode 100644 tests/features/inversion/ref/8.png create mode 100644 tests/features/inversion/ref/9.png create mode 100644 tests/features/inversion/test.typ create mode 100644 tests/features/item-by-item/ref/1.png create mode 100644 tests/features/item-by-item/ref/2.png create mode 100644 tests/features/item-by-item/ref/3.png create mode 100644 tests/features/item-by-item/ref/4.png create mode 100644 tests/features/item-by-item/ref/5.png create mode 100644 tests/features/item-by-item/ref/6.png create mode 100644 tests/features/item-by-item/test.typ create mode 100644 tests/features/layout/ref/1.png create mode 100644 tests/features/layout/ref/2.png create mode 100644 tests/features/layout/ref/3.png create mode 100644 tests/features/layout/ref/4.png create mode 100644 tests/features/layout/test.typ create mode 100644 tests/features/lazy-layout/ref/1.png create mode 100644 tests/features/lazy-layout/ref/2.png create mode 100644 tests/features/lazy-layout/ref/3.png create mode 100644 tests/features/lazy-layout/ref/4.png create mode 100644 tests/features/lazy-layout/ref/5.png create mode 100644 tests/features/lazy-layout/ref/6.png create mode 100644 tests/features/lazy-layout/ref/7.png create mode 100644 tests/features/lazy-layout/ref/8.png create mode 100644 tests/features/lazy-layout/ref/9.png create mode 100644 tests/features/lazy-layout/test.typ create mode 100644 tests/features/math-numbering/ref/1.png create mode 100644 tests/features/math-numbering/ref/2.png create mode 100644 tests/features/math-numbering/ref/3.png create mode 100644 tests/features/math-numbering/test.typ create mode 100644 tests/features/outline/ref/1.png create mode 100644 tests/features/outline/ref/2.png create mode 100644 tests/features/outline/ref/3.png create mode 100644 tests/features/outline/ref/4.png create mode 100644 tests/features/outline/ref/5.png create mode 100644 tests/features/outline/ref/6.png create mode 100644 tests/features/outline/test.typ create mode 100644 tests/features/pagination/ref/1.png create mode 100644 tests/features/pagination/ref/2.png create mode 100644 tests/features/pagination/ref/3.png create mode 100644 tests/features/pagination/test.typ create mode 100644 tests/features/raw/ref/1.png create mode 100644 tests/features/raw/ref/2.png create mode 100644 tests/features/raw/ref/3.png create mode 100644 tests/features/raw/ref/4.png create mode 100644 tests/features/raw/ref/5.png create mode 100644 tests/features/raw/ref/6.png create mode 100644 tests/features/raw/test.typ create mode 100644 tests/features/recall-subslide/ref/1.png create mode 100644 tests/features/recall-subslide/ref/10.png create mode 100644 tests/features/recall-subslide/ref/11.png create mode 100644 tests/features/recall-subslide/ref/12.png create mode 100644 tests/features/recall-subslide/ref/13.png create mode 100644 tests/features/recall-subslide/ref/14.png create mode 100644 tests/features/recall-subslide/ref/15.png create mode 100644 tests/features/recall-subslide/ref/16.png create mode 100644 tests/features/recall-subslide/ref/17.png create mode 100644 tests/features/recall-subslide/ref/18.png create mode 100644 tests/features/recall-subslide/ref/19.png create mode 100644 tests/features/recall-subslide/ref/2.png create mode 100644 tests/features/recall-subslide/ref/20.png create mode 100644 tests/features/recall-subslide/ref/21.png create mode 100644 tests/features/recall-subslide/ref/22.png create mode 100644 tests/features/recall-subslide/ref/23.png create mode 100644 tests/features/recall-subslide/ref/3.png create mode 100644 tests/features/recall-subslide/ref/4.png create mode 100644 tests/features/recall-subslide/ref/5.png create mode 100644 tests/features/recall-subslide/ref/6.png create mode 100644 tests/features/recall-subslide/ref/7.png create mode 100644 tests/features/recall-subslide/ref/8.png create mode 100644 tests/features/recall-subslide/ref/9.png create mode 100644 tests/features/recall-subslide/test.typ create mode 100644 tests/features/recall/ref/1.png create mode 100644 tests/features/recall/ref/10.png create mode 100644 tests/features/recall/ref/11.png create mode 100644 tests/features/recall/ref/12.png create mode 100644 tests/features/recall/ref/2.png create mode 100644 tests/features/recall/ref/3.png create mode 100644 tests/features/recall/ref/4.png create mode 100644 tests/features/recall/ref/5.png create mode 100644 tests/features/recall/ref/6.png create mode 100644 tests/features/recall/ref/7.png create mode 100644 tests/features/recall/ref/8.png create mode 100644 tests/features/recall/ref/9.png create mode 100644 tests/features/recall/test.typ create mode 100644 tests/features/show-notes/ref/1.png create mode 100644 tests/features/show-notes/ref/2.png create mode 100644 tests/features/show-notes/ref/3.png create mode 100644 tests/features/show-notes/ref/4.png create mode 100644 tests/features/show-notes/ref/5.png create mode 100644 tests/features/show-notes/ref/6.png create mode 100644 tests/features/show-notes/ref/7.png create mode 100644 tests/features/show-notes/test.typ create mode 100644 tests/features/show-rules/ref/1.png create mode 100644 tests/features/show-rules/ref/10.png create mode 100644 tests/features/show-rules/ref/11.png create mode 100644 tests/features/show-rules/ref/12.png create mode 100644 tests/features/show-rules/ref/13.png create mode 100644 tests/features/show-rules/ref/14.png create mode 100644 tests/features/show-rules/ref/15.png create mode 100644 tests/features/show-rules/ref/16.png create mode 100644 tests/features/show-rules/ref/17.png create mode 100644 tests/features/show-rules/ref/18.png create mode 100644 tests/features/show-rules/ref/19.png create mode 100644 tests/features/show-rules/ref/2.png create mode 100644 tests/features/show-rules/ref/20.png create mode 100644 tests/features/show-rules/ref/21.png create mode 100644 tests/features/show-rules/ref/22.png create mode 100644 tests/features/show-rules/ref/3.png create mode 100644 tests/features/show-rules/ref/4.png create mode 100644 tests/features/show-rules/ref/5.png create mode 100644 tests/features/show-rules/ref/6.png create mode 100644 tests/features/show-rules/ref/7.png create mode 100644 tests/features/show-rules/ref/8.png create mode 100644 tests/features/show-rules/ref/9.png create mode 100644 tests/features/show-rules/test.typ create mode 100644 tests/features/simple/ref/1.png create mode 100644 tests/features/simple/ref/2.png create mode 100644 tests/features/simple/ref/3.png create mode 100644 tests/features/simple/ref/4.png create mode 100644 tests/features/simple/ref/5.png create mode 100644 tests/features/simple/ref/6.png create mode 100644 tests/features/simple/test.typ create mode 100644 tests/features/slide-levels/ref/1.png create mode 100644 tests/features/slide-levels/ref/10.png create mode 100644 tests/features/slide-levels/ref/2.png create mode 100644 tests/features/slide-levels/ref/3.png create mode 100644 tests/features/slide-levels/ref/4.png create mode 100644 tests/features/slide-levels/ref/5.png create mode 100644 tests/features/slide-levels/ref/6.png create mode 100644 tests/features/slide-levels/ref/7.png create mode 100644 tests/features/slide-levels/ref/8.png create mode 100644 tests/features/slide-levels/ref/9.png create mode 100644 tests/features/slide-levels/test.typ create mode 100644 tests/features/speaker-note-after-section-slide/ref/1.png create mode 100644 tests/features/speaker-note-after-section-slide/ref/2.png create mode 100644 tests/features/speaker-note-after-section-slide/ref/3.png create mode 100644 tests/features/speaker-note-after-section-slide/ref/4.png create mode 100644 tests/features/speaker-note-after-section-slide/ref/5.png create mode 100644 tests/features/speaker-note-after-section-slide/test.typ create mode 100644 tests/features/speaker-note-after-slide/ref/1.png create mode 100644 tests/features/speaker-note-after-slide/ref/2.png create mode 100644 tests/features/speaker-note-after-slide/ref/3.png create mode 100644 tests/features/speaker-note-after-slide/ref/4.png create mode 100644 tests/features/speaker-note-after-slide/ref/5.png create mode 100644 tests/features/speaker-note-after-slide/ref/6.png create mode 100644 tests/features/speaker-note-after-slide/test.typ create mode 100644 tests/features/speaker-notes/ref/1.png create mode 100644 tests/features/speaker-notes/ref/2.png create mode 100644 tests/features/speaker-notes/ref/3.png create mode 100644 tests/features/speaker-notes/ref/4.png create mode 100644 tests/features/speaker-notes/ref/5.png create mode 100644 tests/features/speaker-notes/ref/6.png create mode 100644 tests/features/speaker-notes/test.typ create mode 100644 tests/features/waypoints/ref/1.png create mode 100644 tests/features/waypoints/ref/10.png create mode 100644 tests/features/waypoints/ref/100.png create mode 100644 tests/features/waypoints/ref/101.png create mode 100644 tests/features/waypoints/ref/102.png create mode 100644 tests/features/waypoints/ref/103.png create mode 100644 tests/features/waypoints/ref/104.png create mode 100644 tests/features/waypoints/ref/105.png create mode 100644 tests/features/waypoints/ref/106.png create mode 100644 tests/features/waypoints/ref/107.png create mode 100644 tests/features/waypoints/ref/108.png create mode 100644 tests/features/waypoints/ref/109.png create mode 100644 tests/features/waypoints/ref/11.png create mode 100644 tests/features/waypoints/ref/110.png create mode 100644 tests/features/waypoints/ref/111.png create mode 100644 tests/features/waypoints/ref/112.png create mode 100644 tests/features/waypoints/ref/113.png create mode 100644 tests/features/waypoints/ref/114.png create mode 100644 tests/features/waypoints/ref/115.png create mode 100644 tests/features/waypoints/ref/116.png create mode 100644 tests/features/waypoints/ref/117.png create mode 100644 tests/features/waypoints/ref/118.png create mode 100644 tests/features/waypoints/ref/119.png create mode 100644 tests/features/waypoints/ref/12.png create mode 100644 tests/features/waypoints/ref/120.png create mode 100644 tests/features/waypoints/ref/121.png create mode 100644 tests/features/waypoints/ref/122.png create mode 100644 tests/features/waypoints/ref/123.png create mode 100644 tests/features/waypoints/ref/124.png create mode 100644 tests/features/waypoints/ref/125.png create mode 100644 tests/features/waypoints/ref/126.png create mode 100644 tests/features/waypoints/ref/127.png create mode 100644 tests/features/waypoints/ref/128.png create mode 100644 tests/features/waypoints/ref/129.png create mode 100644 tests/features/waypoints/ref/13.png create mode 100644 tests/features/waypoints/ref/130.png create mode 100644 tests/features/waypoints/ref/131.png create mode 100644 tests/features/waypoints/ref/132.png create mode 100644 tests/features/waypoints/ref/133.png create mode 100644 tests/features/waypoints/ref/134.png create mode 100644 tests/features/waypoints/ref/135.png create mode 100644 tests/features/waypoints/ref/136.png create mode 100644 tests/features/waypoints/ref/137.png create mode 100644 tests/features/waypoints/ref/138.png create mode 100644 tests/features/waypoints/ref/139.png create mode 100644 tests/features/waypoints/ref/14.png create mode 100644 tests/features/waypoints/ref/140.png create mode 100644 tests/features/waypoints/ref/141.png create mode 100644 tests/features/waypoints/ref/142.png create mode 100644 tests/features/waypoints/ref/143.png create mode 100644 tests/features/waypoints/ref/144.png create mode 100644 tests/features/waypoints/ref/145.png create mode 100644 tests/features/waypoints/ref/146.png create mode 100644 tests/features/waypoints/ref/147.png create mode 100644 tests/features/waypoints/ref/148.png create mode 100644 tests/features/waypoints/ref/149.png create mode 100644 tests/features/waypoints/ref/15.png create mode 100644 tests/features/waypoints/ref/150.png create mode 100644 tests/features/waypoints/ref/151.png create mode 100644 tests/features/waypoints/ref/152.png create mode 100644 tests/features/waypoints/ref/153.png create mode 100644 tests/features/waypoints/ref/154.png create mode 100644 tests/features/waypoints/ref/16.png create mode 100644 tests/features/waypoints/ref/17.png create mode 100644 tests/features/waypoints/ref/18.png create mode 100644 tests/features/waypoints/ref/19.png create mode 100644 tests/features/waypoints/ref/2.png create mode 100644 tests/features/waypoints/ref/20.png create mode 100644 tests/features/waypoints/ref/21.png create mode 100644 tests/features/waypoints/ref/22.png create mode 100644 tests/features/waypoints/ref/23.png create mode 100644 tests/features/waypoints/ref/24.png create mode 100644 tests/features/waypoints/ref/25.png create mode 100644 tests/features/waypoints/ref/26.png create mode 100644 tests/features/waypoints/ref/27.png create mode 100644 tests/features/waypoints/ref/28.png create mode 100644 tests/features/waypoints/ref/29.png create mode 100644 tests/features/waypoints/ref/3.png create mode 100644 tests/features/waypoints/ref/30.png create mode 100644 tests/features/waypoints/ref/31.png create mode 100644 tests/features/waypoints/ref/32.png create mode 100644 tests/features/waypoints/ref/33.png create mode 100644 tests/features/waypoints/ref/34.png create mode 100644 tests/features/waypoints/ref/35.png create mode 100644 tests/features/waypoints/ref/36.png create mode 100644 tests/features/waypoints/ref/37.png create mode 100644 tests/features/waypoints/ref/38.png create mode 100644 tests/features/waypoints/ref/39.png create mode 100644 tests/features/waypoints/ref/4.png create mode 100644 tests/features/waypoints/ref/40.png create mode 100644 tests/features/waypoints/ref/41.png create mode 100644 tests/features/waypoints/ref/42.png create mode 100644 tests/features/waypoints/ref/43.png create mode 100644 tests/features/waypoints/ref/44.png create mode 100644 tests/features/waypoints/ref/45.png create mode 100644 tests/features/waypoints/ref/46.png create mode 100644 tests/features/waypoints/ref/47.png create mode 100644 tests/features/waypoints/ref/48.png create mode 100644 tests/features/waypoints/ref/49.png create mode 100644 tests/features/waypoints/ref/5.png create mode 100644 tests/features/waypoints/ref/50.png create mode 100644 tests/features/waypoints/ref/51.png create mode 100644 tests/features/waypoints/ref/52.png create mode 100644 tests/features/waypoints/ref/53.png create mode 100644 tests/features/waypoints/ref/54.png create mode 100644 tests/features/waypoints/ref/55.png create mode 100644 tests/features/waypoints/ref/56.png create mode 100644 tests/features/waypoints/ref/57.png create mode 100644 tests/features/waypoints/ref/58.png create mode 100644 tests/features/waypoints/ref/59.png create mode 100644 tests/features/waypoints/ref/6.png create mode 100644 tests/features/waypoints/ref/60.png create mode 100644 tests/features/waypoints/ref/61.png create mode 100644 tests/features/waypoints/ref/62.png create mode 100644 tests/features/waypoints/ref/63.png create mode 100644 tests/features/waypoints/ref/64.png create mode 100644 tests/features/waypoints/ref/65.png create mode 100644 tests/features/waypoints/ref/66.png create mode 100644 tests/features/waypoints/ref/67.png create mode 100644 tests/features/waypoints/ref/68.png create mode 100644 tests/features/waypoints/ref/69.png create mode 100644 tests/features/waypoints/ref/7.png create mode 100644 tests/features/waypoints/ref/70.png create mode 100644 tests/features/waypoints/ref/71.png create mode 100644 tests/features/waypoints/ref/72.png create mode 100644 tests/features/waypoints/ref/73.png create mode 100644 tests/features/waypoints/ref/74.png create mode 100644 tests/features/waypoints/ref/75.png create mode 100644 tests/features/waypoints/ref/76.png create mode 100644 tests/features/waypoints/ref/77.png create mode 100644 tests/features/waypoints/ref/78.png create mode 100644 tests/features/waypoints/ref/79.png create mode 100644 tests/features/waypoints/ref/8.png create mode 100644 tests/features/waypoints/ref/80.png create mode 100644 tests/features/waypoints/ref/81.png create mode 100644 tests/features/waypoints/ref/82.png create mode 100644 tests/features/waypoints/ref/83.png create mode 100644 tests/features/waypoints/ref/84.png create mode 100644 tests/features/waypoints/ref/85.png create mode 100644 tests/features/waypoints/ref/86.png create mode 100644 tests/features/waypoints/ref/87.png create mode 100644 tests/features/waypoints/ref/88.png create mode 100644 tests/features/waypoints/ref/89.png create mode 100644 tests/features/waypoints/ref/9.png create mode 100644 tests/features/waypoints/ref/90.png create mode 100644 tests/features/waypoints/ref/91.png create mode 100644 tests/features/waypoints/ref/92.png create mode 100644 tests/features/waypoints/ref/93.png create mode 100644 tests/features/waypoints/ref/94.png create mode 100644 tests/features/waypoints/ref/95.png create mode 100644 tests/features/waypoints/ref/96.png create mode 100644 tests/features/waypoints/ref/97.png create mode 100644 tests/features/waypoints/ref/98.png create mode 100644 tests/features/waypoints/ref/99.png create mode 100644 tests/features/waypoints/test.typ create mode 100644 tests/integration/cetz/ref/1.png create mode 100644 tests/integration/cetz/ref/10.png create mode 100644 tests/integration/cetz/ref/11.png create mode 100644 tests/integration/cetz/ref/12.png create mode 100644 tests/integration/cetz/ref/2.png create mode 100644 tests/integration/cetz/ref/3.png create mode 100644 tests/integration/cetz/ref/4.png create mode 100644 tests/integration/cetz/ref/5.png create mode 100644 tests/integration/cetz/ref/6.png create mode 100644 tests/integration/cetz/ref/7.png create mode 100644 tests/integration/cetz/ref/8.png create mode 100644 tests/integration/cetz/ref/9.png create mode 100644 tests/integration/cetz/test.typ create mode 100644 tests/integration/codly/ref/1.png create mode 100644 tests/integration/codly/test.typ create mode 100644 tests/integration/fletcher/ref/1.png create mode 100644 tests/integration/fletcher/ref/10.png create mode 100644 tests/integration/fletcher/ref/2.png create mode 100644 tests/integration/fletcher/ref/3.png create mode 100644 tests/integration/fletcher/ref/4.png create mode 100644 tests/integration/fletcher/ref/5.png create mode 100644 tests/integration/fletcher/ref/6.png create mode 100644 tests/integration/fletcher/ref/7.png create mode 100644 tests/integration/fletcher/ref/8.png create mode 100644 tests/integration/fletcher/ref/9.png create mode 100644 tests/integration/fletcher/test.typ create mode 100644 tests/integration/mitex/ref/1.png create mode 100644 tests/integration/mitex/ref/2.png create mode 100644 tests/integration/mitex/ref/3.png create mode 100644 tests/integration/mitex/ref/4.png create mode 100644 tests/integration/mitex/test.typ create mode 100644 tests/integration/pinit/ref/1.png create mode 100644 tests/integration/pinit/ref/2.png create mode 100644 tests/integration/pinit/ref/3.png create mode 100644 tests/integration/pinit/ref/4.png create mode 100644 tests/integration/pinit/ref/5.png create mode 100644 tests/integration/pinit/ref/6.png create mode 100644 tests/integration/pinit/ref/7.png create mode 100644 tests/integration/pinit/ref/8.png create mode 100644 tests/integration/pinit/test.typ create mode 100644 tests/integration/theorion/ref/1.png create mode 100644 tests/integration/theorion/ref/2.png create mode 100644 tests/integration/theorion/ref/3.png create mode 100644 tests/integration/theorion/ref/4.png create mode 100644 tests/integration/theorion/ref/5.png create mode 100644 tests/integration/theorion/test.typ create mode 100644 tests/issues/i164-slides-after-show-rule/ref/1.png create mode 100644 tests/issues/i164-slides-after-show-rule/ref/2.png create mode 100644 tests/issues/i164-slides-after-show-rule/ref/3.png create mode 100644 tests/issues/i164-slides-after-show-rule/test.typ create mode 100644 tests/issues/i203-ratio-in-margin/ref/1.png create mode 100644 tests/issues/i203-ratio-in-margin/ref/2.png create mode 100644 tests/issues/i203-ratio-in-margin/test.typ create mode 100644 tests/issues/i204-meanwhile-in-cetz/ref/1.png create mode 100644 tests/issues/i204-meanwhile-in-cetz/ref/2.png create mode 100644 tests/issues/i204-meanwhile-in-cetz/test.typ create mode 100644 tests/issues/i216-styled-in-first-slide/ref/1.png create mode 100644 tests/issues/i216-styled-in-first-slide/test.typ create mode 100644 tests/issues/i239-new-section-slide-fn/ref/1.png create mode 100644 tests/issues/i239-new-section-slide-fn/ref/2.png create mode 100644 tests/issues/i239-new-section-slide-fn/ref/3.png create mode 100644 tests/issues/i239-new-section-slide-fn/ref/4.png create mode 100644 tests/issues/i239-new-section-slide-fn/test-typst-pages.typ create mode 100644 tests/issues/i239-new-section-slide-fn/test.typ create mode 100644 tests/issues/i259-meanwhile-in-grids/ref/1.png create mode 100644 tests/issues/i259-meanwhile-in-grids/ref/2.png create mode 100644 tests/issues/i259-meanwhile-in-grids/ref/3.png create mode 100644 tests/issues/i259-meanwhile-in-grids/ref/4.png create mode 100644 tests/issues/i259-meanwhile-in-grids/ref/5.png create mode 100644 tests/issues/i259-meanwhile-in-grids/test.typ create mode 100644 tests/issues/i312-empty-slide-after-show-rule/ref/1.png create mode 100644 tests/issues/i312-empty-slide-after-show-rule/ref/2.png create mode 100644 tests/issues/i312-empty-slide-after-show-rule/test.typ create mode 100644 tests/themes/aqua/default/.gitignore create mode 100644 tests/themes/aqua/default/ref/1.png create mode 100644 tests/themes/aqua/default/ref/2.png create mode 100644 tests/themes/aqua/default/ref/3.png create mode 100644 tests/themes/aqua/default/ref/4.png create mode 100644 tests/themes/aqua/default/ref/5.png create mode 100644 tests/themes/aqua/default/ref/6.png create mode 100644 tests/themes/aqua/default/test.typ create mode 100644 tests/themes/dewdrop/default/.gitignore create mode 100644 tests/themes/dewdrop/default/ref/1.png create mode 100644 tests/themes/dewdrop/default/ref/10.png create mode 100644 tests/themes/dewdrop/default/ref/11.png create mode 100644 tests/themes/dewdrop/default/ref/12.png create mode 100644 tests/themes/dewdrop/default/ref/13.png create mode 100644 tests/themes/dewdrop/default/ref/2.png create mode 100644 tests/themes/dewdrop/default/ref/3.png create mode 100644 tests/themes/dewdrop/default/ref/4.png create mode 100644 tests/themes/dewdrop/default/ref/5.png create mode 100644 tests/themes/dewdrop/default/ref/6.png create mode 100644 tests/themes/dewdrop/default/ref/7.png create mode 100644 tests/themes/dewdrop/default/ref/8.png create mode 100644 tests/themes/dewdrop/default/ref/9.png create mode 100644 tests/themes/dewdrop/default/test.typ create mode 100644 tests/themes/dewdrop/mini-slides/.gitignore create mode 100644 tests/themes/dewdrop/mini-slides/ref/1.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/10.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/11.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/12.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/13.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/2.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/3.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/4.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/5.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/6.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/7.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/8.png create mode 100644 tests/themes/dewdrop/mini-slides/ref/9.png create mode 100644 tests/themes/dewdrop/mini-slides/test.typ create mode 100644 tests/themes/dewdrop/section-body/ref/1.png create mode 100644 tests/themes/dewdrop/section-body/test.typ create mode 100644 tests/themes/dewdrop/sidebar/.gitignore create mode 100644 tests/themes/dewdrop/sidebar/ref/1.png create mode 100644 tests/themes/dewdrop/sidebar/ref/10.png create mode 100644 tests/themes/dewdrop/sidebar/ref/11.png create mode 100644 tests/themes/dewdrop/sidebar/ref/12.png create mode 100644 tests/themes/dewdrop/sidebar/ref/13.png create mode 100644 tests/themes/dewdrop/sidebar/ref/2.png create mode 100644 tests/themes/dewdrop/sidebar/ref/3.png create mode 100644 tests/themes/dewdrop/sidebar/ref/4.png create mode 100644 tests/themes/dewdrop/sidebar/ref/5.png create mode 100644 tests/themes/dewdrop/sidebar/ref/6.png create mode 100644 tests/themes/dewdrop/sidebar/ref/7.png create mode 100644 tests/themes/dewdrop/sidebar/ref/8.png create mode 100644 tests/themes/dewdrop/sidebar/ref/9.png create mode 100644 tests/themes/dewdrop/sidebar/test.typ create mode 100644 tests/themes/metropolis/default/.gitignore create mode 100644 tests/themes/metropolis/default/ref/1.png create mode 100644 tests/themes/metropolis/default/ref/10.png create mode 100644 tests/themes/metropolis/default/ref/11.png create mode 100644 tests/themes/metropolis/default/ref/12.png create mode 100644 tests/themes/metropolis/default/ref/2.png create mode 100644 tests/themes/metropolis/default/ref/3.png create mode 100644 tests/themes/metropolis/default/ref/4.png create mode 100644 tests/themes/metropolis/default/ref/5.png create mode 100644 tests/themes/metropolis/default/ref/6.png create mode 100644 tests/themes/metropolis/default/ref/7.png create mode 100644 tests/themes/metropolis/default/ref/8.png create mode 100644 tests/themes/metropolis/default/ref/9.png create mode 100644 tests/themes/metropolis/default/test.typ create mode 100644 tests/themes/simple/default/.gitignore create mode 100644 tests/themes/simple/default/ref/1.png create mode 100644 tests/themes/simple/default/ref/2.png create mode 100644 tests/themes/simple/default/ref/3.png create mode 100644 tests/themes/simple/default/ref/4.png create mode 100644 tests/themes/simple/default/ref/5.png create mode 100644 tests/themes/simple/default/ref/6.png create mode 100644 tests/themes/simple/default/test.typ create mode 100644 tests/themes/stargazer/default/.gitignore create mode 100644 tests/themes/stargazer/default/ref/1.png create mode 100644 tests/themes/stargazer/default/ref/10.png create mode 100644 tests/themes/stargazer/default/ref/11.png create mode 100644 tests/themes/stargazer/default/ref/12.png create mode 100644 tests/themes/stargazer/default/ref/13.png create mode 100644 tests/themes/stargazer/default/ref/2.png create mode 100644 tests/themes/stargazer/default/ref/3.png create mode 100644 tests/themes/stargazer/default/ref/4.png create mode 100644 tests/themes/stargazer/default/ref/5.png create mode 100644 tests/themes/stargazer/default/ref/6.png create mode 100644 tests/themes/stargazer/default/ref/7.png create mode 100644 tests/themes/stargazer/default/ref/8.png create mode 100644 tests/themes/stargazer/default/ref/9.png create mode 100644 tests/themes/stargazer/default/test.typ create mode 100644 tests/themes/university/default/.gitignore create mode 100644 tests/themes/university/default/ref/1.png create mode 100644 tests/themes/university/default/ref/2.png create mode 100644 tests/themes/university/default/ref/3.png create mode 100644 tests/themes/university/default/ref/4.png create mode 100644 tests/themes/university/default/ref/5.png create mode 100644 tests/themes/university/default/ref/6.png create mode 100644 tests/themes/university/default/ref/7.png create mode 100644 tests/themes/university/default/test.typ create mode 100644 themes/aqua.typ create mode 100644 themes/default.typ create mode 100644 themes/dewdrop.typ create mode 100644 themes/ironclaw.typ create mode 100644 themes/metropolis.typ create mode 100644 themes/simple.typ create mode 100644 themes/stargazer.typ create mode 100644 themes/themes.typ create mode 100644 themes/university.typ create mode 100644 typst.toml diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..05dae4c --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,259 @@ +# Touying - AI Coding Agent Instructions + +## Project Overview + +Touying is a Typst package for creating presentation slides. It is a powerful alternative to LaTeX Beamer with better performance, achieved by avoiding `counter` and `context` for `#pause` animations. + +## Repository Layout + +``` +lib.typ # Entry point — re-exports src/exports.typ +src/ + core.typ # Animation engine, slide rendering + utils.typ # Shared helpers (merge-dicts, display-current-heading, …) + configs.typ # config-common, config-colors, config-page, config-info, … + exports.typ # Public API surface + components.typ # Reusable slide components (cols, …) +themes/ # 6 built-in themes: simple, metropolis, dewdrop, university, aqua, stargazer +examples/ # Theme usage examples (excluded from package) +tests/ + features/ # Feature regression tests (test.typ + ref/*.png) + themes/ # Theme regression tests + examples/ # Full-presentation tests +typst.toml # Package manifest (name, version, compiler constraint) +``` + +## Development Workflow + +### Tools + +Three tools must be available in your environment (all installed by `.github/workflows/copilot-setup-steps.yml`): + +| Tool | Command | Purpose | +|------|---------|---------| +| Typst CLI | `typst` | Compile `.typ` files | +| tytanic | `tt` | Visual regression test runner | +| typstyle | `typstyle` | Official Typst code formatter | + +### Testing with tytanic + +```bash +# Run the full test suite (compares rendered PNGs against ref/ images) +tt run + +# Run only a subset of tests +tt run tests/features/animation + +# Update reference images after intentional visual changes +tt update + +# List all tests +tt list +``` + +- tytanic automatically locates the project root via `typst.toml` +- Test output goes to `tests/**/out/`, diffs to `tests/**/diff/` +- Reference images are committed in `tests/**/ref/` +- PPI for reference images: 72 (set in `typst.toml` under `[tool.tytanic]`) + +**When to run `tt update`**: After making intentional visual changes (e.g., layout, theme colors), regenerate the reference images with `tt update` and commit the updated `ref/*.png` files. + +### Formatting with typstyle + +**Always format modified `.typ` files before finalising a PR.** The CI enforces this via `git diff --exit-code`. + +```bash +# Format one or more files in-place +typstyle -i src/core.typ src/utils.typ + +# Format an entire directory recursively +typstyle -i themes/ + +# Format all .typ files in the project +typstyle -i src/ themes/ tests/ +``` + +### Compiling a single file (quick check) + +```bash +# No build step required — Touying is a pure Typst package +typst compile --root . tests/features/animation/test.typ /tmp/out.pdf +``` + +## Typst Language Essentials + +### Syntax Modes + +| Mode | Trigger | Example | +|------|---------|---------| +| Markup (default) | — | `*bold*`, `_italic_`, `= Heading` | +| Code | `#` prefix | `#let x = 1`, `#if cond { … }` | +| Math | `$…$` | `$x^2 + y$` | + +> **Always use Typst's native math syntax**, not LaTeX. Typst math is more intuitive. + +### Naming: kebab-case only + +All identifiers (variables, functions, parameters) use **kebab-case**: + +```typst +#let my-variable = 42 +#let calculate-sum(a, b) = a + b +``` + +snake_case, camelCase, and PascalCase are **prohibited**. + +### Reserved identifiers to avoid shadowing + +Do not bind variables or parameters to Typst built-in names. Key ones to avoid: + +- **Types**: `none`, `auto`, `bool`, `int`, `float`, `str`, `content`, `function`, `array`, `dictionary`, `color`, `length`, `ratio`, `angle`, `stroke`, `alignment`, `direction` +- **Layout**: `columns`, `grid`, `table`, `stack`, `box`, `block`, `place`, `align`, `pad`, `measure`, `layout`, `repeat` +- **Text/lists**: `text`, `par`, `list`, `enum`, `item`, `quote`, `raw`, `strong`, `emph` +- **Document**: `document`, `page`, `heading`, `outline`, `figure`, `footnote` +- **Graphics**: `math`, `rect`, `circle`, `polygon`, `rotate`, `scale`, `fill`, `gradient` +- **I/O**: `read`, `include`, `image`, `link`, `ref`, `cite` + +When wrapping these, use a `touying-` prefix: `touying-grid`, `touying-table`. + +### Pure functions & caching + +Typst functions are **pure** — they cannot mutate external state: + +```typst +// ✗ Invalid: cannot push to an external array inside a function +// ✗ Invalid: cannot assign to an external variable + +// ✓ Return new values instead +#let add-item(items, new) = items + (new,) +``` + +Typst automatically **caches** function call results by input. Avoid creating many tiny functions with trivial bodies — inline code is usually preferable to prevent cache bloat. + +## Key API Patterns + +### Slide creation + +```typst +// Heading-based (preferred) += Section // section slide +== Subsection // subsection slide +=== Slide title // content slide + +// Explicit function call +#slide[Content] +#slide(composer: (1fr, 1fr))[Left column][Right column] +``` + +### Animation + +```typst +#pause // incremental reveal +#meanwhile // parallel track with #pause +#uncover("2-")[content] // visible from subslide 2 onward +#only("1,3")[content] // visible only on subslides 1 and 3 +#alternatives[Option A][Option B] + +// Callback style (access self.subslide) +#slide(self => { + let (uncover, only, alternatives) = utils.methods(self) + uncover("2-")[Revealed on 2+] +}) +``` + +### Configuration + +```typst +#show: simple-theme.with( + aspect-ratio: "16-9", + config-info(title: [Title], author: [Author]), + config-colors(primary: blue), + config-common(handout: false), +) + +// Per-slide config override +#slide( + config: utils.merge-dicts( + config-colors(primary: red), + config-common(handout: true), + ) +)[Content] +``` + +Configuration functions: +- `config-colors` — color scheme +- `config-common` — global flags (`handout`, `frozen-counters`, `show-only-notes`, …) +- `config-info` — document metadata (title, author, date, …) +- `config-methods` — animation method overrides +- `config-page` — page layout + +### External package integration (touying-reducer) + +```typst +// CeTZ +#let cetz-canvas = touying-reducer.with( + reduce: cetz.canvas, + cover: cetz.draw.hide.with(bounds: true), +) +#cetz-canvas({ + import cetz.draw: * + rect((0,0), (5,5)) + (pause,) + circle((2.5,2.5), radius: 1) +}) + +// Fletcher +#let fletcher-diagram = touying-reducer.with( + reduce: fletcher.diagram, + cover: fletcher.hide, +) +``` + +### Speaker notes + +```typst +#speaker-note[ + + Remind audience of previous slide + + Key takeaway: … +] +``` + +## Documentation Standard + +Use `///` docstrings for all public functions: + +```typst +/// One-line description. +/// +/// Example: +/// ```typst +/// #my-fn(arg1: value) +/// ``` +/// +/// - arg1 (str): Description. +/// - arg2 (int | none): Optional count, defaults to `none`. +/// +/// -> content +``` + +Types use Typst names (`str`, `int`, `content`, `function`, …); union types use `|`. + +## Special Heading Labels + +Touying recognises these heading labels for slide control: + +| Label | Effect | +|-------|--------| +| `` | Hide slide completely | +| `` | Skip slide in output | +| `` | No slide number | +| `` | Exclude from outline | +| `` | No PDF bookmark | +| `` | Show only in handout mode | + +## Performance Notes + +- Avoid `counter` and `context` inside animation logic (causes recompilation). +- Use `touying-reducer` for external animated content (CeTZ, Fletcher, …). +- Prefer functional composition over mutable state. +- Only extract helpers into named functions when the caching benefit is real. \ No newline at end of file diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000..c58372b --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,48 @@ +name: "Copilot Setup Steps" + +# Automatically run the setup steps when they are changed to allow for easy validation, +# and allow manual testing through the repository's "Actions" tab. +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + copilot-setup-steps: + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + + # Install the Typst CLI (used for compiling .typ files and running tests) + - name: Setup Typst + uses: typst-community/setup-typst@v4 + + # Install Rust toolchain (needed by cargo-binstall and tytanic) + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + # cargo-binstall provides fast binary installation without full compilation + - name: Install cargo-binstall + uses: taiki-e/install-action@v2 + with: + tool: cargo-binstall + + # tytanic (tt) is the visual regression test runner for Touying + # Pinned to the same version used in test.yml CI + - name: Install tytanic + run: cargo binstall tytanic@0.3.3 -y + + # typstyle is the official Typst code formatter + # Usage: typstyle -i file1.typ file2.typ dir/ + - name: Install typstyle + run: cargo binstall typstyle -y diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml new file mode 100644 index 0000000..3be6214 --- /dev/null +++ b/.github/workflows/docs-preview.yml @@ -0,0 +1,154 @@ +name: Docs Preview + +on: + pull_request: + types: [opened, synchronize, reopened, closed] + paths: + - "docs/**" + +# Build runs share one concurrency group and can cancel each other when a new +# commit arrives. Cleanup (PR closed) uses a distinct group so it is never +# cancelled by an in-progress build for the same PR. +concurrency: + group: >- + docs-preview-${{ github.event.number }}-${{ + github.event.action == 'closed' && 'cleanup' || 'build' + }} + cancel-in-progress: true + +permissions: + contents: write # push to gh-pages branch + pull-requests: write # post / update the preview comment + +jobs: + preview: + name: Deploy Docs Preview + runs-on: ubuntu-latest + + steps: + # ── 1. Check out this (touying) repo at the workspace root ───────────── + # The root checkout establishes GITHUB_TOKEN credentials so that + # rossjrw/pr-preview-action can push to *this* repo's gh-pages branch. + - name: Checkout touying (PR branch) + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # ── 2. Clone the Docusaurus website repo ─────────────────────────────── + # We clone it without initialising its submodule because we are about to + # replace the submodule directory with the current PR's content anyway. + - name: Checkout website repo + if: github.event.action != 'closed' + uses: actions/checkout@v4 + with: + repository: touying-typ/touying-typ.github.io + path: website + submodules: false + + # ── 3. Inject this PR's touying content into the website tree ────────── + # The website scripts expect: + # website/touying/docs/en/** (hand-written docs) + # website/touying/docs/zh/** (Chinese docs) + # website/touying/src/** (Typst sources – for generate-docs.py) + # website/touying/themes/** (theme files – for generate-docs.py) + # We rsync everything from the touying root except .git and the website/ + # checkout directory itself to avoid recursion. + - name: Inject PR docs into website + if: github.event.action != 'closed' + run: | + mkdir -p website/touying + rsync -a --exclude='.git' --exclude='website' . website/touying/ + + # ── 4. Set up the Node.js environment ───────────────────────────────── + - name: Set up Node.js + if: github.event.action != 'closed' + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: website/package-lock.json + + # ── 5. Install Typst (required by generate-images.py) ────────────────── + - name: Install Typst + if: github.event.action != 'closed' + uses: typst-community/setup-typst@v4 + + # ── 6. Install Python dependencies (Pillow for generate-images.py) ───── + - name: Install Python dependencies + if: github.event.action != 'closed' + run: pip install Pillow + + # ── 7. Install Node dependencies ─────────────────────────────────────── + - name: Install Node dependencies + if: github.event.action != 'closed' + working-directory: website + run: npm ci + + # ── 8. Run the website's own doc-preparation pipeline ───────────────── + - name: Copy docs from touying into website structure + if: github.event.action != 'closed' + working-directory: website + run: npm run copy-docs + + - name: Generate API reference documentation + if: github.event.action != 'closed' + working-directory: website + run: npm run generate-docs + + - name: Generate slide preview images + if: github.event.action != 'closed' + id: generate-images + working-directory: website + run: npm run generate-images + continue-on-error: true + + - name: Warn if slide image generation failed + if: steps.generate-images.outcome == 'failure' + run: | + echo "::warning::Slide preview image generation failed. The docs preview will be deployed without generated slide images. Check the 'Generate slide preview images' step log for details." + + # ── 9. Patch Docusaurus config for PR preview ───────────────────────── + # The website navbar/footer may contain hardcoded links (e.g. /docs/start, + # /docs/dynamic/simple) that don't exist in every PR's docs structure. + # Downgrading onBrokenLinks from 'throw' to 'warn' prevents the build from + # failing over such link drift while still making broken links visible in + # the build log. + - name: Patch broken-links setting for PR preview + if: github.event.action != 'closed' + working-directory: website + run: | + for f in docusaurus.config.js docusaurus.config.ts docusaurus.config.mjs; do + if [ -f "$f" ]; then + sed -i "s/onBrokenLinks:[[:space:]]*['\"]throw['\"]/onBrokenLinks: 'warn'/g" "$f" + echo "Patched onBrokenLinks in $f" + break + fi + done + + # ── 10. Build the Docusaurus site ────────────────────────────────────── + # The touying repo is hosted at https://touying-typ.github.io/touying/ + # so PR previews live under /touying/pr-preview/pr-NNN/. + # We pass this as DOCUSAURUS_BASE_URL so that Docusaurus sets the + # correct href and all asset / link paths resolve properly. + - name: Build website + if: github.event.action != 'closed' + working-directory: website + run: npm run build + env: + DOCUSAURUS_BASE_URL: /touying/pr-preview/pr-${{ github.event.number }}/ + + # ── 10. Deploy preview (or clean up on PR close) ──────────────────────── + # rossjrw/pr-preview-action: + # - On open/sync/reopen: pushes build/ to the gh-pages branch under + # pr-preview/pr-NNN/ and posts a comment with the preview URL. + # - On close: removes pr-preview/pr-NNN/ from gh-pages and updates + # the comment. + # + # Preview URL: https://touying-typ.github.io/touying/pr-preview/pr-NNN/ + - name: Deploy / clean-up preview + uses: rossjrw/pr-preview-action@v1 + with: + source-dir: website/build + preview-branch: gh-pages + umbrella-dir: pr-preview + action: auto diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..362e359 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,51 @@ +name: Test +on: + push: + pull_request: + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install cargo-binstall + uses: taiki-e/install-action@v2 + with: + tool: cargo-binstall + + - name: Install tytanic + run: cargo binstall tytanic@0.3.3 -y + + - name: Setup typst + uses: typst-community/setup-typst@v4 + + - name: Run test suite + run: tt run + + - name: Archive diffs + uses: actions/upload-artifact@v4 + if: always() + with: + name: artifacts + path: | + tests/**/diff/*.png + tests/**/out/*.png + tests/**/ref/*.png + retention-days: 5 + + typstyle: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Run typstyle + uses: typstyle-rs/typstyle-action@main + - name: Check for changes + # Fails the CI job if typstyle modified any files. + # This ensures developers format their code before merging. + run: git diff --exit-code diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6048d23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/local + +.DS_Store + +*.pdf +*.pdfpc +nohup.out diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..446f1e2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2026 OrangeX4 +Copyright (c) 2026 zral0kh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..db72228 --- /dev/null +++ b/README.md @@ -0,0 +1,337 @@ +# ![Touying logo - a presentation slides package for Typst](https://github.com/user-attachments/assets/58a91b14-ae1a-49e2-a3e7-5e3a148e2ba5) + +[Touying](https://github.com/touying-typ/touying) (投影 in Chinese, /tóuyǐng/, meaning projection) is a user-friendly, powerful, and efficient package for creating presentation slides in [Typst](https://typst.app/). + +If you like it, consider [giving a star ⭐ on GitHub](https://github.com/touying-typ/touying). Touying is a community-driven project — feel free to suggest ideas and contribute! + +[![Typst Universe](https://img.shields.io/badge/dynamic/xml?url=https%3A%2F%2Ftypst.app%2Funiverse%2Fpackage%2Ftouying&query=%2Fhtml%2Fbody%2Fdiv%2Fmain%2Fdiv%5B2%5D%2Faside%2Fsection%5B2%5D%2Fdl%2Fdd%5B3%5D&logo=typst&label=universe&color=%2339cccc)](https://typst.app/universe/package/touying) +[![Book badge](https://img.shields.io/badge/docs-book-green)](https://touying-typ.github.io/) +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/touying-typ/touying) +[![Ask Zread for AI-assisted help with Touying](https://img.shields.io/badge/Ask_Zread-_.svg?style=flat&color=00b0aa&labelColor=000000&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuOTYxNTYgMS42MDAxSDIuMjQxNTZDMS44ODgxIDEuNjAwMSAxLjYwMTU2IDEuODg2NjQgMS42MDE1NiAyLjI0MDFWNC45NjAxQzEuNjAxNTYgNS4zMTM1NiAxLjg4ODEgNS42MDAxIDIuMjQxNTYgNS42MDAxSDQuOTYxNTZDNS4zMTUwMiA1LjYwMDEgNS42MDE1NiA1LjMxMzU2IDUuNjAxNTYgNC45NjAxVjIuMjQwMUM1LjYwMTU2IDEuODg2NjQgNS4zMTUwMiAxLjYwMDEgNC45NjE1NiAxLjYwMDFaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00Ljk2MTU2IDEwLjM5OTlIMi4yNDE1NkMxLjg4ODEgMTAuMzk5OSAxLjYwMTU2IDEwLjY4NjQgMS42MDE1NiAxMS4wMzk5VjEzLjc1OTlDMS42MDE1NiAxNC4xMTM0IDEuODg4MSAxNC4zOTk5IDIuMjQxNTYgMTQuMzk5OUg0Ljk2MTU2QzUuMzE1MDIgMTQuMzk5OSA1LjYwMTU2IDE0LjExMzQgNS42MDE1NiAxMy43NTk5VjExLjAzOTlDNS42MDE1NiAxMC42ODY0IDUuMzE1MDIgMTAuMzk5OSA0Ljk2MTU2IDEwLjM5OTlaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik0xMy43NTg0IDEuNjAwMUgxMS4wMzg0QzEwLjY4NSAxLjYwMDEgMTAuMzk4NCAxLjg4NjY0IDEwLjM5ODQgMi4yNDAxVjQuOTYwMUMxMC4zOTg0IDUuMzEzNTYgMTAuNjg1IDUuNjAwMSAxMS4wMzg0IDUuNjAwMUgxMy43NTg0QzE0LjExMTkgNS42MDAxIDE0LjM5ODQgNS4zMTM1NiAxNC4zOTg0IDQuOTYwMVYyLjI0MDFDMTQuMzk4NCAxLjg4NjY0IDE0LjExMTkgMS42MDAxIDEzLjc1ODQgMS42MDAxWiIgZmlsbD0iI2ZmZiIvPgo8cGF0aCBkPSJNNCAxMkwxMiA0TDQgMTJaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00IDEyTDEyIDQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K&logoColor=ffffff)](https://zread.ai/touying-typ/touying) +[![Gallery badge](https://img.shields.io/badge/demo-gallery-red)](https://github.com/touying-typ/touying/wiki) +![GitHub License](https://img.shields.io/github/license/touying-typ/touying) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/touying-typ/touying) +![GitHub Repo stars](https://img.shields.io/github/stars/touying-typ/touying) +![Themes badge](https://img.shields.io/badge/themes-6-aqua) + + +## Why Touying? + +- **Beautiful themes** — [built-in themes](https://touying-typ.github.io/themes/) like Simple, Metropolis, Dewdrop, University, Aqua, Stargazer and [diverse themes on Typst Universe](https://typst.app/universe/search/?q=touying) +- **Fast** — Typst compiles in milliseconds. Live previews update as you type, giving you the instant feedback. +- **Rich animations** — `#pause`, `#meanwhile`, math equation animations, CeTZ & Fletcher support +- **Heading-based slides** — write presentations like a document, no boilerplate +- **Speaker notes** — dual-screen support via tools like PowerPoint, HTML or pympress +- **Export** — Builtin PDF export, PPTX and HTML via [touying-exporter](https://github.com/touying-typ/touying-exporter) +- **Correct bookmarks** — proper PDF outline and page numbers out of the box + +## Documents & Help + +- [Full documentation and references](https://touying-typ.github.io/) (English & Chinese) +- [Ask DeepWiki](https://deepwiki.com/touying-typ/touying) or [Ask Zread](https://zread.ai/touying-typ/touying) for AI-assisted help +- [Gallery](https://github.com/touying-typ/touying/wiki) — slides made by the community +- [Universe](https://typst.app/universe/search/?q=touying) — Diverse touying themes on Typst Universe +- [Share slides instantly on GitHub](https://gistd.myriad-dreamin.com/touying-typ/touying/blob/main/examples/simple.typ?g-mode=slide) with [gistd](https://github.com/Myriad-Dreamin/gistd) or [export](https://github.com/touying-typ/touying-exporter) slides to PPTX and HTML formats and show presentation [online](https://touying-typ.github.io/touying-template/). + + +## Quick Start + +Make sure you have [Typst](https://typst.app/) installed, or use the [Web App](https://typst.app/) / [Tinymist for VS Code](https://marketplace.visualstudio.com/items?itemName=myriad-dreamin.tinymist). + +```typst +#import "@preview/touying:0.7.3": * +#import themes.simple: * + +#show: simple-theme.with(aspect-ratio: "16-9") + += Title + +== First Slide + +Hello, Touying! + +#pause + +Hello, Typst! +``` + +![Screenshot of a simple Touying slide showing Hello Touying and Hello Typst](https://github.com/touying-typ/touying/assets/34951714/f5bdbf8f-7bf9-45fd-9923-0fa5d66450b2) + +Congratulations on creating your first Touying slide! 🎉 + + +## Animations + +Touying supports incremental reveal with `#pause` and `#meanwhile`, math equation animations, and integrations with CeTZ and Fletcher: + +| Math equations | CeTZ & Fletcher | +|:---:|:---:| +| ![math animation](https://github.com/touying-typ/touying/assets/34951714/8640fe0a-95e4-46ac-b570-c8c79f993de4) | ![cetz fletcher animation](https://github.com/touying-typ/touying/assets/34951714/9ba71f54-2a5d-4144-996c-4a42833cc5cc) | + +For the full feature set — cover mode, callback-style animations, `#uncover`, `#only`, `#alternatives` — see the [documentation](https://touying-typ.github.io/docs/tutorials/dynamic/simple). + + +## Full Example + +For a comprehensive example showcasing university theme, theorems, CeTZ/Fletcher animations, speaker notes, and more. You can also use the `#slide[..]` format to access more powerful features provided by Touying. + +```typst +#import "@preview/touying:0.7.3": * +#import themes.university: * +#import "@preview/cetz:0.5.0" +#import "@preview/fletcher:0.5.8" as fletcher: node, edge +#import "@preview/numbly:0.1.0": numbly +#import "@preview/theorion:0.6.0": * +#import cosmos.clouds: * +#show: show-theorion + +// cetz and fletcher bindings for touying +#let cetz-canvas = touying-reducer.with(reduce: cetz.canvas, cover: cetz.draw.hide.with(bounds: true)) +#let fletcher-diagram = touying-reducer.with(reduce: fletcher.diagram, cover: fletcher.hide) + +#show: university-theme.with( + aspect-ratio: "16-9", + // align: horizon, + // config-common(handout: true), + config-common(frozen-counters: (theorem-counter,)), // freeze theorem counter for animation + config-info( + title: [Title], + subtitle: [Subtitle], + author: [Authors], + date: datetime.today(), + institution: [Institution], + logo: emoji.school, + ), +) + +#set heading(numbering: numbly("{1}.", default: "1.1")) + +#title-slide() + +== Outline + +#components.adaptive-columns(outline(title: none, indent: 1em)) + += Animation + +== Simple Animation + +We can use `#pause` to #pause display something later. + +#pause + +Just like this. + +#meanwhile + +Meanwhile, #pause we can also use `#meanwhile` to #pause display other content synchronously. + +#speaker-note[ + + This is a speaker note. + + You won't see it unless you use `config-common(show-notes-on-second-screen: right)` +] + + +== Complex Animation + +At subslide #touying-fn-wrapper((self: none) => str(self.subslide)), we can + +use #uncover("2-")[`#uncover` function] for reserving space, + +use #only("2-")[`#only` function] for not reserving space, + +#alternatives[call `#only` multiple times \u{2717}][use `#alternatives` function #sym.checkmark] for choosing one of the alternatives. + + +== Callback Style Animation + +#slide( + repeat: 3, + self => [ + #let (uncover, only, alternatives) = utils.methods(self) + + At subslide #self.subslide, we can + + use #uncover("2-")[`#uncover` function] for reserving space, + + use #only("2-")[`#only` function] for not reserving space, + + #alternatives[call `#only` multiple times \u{2717}][use `#alternatives` function #sym.checkmark] for choosing one of the alternatives. + ], +) + + +== Math Equation Animation + +Equation with `pause`: + +$ + f(x) &= pause x^2 + 2x + 1 \ + &= pause (x + 1)^2 \ +$ + +#meanwhile + +Here, #pause we have the expression of $f(x)$. + +#pause + +By factorizing, we can obtain this result. + + +== CeTZ Animation + +CeTZ Animation in Touying: + +#cetz-canvas({ + import cetz.draw: * + + rect((0, 0), (5, 5)) + + (pause,) + + rect((0, 0), (1, 1)) + rect((1, 1), (2, 2)) + rect((2, 2), (3, 3)) + + (pause,) + + line((0, 0), (2.5, 2.5), name: "line") +}) + + +== Fletcher Animation + +Fletcher Animation in Touying: + +#fletcher-diagram( + node-stroke: .1em, + node-fill: gradient.radial(blue.lighten(80%), blue, center: (30%, 20%), radius: 80%), + spacing: 4em, + edge((-1, 0), "r", "-|>", `open(path)`, label-pos: 0, label-side: center), + node((0, 0), `reading`, radius: 2em), + edge((0, 0), (0, 0), `read()`, "--|>", bend: 130deg), + pause, + edge(`read()`, "-|>"), + node((1, 0), `eof`, radius: 2em), + pause, + edge(`close()`, "-|>"), + node((2, 0), `closed`, radius: 2em, extrude: (-2.5, 0)), + edge((0, 0), (2, 0), `close()`, "-|>", bend: -40deg), +) + + += Theorems + +== Prime numbers + +#definition[ + A natural number is called a #highlight[_prime number_] if it is greater + than 1 and cannot be written as the product of two smaller natural numbers. +] +#example[ + The numbers $2$, $3$, and $17$ are prime. + @cor_largest_prime shows that this list is not exhaustive! +] + +#theorem(title: "Euclid")[ + There are infinitely many primes. +] +#pagebreak(weak: true) +#proof[ + Suppose to the contrary that $p_1, p_2, dots, p_n$ is a finite enumeration + of all primes. Set $P = p_1 p_2 dots p_n$. Since $P + 1$ is not in our list, + it cannot be prime. Thus, some prime factor $p_j$ divides $P + 1$. Since + $p_j$ also divides $P$, it must divide the difference $(P + 1) - P = 1$, a + contradiction. +] + +#corollary[ + There is no largest prime number. +] +#corollary[ + There are infinitely many composite numbers. +] + +#theorem[ + There are arbitrarily long stretches of composite numbers. +] + +#proof[ + For any $n > 2$, consider $ + n! + 2, quad n! + 3, quad ..., quad n! + n + $ +] + + += Others + +== Multiple columns + +#cols[ + First column. +][ + Second column. +] + +== Multiple columns with equal height blocks + +#cols(columns: (1fr, 1fr), gutter: 1em)[ + #emph-block[ + First column with equal height: #lorem(10) + #lazy-v(1fr) + ] +][ + #emph-block[ + Second column with equal height: : #lorem(15) + #lazy-v(1fr) + ] +] + + +== Multiple Pages + +#lorem(200) + + +#show: appendix + += Appendix + +== Appendix + +Please pay attention to the current slide number. +``` + +![Screenshot of a full example using the university theme with animations and theorems](https://github.com/user-attachments/assets/b1dfc4d9-e263-46ff-8588-a0635870e370) + + +## Acknowledgements + +Thanks to... + +- [@andreasKroepelin](https://github.com/andreasKroepelin) for the `polylux` package +- [@zral0kh](https://github.com/zral0kh) for the waypoint feature and many improvements +- [@enklht](https://github.com/enklht) for many fixes and improvements +- [@Enivex](https://github.com/Enivex) for the `metropolis` theme +- [@drupol](https://github.com/drupol) for the `university` theme +- [@pride7](https://github.com/pride7) for the `aqua` theme +- [@Coekjan](https://github.com/Coekjan) and [@QuadnucYard](https://github.com/QuadnucYard) for the `stargazer` theme +- [@ntjess](https://github.com/ntjess) for contributing to `fit-to-height`, `fit-to-width` and `cover-with-rect` + + +## Poster + +![Touying poster example](https://github.com/user-attachments/assets/e1ddb672-8e8f-472d-b364-b8caed1da16b) + +[View Code](https://github.com/touying-typ/touying-poster) + +## Star History + + + + + + Star History Chart + + \ No newline at end of file diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..8452734 --- /dev/null +++ b/changelog.md @@ -0,0 +1,473 @@ +# Changelog + +## v0.7.3 + +### Minor Breaking Changes + +- **feat!: always attach `#speaker-note[]` to the previous slide & default `receive-body-for-new-*-slide-fn` to `false`** ([#354](https://github.com/touying-typ/touying/pull/354)) + - `#speaker-note[]` now always attaches to the **slide above it**, regardless of how that slide was created (explicit slide calls, heading-triggered section slides, or normal content slides). This eliminates the common pitfall where a `#speaker-note[]` placed after a slide would silently create an unwanted empty "ghost" slide. + - `receive-body-for-new-section-slide-fn` and its variants are now **defaulted to `false`** (previously `true`). + +### Migration Guide + +If you relied on content after `= Section` headings being absorbed into the section slide body, explicitly set `receive-body-for-new-section-slide-fn: true` in your `config-common(...)`. + +### Features + +- feat: `item-by-item-fn` and presets for it ([#347](https://github.com/touying-typ/touying/pull/347)) +- feat: improved `custom-progressive-outline` and new `section-relationship` and some other things ([#345](https://github.com/touying-typ/touying/pull/345)) +- feat: better lazy-layout for mixed layouts ([#355](https://github.com/touying-typ/touying/pull/355)) +- feat: add `cols` as alias of `side-by-side` and export some components `cols`, `lazy-xxx` to outside ([#356](https://github.com/touying-typ/touying/pull/356)) +- theme(metropolis): add outline-slide for metropolis ([#349](https://github.com/touying-typ/touying/pull/349)) +- feat: add warning for empty slide content height detection + +### Documentation + +- docs: add multiple columns example and improve docs structure + +## v0.7.1 + +### Features + +- feat(agents): `breakable` and `clip` options to avoid slide overflow ([#336](https://github.com/touying-typ/touying/pull/336)) +- feat(components): add `lazy-v` (`lazy-h`) and `lazy-layout` for equalizing multi-column (-row) block heights (widths) ([#339](https://github.com/touying-typ/touying/pull/339)) +- feat: additional `contact` and `extra` field in `config-info` ([#342](https://github.com/touying-typ/touying/pull/342)) +- feat: `touying-get-config` function ([#333](https://github.com/touying-typ/touying/pull/333)) + +### Fixes + +- fix: fix `fit-to-height` and `size-to-pt` and allow text reflow ([#332](https://github.com/touying-typ/touying/pull/332)) +- fix: fix waypoint markers ([#341](https://github.com/touying-typ/touying/pull/341)) + + +## v0.7.0 + +### Features + +- **major feature:** a named waypoint feature ([#298](https://github.com/touying-typ/touying/pull/298)) +- feat(waypoint): start param and Waypoints in handout-subslides ([#304](https://github.com/touying-typ/touying/pull/304)) +- feat: auto, "h"-here string and inverse function for string subslide-numbers and waypoints ([#301](https://github.com/touying-typ/touying/pull/301)) +- feat: implicitly allow fn-wrapper based animation functions via reducer ([#300](https://github.com/touying-typ/touying/pull/300)) + +### Fixes + +- fix: fix cover-with-rect breaking long lines of text when partially hidden and fallback functions for color/alpha cover ([#328](https://github.com/touying-typ/touying/pull/328)) +- fix: using explicit numbering in display-current-heading when style=auto ([#329](https://github.com/touying-typ/touying/pull/329)) +- fix: fix ghost slides with show rules. Fix proper consistent handling of show rules and defer keyword ([#317](https://github.com/touying-typ/touying/pull/317)) +- fix: alert not delayed ([#316](https://github.com/touying-typ/touying/pull/316)) +- fix: remove redundant nested text call ([#324](https://github.com/touying-typ/touying/pull/324)) +- fix: function alternatives-match takes into account parameter stretch ([#320](https://github.com/touying-typ/touying/pull/320)) +- fix: correctly handle page margin merge/precedence ([#322](https://github.com/touying-typ/touying/pull/322)) +- fix: fix cover spacing issues surrounding lists ([#303](https://github.com/touying-typ/touying/pull/303)) +- fix: correctly parses negative subslide indices (ints, arrays) for handout-subslides ([#307](https://github.com/touying-typ/touying/pull/307)) +- fix: slide function does not update via scoped import ([#310](https://github.com/touying-typ/touying/pull/310)) + +Thanks for the contributions from [@zral0kh](https://github.com/zral0kh), [@Andrew15-5](https://github.com/Andrew15-5), [@navdeeprana](https://github.com/navdeeprana), and [@Cemoixerestre](https://github.com/Cemoixerestre). + +## v0.6.3 + +A major bugfix release, fixing many long-standing bugs and introducing many practical features. + +### Features + +- **feat: add `#jump(n, relative: bool)` as unified animation control; redefine `#pause`/`#meanwhile` as sugar** +- feat: add `#handout-only` for inline content and `` label for handout-exclusive slides ([#286](https://github.com/touying-typ/touying/pull/286)) +- feat: add `handout-subslides` to control which subslides appear in handout mode ([#288](https://github.com/touying-typ/touying/pull/288)) +- feat: add `#touying-raw` for animated code block reveals ([#283](https://github.com/touying-typ/touying/pull/283)) +- feat: add full-screen speaker notes mode with slide thumbnail (`show-only-notes`) ([#281](https://github.com/touying-typ/touying/pull/281)) +- feat: support arbitrary aspect ratios (e.g. 16-10) across all themes and speaker-note second screen ([#280](https://github.com/touying-typ/touying/pull/280)) +- feat: add `#item-by-item` animation for list, enum, and terms ([#278](https://github.com/touying-typ/touying/pull/278)) +- feat(recall): add subslide parameter to `#touying-recall` ([#285](https://github.com/touying-typ/touying/pull/285)) +- feat: add `default-composer` to config-common for global slide layout configuration ([#284](https://github.com/touying-typ/touying/pull/284)) +- feat: add `cover-fn` parameter to `uncover` for external package integration (e.g. Fletcher) ([#267](https://github.com/touying-typ/touying/pull/267)) +- feat: minislides can be displayed inline ([#228](https://github.com/touying-typ/touying/pull/228)) +- theme: improve appearance of long author lists in university and stargazer theme ([#242](https://github.com/touying-typ/touying/pull/242)) +- theme(simple): make simple-theme respect color configuration for deco-format ([#252](https://github.com/touying-typ/touying/pull/252)) +- theme(aqua,stargazer): add extra parameter to title-slide ([#291](https://github.com/touying-typ/touying/pull/291)) + +### Fixes + +- fix: prevent ghost-slide blank pages from `touying-set-config` anchor regression ([#289](https://github.com/touying-typ/touying/pull/289)) +- fix: styled content on first slide no longer creates extra slides ([#287](https://github.com/touying-typ/touying/pull/287)) +- fix: remove unoutlined headings from navigation +- fix: fix `#meanwhile` being ignored inside grid cells, boxes, and other containers ([#274](https://github.com/touying-typ/touying/pull/274)) +- fix: fix `config: parameter` silently ignored across all themes ([#273](https://github.com/touying-typ/touying/pull/273)) +- fix: fix slides after `#show`/`#set` rules not rendering subsequent slides ([#268](https://github.com/touying-typ/touying/pull/268)) +- fix: fix title page PDF page label causing pdfpc presenter notes mismatch ([#277](https://github.com/touying-typ/touying/pull/277)) +- fix: fix duplicate label error for labeled footnotes with `#pause` animations ([#275](https://github.com/touying-typ/touying/pull/275)) +- fix: fix `#pause` inside `#speaker-note` body (nested list items) ([#282](https://github.com/touying-typ/touying/pull/282)) +- theme(dewdrop): fix body content under level-1 heading was silently dropped ([#279](https://github.com/touying-typ/touying/pull/279)) +- theme(stargazer): update stargazer theme margins and fix [#259](https://github.com/touying-typ/touying/pull/259) + +### Documentation + +- **docs(BIG CHANGE): refactor docs website and add references page** +- docs: reduce README noise, improve first impression ([#297](https://github.com/touying-typ/touying/pull/297)) +- docs: restructure docs + add docs-preview CI for PRs ([#296](https://github.com/touying-typ/touying/pull/296)) +- docs: comprehensive docstring improvements across all source files ([#294](https://github.com/touying-typ/touying/pull/294)) + +### Miscellaneous + +- chore: add `copilot-setup-steps.yml` and improve `copilot-instructions.md` ([#292](https://github.com/touying-typ/touying/pull/292)) + +### Theme Migration Guide + +**For theme developers upgrading to v0.6.3:** + +1. **Move `config` to the last position in `utils.merge-dicts`** to allow user overrides: + ```typst + // Before + self = utils.merge-dicts(self, config, config-page(...)) + + // After + self = utils.merge-dicts(self, config-page(...), config) + ``` + +2. **Replace `paper` with `utils.page-args-from-aspect-ratio`** to support arbitrary aspect ratios: + ```typst + // Before + config-page(paper: "presentation-" + aspect-ratio, ...) + + // After + config-page(..utils.page-args-from-aspect-ratio(aspect-ratio), ...) + ``` + +## v0.6.2 + +### Features + +- feat: allow customisation of `components.checkerboard` ([#161](https://github.com/touying-typ/touying/pull/161)) + +### Fixes + +- fix: support ratio and relative margins for full-width headers ([#256](https://github.com/touying-typ/touying/pull/256)) +- fix: fix `magic.bibliography-as-footnote` in Typst 0.14 ([#249](https://github.com/touying-typ/touying/pull/249)) +- fix: theorion package is broken with Typst 0.14.0 ([#237](https://github.com/touying-typ/touying/pull/237)) +- fix: update `components.typ` and pass named arguments to grid ([#207](https://github.com/touying-typ/touying/pull/207)) +- fix: fix `#meanwhile` in cetz ([#205](https://github.com/touying-typ/touying/pull/205)) +- fix: documentation contains unclosed raw text error ([#187](https://github.com/touying-typ/touying/pull/187)) +- fix: use correct circle symbol ([#171](https://github.com/touying-typ/touying/pull/171)) +- fix: use regex to override colors of equations ([#167](https://github.com/touying-typ/touying/pull/167)) +- fix: `show-hide-set-list-marker-none` with full enum ([#157](https://github.com/touying-typ/touying/pull/157)) +- fix: remove dump and label-it function for better cache + +### Miscellaneous + +- docs: update README, bump versions of deps, and fix comment docs +- ci: add more tests, bump versions of `tytanic`, and update typstyle workflow ([#221](https://github.com/touying-typ/touying/pull/221), [#261](https://github.com/touying-typ/touying/pull/261)) + + +## v0.6.1 + +Added support for the [theorion](https://github.com/OrangeX4/typst-theorion) package, and used it as the default math theorem environment. + +## v0.6.0 + +It's not a big update, but it's the first touying release since typst 0.13 was released. + +### Features + +- feat: add auto style for display-current-heading. + - For users, you can use `show heading: set text(blue)` to change color for heading in some themes like `dewdrop`. + - For theme creator, you can use syntax like `utils.display-current-heading(level: 1, style: auto)` to achieve the same result. +- feat: apply config-info information to `set document`. +- feat: set `stretch: false` by default for `alternatives` functions. This is **a minor breaking change**, but I think it would be more intuitive: no auto empty space. + +### Fixes + +- fix: fix error with uncover using semi-transparent-cover +- fix: fix type string comparison https://github.com/touying-typ/touying/pull/153 +- fix: fix horizontal-line bug in typst 0.13.0 +- refactor: fix display-current-short-heading + + +## v0.5.4 & v0.5.5 + +### Features + +- docs: improve param documentation and we have better hints for tinymist https://github.com/touying-typ/touying/pull/98 +- feat: fake frozon states support for `heading` https://github.com/touying-typ/touying/pull/124 +- feat: add alpha-changing-cover and color-changing-cover https://github.com/touying-typ/touying/pull/129 +- feat: add effect function https://github.com/touying-typ/touying/issues/111 + - Example: `#effect(text.with(fill: red), "2-")[Something]` will display `[Something]` if the current slide is 2 or later. +- feat: add argument `config: (..)` for `xxx-slide` functions +- feat: add `align` argument for university theme + +### Fixes + +- fix: also hide enum numbers with show-hide-set-list-marker-none https://github.com/touying-typ/touying/pull/114 +- fix: fixed progress bar not to break apart when global figure gutter is set nonzero https://github.com/touying-typ/touying/pull/120 +- fix: fixed frozen-counters bug with multiple #pause commands https://github.com/touying-typ/touying/pull/124 +- fix: fixed incorrect page num when draft is true https://github.com/touying-typ/touying/pull/125 +- fix: fix behaviors of fit-to-height and fit-to-width partially https://github.com/touying-typ/touying/pull/131 +- fix: duplicated footnotes in headings https://github.com/touying-typ/touying/pull/132 +- fix: do not hardcode page sizes https://github.com/touying-typ/touying/pull/134 +- fix: add default numbering for page https://github.com/touying-typ/touying/issues/100 +- refactor: move show-strong-with-alert to per-slide level https://github.com/touying-typ/touying/issues/123 +- refactor: remove unnecessary `config-page(fill: ...)` +- theme(metropolis): fix color of title page and fix https://github.com/touying-typ/touying/issues/103 +- theme(metropolis): fixed metropolis slide's header to return content if title is specified https://github.com/touying-typ/touying/pull/126 +- theme(metropolis): respect colors dict in metropolis theme https://github.com/touying-typ/touying/pull/133 +- fix: fix bug of `#effect` function + +Thanks for the contributions from [@enklht](https://github.com/enklht). + + +## v0.5.3 + +### Features + +- feat: add `stretch` parameter for `#alternatives[]` function class. This allows us to handle cases where the internal element is a context expression. +- feat: add `config-common(align-enum-marker-with-baseline: true)` for aligning the enum marker with the baseline. +- feat: add `linebreaks` option to `components.mini-slides`. https://github.com/touying-typ/touying/pull/96 +- feat: add `` label to skip a new-section-slide. +- feat: add `config-common(show-hide-set-list-marker-none: true)` to make the markers of `list` and `enum` invisible after `#pause`. +- feat: add `config-common(bibliography-as-footnote: bibliography(title: none, "ref.bib"))` to display the bibliography in footnotes. +- refactor: add `config-common(show-strong-with-alert: true)` configuration to display strong text with an alert. (small breaking change for some themes) +- refactor: refactor `display-current-heading` for preserving heading style in title and subtitle. https://github.com/touying-typ/touying/issues/71 +- refactor: make `new-section-slide-fn` function class can receive `body` parameter. We can use `receive-body-for-new-section-slide-fn` to control it. **(Breaking change)** + - For example, you can add `#speaker-note[]` for a new section slide, like `= Section Title \ #speaker-note[]`. + - If you don't want to append content to the body of the new section slide, you can use `---` after the section title. + +### Fixes + +- fix outdated documentation. +- fix bug of `enable-frozen-states-and-counters` in handout mode. +- fix unusable `square()` function. https://github.com/touying-typ/touying/issues/73 +- fix hidden footer for `show-notes-on-second-screen: bottom`. https://github.com/touying-typ/touying/issues/89 +- fix metadata element in table cells. https://github.com/touying-typ/touying/issues/77 https://github.com/touying-typ/touying/issues/95 +- fix `auto-offset-for-heading` to `false` by default. +- fix uncover/only hides more content than it should. https://github.com/touying-typ/touying/issues/85 +- theme(simple): fix wrong title and subtitle. https://github.com/touying-typ/touying/issues/70 + + +## v0.5.1 & v0.5.2 + +- Fix somg bugs. + + +## v0.5.0 + +This is a significant disruptive version update. Touying has removed many mistakes that resulted from incorrect decisions. We have redesigned numerous features. The goal of this version is to make Touying more user-friendly, more flexible, and more powerful. + +**Major changes include:** + +- Avoiding closures and OOP syntax, which makes Touying's configuration simpler and allows for the use of document comments to provide more auto-completion information for the slide function. + - The existing `#let slide(self: none, ..args) = { .. }` is now `#let slide(..args) = touying-slide-wrapper(self => { .. })`, where `self` is automatically injected. + - We can use `config-xxx` syntax to configure Touying, for example, `#show: university-theme.with(aspect-ratio: "16-9", config-colors(primary: blue))`. +- The `touying-slide` function no longer includes parameters like `section`, `subsection`, and `title`. These will be automatically inserted into the slide as invisible level 1, 2, or 3 headings via `self.headings` (controlled by the `slide-level` configuration). + - We can leverage the powerful headings provided by Typst to support numbering, outlines, and bookmarks. + - Headings within the `#slide[= XXX]` function will be adjusted to level `slide-level + 1` using the `offset` parameter. + - We can use labels on headings to control many aspects, such as supporting the `` and other special labels, implementing short headings, or recalling a slide with `#touying-recall()`. +- Touying now supports the normal use of `set` and `show` rules at any position, without requiring them to be in specific locations. + +A simple usage example is shown below, and more examples can be found in the `examples` directory: + +```typst +#import "@preview/touying:0.5.0": * +#import themes.university: * + +#show: university-theme.with( + aspect-ratio: "16-9", + config-info( + title: [Title], + subtitle: [Subtitle], + author: [Authors], + date: datetime.today(), + institution: [Institution], + logo: emoji.school, + ), +) + +#set heading(numbering: "1.1") + +#title-slide() + += The Section + +== Slide Title + +#lorem(40) +``` + +**Theme Migration Guide:** + +For detailed changes to specific themes, you can refer to the `themes` directory. Generally, if you want to migrate an existing theme, you should: + +1. Rename the `register` function to `xxx-theme` and remove the `self` parameter. +2. Add a `show: touying-slides.with(..)` configuration. + - Change `self.methods.colors` to `config-colors(primary: rgb("#xxxxxx"))`. + - Change `self.page-args` to `config-page()`. + - Change `self.methods.slide = slide` to `config-methods(slide: slide)`. + - Change `self.methods.new-section-slide = new-section-slide` to `config-methods(new-section-slide: new-section-slide)`. + - Change private theme variables like `self.xxx-footer` to `config-store(footer: [..])`, which you can access through `self.store.footer`. + - Move the configuration of headers and footers into the `slide` function rather than in the `xxx-theme` function. + - You can directly use `set` or `show` rules in `xxx-theme` or configure them through `config-methods(init: (self: none, body) => { .. })` to fully utilize the `self` parameter. +3. For `states.current-section-with-numbering`, you can use `utils.display-current-heading(level: 1)` instead. + - If you only need the previous heading regardless of whether it is a section or a subsection, use `self => utils.display-current-heading(depth: self.slide-level)`. +4. The `alert` function can be replaced with `config-methods(alert: utils.alert-with-primary-color)`. +5. The `touying-outline()` function is no longer needed; you can use `components.adaptive-columns(outline())` instead. Consider using `components.progressive-outline()` or `components.custom-progressive-outline()`. +6. Replace `states.slide-counter.display() + " / " + states.last-slide-number` with `context utils.slide-counter.display() + " / " + utils.last-slide-number`. That is, we no longer use `states` but `utils`. +7. Remove the `slides` function; we no longer need this function. Instead of implicitly injecting `title-slide()`, explicitly use `#title-slide()`. If necessary, consider adding it in the `xxx-theme` function. +8. Change `#let slide(self: none, ..args) = { .. }` to `#let slide(..args) = touying-slide-wrapper(self => { .. })`, where `self` is automatically injected. + - Change specific parameter configurations to `self = utils.merge-dicts(self, config-page(fill: self.colors.neutral-lightest))`. + - Remove `self = utils.empty-page(self)` and use `config-common(freeze-slide-counter: true)` and `config-page(margin: 0em)` instead. + - Change `(self.methods.touying-slide)()` to `touying-slide()`. +9. You can insert visible headings into slides by configuring `config-common(subslide-preamble: self => text(1.2em, weight: "bold", utils.display-current-heading(depth: self.slide-level)))`. +10. Finally, don't forget to add document comments to your functions so your users can get better auto-completion hints, especially when using the Tinymist plugin. + +**Other Changes:** + +- theme(stargazer): new stargazer theme modified from [Coekjan/touying-buaa](https://github.com/Coekjan/touying-buaa). +- feat: implemented fake frozen states support, allowing you to use numbering and `#pause` normally. This behavior can be controlled with `enable-frozen-states-and-counters`, `frozen-states`, and `frozen-counters` in `config-common()`. +- feat: implemented `label-only-on-last-subslide` functionality to prevent non-unique label warnings when working with `@equation` and `@figure` in conjunction with `#pause` animations. +- feat: added the `touying-recall(