feat: add single card template for PNG/SVG output
- Create templates/single-card.typ for individual card rendering - Includes local copy of create-colored-numeral function - Supports transparent backgrounds and exact card dimensions - Used by PNG/SVG generation to avoid PDF intermediate 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
16
README.md
|
|
@ -7,19 +7,19 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
|
|||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img src="docs/images/basic-123-front.png" width="200" alt="Soroban showing 123"><br>
|
||||
<img src="docs/images/svg/basic-123_front.svg" width="200" alt="Soroban showing 123"><br>
|
||||
<b>Soroban (Front)</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/basic-123-back.png" width="200" alt="Numeral 123"><br>
|
||||
<img src="docs/images/svg/basic-123_back.svg" width="200" alt="Numeral 123"><br>
|
||||
<b>Numeral (Back)</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/place-value-456-front.png" width="200" alt="Place-value colored 456"><br>
|
||||
<img src="docs/images/svg/place-value-456_front.svg" width="200" alt="Place-value colored 456"><br>
|
||||
<b>Place-Value Colors</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/place-value-456-back.png" width="200" alt="Colored numeral 456"><br>
|
||||
<img src="docs/images/svg/place-value-456_back.svg" width="200" alt="Colored numeral 456"><br>
|
||||
<b>Colored Numerals</b>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -30,15 +30,15 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
|
|||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img src="docs/images/diamond-25-front.png" width="200" alt="Diamond beads"><br>
|
||||
<img src="docs/images/svg/diamond-25_front.svg" width="200" alt="Diamond beads"><br>
|
||||
<b>Diamond (Realistic)</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/circle-25-front.png" width="200" alt="Circle beads"><br>
|
||||
<img src="docs/images/svg/circle-25_front.svg" width="200" alt="Circle beads"><br>
|
||||
<b>Circle (Traditional)</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/square-25-front.png" width="200" alt="Square beads"><br>
|
||||
<img src="docs/images/svg/square-25_front.svg" width="200" alt="Square beads"><br>
|
||||
<b>Square</b>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -63,7 +63,7 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
|
|||
<b>Skip Counting by 5s</b>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="docs/images/minimal-42-front.png" width="300" alt="Hidden inactive beads"><br>
|
||||
<img src="docs/images/svg/minimal-42_front.svg" width="300" alt="Hidden inactive beads"><br>
|
||||
<b>Hidden Inactive Beads</b>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 56 KiB |
|
|
@ -0,0 +1,23 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(95.868 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gA8B086524B604384343EE41E3350A9CD" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g1BE2FD2BC12AB488A636D0F2EA2BCD50" x="40.17600000000001" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="gA8B086524B604384343EE41E3350A9CD" overflow="visible">
|
||||
<path d="M 12.441601 5.2704 L 12.441601 20.260801 C 12.441601 22.8528 12.4848 25.488 12.5712 26.0496 C 12.5712 26.2656 12.4848 26.2656 12.312 26.2656 C 9.936 24.7968 7.6464 23.7168 3.8448 21.9456 C 3.9312 21.4704 4.104 21.0384 4.4928 20.7792 C 6.48 21.6 7.4304004 21.859201 8.251201 21.859201 C 8.9856 21.859201 9.1152 20.822401 9.1152 19.3536 L 9.1152 5.2704 C 9.1152 1.6848 7.9488 1.4688001 4.9248 1.3392 C 4.6656003 1.08 4.6656003 0.1728 4.9248 -0.0864 C 7.0416 -0.0432 8.5968 0 10.929601 0 C 13.003201 0 14.04 -0.0432 16.2 -0.0864 C 16.4592 0.1728 16.4592 1.08 16.2 1.3392 C 13.176001 1.4688001 12.441601 1.6848 12.441601 5.2704 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g1BE2FD2BC12AB488A636D0F2EA2BCD50" overflow="visible">
|
||||
<path d="M 9.288 24.84 C 11.1456 24.84 12.8736 23.7168 12.8736 20.952 C 12.8736 18.792 10.368 15.4656 6.0912004 14.860801 L 6.3072 13.4784 C 7.0416 13.5648 7.8192 13.5648 8.3808 13.5648 C 10.843201 13.5648 14.04 12.8736 14.04 7.992 C 14.04 2.2464 10.1952 1.08 8.6832 1.08 C 6.48 1.08 6.0912004 2.0736 5.5728 2.8512 C 5.1408 3.456 4.5792003 3.9744 3.7152002 3.9744 C 2.808 3.9744 1.9008 3.1536 1.9008 2.4624 C 1.9008 0.73440003 5.5296 -0.432 8.1216 -0.432 C 13.262401 -0.432 17.8416 2.8944001 17.8416 8.5968 C 17.8416 13.3056 14.2992 14.9904 11.750401 15.4224 L 11.7072 15.5088005 C 15.2496 17.1936 16.2432 18.9648 16.2432 21.2544 C 16.2432 22.5504 15.940801 23.5872 14.904 24.6672 C 13.9536 25.617601 12.441601 26.352001 10.1952 26.352001 C 3.8448 26.352001 2.0304 22.2048 2.0304 20.7792 C 2.0304 20.1744 2.4624 19.3104 3.4992 19.3104 C 5.0112 19.3104 5.184 20.736 5.184 21.5568 C 5.184 24.3216 8.164801 24.84 9.288 24.84 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
|
@ -0,0 +1,176 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(75.89999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(61 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(54.1 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 56)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -0,0 +1,15 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(115.956 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gE527A8F526438E4E6CB0061AC2EAAA13" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="gE527A8F526438E4E6CB0061AC2EAAA13" overflow="visible">
|
||||
<path d="M 7.3440003 23.112001 L 15.0768 23.112001 C 11.7072 14.7312 8.2944 6.3072 5.3568 -0.2592 L 5.7024 -0.5616 L 8.64 -0.432 C 11.1024 6.912 13.4784 14.0832 18.316801 25.8768 L 17.6256 26.3952 C 16.891201 26.179201 15.940801 25.92 14.2992 25.92 L 5.4 25.92 C 3.9312 25.92 4.0176 26.352001 3.24 26.524801 C 3.1104002 26.524801 3.0672002 26.524801 3.0672002 26.3952 C 3.0240002 24.3216 2.5488 21.7296 2.2032 19.4832 C 2.6784 19.3536 3.1104002 19.3104 3.5856001 19.3536 C 4.5360003 22.8096 5.9616003 23.112001 7.3440003 23.112001 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,80 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(100.89999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 1.25 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 25 2 L 25 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |
|
|
@ -0,0 +1,23 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(95.868 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gA8B086524B604384343EE41E3350A9CD" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g1BE2FD2BC12AB488A636D0F2EA2BCD50" x="40.17600000000001" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="gA8B086524B604384343EE41E3350A9CD" overflow="visible">
|
||||
<path d="M 12.441601 5.2704 L 12.441601 20.260801 C 12.441601 22.8528 12.4848 25.488 12.5712 26.0496 C 12.5712 26.2656 12.4848 26.2656 12.312 26.2656 C 9.936 24.7968 7.6464 23.7168 3.8448 21.9456 C 3.9312 21.4704 4.104 21.0384 4.4928 20.7792 C 6.48 21.6 7.4304004 21.859201 8.251201 21.859201 C 8.9856 21.859201 9.1152 20.822401 9.1152 19.3536 L 9.1152 5.2704 C 9.1152 1.6848 7.9488 1.4688001 4.9248 1.3392 C 4.6656003 1.08 4.6656003 0.1728 4.9248 -0.0864 C 7.0416 -0.0432 8.5968 0 10.929601 0 C 13.003201 0 14.04 -0.0432 16.2 -0.0864 C 16.4592 0.1728 16.4592 1.08 16.2 1.3392 C 13.176001 1.4688001 12.441601 1.6848 12.441601 5.2704 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g1BE2FD2BC12AB488A636D0F2EA2BCD50" overflow="visible">
|
||||
<path d="M 9.288 24.84 C 11.1456 24.84 12.8736 23.7168 12.8736 20.952 C 12.8736 18.792 10.368 15.4656 6.0912004 14.860801 L 6.3072 13.4784 C 7.0416 13.5648 7.8192 13.5648 8.3808 13.5648 C 10.843201 13.5648 14.04 12.8736 14.04 7.992 C 14.04 2.2464 10.1952 1.08 8.6832 1.08 C 6.48 1.08 6.0912004 2.0736 5.5728 2.8512 C 5.1408 3.456 4.5792003 3.9744 3.7152002 3.9744 C 2.808 3.9744 1.9008 3.1536 1.9008 2.4624 C 1.9008 0.73440003 5.5296 -0.432 8.1216 -0.432 C 13.262401 -0.432 17.8416 2.8944001 17.8416 8.5968 C 17.8416 13.3056 14.2992 14.9904 11.750401 15.4224 L 11.7072 15.5088005 C 15.2496 17.1936 16.2432 18.9648 16.2432 21.2544 C 16.2432 22.5504 15.940801 23.5872 14.904 24.6672 C 13.9536 25.617601 12.441601 26.352001 10.1952 26.352001 C 3.8448 26.352001 2.0304 22.2048 2.0304 20.7792 C 2.0304 20.1744 2.4624 19.3104 3.4992 19.3104 C 5.0112 19.3104 5.184 20.736 5.184 21.5568 C 5.184 24.3216 8.164801 24.84 9.288 24.84 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
|
@ -0,0 +1,176 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(75.89999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(61 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(54.1 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 56)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(105.912 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
|
||||
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,128 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(88.39999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(6.5 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(6.5 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(6.5 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(6.5 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(31.5 41)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(31.5 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(31.5 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(31.5 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(-0 -0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(105.912 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
|
||||
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,128 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(88.39999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 41)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(105.912 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gE527A8F526438E4E6CB0061AC2EAAA13" x="0" fill="#f18f01" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g456746B19EB22F2A61BF01BD62096D58" x="20.088000000000005" fill="#f18f01" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="gE527A8F526438E4E6CB0061AC2EAAA13" overflow="visible">
|
||||
<path d="M 7.3440003 23.112001 L 15.0768 23.112001 C 11.7072 14.7312 8.2944 6.3072 5.3568 -0.2592 L 5.7024 -0.5616 L 8.64 -0.432 C 11.1024 6.912 13.4784 14.0832 18.316801 25.8768 L 17.6256 26.3952 C 16.891201 26.179201 15.940801 25.92 14.2992 25.92 L 5.4 25.92 C 3.9312 25.92 4.0176 26.352001 3.24 26.524801 C 3.1104002 26.524801 3.0672002 26.524801 3.0672002 26.3952 C 3.0240002 24.3216 2.5488 21.7296 2.2032 19.4832 C 2.6784 19.3536 3.1104002 19.3104 3.5856001 19.3536 C 4.5360003 22.8096 5.9616003 23.112001 7.3440003 23.112001 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g456746B19EB22F2A61BF01BD62096D58" overflow="visible">
|
||||
<path d="M 16.9776 20.952 C 16.9776 24.0624 14.5584 26.352001 10.3248005 26.352001 C 5.9184003 26.352001 3.0672002 23.7168 3.0672002 20.3904 C 3.0672002 17.9712 4.2336 16.2 6.8688 14.5584 L 7.992 13.8672 C 6.7392 13.2192 5.5728 12.441601 4.4928 11.4912 C 2.7216 9.936 1.9872 7.992 1.9872 6.3072 C 1.9872 1.9008 5.0976 -0.432 9.6768 -0.432 C 15.336 -0.432 18.1008 3.7152002 18.1008 6.9984 C 18.1008 9.504001 17.0208 11.7072 14.7312 13.089601 L 11.6640005 14.947201 C 13.694401 15.940801 16.9776 18.1872 16.9776 20.952 Z M 9.7632 1.08 C 7.8192 1.08 4.8816 2.4192 4.8816 6.3072 C 4.8816 7.6032 5.4432 10.6272 9.158401 13.089601 L 11.1888 11.88 C 13.8672 10.2384 14.947201 8.208 14.947201 6.1344004 C 14.947201 1.8144001 11.7072 1.08 9.7632 1.08 Z M 10.1088 24.84 C 12.9168005 24.84 13.9536 22.9824 13.9536 20.995201 C 13.9536 18.662401 11.6640005 16.718401 10.497601 15.854401 L 9.158401 16.6752 C 6.4368 18.4464 6.1344004 19.872 6.1344004 21.2112 C 6.1344004 23.1984 7.5168004 24.84 10.1088 24.84 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
|
|
@ -0,0 +1,128 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(88.39999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 56)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(105.912 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#g695ECEB1DA88E26092A3CA94420E001D" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="g695ECEB1DA88E26092A3CA94420E001D" overflow="visible">
|
||||
<path d="M 18.576 9.4608 L 14.9904 9.4608 L 14.9904 22.075201 C 14.9904 24.2352 14.9904 25.92 15.0768 26.2656 L 14.9904 26.352001 L 13.608001 26.352001 C 13.3056 26.352001 13.089601 26.0928 12.9168005 25.8768 C 10.1952 22.5504 5.184 15.4224 1.2096 9.244801 C 1.3392 8.5968 1.5984 7.4304004 2.8944001 7.4304004 L 11.7072 7.4304004 L 11.7072 3.456 C 11.7072 1.4688001 10.0656 1.4688001 8.208 1.3392 C 7.9488 1.08 7.9488 0.1728 8.208 -0.0864 C 9.590401 -0.0432 11.3184 0 13.3056 0 C 14.9904 0 16.632 -0.0432 18.0144 -0.0864 C 18.2736 0.1728 18.2736 1.08 18.0144 1.3392 C 15.8976 1.5120001 14.9904 1.4256 14.9904 3.456 L 14.9904 7.4304004 L 17.9712 7.4304004 C 18.576 7.4304004 19.224 8.251201 19.224 8.7696 C 19.224 9.2016 19.0512 9.4608 18.576 9.4608 Z M 11.7072 21.902401 L 11.7072 9.4608 L 3.456 9.4608 C 5.6592 13.003201 8.7264 17.8416 11.7072 21.902401 Z "/>
|
||||
</symbol>
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,92 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(88.39999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 56)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 72)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.6 KiB |
|
|
@ -0,0 +1,31 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(95.868 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#g695ECEB1DA88E26092A3CA94420E001D" x="0" fill="#f18f01" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(115.956 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="0" fill="#a23b72" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(136.044 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#gC1E16492C95BF657C4E2F003E39B6B87" x="0" fill="#2e86ab" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="g695ECEB1DA88E26092A3CA94420E001D" overflow="visible">
|
||||
<path d="M 18.576 9.4608 L 14.9904 9.4608 L 14.9904 22.075201 C 14.9904 24.2352 14.9904 25.92 15.0768 26.2656 L 14.9904 26.352001 L 13.608001 26.352001 C 13.3056 26.352001 13.089601 26.0928 12.9168005 25.8768 C 10.1952 22.5504 5.184 15.4224 1.2096 9.244801 C 1.3392 8.5968 1.5984 7.4304004 2.8944001 7.4304004 L 11.7072 7.4304004 L 11.7072 3.456 C 11.7072 1.4688001 10.0656 1.4688001 8.208 1.3392 C 7.9488 1.08 7.9488 0.1728 8.208 -0.0864 C 9.590401 -0.0432 11.3184 0 13.3056 0 C 14.9904 0 16.632 -0.0432 18.0144 -0.0864 C 18.2736 0.1728 18.2736 1.08 18.0144 1.3392 C 15.8976 1.5120001 14.9904 1.4256 14.9904 3.456 L 14.9904 7.4304004 L 17.9712 7.4304004 C 18.576 7.4304004 19.224 8.251201 19.224 8.7696 C 19.224 9.2016 19.0512 9.4608 18.576 9.4608 Z M 11.7072 21.902401 L 11.7072 9.4608 L 3.456 9.4608 C 5.6592 13.003201 8.7264 17.8416 11.7072 21.902401 Z "/>
|
||||
</symbol>
|
||||
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
|
||||
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
|
||||
</symbol>
|
||||
<symbol id="gC1E16492C95BF657C4E2F003E39B6B87" overflow="visible">
|
||||
<path d="M 6.2208004 14.8176 C 7.3872004 18.7488 10.152 23.112001 15.8976 25.272001 C 15.8976 25.790401 15.7248 26.179201 15.3792 26.3952 C 11.016001 25.099201 8.3376 23.284801 5.9184003 20.4768 C 3.24 17.3664 1.9008 13.435201 1.9008 10.0224 C 1.9008 1.2528 6.8688 -0.4752 10.1952 -0.4752 C 15.854401 -0.4752 18.1872 5.0112 18.1872 8.7264 C 18.1872 12.441601 16.2 15.768001 10.3248005 15.768001 C 9.2016 15.768001 7.5168004 15.4224 6.2208004 14.8176 Z M 5.8320003 13.262401 C 7.2576003 14.2128 8.6832 14.2560005 9.417601 14.2560005 C 13.6512 14.2560005 14.601601 10.1088 14.601601 7.9488 C 14.601601 3.1968 12.7872 1.0368 10.670401 1.0368 C 7.9488 1.0368 5.4864 2.5056 5.4864 9.8928 C 5.4864 10.8864 5.5728 12.009601 5.8320003 13.262401 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
|
|
@ -0,0 +1,176 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(75.89999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 5)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 40)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 56)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(4.1000000000000005 72)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#a23b72" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 41)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(29.099999999999998 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(61 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(54.1 6)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 24)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 57)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 73)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(54.1 89)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(105.912 104.21279999999999)">
|
||||
<g class="typst-text" transform="scale(1, -1)">
|
||||
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
|
||||
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs id="glyph">
|
||||
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
|
||||
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
|
||||
</symbol>
|
||||
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
|
||||
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,98 @@
|
|||
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
|
||||
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
|
||||
<g>
|
||||
<g transform="translate(12.600000000000005 12.600000000000005)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(88.39999999999999 22.399999999999995)">
|
||||
<g class="typst-group">
|
||||
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(0 0)">
|
||||
<g class="typst-group">
|
||||
<g>
|
||||
<g transform="translate(11 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 5)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 5)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 24)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 24)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 40)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 40)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 73)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 73)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 89)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(6.5 89)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(36 0)">
|
||||
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 6)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 6)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 41)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 41)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 57)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 57)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 73)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 73)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 89)">
|
||||
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
|
||||
</g>
|
||||
<g transform="translate(31.5 89)">
|
||||
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
|
||||
</g>
|
||||
<g transform="translate(0 20)">
|
||||
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
351
src/generate.py
|
|
@ -7,6 +7,8 @@ import random
|
|||
import subprocess
|
||||
import sys
|
||||
import os
|
||||
import tempfile
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
def load_config(config_path):
|
||||
|
|
@ -45,6 +47,157 @@ def parse_range(range_str, step=1):
|
|||
numbers = [int(range_str)]
|
||||
return numbers
|
||||
|
||||
def generate_single_card_typst(number, side, config, output_path, project_root):
|
||||
"""Generate Typst file for a single card"""
|
||||
|
||||
# Use relative path to single-card.typ (we'll copy templates to temp dir)
|
||||
typst_content = f'''
|
||||
#import "single-card.typ": generate-single-card
|
||||
|
||||
#generate-single-card(
|
||||
{number},
|
||||
side: "{side}",
|
||||
bead-shape: "{config.get('bead_shape', 'diamond')}",
|
||||
color-scheme: "{config.get('color_scheme', 'monochrome')}",
|
||||
colored-numerals: {str(config.get('colored_numerals', False)).lower()},
|
||||
hide-inactive-beads: {str(config.get('hide_inactive_beads', False)).lower()},
|
||||
show-empty-columns: {str(config.get('show_empty_columns', False)).lower()},
|
||||
columns: {config.get('columns', 'auto')},
|
||||
transparent: {str(config.get('transparent', False)).lower()},
|
||||
width: {config.get('card_width', '3.5in')},
|
||||
height: {config.get('card_height', '2.5in')},
|
||||
font-size: {config.get('font_size', '48pt')},
|
||||
font-family: "{config.get('font_family', 'DejaVu Sans')}",
|
||||
scale-factor: {config.get('scale_factor', 1.0)}
|
||||
)
|
||||
'''
|
||||
|
||||
with open(output_path, 'w') as f:
|
||||
f.write(typst_content)
|
||||
|
||||
def typst_to_image(typst_file, output_file, format='png', dpi=300, tmpdir_path=None):
|
||||
"""Convert Typst file directly to PNG or SVG"""
|
||||
|
||||
# Use relative paths from tmpdir
|
||||
if tmpdir_path:
|
||||
rel_input = typst_file.name # Just filename since we're running from tmpdir
|
||||
abs_output = output_file.resolve() # Absolute path for output
|
||||
else:
|
||||
rel_input = str(typst_file)
|
||||
abs_output = str(output_file)
|
||||
|
||||
# Typst can export directly to PNG or SVG
|
||||
cmd = [
|
||||
'typst', 'compile',
|
||||
'--format', format,
|
||||
rel_input,
|
||||
str(abs_output)
|
||||
]
|
||||
|
||||
# Add DPI for PNG only
|
||||
if format == 'png':
|
||||
cmd.insert(-2, '--ppi')
|
||||
cmd.insert(-2, str(dpi))
|
||||
|
||||
# Add font path from tmpdir if fonts were copied there
|
||||
if tmpdir_path:
|
||||
fonts_path = tmpdir_path / 'fonts'
|
||||
if fonts_path.exists():
|
||||
cmd.extend(['--font-path', str(fonts_path)])
|
||||
|
||||
# Run from tmpdir where templates are copied
|
||||
cwd = tmpdir_path if tmpdir_path else None
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, cwd=cwd)
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f"Error generating {format.upper()}: {result.stderr}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def generate_cards_direct(numbers, config, output_dir, format='png', dpi=300, separate_fronts_backs=True):
|
||||
"""Generate PNG/SVG cards directly from Typst without PDF intermediate"""
|
||||
|
||||
# Create output directory
|
||||
output_dir = Path(output_dir)
|
||||
output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Get project root
|
||||
project_root = Path(__file__).parent.parent
|
||||
|
||||
# Apply shuffle if configured
|
||||
if config.get('shuffle', False):
|
||||
if 'seed' in config:
|
||||
random.seed(config['seed'])
|
||||
random.shuffle(numbers)
|
||||
|
||||
if format == 'png':
|
||||
print(f"Generating {len(numbers)} cards directly to PNG at {dpi} DPI...")
|
||||
else:
|
||||
print(f"Generating {len(numbers)} cards directly to SVG...")
|
||||
|
||||
# Create subdirectories if separating
|
||||
if separate_fronts_backs:
|
||||
fronts_dir = output_dir / 'fronts'
|
||||
backs_dir = output_dir / 'backs'
|
||||
fronts_dir.mkdir(exist_ok=True)
|
||||
backs_dir.mkdir(exist_ok=True)
|
||||
|
||||
generated_files = []
|
||||
|
||||
# Use temp directory for Typst files
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
tmpdir_path = Path(tmpdir)
|
||||
|
||||
# Copy template files to temp directory so imports work
|
||||
templates_dir = project_root / 'templates'
|
||||
shutil.copy2(templates_dir / 'single-card.typ', tmpdir_path)
|
||||
shutil.copy2(templates_dir / 'flashcards.typ', tmpdir_path)
|
||||
|
||||
# Copy fonts directory if it exists
|
||||
fonts_dir = project_root / 'fonts'
|
||||
if fonts_dir.exists():
|
||||
shutil.copytree(fonts_dir, tmpdir_path / 'fonts')
|
||||
|
||||
for i, num in enumerate(numbers):
|
||||
# Generate front (soroban)
|
||||
front_typst = tmpdir_path / f'card_{i}_front.typ'
|
||||
generate_single_card_typst(num, 'front', config, front_typst, project_root)
|
||||
|
||||
if separate_fronts_backs:
|
||||
front_file = fronts_dir / f'card_{i:03d}.{format}'
|
||||
else:
|
||||
front_file = output_dir / f'card_{i:03d}_front.{format}'
|
||||
|
||||
# Ensure parent directory exists
|
||||
front_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if typst_to_image(front_typst, front_file, format, dpi, tmpdir_path):
|
||||
generated_files.append(front_file)
|
||||
print(f" ✓ Card {i:03d} front: {num}")
|
||||
else:
|
||||
print(f" ✗ Failed card {i:03d} front: {num}")
|
||||
|
||||
# Generate back (numeral)
|
||||
back_typst = tmpdir_path / f'card_{i}_back.typ'
|
||||
generate_single_card_typst(num, 'back', config, back_typst, project_root)
|
||||
|
||||
if separate_fronts_backs:
|
||||
back_file = backs_dir / f'card_{i:03d}.{format}'
|
||||
else:
|
||||
back_file = output_dir / f'card_{i:03d}_back.{format}'
|
||||
|
||||
# Ensure parent directory exists
|
||||
back_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if typst_to_image(back_typst, back_file, format, dpi, tmpdir_path):
|
||||
generated_files.append(back_file)
|
||||
print(f" ✓ Card {i:03d} back: {num}")
|
||||
else:
|
||||
print(f" ✗ Failed card {i:03d} back: {num}")
|
||||
|
||||
return generated_files
|
||||
|
||||
def generate_typst_file(numbers, config, output_path):
|
||||
"""Generate a Typst file with the specified configuration."""
|
||||
|
||||
|
|
@ -108,8 +261,22 @@ def main():
|
|||
parser.add_argument('--color-scheme', type=str, choices=['monochrome', 'place-value', 'heaven-earth', 'alternating'], default='monochrome', help='Color scheme (default: monochrome)')
|
||||
parser.add_argument('--colored-numerals', action='store_true', help='Color the numerals to match the bead color scheme')
|
||||
parser.add_argument('--scale-factor', type=float, default=0.9, help='Manual scale adjustment (0.1 to 1.0, default: 0.9)')
|
||||
parser.add_argument('--output', '-o', type=str, default='out/flashcards.pdf', help='Output PDF path')
|
||||
|
||||
# Output format options
|
||||
parser.add_argument('--format', '-f', choices=['pdf', 'png', 'svg'], default='pdf', help='Output format (default: pdf)')
|
||||
parser.add_argument('--output', '-o', type=str, help='Output path (default: out/flashcards.FORMAT or out/FORMAT)')
|
||||
|
||||
# PDF-specific options
|
||||
parser.add_argument('--linearize', action='store_true', default=True, help='Create linearized PDF (default: True)')
|
||||
|
||||
# PNG/SVG-specific options
|
||||
parser.add_argument('--dpi', type=int, default=300, help='DPI for PNG output (default: 300)')
|
||||
parser.add_argument('--transparent', action='store_true', help='Use transparent background for PNG/SVG')
|
||||
parser.add_argument('--separate', action='store_true', default=True, help='Separate fronts and backs into subdirectories (PNG/SVG only)')
|
||||
parser.add_argument('--no-separate', dest='separate', action='store_false', help='Keep fronts and backs in same directory (PNG/SVG only)')
|
||||
parser.add_argument('--card-width', type=str, default='3.5in', help='Card width for PNG/SVG (default: 3.5in)')
|
||||
parser.add_argument('--card-height', type=str, default='2.5in', help='Card height for PNG/SVG (default: 2.5in)')
|
||||
|
||||
parser.add_argument('--font-path', type=str, help='Path to fonts directory')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
|
@ -154,6 +321,12 @@ def main():
|
|||
'color_scheme': args.color_scheme if args.color_scheme != 'monochrome' else config.get('color_scheme', 'monochrome'),
|
||||
'colored_numerals': args.colored_numerals or config.get('colored_numerals', False),
|
||||
'scale_factor': args.scale_factor if args.scale_factor != 0.9 else config.get('scale_factor', 0.9),
|
||||
# PNG/SVG specific options
|
||||
'transparent': args.transparent or config.get('transparent', False),
|
||||
'card_width': args.card_width or config.get('card_width', '3.5in'),
|
||||
'card_height': args.card_height or config.get('card_height', '2.5in'),
|
||||
'shuffle': args.shuffle or config.get('shuffle', False),
|
||||
'seed': args.seed or config.get('seed'),
|
||||
}
|
||||
|
||||
# Handle margins
|
||||
|
|
@ -185,87 +358,127 @@ def main():
|
|||
else:
|
||||
final_config['columns'] = config.get('columns', 'auto')
|
||||
|
||||
# Determine output path based on format
|
||||
if args.output:
|
||||
output_path = Path(args.output)
|
||||
elif args.format == 'pdf':
|
||||
output_path = Path('out/flashcards.pdf')
|
||||
else:
|
||||
# For PNG/SVG, use directory instead of file
|
||||
output_path = Path(f'out/{args.format}')
|
||||
|
||||
# Create output directory
|
||||
output_path = Path(args.output)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
if args.format == 'pdf':
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
else:
|
||||
output_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Generate temporary Typst file in project root
|
||||
project_root = Path(__file__).parent.parent
|
||||
temp_typst = project_root / 'temp_flashcards.typ'
|
||||
generate_typst_file(numbers, final_config, temp_typst)
|
||||
|
||||
# Set up font path if provided
|
||||
font_args = []
|
||||
if args.font_path:
|
||||
font_args = ['--font-path', args.font_path]
|
||||
elif os.path.exists('fonts'):
|
||||
font_args = ['--font-path', 'fonts']
|
||||
|
||||
# Compile with Typst
|
||||
print(f"Generating flashcards for {len(numbers)} numbers...")
|
||||
try:
|
||||
# Run typst from project root directory
|
||||
# Generate based on format
|
||||
if args.format == 'pdf':
|
||||
# Generate PDF (original functionality)
|
||||
project_root = Path(__file__).parent.parent
|
||||
result = subprocess.run(
|
||||
['typst', 'compile'] + font_args + [str(temp_typst), str(output_path)],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
cwd=str(project_root)
|
||||
)
|
||||
temp_typst = project_root / 'temp_flashcards.typ'
|
||||
generate_typst_file(numbers, final_config, temp_typst)
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f"Error compiling Typst document:", file=sys.stderr)
|
||||
print(result.stderr, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
# Set up font path if provided
|
||||
font_args = []
|
||||
if args.font_path:
|
||||
font_args = ['--font-path', args.font_path]
|
||||
elif os.path.exists('fonts'):
|
||||
font_args = ['--font-path', 'fonts']
|
||||
|
||||
print(f"Generated: {output_path}")
|
||||
|
||||
# Clean up temp file
|
||||
temp_typst.unlink()
|
||||
|
||||
# Add duplex printing hints and linearize if requested
|
||||
if args.linearize:
|
||||
linearized_path = output_path.parent / f"{output_path.stem}_linear{output_path.suffix}"
|
||||
print(f"Linearizing PDF with duplex hints...")
|
||||
|
||||
# Use qpdf to add duplex hints and linearize
|
||||
# Note: --pages option preserves page order for duplex
|
||||
# Compile with Typst
|
||||
print(f"Generating PDF flashcards for {len(numbers)} numbers...")
|
||||
try:
|
||||
# Run typst from project root directory
|
||||
result = subprocess.run(
|
||||
['qpdf', '--linearize',
|
||||
'--object-streams=preserve',
|
||||
str(output_path), str(linearized_path)],
|
||||
['typst', 'compile'] + font_args + [str(temp_typst), str(output_path)],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
cwd=str(project_root)
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f"Error compiling Typst document:", file=sys.stderr)
|
||||
print(result.stderr, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print(f"Generated: {output_path}")
|
||||
|
||||
# Clean up temp file
|
||||
temp_typst.unlink()
|
||||
|
||||
# Add duplex printing hints and linearize if requested
|
||||
if args.linearize:
|
||||
linearized_path = output_path.parent / f"{output_path.stem}_linear{output_path.suffix}"
|
||||
print(f"Linearizing PDF with duplex hints...")
|
||||
|
||||
# Use qpdf to add duplex hints and linearize
|
||||
result = subprocess.run(
|
||||
['qpdf', '--linearize',
|
||||
'--object-streams=preserve',
|
||||
str(output_path), str(linearized_path)],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print(f"Linearized: {linearized_path}")
|
||||
else:
|
||||
print(f"Warning: Failed to linearize PDF: {result.stderr}", file=sys.stderr)
|
||||
|
||||
# Run basic PDF validation
|
||||
print("Validating PDF...")
|
||||
result = subprocess.run(
|
||||
['qpdf', '--check', str(output_path)],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print(f"Linearized: {linearized_path}")
|
||||
print("PDF validation passed")
|
||||
else:
|
||||
print(f"Warning: Failed to linearize PDF: {result.stderr}", file=sys.stderr)
|
||||
|
||||
# Run basic PDF validation
|
||||
print("Validating PDF...")
|
||||
result = subprocess.run(
|
||||
['qpdf', '--check', str(output_path)],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("PDF validation passed")
|
||||
else:
|
||||
print(f"Warning: PDF validation issues: {result.stderr}", file=sys.stderr)
|
||||
print(f"Warning: PDF validation issues: {result.stderr}", file=sys.stderr)
|
||||
|
||||
except FileNotFoundError as e:
|
||||
if 'typst' in str(e):
|
||||
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
|
||||
print("Visit: https://github.com/typst/typst", file=sys.stderr)
|
||||
elif 'qpdf' in str(e):
|
||||
print("Warning: qpdf command not found. Skipping linearization and validation.", file=sys.stderr)
|
||||
print("Install with: brew install qpdf", file=sys.stderr)
|
||||
else:
|
||||
raise
|
||||
sys.exit(1)
|
||||
|
||||
else:
|
||||
# Generate PNG/SVG (individual cards)
|
||||
try:
|
||||
generated_files = generate_cards_direct(
|
||||
numbers,
|
||||
final_config,
|
||||
output_path,
|
||||
format=args.format,
|
||||
dpi=args.dpi,
|
||||
separate_fronts_backs=args.separate
|
||||
)
|
||||
|
||||
except FileNotFoundError as e:
|
||||
if 'typst' in str(e):
|
||||
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
|
||||
print("Visit: https://github.com/typst/typst", file=sys.stderr)
|
||||
elif 'qpdf' in str(e):
|
||||
print("Warning: qpdf command not found. Skipping linearization and validation.", file=sys.stderr)
|
||||
print("Install with: brew install qpdf", file=sys.stderr)
|
||||
else:
|
||||
raise
|
||||
sys.exit(1)
|
||||
if generated_files:
|
||||
print(f"\n✓ Generated {len(generated_files)} {args.format.upper()} files in {output_path}")
|
||||
if args.separate:
|
||||
print(f" - Fronts in: {output_path}/fronts/")
|
||||
print(f" - Backs in: {output_path}/backs/")
|
||||
else:
|
||||
print(f"\n✗ Failed to generate {args.format.upper()} cards")
|
||||
sys.exit(1)
|
||||
|
||||
except FileNotFoundError as e:
|
||||
if 'typst' in str(e):
|
||||
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
|
||||
print("Visit: https://github.com/typst/typst", file=sys.stderr)
|
||||
else:
|
||||
raise
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
@ -9,82 +9,102 @@ import os
|
|||
from pathlib import Path
|
||||
import tempfile
|
||||
|
||||
def generate_example_pdfs():
|
||||
"""Generate various example PDFs to convert to PNG"""
|
||||
def generate_examples():
|
||||
"""Generate various example images (SVG for single cards, PNG for grids)"""
|
||||
examples = [
|
||||
# Basic examples
|
||||
# Single card examples - use SVG
|
||||
{
|
||||
'name': 'basic-7',
|
||||
'args': ['--range', '7-7', '--cards-per-page', '1'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '7-7', '--format', 'svg', '--no-separate'],
|
||||
'desc': 'Number 7 on soroban'
|
||||
},
|
||||
{
|
||||
'name': 'basic-123',
|
||||
'args': ['--range', '123-123', '--cards-per-page', '1'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '123-123', '--format', 'svg', '--no-separate'],
|
||||
'desc': 'Number 123 on soroban'
|
||||
},
|
||||
|
||||
# Color schemes
|
||||
# Color schemes - use SVG
|
||||
{
|
||||
'name': 'place-value-456',
|
||||
'args': ['--range', '456-456', '--cards-per-page', '1', '--color-scheme', 'place-value', '--colored-numerals'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '456-456', '--format', 'svg', '--color-scheme', 'place-value', '--colored-numerals', '--no-separate'],
|
||||
'desc': 'Place-value coloring'
|
||||
},
|
||||
{
|
||||
'name': 'heaven-earth-78',
|
||||
'args': ['--range', '78-78', '--cards-per-page', '1', '--color-scheme', 'heaven-earth', '--colored-numerals'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '78-78', '--format', 'svg', '--color-scheme', 'heaven-earth', '--colored-numerals', '--no-separate'],
|
||||
'desc': 'Heaven-earth coloring'
|
||||
},
|
||||
|
||||
# Bead shapes
|
||||
# Bead shapes - use SVG
|
||||
{
|
||||
'name': 'diamond-25',
|
||||
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'diamond'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'diamond', '--no-separate'],
|
||||
'desc': 'Diamond beads (realistic)'
|
||||
},
|
||||
{
|
||||
'name': 'circle-25',
|
||||
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'circle'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'circle', '--no-separate'],
|
||||
'desc': 'Circle beads'
|
||||
},
|
||||
{
|
||||
'name': 'square-25',
|
||||
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'square'],
|
||||
'format': 'svg',
|
||||
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'square', '--no-separate'],
|
||||
'desc': 'Square beads'
|
||||
},
|
||||
|
||||
# Grid layouts
|
||||
# Hide inactive - use SVG
|
||||
{
|
||||
'name': 'minimal-42',
|
||||
'format': 'svg',
|
||||
'args': ['--range', '42-42', '--format', 'svg', '--hide-inactive-beads', '--no-separate'],
|
||||
'desc': 'Hidden inactive beads'
|
||||
},
|
||||
|
||||
# Grid layouts - use PDF→PNG
|
||||
{
|
||||
'name': 'grid-6',
|
||||
'format': 'pdf',
|
||||
'args': ['--range', '0-5', '--cards-per-page', '6'],
|
||||
'desc': '6 cards per page'
|
||||
},
|
||||
{
|
||||
'name': 'grid-12',
|
||||
'format': 'pdf',
|
||||
'args': ['--range', '0-11', '--cards-per-page', '12'],
|
||||
'desc': '12 cards per page'
|
||||
},
|
||||
|
||||
# Skip counting
|
||||
# Skip counting - use PDF→PNG
|
||||
{
|
||||
'name': 'skip-5s',
|
||||
'format': 'pdf',
|
||||
'args': ['--range', '0-30', '--step', '5', '--cards-per-page', '6'],
|
||||
'desc': 'Counting by 5s'
|
||||
},
|
||||
|
||||
# Hide inactive
|
||||
{
|
||||
'name': 'minimal-42',
|
||||
'args': ['--range', '42-42', '--cards-per-page', '1', '--hide-inactive-beads'],
|
||||
'desc': 'Hidden inactive beads'
|
||||
},
|
||||
|
||||
# Cutting guides
|
||||
# Cutting guides - use PDF→PNG
|
||||
{
|
||||
'name': 'cutting-guides',
|
||||
'format': 'pdf',
|
||||
'args': ['--range', '10-15', '--cards-per-page', '6', '--cut-marks'],
|
||||
'desc': 'With cutting guides'
|
||||
},
|
||||
|
||||
# Additional cutting example
|
||||
{
|
||||
'name': 'cutting-registration',
|
||||
'format': 'pdf',
|
||||
'args': ['--range', '10-15', '--cards-per-page', '6', '--cut-marks', '--registration'],
|
||||
'desc': 'With cutting guides and registration marks'
|
||||
},
|
||||
]
|
||||
|
||||
return examples
|
||||
|
|
@ -170,6 +190,36 @@ def pdf_to_png(pdf_path, png_path, dpi=150, page=1):
|
|||
|
||||
return False
|
||||
|
||||
|
||||
def copy_svg_files(svg_dir, output_dir, example_name):
|
||||
"""Copy SVG files from the generated directory to examples"""
|
||||
svg_dir = Path(svg_dir)
|
||||
output_dir = Path(output_dir)
|
||||
output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
copied_files = []
|
||||
|
||||
# Look for front and back SVG files
|
||||
front_file = svg_dir / f'card_000_front.svg'
|
||||
back_file = svg_dir / f'card_000_back.svg'
|
||||
|
||||
if front_file.exists():
|
||||
dest = output_dir / f'{example_name}_front.svg'
|
||||
import shutil
|
||||
shutil.copy2(front_file, dest)
|
||||
copied_files.append(dest)
|
||||
print(f" ✓ Generated {dest.name}")
|
||||
|
||||
if back_file.exists():
|
||||
dest = output_dir / f'{example_name}_back.svg'
|
||||
import shutil
|
||||
shutil.copy2(back_file, dest)
|
||||
copied_files.append(dest)
|
||||
print(f" ✓ Generated {dest.name}")
|
||||
|
||||
return copied_files
|
||||
|
||||
|
||||
def main():
|
||||
"""Generate example images for README"""
|
||||
|
||||
|
|
@ -181,7 +231,11 @@ def main():
|
|||
temp_dir = project_root / 'out' / 'examples'
|
||||
temp_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
examples = generate_example_pdfs()
|
||||
# Create SVG output directory
|
||||
svg_dir = images_dir / 'svg'
|
||||
svg_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
examples = generate_examples()
|
||||
|
||||
# Check if we have a PDF to PNG converter available
|
||||
converters = []
|
||||
|
|
@ -205,33 +259,56 @@ def main():
|
|||
for example in examples:
|
||||
print(f" - {example['name']}: {example['desc']}")
|
||||
|
||||
# Generate PDF
|
||||
pdf_path = temp_dir / f"{example['name']}.pdf"
|
||||
cmd = [
|
||||
'python3',
|
||||
str(project_root / 'src' / 'generate.py'),
|
||||
'--output', str(pdf_path)
|
||||
] + example['args']
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f" ERROR generating PDF: {result.stderr}")
|
||||
continue
|
||||
|
||||
# Convert front page to PNG
|
||||
front_png = images_dir / f"{example['name']}-front.png"
|
||||
if pdf_to_png(str(pdf_path), str(front_png), dpi=150, page=1):
|
||||
print(f" ✓ Generated {front_png.name}")
|
||||
if example['format'] == 'svg':
|
||||
# Generate SVG directly
|
||||
svg_temp_dir = temp_dir / f"{example['name']}_svg"
|
||||
cmd = [
|
||||
'python3',
|
||||
str(project_root / 'src' / 'generate.py'),
|
||||
'--output', str(svg_temp_dir)
|
||||
] + example['args']
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f" ERROR generating SVG: {result.stderr}")
|
||||
failed.append(example['name'])
|
||||
continue
|
||||
|
||||
# Copy SVG files to final destination
|
||||
copied = copy_svg_files(svg_temp_dir, svg_dir, example['name'])
|
||||
if not copied:
|
||||
print(f" ✗ No SVG files found")
|
||||
failed.append(example['name'])
|
||||
|
||||
else:
|
||||
print(f" ✗ Failed to convert {front_png.name}")
|
||||
failed.append(example['name'])
|
||||
|
||||
# For single cards, also generate back page
|
||||
if '--cards-per-page' in example['args'] and example['args'][example['args'].index('--cards-per-page') + 1] == '1':
|
||||
back_png = images_dir / f"{example['name']}-back.png"
|
||||
if pdf_to_png(str(pdf_path), str(back_png), dpi=150, page=2):
|
||||
print(f" ✓ Generated {back_png.name}")
|
||||
# Generate PDF and convert to PNG
|
||||
pdf_path = temp_dir / f"{example['name']}.pdf"
|
||||
cmd = [
|
||||
'python3',
|
||||
str(project_root / 'src' / 'generate.py'),
|
||||
'--output', str(pdf_path)
|
||||
] + example['args']
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f" ERROR generating PDF: {result.stderr}")
|
||||
continue
|
||||
|
||||
# Convert front page to PNG
|
||||
front_png = images_dir / f"{example['name']}-front.png"
|
||||
if pdf_to_png(str(pdf_path), str(front_png), dpi=150, page=1):
|
||||
print(f" ✓ Generated {front_png.name}")
|
||||
else:
|
||||
print(f" ✗ Failed to convert {front_png.name}")
|
||||
failed.append(example['name'])
|
||||
|
||||
# For single cards, also generate back page
|
||||
if '--cards-per-page' in example['args'] and example['args'][example['args'].index('--cards-per-page') + 1] == '1':
|
||||
back_png = images_dir / f"{example['name']}-back.png"
|
||||
if pdf_to_png(str(pdf_path), str(back_png), dpi=150, page=2):
|
||||
print(f" ✓ Generated {back_png.name}")
|
||||
|
||||
if failed:
|
||||
print(f"\n✗ Failed to generate {len(failed)} images: {', '.join(failed)}")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,113 @@
|
|||
// Single card template for PNG export
|
||||
// Renders one card at a time with optional transparent background
|
||||
|
||||
#import "flashcards.typ": draw-soroban
|
||||
|
||||
// Local definition of create-colored-numeral since it's not exported
|
||||
#let create-colored-numeral(num, scheme, use-colors, font-size) = {
|
||||
// Use the exact same colors as the beads
|
||||
let place-value-colors = (
|
||||
rgb("#2E86AB"), // ones - blue (same as beads)
|
||||
rgb("#A23B72"), // tens - magenta (same as beads)
|
||||
rgb("#F18F01"), // hundreds - orange (same as beads)
|
||||
rgb("#6A994E"), // thousands - green (same as beads)
|
||||
rgb("#BC4B51"), // ten-thousands - red (same as beads)
|
||||
)
|
||||
|
||||
if not use-colors or scheme == "monochrome" {
|
||||
// Plain black text
|
||||
text(size: font-size)[#num]
|
||||
} else if scheme == "place-value" {
|
||||
// Color each digit according to its place value
|
||||
let digits = str(num).clusters()
|
||||
let num-digits = digits.len()
|
||||
let colored-digits = ()
|
||||
|
||||
for (idx, digit) in digits.enumerate() {
|
||||
let place-idx = num-digits - idx - 1 // 0 = ones, 1 = tens, etc.
|
||||
let color-idx = calc.rem(place-idx, place-value-colors.len())
|
||||
let digit-color = place-value-colors.at(color-idx)
|
||||
colored-digits += (text(fill: digit-color, size: font-size)[#digit],)
|
||||
}
|
||||
|
||||
colored-digits.join()
|
||||
} else if scheme == "heaven-earth" {
|
||||
// For heaven-earth, use orange (heaven bead color)
|
||||
text(size: font-size, fill: rgb("#F18F01"))[#num]
|
||||
} else if scheme == "alternating" {
|
||||
// For alternating, we could alternate digit colors
|
||||
let digits = str(num).clusters()
|
||||
let colored-digits = ()
|
||||
|
||||
for (idx, digit) in digits.enumerate() {
|
||||
let digit-color = if calc.rem(idx, 2) == 0 { rgb("#1E88E5") } else { rgb("#43A047") }
|
||||
colored-digits += (text(fill: digit-color, size: font-size)[#digit],)
|
||||
}
|
||||
|
||||
colored-digits.join()
|
||||
} else {
|
||||
// Fallback to plain text
|
||||
text(size: font-size)[#num]
|
||||
}
|
||||
}
|
||||
|
||||
#let generate-single-card(
|
||||
number,
|
||||
side: "front", // "front" or "back"
|
||||
bead-shape: "diamond",
|
||||
color-scheme: "monochrome",
|
||||
colored-numerals: false,
|
||||
hide-inactive-beads: false,
|
||||
show-empty-columns: false,
|
||||
columns: auto,
|
||||
transparent: false,
|
||||
width: 3.5in,
|
||||
height: 2.5in,
|
||||
font-size: 48pt,
|
||||
font-family: "DejaVu Sans",
|
||||
scale-factor: 1.0,
|
||||
) = {
|
||||
// Set page size to exact card dimensions
|
||||
set page(
|
||||
width: width,
|
||||
height: height,
|
||||
margin: 0pt,
|
||||
fill: if transparent { none } else { white }
|
||||
)
|
||||
|
||||
// Set font
|
||||
set text(font: font-family, size: font-size, fallback: true)
|
||||
|
||||
// Calculate padding for content
|
||||
let padding = width * 0.05
|
||||
|
||||
// Render the appropriate side
|
||||
if side == "front" {
|
||||
// Soroban side
|
||||
align(center + horizon)[
|
||||
#box(
|
||||
width: width - 2 * padding,
|
||||
height: height - 2 * padding
|
||||
)[
|
||||
#align(center + horizon)[
|
||||
#scale(x: scale-factor * 100%, y: scale-factor * 100%)[
|
||||
#draw-soroban(
|
||||
number,
|
||||
columns: columns,
|
||||
show-empty: show-empty-columns,
|
||||
hide-inactive: hide-inactive-beads,
|
||||
bead-shape: bead-shape,
|
||||
color-scheme: color-scheme,
|
||||
base-size: 1.0
|
||||
)
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
} else {
|
||||
// Numeral side
|
||||
align(center + horizon)[
|
||||
#create-colored-numeral(number, color-scheme, colored-numerals, font-size * scale-factor)
|
||||
]
|
||||
}
|
||||
}
|
||||