Compare commits

..
55 changed files with 71 additions and 1476 deletions

No files matched your search

+7 -21
View File
@@ -1,27 +1,13 @@
image: alpine/edge
packages:
- git
secrets:
- 88cce185-d2ec-4573-9546-e33f36f79bbf
environment:
# repo and user names on both sr.ht and github
REPO: typst-collection
USER: swaits
sources:
- git+ssh://git@git.sr.ht/~swaits/typst-collection
tasks:
- fetch-all-branches: |
cd "$HOME/$REPO"
git fetch origin '+refs/heads/*:refs/heads/*' '+refs/tags/*:refs/tags/*' --prune
- get-github-public-key: |
ssh-keyscan -t rsa github.com >> "$HOME/.ssh/known_hosts"
- add-github-remote: |
cd "$HOME/$REPO"
git remote add github "git@github.com:$USER/$REPO.git"
- mirror-to-github: |
cd "$HOME/$REPO"
cd ~/typst-collection
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
# Explicitly fetch all branches & tags
git fetch origin '+refs/heads/*:refs/heads/*' '+refs/tags/*:refs/tags/*' --prune
git remote add github git@github.com:swaits/typst-collection.git
git push --mirror github
-2
View File
@@ -15,8 +15,6 @@ links below to their main page.
glossary system with easily customizable output.
- [**rfc-vibe**](https://typst.app/universe/package/rfc-vibe): Bring RFC language
into everyday docs.
- [**run-liners**](https://typst.app/universe/package/run-liners): Functions to
create various run-in lists.
- [**swank-tex**](https://typst.app/universe/package/swank-tex): Render those
funky logos for TeX, LaTeX, and friends.
+3 -10
View File
@@ -10,10 +10,10 @@ Pretty simple. Import `codly`. Initialize it. Import `codly-languages`.
Configure `codly` with the languages. Like this:
```typst
#import "@preview/codly:1.1.1": *
#import "@preview/codly:1.1.0": *
#show: codly-init
#import "@preview/codly-languages:0.1.4": *
#import "@preview/codly-languages:0.1.3": *
#codly(languages: codly-languages)
```
@@ -50,6 +50,7 @@ The following languages are still missing. All contributions welcome.
- Jinja2
- Jsonnet
- Lean
- Lisp
- LiveScript
- Makefile
- MediaWiki
@@ -92,14 +93,6 @@ The following languages are still missing. All contributions welcome.
The `typst-small.png` icon included in this package came from the MIT-licensed
[codly](https://github.com/Dherse/codly) project.
The `lisp.svg` icon comes [from
Wikipedia](https://commons.wikimedia.org/wiki/File:Lisp_logo.svg), attribution:
Jooja, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via
Wikimedia Commons.
The `cuda.svg` icon included in this package came from the MIT-licensed
[vscode-icons](https://github.com/vscode-icons/vscode-icons) project.
All other icons included here came from the MIT-licensed
[devicon](https://github.com/devicons/devicon/) project.
+1 -2
View File
@@ -1,2 +1 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><title>file_type_awk</title><path d="M26.925,27.737C23.431,26.1,24.606,14.588,13.81,8.319,14.089,5.792,14.758-.5,7.961,3,6.845,3.128,4.907,2.331,4,4.831v.114C16.918,3.9.088,10.53,16.75,25.844c-.373.176-.674-.325-1.97.1l-.014.016c-1.722,1.135,1.933.768,4.154,1.274-1.611.417-5.594-1.137-6.3,1.645.877-.37,1,.329,1.076,1.077A26.277,26.277,0,0,1,22.379,27.5c1.1.285,4.118,2.049,5.122.551C27.519,27.93,27.221,27.876,26.925,27.737Z"/><path d="M10.446,2.97l-.121.088a.266.266,0,0,0-.011.377.211.211,0,0,0,.045.039.416.416,0,0,0,.521-.063.263.263,0,0,0,.078-.364l-.01-.014c-.076-.143-.163-.177-.34-.127C10.553,2.925,10.5,2.946,10.446,2.97Z" style="fill:#d2d2d2"/><path d="M18,26.368c.151-.041.318-.828.174-.949A6.29,6.29,0,0,0,19.4,26.485c1.023,1.007,2.665-.032,3.482.759a10.736,10.736,0,0,0,1.957,1.027c-.139-.151-.029-.144.179-.011-.13-.338-4.421-5.156-5.226-7.18.095.293-1.608-.824-2.076-1.419-.028.056-.092-.251-.228-.434-.041.05-.2-.433-.3-.728.037.187-.462-.5-.65-.818-.056.09-.719.372-.809.286-.729-.4,2.529,4.066.122,2.559.676.683.614.4-1.095-.852.364.452-.317.312-1.553-1.523.186.2-.218-.576-.218-.576a2.692,2.692,0,0,0-.133-.483c-.056-.32-.241-.723-.12-.65-1.444-1.556,1.314-3.3.719-3.671-.111,0-.027.017-.151-.106-.09,0-.468.285-.587-.234.006.132-.034.406-.153-.1-.023.052.015.1-.03.145-.225-.576-.772-1.6-1.217-2.539-.158.155-.138-.076-.193-1.092.053.144-.225,1.921-.2.13-.128.007.108,1.258-.343.21-.141.05-.305-.363-.341-1.178-.048.623-.29.187-.5-.923-.269.508-1.6,1.743-.333,7.622-.053-.313.186.341.755,2.427.021-.039-.022-.083.038-.131a6.324,6.324,0,0,0,.677,1.365c.544.658.995,2.074.8,1.277a11.867,11.867,0,0,0,2.554,3.249A34.423,34.423,0,0,0,18,26.368Z" style="fill:#d2d2d2"/><path d="M10.823,2.557a.291.291,0,0,0-.051-.022c-.221-.04-.429.153-.654.032-.145.085-.257-.036-.375-.073a.224.224,0,0,0-.2.014,5.823,5.823,0,0,0-.814.582,1.037,1.037,0,0,0-.273.449c-.021.048-.037.126.05.137a2.3,2.3,0,0,0,.682.045c.177-.028.277-.152.418-.221a1.2,1.2,0,0,0,.592-.68c.064-.175.161-.167.28-.2S10.7,2.62,10.823,2.557Z" style="fill:#d2d2d2"/><path d="M10.325,3.058l.121-.088a.117.117,0,0,1,.12.064c.044.1.106.112.193.047.033-.025.071-.058.118-.027a.119.119,0,0,1,.041.128.276.276,0,0,1-.187.248.266.266,0,0,1-.3-.03C10.341,3.308,10.26,3.2,10.325,3.058Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g fill="#0a094d"><path d="M114.33 75.056c.136-.547-.375-1.063-.715-.723-.418.422-.703.25-.582-.347.07-.36.035-.563-.102-.563-.36 0-.23-.527.207-.836.23-.16.801-.293 1.27-.297.469 0 .98-.09 1.133-.203.218-.152.168-.176-.22-.09-.276.063-.734.024-1.01-.082-.38-.144-.645-.12-1.075.094-.715.355-.703.36-.703-.078 0-.25-.153-.383-.485-.422l-.48-.063.41-.437c.438-.469.914-.48 2.2-.066.84.27.769.004-.133-.504-.852-.477-1.434-1.137-3.598-4.07-2.305-3.118-2.469-3.52-2.57-6.153l-.086-2.203-1.196-1.402c-.656-.77-1.28-1.454-1.386-1.52-.106-.062-.618-.168-1.137-.23-1.067-.125-1.133-.278-.547-1.27.46-.789 1.07-.879 1.953-.293.313.207.692.367.848.363.176-.007.12-.09-.14-.218-.235-.11-.423-.262-.423-.336 0-.211 2.477-.375 3.2-.207 1.5.343 1.98.87 2.234 2.445.172 1.066.285 1.281 1.058 2.008.473.449 1.344 1.047 1.934 1.328s1.414.789 1.836 1.125c.992.789 2.547 3.062 3.078 4.492.23.621.512 1.238.625 1.379.309.371-.187.625-.988.5a13.79 13.79 0 0 0-1.598-.117c-.52-.008-1.055-.106-1.191-.215-.348-.281-1.266-2.363-1.434-3.242-.293-1.563-.855-2.14-2.832-2.91-1.418-.551-1.523-.637-2.285-1.825-.7-1.09-.832-1.91-.3-1.87.546.042.398-.688-.192-.97-.403-.195-.668-.203-1.153-.042-.418.136-.886.148-1.406.03-.426-.097-.777-.132-.777-.077 0 .05.437.57.973 1.152 1.562 1.711 1.687 1.988 1.546 3.461-.082.852-.05 1.352.098 1.531.121.145.203.336.184.422-.02.09.105.477.273.863.172.383.313.828.313.985 0 .16.132.289.296.289.22 0 .258.11.16.422-.113.351-.09.386.133.199.22-.18.313-.11.512.379.133.328.324.797.422 1.043.098.242.34.484.54.535.202.05.41.324.476.613.062.285.27.688.457.89.187.204.402.552.472.774.176.551 1.024 1.117 1.805 1.207.492.059.652.164.652.442 0 .199.098.343.215.32.121-.023.32.086.45.234.124.153.316.278.425.278.11 0 0-.211-.242-.469s-.39-.523-.324-.59c.066-.062.344.149.617.477.547.648 1.176 1.054 1.36.87.066-.062-.262-.44-.723-.843-.461-.398-.774-.789-.7-.867.079-.078.352.062.61.312 1.242 1.203 2.25 1.864 2.855 1.864.285 0 .282-.035-.02-.368-.179-.199-.277-.445-.214-.55a.217.217 0 0 0-.07-.301c-.102-.063-.578-.875-1.059-1.805-.48-.93-1.031-1.773-1.227-1.879-.699-.375-.324-.492 1.458-.457l1.816.04 1.562 1.663c.86.918 1.532 1.696 1.493 1.735-.036.039-.239-.02-.45-.133-.52-.281-.57-.262-.457.172.11.418-.129.496-.468.152-.125-.12-.29-.156-.368-.078-.078.082.36.606.977 1.164.66.602 1.047 1.082.938 1.176-.247.21-4.247-.055-4.739-.32-.219-.118-.742-.211-1.164-.211-.637 0-.765.062-.765.37 0 .755-.614 1.872-1.434 2.622-.465.422-.887.77-.934.77s-.035-.2.028-.438zm.902-1.223c-.082-.25-.062-.261.082-.054.152.207.242.171.477-.192.156-.246.312-.617.347-.82.051-.32-.027-.367-.504-.313-.671.078-1.199.336-1.644.797-.403.422-.414.547-.043.547.156 0 .426.168.598.371.367.426.855.188.687-.336zm-.656-.605c.469-.39.777-.473.777-.211 0 .152-.828.601-1.09.59-.07-.004.067-.176.313-.38zm6.515-2.625c-.066-.106-.203-.188-.304-.188-.106 0-.137.082-.07.188.062.101.199.187.3.187.106 0 .137-.086.074-.187zm-.582-2.371c.512-.196.329-.45-.242-.332-.308.058-.597.015-.668-.102-.176-.281-.535-.262-.437.023.043.13.281.29.531.36.254.07.473.137.488.144.02.012.168-.03.328-.093zm-1.77-.996c0-.09-.132-.22-.296-.282-.461-.175-.523-.136-.266.168.258.313.563.375.563.114zm-2.41-2.317c-.136-.137-.222-.148-.222-.027 0 .25.223.472.348.347.054-.054-.004-.199-.125-.32zm.508-.61c-.324-.32-1.546-1.042-1.628-.956-.059.054-.07.129-.028.16.043.031.324.246.621.473.446.335 1.325.613 1.035.324zm1.34-.476c0-.226-.691-.672-1.32-.847-.422-.122-.402-.079.191.441.66.582 1.13.75 1.13.406zm-1.847-3.05c-.137-.137-.223-.149-.223-.032 0 .254.223.473.348.348.054-.05-.004-.195-.125-.317zm-1.352-.985c0-.047-.086-.137-.187-.2-.106-.062-.188-.026-.188.083 0 .11.082.2.188.2.101 0 .187-.036.187-.083zm-2.527-.77c-.387-.289-.602-.242-.395.086.067.114.266.2.442.196.277-.004.273-.04-.047-.281zm-4.242-4.976a.196.196 0 0 0-.2-.191c-.109 0-.148.085-.086.191.067.102.157.187.2.187.047 0 .086-.085.086-.187zm-3.575-.191c0-.102-.191-.184-.425-.184-.34.004-.368.039-.141.184.367.238.566.238.566 0zm10.657 15.3c-.067-.07-.125-.25-.125-.402 0-.219.054-.227.28-.04.157.13.286.31.286.4 0 .195-.262.218-.441.042zm-2.579-2.867c-.355-.3-.578-.617-.496-.703.086-.086.243-.008.348.18.102.187.39.414.64.511.25.094.458.258.458.364 0 .32-.262.222-.95-.352zm-10.66-11.93-.605-.218.476-.614c.352-.449.633-.609 1.047-.609.313 0 .532.063.493.14-.04.079-.215.458-.395.844-.176.391-.34.7-.367.692a84.463 84.463 0 0 1-.649-.235zM20.498 34.126h.922c1.03 0 1.355.164 1.675.84.422.918.422.918.68.918h.371v-2.691c-.422.16-.758.207-1.277.207h-6.29c-.695 0-.968-.047-1.324-.207v2.691h.5c.16 0 .258-.129.34-.465.242-.984.676-1.293 1.805-1.293h1.016v8.762c0 .469-.11.613-.5.68l-.16.015c-.192.031-.29.13-.29.305v.277h3.485v-.277c0-.176-.098-.274-.258-.305l-.18-.015c-.386-.051-.515-.211-.515-.68zm6.281 4.133c.39-.535 1.164-.906 1.89-.906.45 0 .872.148 1.16.437.29.274.387.563.387 1.211v3.758c0 .582-.03.645-.468.758l-.078.035c-.165.047-.227.129-.227.32v.293h3.016v-.293c0-.191-.063-.304-.207-.32l-.13-.035c-.40Line truncated

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 19 KiB

-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><title>file_type_cuda</title><path d="M12.447,12.265V10.591c.163-.012.327-.02.494-.026,4.577-.143,7.581,3.934,7.581,3.934S17.278,19,13.8,19a4.2,4.2,0,0,1-1.353-.217V13.712c1.782.215,2.14,1,3.212,2.788l2.383-2.009A6.312,6.312,0,0,0,13.37,12.21a8.606,8.606,0,0,0-.923.055m0-5.529v2.5c.164-.013.329-.024.494-.03,6.366-.214,10.513,5.221,10.513,5.221s-4.764,5.792-9.726,5.792a7.4,7.4,0,0,1-1.281-.112v1.545a8.528,8.528,0,0,0,1.067.069c4.618,0,7.958-2.358,11.192-5.15.535.43,2.731,1.474,3.182,1.932-3.075,2.574-10.241,4.649-14.3,4.649-.392,0-.769-.024-1.138-.06v2.172H30V6.736Zm0,12.051v1.32c-4.271-.762-5.457-5.2-5.457-5.2a9.234,9.234,0,0,1,5.457-2.64v1.447h-.006a4.1,4.1,0,0,0-3.184,1.456s.782,2.811,3.19,3.62M4.861,14.713a10.576,10.576,0,0,1,7.586-4.122V9.236C6.848,9.685,2,14.427,2,14.427s2.746,7.939,10.447,8.665v-1.44C6.8,20.941,4.861,14.713,4.861,14.713Z" style="fill:#80bc00"/></svg>

Before

Width:  |  Height:  |  Size: 945 B

+1 -3
View File
@@ -1,3 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-star" viewBox="0 0 16 16">
<path d="M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.523 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.56.56 0 0 0-.163-.505L1.71 6.745l4.052-.576a.53.53 0 0 0 .393-.288L8 2.223l1.847 3.658a.53.53 0 0 0 .393.288l4.052.575-2.906 2.77a.56.56 0 0 0-.163.506l.694 3.957-3.686-1.894a.5.5 0 0 0-.461 0z"/>
</svg>
<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><path d="M103.555 95.851L64 80.52 24.446 95.847l15.618-24.436L0 56.447l49.208.23L63.999 32.1l14.794 24.578L128 56.453l-40.065 14.96 15.62 24.438"/><path d="M98.204 91.48l-34.17-13.244-34.168 13.242 13.491-21.11-34.61-12.926 42.506.198L64.03 36.41l12.78 21.23 42.509-.194L84.71 70.37l13.493 21.11" fill="#619cbc"/><path d="M37.804 44.66c3.413 0 1.424 8.528.21 11.1-1.04 2.201-3.38 5.377-6.153 5.377-3.327 0-3.228-3.727-1.904-6.532.717-1.52 1.82-3.222 3.338-4.474-.39 1.307.925 2.2.393 3.325-.363.769-1.114 1.609-1.504 2.436-.631 1.337-.39 3.71 1.135 3.71 1.365 0 2.578-1.692 3.075-2.745 1.019-2.158 3.566-11.366.719-11.366-3.28 0-8.93 7.99-10.113 10.497-2.112 4.474-.58 9.984 4.231 9.984 3.252 0 5.926-3.126 7.218-5.862a14.931 14.931 0 001.353-4.781l.632-.116c.139 4.21 4.592 11.18 2.697 15.196-2.427 5.14-9.681 5.094-13.824 6.918-.87-2.037-2.05-3.93-3.711-5.376 3.695-1.243 12.775-3.33 14.75-7.512.83-1.758.264-4.671-.694-5.659a10.916 10.916 0 01-.689 1.89c-1.69 3.58-5.31 6.357-9.041 6.357-5.196 0-7.398-3.733-4.953-8.913 1.467-3.109 8.96-13.455 12.835-13.455"/><path d="M37.804 44.66c3.413 0 1.424 8.528.21 11.1-1.04 2.201-3.38 5.377-6.153 5.377-3.327 0-3.228-3.727-1.904-6.532.717-1.52 1.82-3.222 3.338-4.474-.39 1.307.925 2.2.393 3.325-.363.769-1.114 1.609-1.504 2.436-.631 1.337-.39 3.71 1.135 3.71 1.365 0 2.578-1.692 3.075-2.745 1.019-2.158 3.566-11.366.719-11.366-3.28 0-8.93 7.99-10.113 10.497-2.112 4.474-.58 9.984 4.231 9.984 3.252 0 5.926-3.126 7.218-5.862a14.931 14.931 0 001.353-4.781l.632-.116c.139 4.21 4.592 11.18 2.697 15.196-2.427 5.14-9.681 5.094-13.824 6.918-.87-2.037-2.05-3.93-3.711-5.376 3.695-1.243 12.775-3.33 14.75-7.512.83-1.758.264-4.671-.694-5.659a10.916 10.916 0 01-.689 1.89c-1.69 3.58-5.31 6.357-9.041 6.357-5.196 0-7.398-3.733-4.953-8.913 1.467-3.109 8.96-13.455 12.835-13.455z" fill="none" stroke="#000" stroke-linejoin="round" stroke-miterlimit="3.864" stroke-width="5.7179996"/><path d="M46.681 57.002c.206.508.803 3.38 1.256 3.38.979 0 2.748-2.663 3.222-3.355.87.57.388 1.767 2 1.767.73 0 1.098-1.573 1.858-1.599.026.636.067 1.211-.28 1.946-.534 1.132-1.886 2.666-3.215 2.666-.953 0-2.279-1.146-2.54-1.146-.282 0-.802.132-.967.483-.693 1.467 1.158 6.363 3.014 6.363.992 0 2.175-.728 3.213-1.176-.27 1.764-.308 3.251.05 4.77a5.674 5.674 0 01-2.942.85c-4.56 0-2.045-10.605-6.25-12.865l1.58-2.084"/><path d="M46.681 57.002c.206.508.803 3.38 1.256 3.38.979 0 2.748-2.663 3.222-3.355.87.57.388 1.767 2 1.767.73 0 1.098-1.573 1.858-1.599.026.636.067 1.211-.28 1.946-.534 1.132-1.886 2.666-3.215 2.666-.953 0-2.279-1.146-2.54-1.146-.282 0-.802.132-.967.483-.693 1.467 1.158 6.363 3.014 6.363.992 0 2.175-.728 3.213-1.176-.27 1.764-.308 3.251.05 4.77a5.674 5.674 0 01-2.942.85c-4.56 0-2.045-10.605-6.25-12.865z" fill="none" stroke="#000" stroke-linejoin="round" stroke-miterlimit="3.864" stroke-width="5.7179996"/><path d="M64.209 56.154c3.447 0 4.808 6.2 3.261 9.476-1.2 2.542-3.327 4.384-6.052 4.384-4.812 0-4.21-6.56-2.332-10.538.518-1.096 2.287-3.484 3.67-3.484.51 0 .93.162 1.453.162zm-.107.579c-.542 0-1.02.268-1.27.802-.53 1.118 2.105 2.25 1.727 3.051-.238.504-1.144.976-1.601.976-2.284 0-2.265-2.972-.903-4.908-.847.539-1.402 1.363-1.762 2.127-1.338 2.835-.276 6.734 2.778 6.734 1.688 0 3.631-1.516 4.387-3.117.93-1.968-1.448-5.665-3.356-5.665" fill-rule="evenodd"/><path d="M64.209 56.154c3.447 0 4.808 6.2 3.261 9.476-1.2 2.542-3.327 4.384-6.052 4.384-4.812 0-4.21-6.56-2.332-10.538.518-1.096 2.287-3.484 3.67-3.484.51 0 .93.162 1.453.162z" fill="none" stroke="#000" stroke-linejoin="round" stroke-miterlimit="3.864" stroke-width="5.7179996"/><path d="M64.101 56.733c-.542 0-1.02.268-1.271.802-.528 1.119 2.106 2.25 1.728 3.051-.238.504-1.144.976-1.601.976-2.284 0-2.265-2.972-.903-4.908-.847.54-1.402 1.363-1.762 2.127-1.339 2.835-.277 6.735 2.778 6.735 1.687 0 3.631-1.517 4.387-3.117.93-1.968-1.448-5.666-3.356-5.666z" fill="none" stroke="#000" stroke-linejoin="round" stroke-miterlimit="3.864" stroke-width="5.7179996"/><path d="M79.875 66.36c-.901 1.908-2.58 2.955-4.47 2.955-5.997 0-7.187-5.469-4.587-10.975.613-1.3 1.62-2.737 3.159-2.737 4.818 0 8.174 5.933 5.897 10.757zM75.09 56.293c-.443 0-.83.16-1.043.61-.466.989 2.072 1.87 2.075 2.892-.265.314-1.007.665-1.33.665-1.828 0-3.208-2.478-1.647-4.32-.634.403-1.01 1.005-1.277 1.57-1.582 3.352.673 6.74 3.96 6.74 1.368 0 3.13-.76 3.841-2.266 1.006-2.13-2.576-5.89-4.58-5.89" fill-rule="evenodd"/><path d="M79.875 66.36c-.901 1.908-2.58 2.955-4.47 2.955-5.997 0-7.187-5.469-4.587-10.975.613-1.3 1.62-2.737 3.159-2.737 4.818 0 8.174 5.933 5.897 10.757z" fill="none" stroke="#000" stroke-linejoin="round" stroke-miterlimit="3.864" stroke-width="5.7179996"/><path d="M75.089 56.294c-.442 0-.83.16-1.043.61-.466.988 2.072 1.87 2.076 2.892-.265.313-1.008.665-1.331.665-1.828 0-3.208-2.478-1.647-4.32-.633.402-1.01 1.004-1.277 1.57-1.582 3.352.674 6.74 3.96 6.74 1.368 0 3.131-.76 3.842-2.266 1.005-2.13-2.576-5.89-4.58-5.89z" fill="none" stroke="#Line truncated

Before

Width:  |  Height:  |  Size: 623 B

After

Width:  |  Height:  |  Size: 48 KiB

-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<circle cx="256" cy="256" r="235" fill="#fff"/>
<path stroke="#000" stroke-width="5" d="m255.56 20.008c-62.374 0.1169-122.17 24.922-166.3 68.992-92.236 92.091-92.353 241.52-0.2617 333.75 92.09 92.236 241.52 92.353 333.75 0.262 92.236-92.091 92.353-241.52 0.262-333.75-44.377-44.447-104.64-69.371-167.45-69.254zm2.281 1.0059c59.934 0.4846 119.39 23.809 164.46 68.953 91.701 91.845 91.585 240.64-0.259 332.34-45.922 45.851-120.32 45.793-166.17-0.129-45.851-45.922-45.793-120.32 0.129-166.17 46.412-46.339 46.471-121.53 0.13-167.94-37.084-37.141-94.457-46.553-140.66-21.658 42.416-31.541 92.711-45.798 142.37-45.396zm-190.84 130.26h40c9.943 42.147 25.204 79.418 40.75 116.43 15.9-41.326 33.203-81.249 55.25-116.43h40c-48.928 97.364-102.19 164.06-24 250h-40c-47.567-77.243-82.439-147.67-112-250z"/>
<path d="m293 110.72c78.194 85.936 24.928 152.64-24 250h40c22.047-35.179 39.35-75.102 55.25-116.43 15.546 37.01 30.807 74.282 40.75 116.43h40c-29.561-102.33-64.433-172.76-112-250z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

+1 -4
View File
@@ -4,7 +4,7 @@
// To use:
//
// ```typst
// #import "@preview/codly:1.1.1": *
// #import "@preview/codly:1.1.0": *
// #show: codly-init
//
// #import "codly-languages.typ": *
@@ -42,8 +42,6 @@
cplusplus: (name: "C++", color: rgb("#00599c"), icon: __icon("cplusplus.svg")),
cpp: (name: "C++", color: rgb("#00599c"), icon: __icon("cplusplus.svg")),
cxx: (name: "C++", color: rgb("#00599c"), icon: __icon("cplusplus.svg")),
cuda: (name: "CUDA", color: rgb("#80bc00"), icon: __icon("cuda.svg")),
cu: (name: "CUDA", color: rgb("#80bc00"), icon: __icon("cuda.svg")),
crystal: (name: "Crystal", color: rgb("#000000"), icon: __icon("crystal.svg")),
csharp: (name: "C#", color: rgb("#9b4f96"), icon: __icon("csharp.svg")),
cs: (name: "C#", color: rgb("#9b4f96"), icon: __icon("csharp.svg")),
@@ -82,7 +80,6 @@
kt: (name: "Kotlin", color: rgb("#5e3cc2"), icon: __icon("kotlin.svg")),
latex: (name: "LaTeX", color: rgb("#000000"), icon: __icon("latex.svg")),
less: (name: "Less", color: rgb("#2a4d80"), icon: __icon("less.svg")),
lisp: (name: "Lisp", color: rgb("#3FBF3F"), icon: __icon("lisp.svg")),
lua: (name: "Lua", color: rgb("#000080"), icon: __icon("lua.svg")),
markdown: (name: "Markdown", color: rgb("#000000"), icon: __icon("markdown.svg")),
matlab: (name: "Matlab", color: rgb("#4499dd"), icon: __icon("matlab.svg")),
+1 -1
View File
@@ -1,5 +1,5 @@
#import "/lib.typ": *
#import "@preview/codly:1.1.1": *
#import "@preview/codly:1.1.0": *
#show: codly-init
#codly(languages: codly-languages)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

@@ -18,7 +18,6 @@
"crystal",
"csharp",
"css",
"cuda",
"dart",
"docker",
"elixir",
@@ -43,7 +42,6 @@
"kotlin",
"latex",
"less",
"lisp",
"lua",
"markdown",
"matlab",
@@ -109,7 +107,6 @@ Found all base languages!
"cpp",
"cs",
"cxx",
"cu",
"dockerfile",
"erl",
"ex",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "codly-languages"
version = "0.1.4"
version = "0.1.3"
entrypoint = "lib.typ"
authors = ["Stephen Waits <steve@waits.net>"]
license = "MIT"
+4 -8
View File
@@ -41,7 +41,7 @@ different goals:
### Import the package
```typst
#import "@preview/glossy:0.5.2": *
#import "@preview/glossy:0.4.1": *
```
### Defining Glossary Terms
@@ -186,9 +186,8 @@ Display the glossary using the `glossary()` function:
```typst
#glossary(
title: "Web Development Glossary", // Optional: defaults to Glossary theme:
my-theme, // Optional: defaults to theme-academic
sort: true, // Optional: whether or not to sort the glossary
title: "Web Development Glossary", // Optional: defaults to Glossary
theme: my-theme, // Optionaal: defaults to theme-twocol
ignore-case: false, // Optional: ignore case when sorting terms
groups: ("Web") // Optional: Filter to specific groups
)
@@ -253,7 +252,7 @@ Customize glossary appearance by defining a theme with three functions:
// Individual glossary entry
entry: (entry, index, total) => {
// index = entry index, total = total entries in group
let output = [#entry.short#entry.label] // **NOTE:** Label here!
let output = [#entry.short]
if entry.long != none {
output = [#output -- #entry.long]
}
@@ -280,9 +279,6 @@ Entry fields available to themes:
- `label`: Term's dictionary label
- `pages`: Linked page numbers where term appears
**NOTE:** If the theme does not emit `entry.label`, linking form terms to their
glossary entry will not work.
## License
This project is licensed under the MIT License.
-6
View File
@@ -1,6 +0,0 @@
watchexec \
--watch . \
--clear \
--ignore 'tests/**/diff/**' \
--ignore 'tests/**/out/**' \
"typst-test r"
+46 -87
View File
@@ -23,7 +23,7 @@
// Returns:
// dictionary: Normalized dictionary with all expected keys populated
//
// Panics:
// Throws:
// - If 'short' key is missing when using normal (non-abbreviated) syntax
// - If 'short' value is not a string
// - If 'short' value is an empty string
@@ -97,7 +97,7 @@
// Returns:
// dictionary: The glossary entry associated with the key
//
// Panics:
// Throws:
// - If the key does not exist in the glossary
//
#let __get_entry(key) = {
@@ -153,7 +153,7 @@
//
// Parameters:
// key (string): The glossary entry key
//
//
// Returns:
// boolean: If the term is visible in the glossary (and the label is unique)
//
@@ -187,7 +187,7 @@
// content: The fully formatted term, including optional article, capitalization,
// usage tracking metadata, and the chosen form (short, long, or both).
//
#let __gls(key, modifiers: array, format-term: function, show-term: function, term-links: true) = {
#let __gls(key, modifiers: array, show-term: function, term-links: true) = {
// ---------------------------------------------------------------------------
// Check for illegal modifier combinations
// ---------------------------------------------------------------------------
@@ -248,6 +248,27 @@
}
}
// get_term(mode): Returns the appropriate term string based on the mode.
// mode is one of "short", "long", or "both".
// - "short": Returns the short form.
// - "long": Returns the long form.
// - "both": Returns "Long form (short form)".
// We rely on prior logic to ensure that when mode = "both" or "long", a long form is available.
let get_term = (mode) => {
let short_form = pluralize_term(entry.short, entry.plural)
let long_form = pluralize_term(entry.long, entry.longplural) // none safe here
if mode == "short" {
// Just the short form.
short_form
} else if mode == "long" {
// Just the long form.
long_form
} else {
// mode == "both": "Long form (short form)".
long_form + " (" + short_form + ")"
}
}
// get_article(mode): Returns the appropriate article string based on the mode.
// - If wants_article is false, returns an empty string.
// - If mode is "short", return the short article.
@@ -316,33 +337,19 @@
// Determine mode using the helper function
let mode = determine_mode(wants_both, wants_long, wants_short, is_first_use, long_available)
// Pluralize (if requested)
let short-form = pluralize_term(entry.short, entry.plural)
let long-form = pluralize_term(entry.long, entry.longplural) // `none` safe here
// Apply format-term() to get the term
let formatted-term = format-term(mode, short-form, long-form)
if type(formatted-term) != "string" {
// This is because we still need to capitalize the term, and we cannot do
// that with content, thus requiring a string here.
// TODO: consider if we want to capitalize *before* this. First intuition is
// "no".
panic("Your cutsom format-term() function must return a string.")
}
// Get the article, then capitalize either the article or term (if requested)
let (article, term) = capitalize_term(get_article(mode), formatted-term)
// Get the article and term for the chosen mode, then apply capitalization if requested
let (article, term) = capitalize_term(get_article(mode), get_term(mode))
// ---------------------------------------------------------------------------
// Construct and return the final output
// ---------------------------------------------------------------------------
context {
let linked-term = if term-links and __has_glossary_entry(key) {
link(label(key), term)
let text = if term-links and __has_glossary_entry(key) {
link(label(key), term)
} else {
term
}
[#article#show-term(linked-term)#metadata(term)#__term_label(key)]
[#article#show-term(text)#metadata(term)#__term_label(key)]
// |^^^^^^^|^^^^^^^^^ |^^^^^^^^ |^^^^^^^^^^^^
// \_art. | | |
// \_ apply user formatting function to the term
@@ -377,48 +384,7 @@
})
.dedup(key: ((loc, page)) => page) // deduplicate by page
.map(((loc, page)) => link(loc, page)) // create links
.join(", ")
}
// Formats a term string based on the specified mode.
//
// Given mode, long-form, and short-form, this function returns the formatted
// term based on the mode. When mode is ...
//
// - "short" -> returns "short-form"
// - "long" -> returns "long-form"
// - "both" -> returns "short-form (long-form)"
//
// Parameters:
// mode (string): The mode in which to format the term. Possible values are "short", "long", or "both".
// short-form (string): The short form of the term.
// long-form (string): The long form of the term.
//
// Returns:
// string: The formatted term based on the specified mode.
//
#let __default-format-term(mode, short-form, long-form) = {
if mode == "short" {
short-form
} else if mode == "long" {
long-form
} else {
// mode assumed to be "both"
long-form + " (" + short-form + ")"
}
}
// Styles a term to control its display in a document.
//
// Parameters:
// term-body (content'ish): the unstyled output from __gls()
//
// Returns:
// content: display ready content (assumed based on `term-body`)
//
#let __default-show-term(term-body) = {
// Default: just render it like normal text
term-body
.join(", ")
}
// Initializes the glossary system and sets up term reference handling.
@@ -441,13 +407,12 @@
// Returns:
// content: Processed document content with glossary functionality enabled
//
// Panics:
// Throws:
// - If entries parameter is not a dictionary
//
#let init-glossary(
entries,
format-term: __default-format-term,
show-term: __default-show-term,
show-term: (term-body) => term-body,
term-links: true,
body
) = context {
@@ -458,7 +423,6 @@
let checked-entry = z.parse(entry, dict-schema, scope: ("dictionary entry",))
checked-entries.insert(checked-key, checked-entry)
}
let checked-format-term = z.parse(show-term, z.function(), scope: ("format-term",))
let checked-show-term = z.parse(show-term, z.function(), scope: ("show-term",))
let checked-body = z.parse(body, z.content(), scope: ("body",))
@@ -493,7 +457,7 @@
// Now see if this is an actual glossary term key
if __has_entry(key) {
// Found in dictionary, render via __gls()
__gls(key, modifiers: modifiers.map(lower), format-term: format-term, show-term: show-term, term-links: term-links)
__gls(key, modifiers: modifiers.map(lower), show-term: show-term, term-links: term-links)
} else {
// Not one of ours, so just pass it through
r
@@ -535,13 +499,12 @@
// Returns:
// content: Formatted glossary content
//
// Panics:
// Throws:
// - If a requested group doesn't exist
//
#let glossary(
title: "Glossary",
theme: theme-academic,
sort: true,
theme: theme-twocol,
ignore-case: false,
groups: (),
) = context {
@@ -596,24 +559,20 @@
))
}
}
// Add non-empty groups to output
if current_entries.len() > 0 {
group = if group == none { "" } else { group }
// sort entries by case insensitivity if requested
let sorted_entries = if sort {
current_entries
// 1. create array of tuples with (lower [if ignore-case], entry)
.map(e => { if ignore-case { (lower(e.short), e) } else { (e.short, e) } })
// 2. sort the tuples (by first element then second)
.sorted() // NOTE: sorted() is NOT language-aware
// 3. strip away the tuple's first element, leaving an array of entries
.map(t => t.last())
} else {
current_entries
}
let sorted_entries = current_entries
// 1. create array of tuples with (lower [if ignore-case], entry)
.map(e => { if ignore-case { (lower(e.short), e) } else { (e.short, e) } })
// 2. sort the tuples (by first element then second)
.sorted() // NOTE: sorted() is NOT language-aware
// 3. strip away the tuple's first element, leaving an array of entries
.map(t => t.last())
// add entries to this group's output map
output.insert(group, sorted_entries)
}
+1 -1
View File
@@ -40,7 +40,7 @@
grid(
columns: (1fr, auto),
gutter: 0.75em,
[#short-display#long-display#description#entry.label],
[#short-display#long-display#description],
text(fill: rgb("#666666"), entry.pages)
)
}
+1 -1
View File
@@ -37,7 +37,7 @@
grid(
columns: (1fr, auto),
gutter: 1em,
[#short-display#entry.label#long-display#description#entry.label],
[#short-display#entry.label#long-display#description],
[#entry.pages]
)
}
+1 -1
View File
@@ -27,6 +27,6 @@
},
entry: (entry, index, total) => {
(entry.short + entry.label, entry.long, entry.description, entry.pages)
(entry.short, entry.long, entry.description, entry.pages)
}
)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 KiB

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 844 KiB

After

Width:  |  Height:  |  Size: 843 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

-208
View File
@@ -1,208 +0,0 @@
#import "/lib.typ": *
#let myGlossary = (
html: (
short: "HTML",
long: "Hypertext Markup Language",
description: "A standard language for creating web pages",
group: "Web"),
css: (
short: "CSS",
long: "Cascading Style Sheets",
description: "A language used for describing the presentation of a document",
group: "Web"),
tps: (
short: "TPS",
long: "test procedure specification",
description: "A document on how to run all the test procedures"),
concise: "Concise syntax!",
shortonly: (
short: "shortonly!!!"),
unused: "Unused term, which shouldn't print in the glossary."
)
#set page(width: 6.5in, height: auto, margin: 1em)
#let test-content = {
table(
columns: 3,
table.header(
[`short`], [`long`], [`both`],
),
[@html:short], [@html:long], [@html:both],
[@css:short], [@css:long], [@css:both],
[@tps:short], [@tps:long], [@tps:both],
[@concise:short], [@concise:long], [@concise:both],
[@shortonly:short], [@shortonly:long], [@shortonly:both],
table.hline(stroke: 2pt),
[@html:short:cap], [@html:long:cap], [@html:both:cap],
[@a:css:short], [@a:css:long], [@a:css:both],
[@tps:short:pl], [@tps:long:pl], [@tps:both:pl],
[@concise:a:cap:short], [@concise:a:cap:long], [@concise:a:cap:both],
[@an:shortonly:short], [@an:shortonly:long], [@an:shortonly:both],
)
[@a:tps:cap is @tps:def.]
}
// ---------------------------------------------------------------------------------
#let format-basic(mode, short-form, long-form) = {
if mode == "short" {
short-form
} else if mode == "long" {
long-form
} else {
long-form + " (" + short-form + ")"
}
}
#init-glossary(myGlossary, format-term: format-basic)[#test-content]
// ---------------------------------------------------------------------------------
#let format-reverse(mode, short-form, long-form) = {
if mode == "short" {
short-form
} else if mode == "long" {
long-form
} else {
short-form + " [" + long-form + "]"
}
}
#init-glossary(myGlossary, format-term: format-reverse)[#test-content]
// ---------------------------------------------------------------------------------
#let format-uppercase-short(mode, short-form, long-form) = {
let short-up = upper(short-form);
if mode == "short" {
short-up
} else if mode == "long" {
long-form
} else {
long-form + " (" + short-up + ")"
}
}
#init-glossary(myGlossary, format-term: format-uppercase-short)[#test-content]
// ---------------------------------------------------------------------------------
#let format-prefix-suffix(mode, short-form, long-form) = {
if mode == "short" {
"Term: " + short-form + "."
} else if mode == "long" {
"Term: " + long-form + "."
} else {
"Term: " + long-form + " (" + short-form + ")."
}
}
#init-glossary(myGlossary, format-term: format-prefix-suffix)[#test-content]
// ---------------------------------------------------------------------------------
#let format-conditional-separator(mode, short-form, long-form) = {
let separator = if short-form.len() > 4 { " / " } else { ", " };
let has_long = long-form != none and long-form != "";
if mode == "short" {
short-form
} else if mode == "long" {
if has_long { long-form } else { short-form }
} else {
if has_long {
long-form + separator + short-form
} else {
short-form
}
}
}
#init-glossary(myGlossary, format-term: format-conditional-separator)[#test-content]
// ---------------------------------------------------------------------------------
// 1. Braces and Labels
// Idea: Use different bracket styles and labels based on the mode.
#let format-braces(mode, short-form, long-form) = {
if mode == "short" {
"{" + short-form + "}"
} else if mode == "long" {
"[" + long-form + "]"
} else {
long-form + " <" + short-form + ">"
}
}
#init-glossary(myGlossary, format-term: format-braces)[#test-content]
// ---------------------------------------------------------------------------------
// 2. Mode-Based Prefix
// Idea: Add a prefix indicating the mode, and then show the term(s).
#let format-mode-prefix(mode, short-form, long-form) = {
let prefix = if mode == "short" { "S:" } else if mode == "long" { "L:" } else { "B:" };
if mode == "short" {
prefix + short-form
} else if mode == "long" {
prefix + long-form
} else {
prefix + long-form + " & " + short-form
}
}
#init-glossary(myGlossary, format-term: format-mode-prefix)[#test-content]
// ---------------------------------------------------------------------------------
// 3. Conditional Fallback for Missing Long
// Idea: If no long-form is provided, use the short-form in all cases.
#let format-fallback-long(mode, short-form, long-form) = {
let has_long = long-form != none and long-form != "";
if mode == "short" {
short-form
} else if mode == "long" {
if has_long { long-form } else { short-form }
} else {
if has_long { long-form + " (" + short-form + ")" } else { short-form }
}
}
#init-glossary(myGlossary, format-term: format-fallback-long)[#test-content]
// ---------------------------------------------------------------------------------
// 4. Uppercase Both Terms in Both Mode
// Idea: Always uppercase for both mode, normal otherwise.
#let format-uppercase-both(mode, short-form, long-form) = {
if mode == "short" {
short-form
} else if mode == "long" {
long-form
} else {
upper(long-form) + " (" + upper(short-form) + ")"
}
}
#init-glossary(myGlossary, format-term: format-uppercase-both)[#test-content]
// ---------------------------------------------------------------------------------
// 5. Append Length Info
// Idea: In both mode, append the length of each string.
#let format-length-info(mode, short-form, long-form) = {
let s_len = str(short-form.len())
let l_len = if long-form != none and long-form != "" { str(long-form.len()) } else { "0" }
if mode == "short" {
short-form + " [len:" + s_len + "]"
} else if mode == "long" {
long-form + " [len:" + l_len + "]"
} else {
long-form + " (" + short-form + ") [L:" + l_len + ", S:" + s_len + "]"
}
}
#init-glossary(myGlossary, format-term: format-length-info)[#test-content]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

-45
View File
@@ -1,45 +0,0 @@
#import "/lib.typ": *
#import "@preview/glossarium:0.5.1": *
#set page(height: auto, width: 4.5in)
#show link: set text(fill: red)
// -----------------------------------------------------------------------------
= `glossy`:
#box(
stroke: 1pt,
inset: 1em,
[
#show: init-glossary.with((WWW: "World Wide Web"))
This should be a link: @WWW
This should be a link, too: @WWW
#glossary()
]
)
// -----------------------------------------------------------------------------
= `glossarium`:
#box(
stroke: 1pt,
inset: 1em,
[
#show: make-glossary
#let entry-list = (
(key: "ML", short: "ML", long: "Machine Learning"),
)
#register-glossary(entry-list)
This should be a link: @ML
This should be a link, too: @ML
#print-glossary(entry-list)
]
)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 76 KiB

-23
View File
@@ -1,23 +0,0 @@
first:
short: "DAL"
long: "first"
second:
short: "cab"
long: "second"
third:
short: "delta"
long: "third"
fourth:
short: "COO"
long: "fourth"
fifth:
short: "cuckoo"
long: "fifth"
sixth:
short: "ČR"
long: "sixth"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

-13
View File
@@ -1,13 +0,0 @@
#import "/lib.typ":*
#show: init-glossary.with(yaml("glossary.yml"))
@first, @second, @third, @fourth, @fifth, @sixth
#glossary(ignore-case: false, sort: true)
#line(length: 20em)
#glossary(ignore-case: true, sort: true)
#line(length: 20em)
#glossary(ignore-case: false, sort: false)
#line(length: 20em)
#glossary(ignore-case: true, sort: false)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 651 KiB

After

Width:  |  Height:  |  Size: 651 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

+1 -1
View File
@@ -3,7 +3,7 @@
#set text(lang: "cs", region: "CZ")
#show: init-glossary.with(yaml("glossary.yml"))
#glossary(ignore-case: true, theme: theme-twocol)
#glossary(ignore-case: true)
#line(length: 20em)
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "glossy"
version = "0.5.2"
version = "0.4.1"
entrypoint = "lib.typ"
authors = ["Stephen Waits <steve@waits.net>"]
license = "MIT"
@@ -8,4 +8,4 @@ description = "A very simple glossary system with easily customizable output."
categories = ["model"]
keywords = ["glossary", "index", "dictionary", "gloss"]
repository = "https://github.com/swaits/typst-collection"
exclude = ["thumbnail.png", "themeshots.pjng", "tests", "bin"]
exclude = ["thumbnail.png", "themeshots.pjng", "tests"]
-2
View File
@@ -1,2 +0,0 @@
tests/**/out/
tests/**/diff/
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2025 Stephen Waits <steve@waits.net>
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.
-62
View File
@@ -1,62 +0,0 @@
# run-liners
A Typst package for creating run-in lists, enumerations, and more following Chicago Manual of Style guidelines.
## Features
- **Run-in Enumerations**: Create numbered lists like "(1) apple, (2) banana, and (3) cherry"
- **Run-in Bullet Lists**: Make bullet-point lists flow in a single line
- **Run-in Term Definitions**: Format term-definition pairs inline
- **Run-in Verse**: Join poetry lines with custom separators
- **Smart Separator Detection**: Automatically switches between commas and semicolons based on content
- **Flexible Coordination**: Use "and", "or", "and/or", or no coordinator between the last two items
## Usage
```typst
#import "@preview/run-liners:0.1.0": *
// Basic enumeration
#run-in-enum([Apple], [Banana], [Cherry])
// Output: (1) Apple, (2) Banana, and (3) Cherry
// Bullet list with custom marker
#run-in-list(
marker: [#sym.ballot.check],
[First],
[Second],
[Third]
)
// Output: ✓ First, ✓ Second, and ✓ Third
// Term definitions
#run-in-terms(
([Term 1], [Definition 1]),
([Term 2], [Definition 2])
)
// Output: Term 1: Definition 1, and Term 2: Definition 2
// Poetry lines
#run-in-verse(
[Line 1],
[Line 2],
[Line 3]
)
// Output: Line 1 / Line 2 / Line 3
```
## Configuration Options
- `separator`: Use "auto" for smart detection or specify like ", " or "; "
- `coordinator`: "and", "or", "and/or", or none
- `numbering-pattern`: "(1)", "(A)", etc. for enumerations
- `marker`: Customize bullet points
- `term-formatter`: Style your terms (bold by default)
## Documentation
See the [manual](docs/manual.pdf) for detailed examples and usage guidelines.
## License
[MIT License](LICENSE)
-6
View File
@@ -1,6 +0,0 @@
watchexec \
--watch . \
--clear \
--ignore 'tests/**/diff/**' \
--ignore 'tests/**/out/**' \
"typst-test r"
Binary file not shown.
-472
View File
@@ -1,472 +0,0 @@
#import "/lib.typ": *
#import "@preview/codly:1.1.1": *
#import "@preview/codly-languages:0.1.1": *
#show: codly-init.with()
#codly(languages: codly-languages)
#set page(width: 8.5in, height: 11in, margin: 1in, numbering: "1",
header: [#h(1fr) Version: `0.1.0`])
#set par(justify: true)
#show raw.where(block: true): set text(size:7pt)
#let easy-typography(
body-size: 10pt,
body-font: "Source Serif Pro",
heading-font: "Source Sans Pro",
paper: none,
margin: none,
body
) = {
// Constants
let heading-above-max = 1.25em
let heading-above-min = 0.75em
let heading-below-max = 0.65em
let heading-below-min = 0.52em
let heading-size-max = 1.10em
let heading-size-min = 1.00em
let body-weight = "light"
let line-spacing = 1.25
let paragraph-spacing = 2.00
// Optional page setup
if paper != none {
set page(paper: paper)
}
if margin != none {
set page(margin: margin)
}
// Paragraphs
set par(
leading: line-spacing * 0.5em,
spacing: paragraph-spacing * 0.5em,
justify: true,
linebreaks: "optimized",
)
// Body text
set text(
font: body-font,
fallback: false,
style: "normal",
weight: body-weight,
stretch: 100%,
size: body-size,
tracking: 0pt,
spacing: 100% + 0pt,
baseline: 0pt,
overhang: true,
hyphenate: true,
kerning: true,
ligatures: true,
number-type: "lining",
)
// Top-heavy easing function for heading sizes/spacing:
// - max = biggest size (H1), min = smallest size (H5), level in [1..5]
// - sqrt(t) => gives biggest decrease at top, gentlest at bottom
let compute-size(max, min, level) = {
if level <= 1 {
max
} else if level >= 5 {
min
} else {
let t = (level - 1) / 4
max - (max - min) * calc.sqrt(t)
}
}
// Heading weight logic
let compute-weight(level) = {
if level <= 1 {
"bold"
} else if level == 2 {
"semibold"
} else if level == 3 {
"medium"
} else {
"regular"
}
}
// Show headings using computed size/spacing values
show heading: it => block(
breakable: false,
sticky: true,
above: compute-size(heading-above-max, heading-above-min, it.level),
below: compute-size(heading-below-max, heading-below-min, it.level),
text(
font: heading-font,
size: compute-size(heading-size-max, heading-size-min, it.level),
weight: compute-weight(it.level),
it
)
)
// Finally, render the body
body
}
#show: easy-typography
#text(
size: 3em,
weight: "black",
font: "Source Sans Pro",
[`run-liners`: User Manual]
)
#v(1fr)
#outline(depth: 1)
#pagebreak()
#set heading(numbering: "1.1.")
= Introduction
This package provides a set of functions that create “run-in” lists and enumerations, following guidelines similar to the *Chicago Manual of Style*. You can produce run-in enumerations, bullet lists, terms/definitions, or verses, all joined in a single line with flexible separators and optional words like “and,” “or,” or _none_ (i.e. omit a coordinator).
We’ll illustrate each function using
#run-in-terms(
coordinator: "and",
([the left column], [a `typst` block containing the Typst code you’d write]),
([the right column], [the rendered result]),
).
= `run-in-enum`: Run-in numbered lists
`run-in-enum` is typically used for run-in enumerations like “(1) apple, (2) banana, and (3) cherry.” It offers these parameters:
- *`separator`*: Defaults to `"auto"` (which tries to detect commas and switch to semicolons).
- *`coordinator`*: The word or phrase before the last item—defaults to `"and"`, can be `"or"`, `"and/or"`, or `none`.
- *`numbering-pattern`*: A pattern like `"(1)"`, `"(A)"`, or any format the `numbering()` call supports.
- *`numbering-formatter`*: A function that can style or transform the generated number.
== Example: Basic Three-Item Enumeration
#columns(2)[
```typst
#run-in-enum(
[Apple],
[Banana],
[Cherry]
)
```
#colbreak()
#run-in-enum(
[Apple],
[Banana],
[Cherry]
)
]
This example uses *all defaults*:
- `separator: "auto"` → because there’s no comma in the content, it uses commas.
- `coordinator: "and"` → puts “and” before the last item.
- `numbering-pattern: "(1)"` → “(1) (2) (3)”
- `numbering-formatter: (it) => [#it]` → no special styling.
== Example: Coordinator = none, 4 Items, Comma in content
If one of your items contains `[text, with comma]`, the `auto` separator chooses `"; "`.
#columns(2)[
```typst
#run-in-enum(
coordinator: none,
[Item One],
[Item Two, comma here],
[Item Three],
[Item Four]
)
```
#colbreak()
#run-in-enum(
coordinator: none,
[Item One],
[Item Two, comma here],
[Item Three],
[Item Four]
)
]
Notice it used semicolons because of comma detection, *and* no coordinator word (because `coordinator: none`).
== Example: Custom Numbering Pattern & Styling
#block(breakable: false)[
You can change `numbering-pattern` to `"(A)"` or `"(i)"` and style the numbers with `numbering-formatter`.
#columns(2)[
```typst
#run-in-enum(
numbering-pattern: "(A)",
numbering-formatter: (txt) => [#strong(txt)],
[Alpha],
[Beta],
[Gamma]
)
```
#colbreak()
#run-in-enum(
numbering-pattern: "(A)",
numbering-formatter: (txt) => [#strong(txt)],
[Alpha],
[Beta],
[Gamma]
)
]
Here, `(A)`, `(B)`, `(C)` appear in *bold*.
]
== Example: Single Item & Two Items Edge Cases
When only one item is present, no separator or coordinator is used. With two items, you’ll see just one separator plus “and/or/or” (depending on coordinator).
#columns(2)[
```typst
// Single item:
#run-in-enum([LoneItem])
```
#colbreak()
#run-in-enum([LoneItem])
]
#columns(2)[
```typst
// Two items:
#run-in-enum([First], [Second])
```
#colbreak()
#run-in-enum([First], [Second])
]
#columns(2)[
```typst
// Two items, no coordinator:
#run-in-enum(coordinator: none, [First], [Second])
```
#colbreak()
#run-in-enum(coordinator: none, [First], [Second])
]
#columns(2)[
```typst
// Three items:
#run-in-enum([First], [Second], [Third])
```
#colbreak()
#run-in-enum([First], [Second], [Third])
]
#columns(2)[
```typst
// Three items, no coordinator:
#run-in-enum(coordinator: none, [First], [Second], [Third])
```
#colbreak()
#run-in-enum(coordinator: none, [First], [Second], [Third])
]
= `run-in-list`: Run-in bullet points
`run-in-list` behaves like `run-in-enum` but uses a *bullet (or any marker)* before each item. The rest of the logic is the same—`separator`, `coordinator`, etc.
See the “run-in-enum” section for *how `auto` detection* and *`coordinator`* work.
== Example1: Default Bullets
#columns(2)[
```typst
#run-in-list(
[Apple],
[Banana],
[Cherry]
)
```
#colbreak()
#run-in-list(
[Apple],
[Banana],
[Cherry]
)
]
You get bullets `[•]` for each item by default.
== Example: Custom Marker, Coordinator = 'or'
#block(breakable: false)[
#columns(2)[
```typst
#run-in-list(
coordinator: "or",
marker: [#sym.ballot.check],
[First],
[Second],
[Third, comma item]
)
```
#colbreak()
#run-in-list(
coordinator: "or",
marker: [#sym.ballot.check],
[First],
[Second],
[Third, comma item]
)
]
Because of the comma, it uses semicolons. The coordinator is now `"or"`.
]
= `run-in-terms`: Run-in term definitions
`run-in-terms` is for run-in *terms and definitions*. By default, each term is *bold* (`[#strong(term)]`) followed by the definition, and you still get the same *separator* and *coordinator* logic as in `run-in-enum`.
== Example: Three Terms, No Coordinator
#columns(2)[
```typst
#run-in-terms(
coordinator: none,
(
([Goal], [Summarize the prior research]),
([Methods], [Outline the approach]),
([Outcome], [Analyze the results])
)
)
```
#colbreak()
#run-in-terms(
coordinator: none,
([Goal], [Summarize the prior research]),
([Methods], [Outline the approach]),
([Outcome], [Analyze the results])
)
]
See how no “and” or “or” appears. It detects commas if they exist.
== Example: Custom Term Formatter
#columns(2)[
```typst
#run-in-terms(
term-formatter: (txt) => [#underline(txt)],
([Key], [Value 1]),
([Another Key], [Value 2])
)
```
#colbreak()
#run-in-terms(
term-formatter: (txt) => [#underline(txt)],
([Key], [Value 1]),
([Another Key], [Value 2])
)
]
Each term is underlined, with a colon after the term.
= `run-in-verse`: Run-in poetry lines
`run-in-verse` simply joins lines (verses) with a given *separator* (default: `[ /~]`), and no coordinator. It’s much simpler since you typically don’t want “and” in between lines of poetry.
== Example: Default Verse Joining
#columns(2)[
```typst
#run-in-verse(
[Line 1],
[Line 2],
[Line 3]
)
```
#colbreak()
#run-in-verse(
[Line 1],
[Line 2],
[Line 3]
)
]
== Example: Custom Separator
#block(breakable: false)[
#columns(2)[
```typst
// Overriding the default with a comma + space
#run-in-verse(
separator: ", ",
[Line A],
[Line B],
[Line C]
)
```
#colbreak()
#run-in-verse(
separator: ", ",
[Line A],
[Line B],
[Line C]
)
]
]
= Direct `run-in-join`
All these functions ultimately call *`run-in-join`*, which you can use yourself if you want to create custom transformations. You supply:
1. *`separator`* (or `"auto"` for comma detection).
2. *`coordinator`* or `none`.
3. A *spread* of content items (`..content`).
== Example: Using `run-in-join` Directly
#columns(2)[
```typst
#run-in-join(
coordinator: "and/or",
[First item],
[Second item],
[Third item, comma triggers semicolon],
[Final item]
)
```
#colbreak()
#run-in-join(
coordinator: "and/or",
[First item],
[Second item],
[Third item, comma triggers semicolon],
[Final item]
)
]
You can see that it inserts semicolons (auto detection) and “and/or” before the last item.
= Conclusion
That’s your tour of the *run-in* functions! Remember:
- If you want enumerations with `(1)` or `(A)` prefixes, use *`run-in-enum`*.
- For bullet lists, use *`run-in-list`*.
- For term–definition pairs, *`run-in-terms`*.
- For verse lines, *`run-in-verse`*.
- Or just call *`run-in-join`* yourself for custom needs.
Explore different *separators* (like `[ /~]`, `", "`, or `"; "`) and *coordinators* (`"and"`, `"or"`, `"none"`, etc.) to get the exact run-in style your text requires.
Happy Typst-ing!
-1
View File
@@ -1 +0,0 @@
#import "src/main.typ": run-in-join, run-in-enum, run-in-list, run-in-terms, run-in-verse
-77
View File
@@ -1,77 +0,0 @@
#let run-in-join(
// Determines the in-between separator for all but the last item.
// - If set to "auto", we'll detect whether content has commas.
// - Otherwise, use it literally (e.g., ", ", " / ", etc.).
separator: "auto",
// The word or phrase (e.g., "and", "or", "and/or") that comes before the last item.
// - If set to `none`, we skip any coordinator.
coordinator: "and",
// Content items you want to join.
// e.g., `[ [#(1) " item one"], [#(2) " item two"], ... ]`
..content,
) = {
// 1. Decide on the base separator.
let sep = if separator == "auto" {
// naive check: if any item in the content sequence includes a comma, use semicolons
if content.pos().any((item) => repr(item).find(regex("\[[^]]*,[^]]*\]")) != none) {
"; "
} else {
", "
}
} else {
separator
}
// 2. Figure out how to handle the last separator.
// If `coordinator` is none, just do a normal join.
// If `oxford` is true and there are 3+ items, insert a comma before coordinator.
let final-sep = if coordinator != none and content.pos().len() == 2 {
// For 3 or more items, we do something like: ", and "
// That is, a final comma plus the coordinator
" " + coordinator + " "
} else if coordinator != none and content.pos().len() > 2 {
// For 3 or more items, we do something like: ", and "
// That is, a final comma plus the coordinator
sep + coordinator + " "
} else {
// No coordinator or too few items; the final separator is just `sep`.
sep
}
// 3. Perform the join:
content.pos().join(
sep,
last: final-sep
)
}
#let run-in-enum(separator: "auto", coordinator: "and", numbering-pattern: "(1)", numbering-formatter: (it) => [#it], ..items) = {
let contents = items.pos().enumerate(start: 1).map(((index, item)) => {
[#numbering-formatter(numbering(numbering-pattern, index))~#item]
})
run-in-join(separator: separator, coordinator: coordinator, ..contents)
}
#let run-in-list(separator: "auto", coordinator: "and", marker: [•], ..items) = {
let contents = items.pos().map((item) => {
[#marker~#item]
})
run-in-join(separator: separator, coordinator: coordinator, ..contents)
}
#let run-in-terms(separator: "auto", coordinator: "and", term-formatter: (it) => [#strong(it)], ..terms) = {
let contents = terms.pos().map((t) => {
if type(t) != array or t.len() != 2 {
panic("arguments to run-in-terms must be arrays of the form (term, definition)")
}
[#term-formatter(t.at(0)):~#t.at(1)]
})
run-in-join(separator: separator, coordinator: coordinator, ..contents)
}
#let run-in-verse(separator: [ /~], coordinator: none, ..verses) = {
let contents = verses
run-in-join(separator: separator, coordinator: coordinator, ..contents)
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

-335
View File
@@ -1,335 +0,0 @@
// exhaustive-test.typ
// =============================================================================
// EXHAUSTIVE TESTS for your run-in library
// =============================================================================
// This file demonstrates almost every combination of named/positional arguments
// for run-in-enum, run-in-list, run-in-terms, run-in-verse, and run-in-join,
// including zero items, single item, multiple items, bracketed commas, etc.
//
// Adjust import path to your library as needed:
//
// #import "/lib.typ": * // or whatever your actual path is
//
// Then compile.
// =============================================================================
#import "/lib.typ": *
#set page(height: auto, width: 6in, margin: 1em)
// A small helper for easy labeling:
#let heading = (text) => {
[#strong(text) "\n"]
}
#let subheading = (text) => {
[#emph(text) "\n"]
}
// =============================================================================
// 1) run-in-enum TESTS
// =============================================================================
#heading("1) run-in-enum Tests")
// 1A. NO NAMED ARGUMENTS (uses defaults: separator=auto, coordinator=and, etc.)
#subheading("1A: No named arguments")
#text("Zero items => Should produce nothing:")
#run-in-enum()
#text("Single item => Should just produce \"(1) <item>\":")
#run-in-enum([Single item here])
#text("Two items => Typically comma, then \"and\":")
#run-in-enum([First], [Second])
#text("Three items => Commas, then \"and\" before last:")
#run-in-enum([Apple], [Banana], [Cherry])
#text("Three items w/ bracketed comma => triggers semicolons:")
#run-in-enum([Item1], [[test, bracketed]], [Item3])
// 1B. ALL NAMED ARGUMENTS
#subheading("1B: All named arguments")
#text("separator=', ', coordinator='or', numbering-pattern='(A)', custom numbering-formatter => bold:")
#run-in-enum(
separator: ", ",
coordinator: "or",
numbering-pattern: "(A)",
numbering-formatter: (val) => [#strong(val)],
[Alpha],
[Beta],
[Gamma]
)
#text("separator='; ', coordinator=none, numbering-pattern='(i)', numbering-formatter=>italics, 4 items:")
#run-in-enum(
separator: "; ",
coordinator: none,
numbering-pattern: "(i)",
numbering-formatter: (val) => [#emph(val)],
[Item A],
[[Bracket, comma]],
[Item C],
[Item D]
)
// 1C. MIXED SCENARIOS
#subheading("1C: Mixed scenarios")
#text("Two items, coordinator='and/or':")
#run-in-enum(
coordinator: "and/or",
[Red],
[Blue]
)
#text("Single item, custom numbering-pattern='(###)':")
#run-in-enum(
numbering-pattern: "( -- 1 -- )",
[JustOne]
)
// =============================================================================
// 2) run-in-list TESTS
// =============================================================================
#heading("2) run-in-list Tests (bulleted run-in)")
// 2A. NO NAMED ARGUMENTS (uses defaults: separator=auto, coordinator=and, marker=[•])
#subheading("2A: No named arguments")
#text("Zero items => Should produce nothing:")
#run-in-list()
#text("Single item => One bullet, no join needed:")
#run-in-list([Only me])
#text("Two items => bullet for each, comma by default, then 'and':")
#run-in-list([First], [Second])
#text("Three items => bracketed comma triggers semicolons, plus 'and':")
#run-in-list([One], [[Two, bracketed]], [Three])
// 2B. ALL NAMED ARGUMENTS
#subheading("2B: All named arguments")
#text("separator='; ', coordinator='or', marker=[-> ]:")
#run-in-list(
separator: "; ",
coordinator: "or",
marker: [-> ],
[Apple],
[Banana],
[Cherry]
)
#text("separator=', ', coordinator=none, marker=[❖ ] (for instance):")
#run-in-list(
separator: ", ",
coordinator: none,
marker: [❖ ],
[ListOne],
[ListTwo],
[ListThree]
)
// 2C. MIXED SCENARIOS
#subheading("2C: Mixed scenarios")
#text("Single item with custom marker [✓ ]:")
#run-in-list(
marker: [✓ ],
[One item only]
)
#text("Three items, coordinator='and/or':")
#run-in-list(
coordinator: "and/or",
[ItemA],
[ItemB],
[ItemC]
)
// =============================================================================
// 3) run-in-terms TESTS
// =============================================================================
#heading("3) run-in-terms Tests (term => definition)")
// 3A. NO NAMED ARGUMENTS (defaults: separator=auto, coordinator=and, term-formatter=(it)=>[#strong(it)])
#subheading("3A: No named arguments")
#text("Zero terms => produce nothing:")
// #run-in-terms([]) // appropriately panics :)
#text("Single term => no join needed:")
#run-in-terms(
([OnlyTerm], [ItsDefinition]),
)
#text("Two terms => comma then 'and':")
#run-in-terms(
([FirstTerm], [DefinitionOne]),
([SecondTerm], [DefinitionTwo])
)
#text("Three terms => bracketed comma triggers semicolons + 'and':")
#run-in-terms(
([Term1], [Definition1]),
([Term2], [Def, bracketed]),
([Term3], [Definition3])
)
// 3B. ALL NAMED ARGUMENTS
#subheading("3B: All named arguments")
#text("separator='; ', coordinator='none', custom term-formatter => italic, 3 terms:")
#run-in-terms(
separator: "; ",
coordinator: none,
term-formatter: (txt) => [#emph(txt)],
([Goal], [Summarize prior research]),
([Methods], [Outline approach]),
([Outcome], [Analyze results])
)
#text("separator=', ', coordinator='or', custom term-formatter => underline, 2 terms:")
#run-in-terms(
separator: ", ",
coordinator: "or",
term-formatter: (txt) => [#underline(txt)],
([Key], [Value 1]),
([Secondary], [Value 2])
)
// 3C. MIXED SCENARIOS
#subheading("3C: Mixed scenarios")
#text("Single term, coordinator='and/or' => no effect because only one term:")
#run-in-terms(
coordinator: "and/or",
([OneTerm], [OneDefinition],)
)
// =============================================================================
// 4) run-in-verse TESTS
// =============================================================================
#heading("4) run-in-verse Tests")
// By default: separator=[ /~], coordinator=none, ..verses
// 4A. Testing zero, single, multiple verses
#subheading("4A: No named arguments")
#text("Zero verses => nothing:")
#run-in-verse()
#text("Single verse => no joins needed:")
#run-in-verse([Alone in the verse])
#text("Two verses => joined with ' / ':")
#run-in-verse([Line one], [Line two])
#text("Three verses => bracketed commas don't matter here, but let's try anyway:")
#run-in-verse([LineA], [[Line, with comma]], [LineC])
// 4B. Overriding the default separator (rare but possible)
#subheading("4B: Custom separator")
#text("Using separator=', ' while coordinator=none:")
#run-in-verse(
separator: ", ",
[VerseOne],
[VerseTwo],
[VerseThree]
)
// =============================================================================
// 5) DIRECT run-in-join TESTS
// =============================================================================
#heading("5) Direct run-in-join Tests")
// We’ll systematically test zero, single, multiple items,
// with or without named arguments.
#subheading("5A: Minimal usage => no named args, zero items => nothing.")
#run-in-join()
#text("Single item, no named args => no join needed:")
#run-in-join([Solo])
#text("Two items, no named args => comma + 'and':")
#run-in-join([Item A], [Item B])
#text("Three items, bracketed comma => semicolons + 'and':")
#run-in-join([A1], [[B, bracketed]], [C1])
#subheading("5B: All named args")
#text("separator='; ', coordinator='or', 3 items => semicolons and \"or\"")
#run-in-join(
separator: "; ",
coordinator: "or",
[Alpha],
[Beta],
[Gamma]
)
#text("separator=[ /~], coordinator='and/or', 4 items => ' / ' as base sep + 'and/or' before last:")
#run-in-join(
separator: [ /~],
coordinator: "and/or",
[One],
[Two],
[Three],
[Four]
)
#subheading("5C: Edge combos")
#text("Two items, coordinator=none => just a single separator between them.")
#run-in-join(
coordinator: none,
[X],
[Y]
)
#text("Three items, separator=', ', coordinator=none => no 'and':")
#run-in-join(
separator: ", ",
coordinator: none,
[X2],
[Y2],
[Z2]
)
#text("Single item, bracketed comma => no effect since there's no join anyway.")
#run-in-join([[Has, bracketed]])
#text("Done with direct run-in-join tests.")
Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

-39
View File
@@ -1,39 +0,0 @@
#import "/lib.typ": *
#set page(margin: 1em, height: auto, width: 5in)
*`#run-in-enum()`* creates run-in numbered lists, like:
#run-in-enum(
[one],
[two],
[three],
).
#line(length: 100%)
*`#run-in-list()`* creates run-in bullet points, like:
#run-in-list(
[one],
[two],
[three],
).
#line(length: 100%)
*`#run-in-terms()`* creates run-in term lists, like:
#run-in-terms(
([enumerations], [numbered lists]),
([lists], [bulleted lists]),
([term lists], [definition lists]),
([verses], [poetry (or similar) lines])
).
#line(length: 100%)
*`#run-in-verse()`* creates run-in verses, like:
#run-in-verse(
[Now is the time],
[for all good men],
[to come to the aid],
[of their country]
).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

-11
View File
@@ -1,11 +0,0 @@
[package]
name = "run-liners"
version = "0.1.0"
entrypoint = "lib.typ"
authors = ["Stephen Waits <steve@waits.net>"]
license = "MIT"
description = "Functions to create various run-in lists."
categories = ["model"]
keywords = ["run-in", "enum", "list", "terms"]
repository = "https://github.com/swaits/typst-collection"
exclude = ["thumbnail.png", "tests", "bin", "docs/manual.pdf"]