From 1c3d4a8f0c9d5297aac8ab4eb73f486a17dc421d Mon Sep 17 00:00:00 2001 From: unexplrd Date: Fri, 23 Jan 2026 20:37:08 +0200 Subject: [PATCH] test workork gork --- erv/lb2/flake.lock | 113 +++++++++++++ erv/lb2/flake.nix | 176 ++++++++++++++++++++ erv/lb2/justfile | 79 +++++++++ erv/lb2/src/assets/sample.c | 30 ++++ erv/lb2/src/assets/table.csv | 2 + erv/lb2/src/chapters/appendices.typ | 4 + erv/lb2/src/doc.toml | 24 +++ erv/lb2/src/figures/Google-Logo-700x394.png | Bin 0 -> 10380 bytes erv/lb2/src/main.typ | 54 ++++++ erv/lb2/src/utils.typ | 109 ++++++++++++ erv/lb4/flake.lock | 113 +++++++++++++ erv/lb4/flake.nix | 176 ++++++++++++++++++++ erv/lb4/justfile | 79 +++++++++ erv/lb4/src/assets/sample.c | 30 ++++ erv/lb4/src/assets/table.csv | 2 + erv/lb4/src/chapters/appendices.typ | 4 + erv/lb4/src/doc.toml | 24 +++ erv/lb4/src/figures/Google-Logo-700x394.png | Bin 0 -> 10380 bytes erv/lb4/src/main.typ | 54 ++++++ erv/lb4/src/utils.typ | 109 ++++++++++++ erv/lb5/flake.lock | 113 +++++++++++++ erv/lb5/flake.nix | 176 ++++++++++++++++++++ erv/lb5/justfile | 79 +++++++++ erv/lb5/src/assets/sample.c | 30 ++++ erv/lb5/src/assets/table.csv | 2 + erv/lb5/src/chapters/appendices.typ | 4 + erv/lb5/src/doc.toml | 24 +++ erv/lb5/src/figures/Google-Logo-700x394.png | Bin 0 -> 10380 bytes erv/lb5/src/main.typ | 54 ++++++ erv/lb5/src/utils.typ | 109 ++++++++++++ 30 files changed, 1773 insertions(+) create mode 100644 erv/lb2/flake.lock create mode 100644 erv/lb2/flake.nix create mode 100644 erv/lb2/justfile create mode 100644 erv/lb2/src/assets/sample.c create mode 100644 erv/lb2/src/assets/table.csv create mode 100644 erv/lb2/src/chapters/appendices.typ create mode 100644 erv/lb2/src/doc.toml create mode 100644 erv/lb2/src/figures/Google-Logo-700x394.png create mode 100644 erv/lb2/src/main.typ create mode 100644 erv/lb2/src/utils.typ create mode 100644 erv/lb4/flake.lock create mode 100644 erv/lb4/flake.nix create mode 100644 erv/lb4/justfile create mode 100644 erv/lb4/src/assets/sample.c create mode 100644 erv/lb4/src/assets/table.csv create mode 100644 erv/lb4/src/chapters/appendices.typ create mode 100644 erv/lb4/src/doc.toml create mode 100644 erv/lb4/src/figures/Google-Logo-700x394.png create mode 100644 erv/lb4/src/main.typ create mode 100644 erv/lb4/src/utils.typ create mode 100644 erv/lb5/flake.lock create mode 100644 erv/lb5/flake.nix create mode 100644 erv/lb5/justfile create mode 100644 erv/lb5/src/assets/sample.c create mode 100644 erv/lb5/src/assets/table.csv create mode 100644 erv/lb5/src/chapters/appendices.typ create mode 100644 erv/lb5/src/doc.toml create mode 100644 erv/lb5/src/figures/Google-Logo-700x394.png create mode 100644 erv/lb5/src/main.typ create mode 100644 erv/lb5/src/utils.typ diff --git a/erv/lb2/flake.lock b/erv/lb2/flake.lock new file mode 100644 index 0000000..7027761 --- /dev/null +++ b/erv/lb2/flake.lock @@ -0,0 +1,113 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "local-nure": { + "flake": false, + "locked": { + "lastModified": 1769126611, + "narHash": "sha256-4qmXN7kx87pEpZHFJpyRbLfZ5GanF5Jbi1Bmfx6ZXss=", + "path": "/storage/git/typst_nure_template", + "type": "path" + }, + "original": { + "path": "/storage/git/typst_nure_template", + "type": "path" + } + }, + "local-nure-upstream": { + "flake": false, + "locked": { + "lastModified": 1768301144, + "narHash": "sha256-VHZXALfaAw5f32mClZTS7MeTSaDSQtErAjI+lgpYIZk=", + "ref": "refs/heads/0.1.0", + "rev": "549d7f060f81a6356c43b2c231e6453ddae19fca", + "revCount": 111, + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + }, + "original": { + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1763421233, + "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "local-nure": "local-nure", + "local-nure-upstream": "local-nure-upstream", + "nixpkgs": "nixpkgs", + "typix": "typix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "typix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769071922, + "narHash": "sha256-WD8cMrUlqWJWDAD8+B6MUyEuWvi/fgGgv5Wg0xF/Zkc=", + "owner": "loqusion", + "repo": "typix", + "rev": "5d334996b24af342b0992f7f432fcb301ed67314", + "type": "github" + }, + "original": { + "owner": "loqusion", + "repo": "typix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/erv/lb2/flake.nix b/erv/lb2/flake.nix new file mode 100644 index 0000000..e044c10 --- /dev/null +++ b/erv/lb2/flake.nix @@ -0,0 +1,176 @@ +{ + description = "A Nix flake for compiling NURE works"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + typix.url = "github:loqusion/typix"; + typix.inputs.nixpkgs.follows = "nixpkgs"; + + flake-utils.url = "github:numtide/flake-utils"; + + # local-nure.url = "git+ssh://gitea@gitea.linerds.us/unexplrd/typst_nure_template"; + local-nure-upstream.url = "git+ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template"; + local-nure-upstream.flake = false; + + local-nure.url = "path:/storage/git/typst_nure_template"; + local-nure.flake = false; + + # Example of downloading icons from a non-flake source + # font-awesome = { + # url = "github:FortAwesome/Font-Awesome"; + # flake = false; + # }; + }; + + outputs = inputs @ { + nixpkgs, + typix, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; + inherit (pkgs) lib; + inherit (lib.strings) escapeShellArg; + + typixLib = typix.lib.${system}; + + src = lib.fileset.toSource { + root = ./.; + fileset = lib.fileset.unions [ + # lib/ gets imported, which is unwanted + # (lib.fileset.fromSource (typixLib.cleanTypstSource ./.)) + # ./main.typ + # (lib.fileset.maybeMissing ./doc.toml) + # (lib.fileset.maybeMissing ./utils.typ) + # (lib.fileset.maybeMissing ./chapters) + # (lib.fileset.maybeMissing ./assets) + # (lib.fileset.maybeMissing ./figures) + ./src + ]; + }; + commonArgs = { + typstSource = "src/main.typ"; + + fontPaths = [ + "${pkgs.liberation_ttf}/share/fonts/truetype" + ]; + + # Make sure to override outdated files/links (in case of updated flake.lock) + # (may be undesirable with config/universities.yaml in case of custom subjects) + forceVirtualPaths = true; + + virtualPaths = [ + # Add paths that must be locally accessible to typst here + # { + # dest = "src/lib"; + # src = "${inputs.local-nure}/src"; + # } + # { + # dest = "config/universities.yaml"; + # src = "${inputs.local-nure}/src/config/universities.yaml"; + # } + ]; + }; + + mkTypstPackagesDrv = name: entries: let + linkFarmEntries = + lib.foldl (set: { + name, + version, + namespace, + input, + }: + set + // { + "${namespace}/${name}/${version}" = input; + }) + {} + entries; + in + pkgs.linkFarm name linkFarmEntries; + + unpublishedTypstPackages = mkTypstPackagesDrv "unpublished-packages" [ + { + namespace = "unexplrd"; + name = "test-multifile"; + version = "0.1.0"; + input = inputs.local-nure; + } + { + namespace = "local"; + name = "nure"; + version = "0.1.0"; + input = inputs.local-nure-upstream; + } + ]; + + # Any transitive dependencies must be added here + # See https://loqusion.github.io/typix/recipes/using-typst-packages.html#the-typstpackages-attribute + # unstable_typstPackages = [ + # { + # name = "oxifmt"; + # version = "0.2.1"; + # hash = "sha256-8PNPa9TGFybMZ1uuJwb5ET0WGIInmIgg8h24BmdfxlU="; + # } + # ]; + + # Compile a Typst project, *without* copying the result + # to the current directory + build-drv = typixLib.buildTypstProject (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Compile a Typst project, and then copy the result + # to the current directory + build-script = typixLib.buildTypstProjectLocal (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Watch a project and recompile on changes + watch-script = typixLib.watchTypstProject (lib.recursiveUpdate commonArgs + { + typstWatchCommand = "TYPST_PACKAGE_PATH=${escapeShellArg unpublishedTypstPackages} typst watch"; + }); + in { + checks = {inherit build-drv build-script watch-script;}; + + packages.default = build-drv; + packages.watch = watch-script; + + apps = rec { + default = watch; + build = flake-utils.lib.mkApp { + drv = build-script; + }; + watch = flake-utils.lib.mkApp { + drv = watch-script; + }; + }; + + devShells.default = typixLib.devShell { + inherit (commonArgs) fontPaths virtualPaths; + + env = { + TYPST_PACKAGE_PATH = escapeShellArg unpublishedTypstPackages; + }; + packages = with pkgs; [ + # WARNING: Don't run `typst-build` directly, instead use `nix run .#build` + # See https://github.com/loqusion/typix/issues/2 + # build-script + watch-script + + just + typstyle + yq + ]; + }; + }); +} diff --git a/erv/lb2/justfile b/erv/lb2/justfile new file mode 100644 index 0000000..43fd58e --- /dev/null +++ b/erv/lb2/justfile @@ -0,0 +1,79 @@ +# File aliases for common commands +alias w := watch +alias c := compile +alias nw := nix-watch +alias nb := nix-build +alias nd := nix-develop + + +# Configuration +set shell := ["fish", "-ic"] + +file := "src/main.typ" +doc_config := "src/doc.toml" +# out := `cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"'` +# out := 'bla' + +# Default target - show available recipes +default: + @just --list + +# Validate required files exist +_check-files: + #!/usr/bin/env bash + set -euo pipefail + if [[ ! -f "{{file}}" ]]; then + echo "Error: Source file {{file}} not found" + exit 1 + fi + if [[ ! -f "{{doc_config}}" ]]; then + echo "Error: Config file {{doc_config}} not found" + exit 1 + fi + +# Watch file for changes and recompile automatically +[group('typst')] +watch: _check-files + typst w {{file}} + +# Compile the document once +[group('typst')] +compile: _check-files + typst c {{file}} + +# Compile and copy to parent directory +[group('typst')] +copy: compile + #!/usr/bin/env bash + # set -euo pipefail + # if [[ ! -f "{{out}}" ]]; then + # echo "Error: Output file {{out}} not found after compilation" + # exit 1 + # fi + local final_name = $(cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"') + cp "main.typ" "$final_name" + +# Enter nix development environment +[group('nix')] +nix-develop: + nix develop . + +# Watch using nix environment +[group('nix')] +nix-watch: + nix run .#watch + +# Build using nix environment +[group('nix')] +nix-build: + nix run .#build + +# Clean generated PDFs +[group('utils'), confirm] +clean: + @rm -rvf *.pdf + +# Show generated filename +# [group('utils')] +# show-output: +# @echo "{{out}}" \ No newline at end of file diff --git a/erv/lb2/src/assets/sample.c b/erv/lb2/src/assets/sample.c new file mode 100644 index 0000000..9ad18c4 --- /dev/null +++ b/erv/lb2/src/assets/sample.c @@ -0,0 +1,30 @@ +#include +int main() { + int i, j; + + // Number of rows + int rows = 3; + + // Taking first character of alphabet + // which is useful to print pattern + char character = 'A'; + + // This loop is used to identify + // number rows + for (i = 0; i < rows; i++) { + // This for loop is used to + // identify number of columns + // based on the rows + for (j = 0; j <= i; j++) { + // Printing character to get + // the required pattern + printf("%c ", character); + + // Incrementing character value so + // that it will print the next character + character++; + } + printf("\n"); + } + return 0; +} diff --git a/erv/lb2/src/assets/table.csv b/erv/lb2/src/assets/table.csv new file mode 100644 index 0000000..2ec748f --- /dev/null +++ b/erv/lb2/src/assets/table.csv @@ -0,0 +1,2 @@ +1,2,3,4 +5,6,7,8 diff --git a/erv/lb2/src/chapters/appendices.typ b/erv/lb2/src/chapters/appendices.typ new file mode 100644 index 0000000..b221b49 --- /dev/null +++ b/erv/lb2/src/chapters/appendices.typ @@ -0,0 +1,4 @@ +#import "/utils.typ": code + += Код програми sample.c +#code(read("/assets/sample.c")) diff --git a/erv/lb2/src/doc.toml b/erv/lb2/src/doc.toml new file mode 100644 index 0000000..293e2a1 --- /dev/null +++ b/erv/lb2/src/doc.toml @@ -0,0 +1,24 @@ +university = "ХНУРЕ" +subject = "ЕРВ" +type = "ЛБ" +number = 2 + +[[mentors]] +name = "Шевченко Т. Г." +degree = "Доцент кафедри ПІ" +gender = "m" + +[[mentors]] +name = "Франко І. Я." +degree = "Асистент кафедри ПІ" +gender = "m" + +[[authors]] +name = "Косач Л. П." +edu_program = "КУІБ" +group = "23-2" +gender = "f" +variant = 8 +full_name_gen = "Косач Лариси Петрівни" +course = 2 +semester = 4 diff --git a/erv/lb2/src/figures/Google-Logo-700x394.png b/erv/lb2/src/figures/Google-Logo-700x394.png new file mode 100644 index 0000000000000000000000000000000000000000..9967a3c6d4441e8524acdb2536c07580ee3c3698 GIT binary patch literal 10380 zcmY*b_9-wpL4$_`a2UkttU@h=sIr@FER zl+AH~a3wDu_`yY!a(J}=f_OUc*?KteB$lDL zGw0Ug=pcxL$vZ(aT&M+qj;L3|=o)pEbBh@E^GE1e)cwnrqUH2hZ+^`6iP_~(ZVH4@ za)i)TYsD|WVKxHE3uEf!LZ$l|i~c+eT2Xr2gwfN&T<^l5kS>an!K4aI0>oSeffL4? z;YKd7@B%6=W_QTcbjP_A^^Yv^9bqj>l6l)RCa*uocqRD85&z3Pdc#8cGn*xX&rMN$ zu**@=6g?|wb4VQLgB#Y7E-sZaOjso}kD)hV%bs>sl5BhfQocuyrtqI+$&*Ls#Q`i# z6-?{U4y;Hy`VDJNX6xctn1`tAQ(D=+o6VneVi-e@CrH`ZMfOsu%h=2CP7Gsxk5cNa z1IJ+ub=56e^=(x-h| ziaGI*M?En|ub&7&i`cU5+RJ51J)DLMz`mqP-Su#CguSi>Bmx$H`RcVppdly_slijr zwI2frmgFk;Rmh8;G>L7_>F|Hi#9p}RP*d{UivOpdJQ{NIqt19BiU!(&NBoHla(Wum z7Lldh%iyREG);aVw;O^HtKY{Iz*4FoDvysq)WMpp7}94ki{?3I2AWVfG$J^E5n+N+ za;D0QDO~8EzAE4*2>Ri2BDP2hBla5qjVgMR9yubCdkm|+K&tKfx21rTQYmWMjrLC` z@08zERN3)Pg=lc${RcD3G{!>-v66h|dBb-K?b|Qvr+5_0Bn#o|!T-0bu`)YEzGLUH}6W=ITeb?}aU$FsikJD2Tk zpCcIi8q3Z<{lBf+#t@;nr_seyY=nkiy0f@Nf`l%SOeGGD!IVv;Gv~`)6O|?Ijvf=Y za-wbe=&_S*js5$0%KRK`)Tys&+5<0J1hnBv?`m@lbuXl?8fdjs^rMN06(|Kw%7J#w z@z~W^kOoHv&qtWN$uO(aA~wG3n1WpY;hzM-H|T9H;%`44LWEF2p?^36m?(FyU}C;g zRT5cjRN4b45R^2uoDBAuoRgo1!EPnz;msP{T7GcY;aqMkAQG-DmH5&9mblhV{^APx z?oBWJRW&|uF6BGitoGq}!4G=}){if%JMNi+VoS7^g{v?M?NF@3$t6`@j~&<_6E^J) zcpoYi?;0*=(&OZZBF`K1R8EK=&joNFZvrPGkg(0Slq2doWCiYh87q&NDChv1qBv&+ z46cNVRZ`SIqke&9_TTR0zAJZ~92J6(Jp@vvhLMnoQKGy~#%rkZW+-9?xOBcq3Y~iF z9Di>)E`HJ-l^^VvuUM3epJ#A2LIrL!7Eh&C5y5`HH@%LfV_ z`|K01t296^vJBSzNiFOVcQq^v6gqj7AN`I0innv484ZJ9E*t zZKIalm&-YA$oa8?WSn^{l#J?FdMplivG(_~xD2^17L@9!O2XHO2YCFwf$dy~(##Gl zb(q4snCBX}s%sd5BmQ=qkD%H&nJ>z`Ns2nG%ai=bx5kz&F7%AXmoLpq6~RP%HwlE< zzG2AfP|x?hc@TX4xuTJ$9e}*yuGGa$V4nmso6@Nr+`@P$GfpK5WhM}Ifurv(du%?p z=t%ySX0W^UcGT|GU{z!Y1F`PVNh;w9eXiA z^j(T^zgH5>iVsY{+2omY=&d`g9}vCf-G1+&^^3^YX%EX>c|fy!b=GKE{yNZT&r9hW zlQ0oEAJH+tS#2AD<(>&ah1B}v61QpPR;Tif8Kv+kTE}=;l3KMNauzVwyi1;y(=zr! zk9848ly2S|`u5i^D)V%aIvHg**eY@)4mCQp)B@p7nj?C$rc#t{a}F~?VjKyR6l|oB zOsI&lAK0K5{7mfO{J^4`F)(2*VVcCPG`@qgu>;L89A*+1DWKz2%UV{f6l1J$BlV9z zV@wFkLR+kp)81Wyk9@J7t)k%ZiE~1)(~vXAgj3Ss%Em7U>UyfcEHD1h-1N#f-d;#T zJ@ifMk97Fejsxx@Oojw|-y}C6(s*Ez!JE|`(ULoR>sm%<>EC*;OUcq2o*bL?!goQ# zG#e-EwgKWLKhXssol-!`_>ikzU}&4CAK$u15c)AjH9<-TA9~wM4iMj=4XAa+TRIby zfVCGm{l^S5+ryj#D5UxG(8z?F8nIH)K?jiwTF#?=FY#S5_F7UnR}lED^JTc19h; zR(eFeVLr7t1qm^$x3vSN3eCg)2KHco9+%&xj?oDzZFkd`Skx}dKlogw>r`mD9eWwh z%poQbZU=1f+LF{RcjiecTochXeqhE&Qx?BGg|z#E-Q6rXuoNyEEL$>%FOy3@Q4eqI z?WAy6Skn)6pI^G|zihpux|1zkdLS%sFm>NI`_1S$$D;o3DXjeh_J|{}X2J+BjF2%* z_?boDTJHm%v)WVfJK6ea(SEeWpV=dfM`raW#n~ol5$RJB$cE8UUvQpjxs7&#Jscyl z;d+;-g$R&BJZJ5(brVaNc!LkdH7NnC(YuRUt>ggMe4TF9YUM#hc_8)7gznPp1y&c^ zlzVFic3&U$N?d5ih?ugn(&bf0Yp$Zd)gTtWEz$~M4|`1Rzj@%WHK^T${>WTq^xeQ1 zLB1|`7{0HE4M?8BcAX)x+frlRQ8Grb+q0Q>9J!{v-JiR){z7f6_pv_3aT4ShATv+jB`8)cO9<67+ueI)7gx1N+h<8rad2(a!cNxD=D+ z0KT0Ds9otoYT^b>KHt^x9?NWd!{gVfv*OmWbY^L}`FkDHS$#7CU5ezrzyES)82Ngr@QIGV!{ifX?Lzv+0)M+-#eS@)u|$_*J^pyquow^hd=`6;MnDw+m1y?D zQSf9@2HBw8|6*I11Wj0Ttzh%li)(KdTO6kevZndGG33c-+XvF(7!Ypp2MRMFSucf8 zQ*pcE#g9dpM!at4W=QhAnA7;>_#_Ow*vDw3rdR>d7alxd6<{1ertZ517T<0l(pbDq zH%WJBzrVc>heuecgnC;6E~^WZaKq(`wC?P>KD?5M$+3D}&Gz|+KJ`vLyxw?l$) z*w=5is}fvdM%~YS-fb_FCxN6A+bXFRw5gf55sVjEE_8AH&U~tZPaRv26FdUGZp7T8 z+lk^odUB#@Em8x{aqF~pCp~F8xBn`#|89J69PG1v%Ev;>dVO>49PV3->$39b2(Rbk z@pU^QzR5sJ9k7Wu*GOpttE4Rg=+A|L3*SGbz8~%WonGO;QtLUOL2)v_S$#Ju*Vpqw_6qO_t zbFP)oAIAeMF|xJ}j$c1UwgA&B=fhPBU(a79jATZhZH{F(|{pq2BA?VT|zaZ zZQPHs=}J@D&AeqnM#<1s$e8gxX-7fo$TAA{gSf{;;$^BkUo>bYzP%xGy%nsXv3=Wr?OjOG)GTsxpU_BGIVEEyCw;uVcqnZ0LAt#HdK34W;shK8Y}BCJNS9xg)@nEAZ1(BJfjyQdo%L;snCYO%C2@QT z7m7KxM;Y$e?hT>12d1=AerXf^TeC1V2_+1YMmfcm(NXT{wCbvO=0 z$umga6el)o&qkSVvKg(9305JIwZlt4F`^ZVN&{JfDt)4R)*m7`{413K!-EbfsnhR; zJ5Ff};S=@*H+Yxp$roG=?$K{*Mzubgi={z7+&8Novl4;Cf4#py*Uy6h@aAP>>A%hR zn@fb`F{uerB9QI{6!~=-R-3<;QYn57d5;sWIgkhgMe;ASO+$dlzoQ;k>}z9!`=%4zx+}PL*r_Y?oUO8}+?k- zZW$|R%tUL*BMb*`+xIT1!+5;-h~cT1#C6$vPLUY!tq~UnZ!$(!GFPm=Dv#obTtdqX zTyYf=V6iiCEy64P3T_PIJDA;#PvCHRXZd<^vF7>Rn3J7R~=a^ zYLHY^6)2I8A_yIvD9;T#JbyuhlGX_Hk2pKprkO&nTse$4Nk9t9*7LUmf#(JfnBLgq z$X!c9pDhHv5RaUoE>o^eur%JZI5n$%cc!jxEq&bm!d9*pjbv?BEOAYUCa?Yi%FXzO zV_{M5NH-is)vlC157!&;eJDy|^%xDFQ|>UC(;P3)l;lx%9+BBVl&-pdXMmscwCdL>z zJi!7zUGzxWr3alCve*186ZEx%2dJh{qTW=vMFOBH@rJu>qzfg%x)NSKwyT2uD>RYO z@tK*7t=B)`z-}hA*+K&Uig0tv4w*wJ&$;L%ybRCY}2b&-3 zJ}f>IdCoR+GX|1wvQZ~!E=Fr+5q`gSmHAer*NiG*FGJT8U;&bLQkH>slByJrn>Gy- z<#oz<20B-j-2{gj9FI1pOAkmbK6r`ir^ICN7^h#vlMh6Vmnz}mhx)6!ksW;A*V!Cg+9w7oAW}6K_18DqS#lf13;G#ycslR35`)UbG0!O>@JxZO@sOZcv5Han zBr}3BiF~?_c!G$`{0|9?2Br(GlrvvVv<>b!V-bzthCR4M>ly}aBWYZizaEQ?R-f#+ zP!M;Fh?G{-3l&t176sL=zP51)Sy*p|Y4CAEmK+=&lLSnTd^P8ZY7;duct_2>@mj0( zJL-7sy(0ad%pb3nYQsa(!O9{2Vpniw%lT`zeC5tN@PiVDv;5DOIyJzX;X2;6;CeCr zUtZ^D&h#pv2RB~J{8%CfCor<{=n#DoO^S9oU;GpA zwe1#VFNsJkiTdKx6w~IP>MlonAR+#?d&^gtp$3R2oqjQMQ^YebQ_@JFKM>@?O(h6obp{iGJ*E=}@* zd9=5mTKZqNXMF>9s`}Ha0k|s8(ORM9_bq0vA)eTOj~D?R1~7eHe^QECz84hT28#GV zca4z5@;cV>XA%@=G6ty`eXc%*aVZ3?Ud?^q=vcg96lA0fnsDG(4&iGb|0)|Ve?|Jd zXl(4`ZC=Wc+JN*^3Y?xC8&cM_`fGf9X6A)K4Cx6ShJimf!>mSY@GzmEkYBM`P*)u< z*#6Z&kCRV?dSIDOh#Ap1k88njK4k&vFGBYrT~0MXt?QB5tmSi5GiT7}k+jj38K9}o z7Ey12hWWJ20WY!6p3V$C*sz_E1V!4|4=V}{B(zA+48%73;;Z9sdpQc$$)OjjW4zmjZN<*r|@Jb zZWEY=`~HcXQP*>Hw$tXWl|kjJ=A_ri&*CrIPIv|u(6rH)014Vy6C`ofN`2J?zpx_z=1 z;cK7n^7UsVSA*TTH~NFb#ui+ckMJ_>n=_e#{OKQ}%stxnzw@+|U9Qn-%z*r-i(<#P zPG4_S;>rZabrrj_$>D)cB6P@p?!3NLaL)g7A=nND3wc?bY+^O@ z|IQyeAvt<>Q1B4w33~*nG&r-9E&U>_G&X)Ea#VKge-4r#ba4T;v zIi&hhXPkU#FRbb1zg?w90XH{o-bb*CxgDwMazGjcX^k4iralfKjV+;kSym2vf2NN` zbg(L`@7@S3AG`2C_K)mv$}%fJ-}wu-q{J57`W*HWd{z~}+)|Pi8%2$EL)ZBo3;t5V<;s%K zCKfxomgzHew|V7f9F`%-?UBR}fjgDo*Or@Rc#BjId3QBT3UwAP6IV;nAVxiXJr8=q z5nrmbB`}$krt}kTLj7GhX$m9DG3jK{^vLCd8G%t<@|q{*21)1lrhRw&%4c z>s12tT{e1bAakIQ7jv4P{^=yvoX;CeJYN4fLIgXI9cMGb)F{-Owx6tZxrmQ2ecFex z81bUXup5spA_oa9b2w&f+M#2jO^;^U_Q)8+*21D$b-|8(ms*_>Yp@%k83Qc$W4+eP zXZuo?F@Bf1wW^_{ew5eyH+ZGJ-h#ne!K~5~85lwDk7$31WW>pF4YM?{*S^&fG0Pl*ifL!(p z2kCrex_yXH;eE*qF8)%s zqYF2zX~*swOwb2j&`s_>_VvAqtwo?099L@Ir~FMu10Q5Rf*y$J;Q|R z#>MwtD=j@AnvSq+s}gmbXQ@LhlY8G@AYI24) zS$IxiM(#A$81d@e0L<*ohSRgu;#P_8Wid9IXT?UB*-hss)d!HQWAmtjMCx*S?b_E# zNSNi0->euA=d)g!xL_xLx&Srt{9sl=i;Y}&|TbbF_A zX<2A7O^I8bAcI|P%r^%`=+v%~N{deL57BYE>V^!HtIFz-tGnwrwk>$YY_5>b6+H&? z0z1P*=@9DQ6(z!aozRtshLSqrdO44bsz`S_+;#zBkI6lMRPA-IN=8UfxgL-iALu9rXxojvE7Z&tIUl&`C9aN73BZe1=KtTlbzm(Z+Z4M3FQRgT)QE3H# z^)zX|&|BmU%8|WmQZ>+=4o7j@YE4xR+Sh)=B*QGKd*2CwyOvx=9#&3#x7=?e zc}5YS=~2>biX&Tpmn8m-pQ`IoqvYLey>G0V5x?s$og+wtwP^|xsc$HU=0Y=7{$ZXAIARZ?KVzdeGA-x@IV zB@9!Z1@SREkq>s;+XLK`z>nWX_%^E2ud3$)OiX}B9tsN(!$gomeyr*sUg_TB!J5A~b#VOfB@`6=&VOEjzndmw6d9lo zz*T{}^^XCI^}!;cLc~O%6rwy0(>tQZQLYy6cb(n^uPaj1=q6$T zaqS;u-{$rg1_h2dLL@%fWjej=hnrkl#MV5YY8)BnMoL_}&Lu2n9 zji$(oXZ&sKo+kF5nbJRF!5G>%bVW_C^eyhMINx92ULS|GsU{+-pLzdr7`-}W`SEmr z5Y`q^NB%)^WyOKJqUWmo37GU~&}>L|C=((m5-5#TfSz!j?g{~VLuS!|59MkbPtt|q zc7~$TWauzOrOF;RSdx`~X34?9woJiaD@z$!OH%QHMKU(I(1?biAcGY#wL;Q%CYdJ= z{z+<0d^x2*pr=q~D{OpC>#02oca1aZkP< zLgT&`QHmmsUgTeucSQPY3F0aLXWcF}gOl4KbX#9D%;%m;K}#(_e~<{CcWFMUsj-lU zZHO%FAhyj2$cGM=oCEl74EUa}d_SH30$F{1&v<*u)PgN`SlOqmZfU~TKG>yY7;xEZ zitrsVTS5+Bq55Q;PT`Pi6O8}4(^aHk0q-}ljxVN(`xX2CyHraYKD-GF(Tbc`F&iWs zzKk!Bn6}b_wR>({fg7(gCjORAw)7ihI^ANi)cMoFE6=r} zcv|1@6RdhsrA5M4)_fwla#c=Gt+LfIdrSy{+?0Pgwe(wvnU7Y5I3iS z(Dumi-Y=VQcpw6--0km5qjo4`sEC_%Fmw2^4{AQTe>OLS2N2a%rk2<=E6G{_2@->R z3qj^=DTQ3Op^37LCn1Rr^@IT8Nt(+2mEHD6({VDl34}4Xx&<|{x)fc`QB$<(RT`+~ zRLt{fN3p-dO@%j~VbyRn)G758Lt%b#^I#~kpz%EeI{eGyb7;*d*E=$HNc8$FCfIbK zOIa84ctuNdWu2*YX_M9@O-_5IUrh)eZkna-PM$(woRjN3bdmtaV7PtcE{b$o*Nh{tQ@ohqoYO*+$0YF8;h_RyN#6Vo}&l6W7C4$~u>N zL%tHA^3%B|7aD%BIekKo+S6C@)NbVbyu_kQDu&^UgMf?1q4`gS6OY{4vBDiL{ipna zTX+{b$3T14;1Xq>e9^c3EX61{-0Mu&!wxs=0Wlx;!k<;~Q|f|w%X}CM+(shT*BS?J zI6eN8!y{{>8bI=gM&SXLqDAomy5*bsQi60H{${#n_}w@!8b25+T(;0KDVD!_qKFq5 z7^=&4HHG9Xc>$P=1~hS|=+vtV1BCn-#k)z1jGy|imA}u%SA9()vm^P4cimoBfxqFk zh=ykH4lYQvYXU`oAEJK%|`Xjqf4lk;YUd{U;?|Y7@`vs`Fnv z1fj9sU$C_S#F{_DGUKK_R5S`W0VbZ3NEC(h^|G*9Gbe;?{1&i*`euki2LW}Mt zKJ6nhvhh+LJAOVG>a&IAAA|jtp4%I8O3;pv_)OQMagy;!z^*j(B>*@87 zgIoc*)z)K=aj0NeVGWI>lY47{l8L{H#v~mq5KUlyg@4OJni@qn9En~`Yyw9>I8MRU zBuT+v%m(%udC$7g8vV&mq1QB!UyLbR0&hH2fac;OeQwkziqOM5yx*Eqr@p3>nQ18A6Lm1upLw|l9y5+-|gqA6|sXBiC1HhnSujGu%9 k%4Hxz7-Mzm%%N}E%63ZX&~I4(Jb_ShQp%FG;-;bh2QdB}-T(jq literal 0 HcmV?d00001 diff --git a/erv/lb2/src/main.typ b/erv/lb2/src/main.typ new file mode 100644 index 0000000..a3d4e65 --- /dev/null +++ b/erv/lb2/src/main.typ @@ -0,0 +1,54 @@ +#import "@unexplrd/test-multifile:0.1.0": * +// #import "/lib/lib.typ": * +#import "utils.typ": * + +#import style: spacing + +// #show: correctly-indent-list-and-enum-items + +// #show: style.dstu +#show: pz-lb.with( + ..toml("doc.toml"), + title: lorem(2), +) + +== #lorem(3) +#v(-spacing) +=== #lorem(5) + +#lorem(20) + ++ #lorem(10) + + #lorem(10) ++ #lorem(10) + + #lorem(10) + $ 1/2 dot 3 = 3/2 $ + + #lorem(10) +$ 1/2 dot 3 = 3/2 $ ++ #lorem(10) + + #lorem(10) + + #lorem(10) + +#lorem(20) + +// #img("/figures/Google-Logo-700x394.png", [Корпорація зла], width: 60%) + + +#lorem(50) + +#figure(caption: "Приклад коду на C", code(read("assets/sample.c"))) + +#lorem(20) + +#figure( + caption: [Цифри], + table( + columns: 4, + table.header([Один], [Два], [Три], [Чотири]), + ..csv("assets/table.csv").flatten(), + ), +) + +#lorem(20) + +#style.appendices(include "chapters/appendices.typ") diff --git a/erv/lb2/src/utils.typ b/erv/lb2/src/utils.typ new file mode 100644 index 0000000..7e1ba9b --- /dev/null +++ b/erv/lb2/src/utils.typ @@ -0,0 +1,109 @@ +/// takes in a string of code, e.g. #code(read("foo.c")) +#let code(content) = raw(block: true, theme: none, content) + +/// read file as bytes +#let p(path) = bytes(read(path, encoding: none)) + +/// include chapters by file names from /chapters +#let chapters(ch) = ( + array(ch).map(chapter => include str(chapter) + ".typ").join() +) + +#let pz-header(worknumber, name) = columns[#text(weight: "bold", [ + #align(left)[Практичне заняття №#worknumber] + #colbreak() + #align(right)[#name] +])] + +/// https://forum.typst.app/t/how-to-make-bullet-list-item-bodies-flow-like-paragraphs/3756/3?u=andrew +/// Spacing doesn't work the same way as native solution if par leading and +/// spacing are different. +#let correctly-indent-list-and-enum-items(doc) = { + let first-line-indent() = if type(par.first-line-indent) == dictionary { + par.first-line-indent.amount + } else { + par.first-line-indent + } + + show list: li => { + for (i, it) in li.children.enumerate() { + let nesting = state("list-nesting", 0) + let indent = context h((nesting.get() + 1) * li.indent) + let get-nesting() = calc.div-euclid(nesting.get(), 10) + let marker = context { + let n = get-nesting() + if type(li.marker) == array { + li.marker.at(calc.rem-euclid(n, li.marker.len())) + } else if type(li.marker) == content { + li.marker + } else { + li.marker(n) + } + } + let parents = state("enum-parents", ()) // Support enum nesting. + let body = { + parents.update(arr => arr + (-1,)) + nesting.update(x => x + 10) + it.body + parbreak() + nesting.update(x => x - 10) + parents.update(arr => arr.slice(0, -1)) + } + let content = { + marker + h(li.body-indent) + body + } + context pad(left: int(nesting.get() != 0) * li.indent, content) + } + } + + show enum: en => { + let start = if en.start == auto { + if en.children.first().has("number") { + if en.reversed { en.children.first().number } else { 1 } + } else { + if en.reversed { en.children.len() } else { 1 } + } + } else { + en.start + } + let number = start + for (i, it) in en.children.enumerate() { + number = if it.number != auto { it.number } else { number } + if en.reversed { number = start - i } + let parents = state("enum-parents", ()) + let get-parents() = parents.get().filter(x => x >= 0) + let indent = context h((get-parents().len() + 1) * en.indent) + let num = if en.full { + context numbering(en.numbering, ..get-parents(), number) + } else { + numbering(en.numbering, number) + } + let max-num = if en.full { + context numbering(en.numbering, ..get-parents(), en.children.len()) + } else { + numbering(en.numbering, en.children.len()) + } + num = context box( + width: measure(max-num).width, + align(right, text(overhang: false, num)), + ) + let list-nesting = state("list-nesting", 0) // Support list nesting. + let body = { + parents.update(arr => arr + (number,)) + list-nesting.update(x => x + 1) + it.body + parbreak() + list-nesting.update(x => x - 1) + parents.update(arr => arr.slice(0, -1)) + } + if not en.reversed { number += 1 } + let content = { + num + h(en.body-indent) + body + } + context pad(left: int(parents.get().len() != 0) * en.indent, content) + } + } + doc +} diff --git a/erv/lb4/flake.lock b/erv/lb4/flake.lock new file mode 100644 index 0000000..7027761 --- /dev/null +++ b/erv/lb4/flake.lock @@ -0,0 +1,113 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "local-nure": { + "flake": false, + "locked": { + "lastModified": 1769126611, + "narHash": "sha256-4qmXN7kx87pEpZHFJpyRbLfZ5GanF5Jbi1Bmfx6ZXss=", + "path": "/storage/git/typst_nure_template", + "type": "path" + }, + "original": { + "path": "/storage/git/typst_nure_template", + "type": "path" + } + }, + "local-nure-upstream": { + "flake": false, + "locked": { + "lastModified": 1768301144, + "narHash": "sha256-VHZXALfaAw5f32mClZTS7MeTSaDSQtErAjI+lgpYIZk=", + "ref": "refs/heads/0.1.0", + "rev": "549d7f060f81a6356c43b2c231e6453ddae19fca", + "revCount": 111, + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + }, + "original": { + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1763421233, + "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "local-nure": "local-nure", + "local-nure-upstream": "local-nure-upstream", + "nixpkgs": "nixpkgs", + "typix": "typix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "typix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769071922, + "narHash": "sha256-WD8cMrUlqWJWDAD8+B6MUyEuWvi/fgGgv5Wg0xF/Zkc=", + "owner": "loqusion", + "repo": "typix", + "rev": "5d334996b24af342b0992f7f432fcb301ed67314", + "type": "github" + }, + "original": { + "owner": "loqusion", + "repo": "typix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/erv/lb4/flake.nix b/erv/lb4/flake.nix new file mode 100644 index 0000000..e044c10 --- /dev/null +++ b/erv/lb4/flake.nix @@ -0,0 +1,176 @@ +{ + description = "A Nix flake for compiling NURE works"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + typix.url = "github:loqusion/typix"; + typix.inputs.nixpkgs.follows = "nixpkgs"; + + flake-utils.url = "github:numtide/flake-utils"; + + # local-nure.url = "git+ssh://gitea@gitea.linerds.us/unexplrd/typst_nure_template"; + local-nure-upstream.url = "git+ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template"; + local-nure-upstream.flake = false; + + local-nure.url = "path:/storage/git/typst_nure_template"; + local-nure.flake = false; + + # Example of downloading icons from a non-flake source + # font-awesome = { + # url = "github:FortAwesome/Font-Awesome"; + # flake = false; + # }; + }; + + outputs = inputs @ { + nixpkgs, + typix, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; + inherit (pkgs) lib; + inherit (lib.strings) escapeShellArg; + + typixLib = typix.lib.${system}; + + src = lib.fileset.toSource { + root = ./.; + fileset = lib.fileset.unions [ + # lib/ gets imported, which is unwanted + # (lib.fileset.fromSource (typixLib.cleanTypstSource ./.)) + # ./main.typ + # (lib.fileset.maybeMissing ./doc.toml) + # (lib.fileset.maybeMissing ./utils.typ) + # (lib.fileset.maybeMissing ./chapters) + # (lib.fileset.maybeMissing ./assets) + # (lib.fileset.maybeMissing ./figures) + ./src + ]; + }; + commonArgs = { + typstSource = "src/main.typ"; + + fontPaths = [ + "${pkgs.liberation_ttf}/share/fonts/truetype" + ]; + + # Make sure to override outdated files/links (in case of updated flake.lock) + # (may be undesirable with config/universities.yaml in case of custom subjects) + forceVirtualPaths = true; + + virtualPaths = [ + # Add paths that must be locally accessible to typst here + # { + # dest = "src/lib"; + # src = "${inputs.local-nure}/src"; + # } + # { + # dest = "config/universities.yaml"; + # src = "${inputs.local-nure}/src/config/universities.yaml"; + # } + ]; + }; + + mkTypstPackagesDrv = name: entries: let + linkFarmEntries = + lib.foldl (set: { + name, + version, + namespace, + input, + }: + set + // { + "${namespace}/${name}/${version}" = input; + }) + {} + entries; + in + pkgs.linkFarm name linkFarmEntries; + + unpublishedTypstPackages = mkTypstPackagesDrv "unpublished-packages" [ + { + namespace = "unexplrd"; + name = "test-multifile"; + version = "0.1.0"; + input = inputs.local-nure; + } + { + namespace = "local"; + name = "nure"; + version = "0.1.0"; + input = inputs.local-nure-upstream; + } + ]; + + # Any transitive dependencies must be added here + # See https://loqusion.github.io/typix/recipes/using-typst-packages.html#the-typstpackages-attribute + # unstable_typstPackages = [ + # { + # name = "oxifmt"; + # version = "0.2.1"; + # hash = "sha256-8PNPa9TGFybMZ1uuJwb5ET0WGIInmIgg8h24BmdfxlU="; + # } + # ]; + + # Compile a Typst project, *without* copying the result + # to the current directory + build-drv = typixLib.buildTypstProject (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Compile a Typst project, and then copy the result + # to the current directory + build-script = typixLib.buildTypstProjectLocal (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Watch a project and recompile on changes + watch-script = typixLib.watchTypstProject (lib.recursiveUpdate commonArgs + { + typstWatchCommand = "TYPST_PACKAGE_PATH=${escapeShellArg unpublishedTypstPackages} typst watch"; + }); + in { + checks = {inherit build-drv build-script watch-script;}; + + packages.default = build-drv; + packages.watch = watch-script; + + apps = rec { + default = watch; + build = flake-utils.lib.mkApp { + drv = build-script; + }; + watch = flake-utils.lib.mkApp { + drv = watch-script; + }; + }; + + devShells.default = typixLib.devShell { + inherit (commonArgs) fontPaths virtualPaths; + + env = { + TYPST_PACKAGE_PATH = escapeShellArg unpublishedTypstPackages; + }; + packages = with pkgs; [ + # WARNING: Don't run `typst-build` directly, instead use `nix run .#build` + # See https://github.com/loqusion/typix/issues/2 + # build-script + watch-script + + just + typstyle + yq + ]; + }; + }); +} diff --git a/erv/lb4/justfile b/erv/lb4/justfile new file mode 100644 index 0000000..43fd58e --- /dev/null +++ b/erv/lb4/justfile @@ -0,0 +1,79 @@ +# File aliases for common commands +alias w := watch +alias c := compile +alias nw := nix-watch +alias nb := nix-build +alias nd := nix-develop + + +# Configuration +set shell := ["fish", "-ic"] + +file := "src/main.typ" +doc_config := "src/doc.toml" +# out := `cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"'` +# out := 'bla' + +# Default target - show available recipes +default: + @just --list + +# Validate required files exist +_check-files: + #!/usr/bin/env bash + set -euo pipefail + if [[ ! -f "{{file}}" ]]; then + echo "Error: Source file {{file}} not found" + exit 1 + fi + if [[ ! -f "{{doc_config}}" ]]; then + echo "Error: Config file {{doc_config}} not found" + exit 1 + fi + +# Watch file for changes and recompile automatically +[group('typst')] +watch: _check-files + typst w {{file}} + +# Compile the document once +[group('typst')] +compile: _check-files + typst c {{file}} + +# Compile and copy to parent directory +[group('typst')] +copy: compile + #!/usr/bin/env bash + # set -euo pipefail + # if [[ ! -f "{{out}}" ]]; then + # echo "Error: Output file {{out}} not found after compilation" + # exit 1 + # fi + local final_name = $(cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"') + cp "main.typ" "$final_name" + +# Enter nix development environment +[group('nix')] +nix-develop: + nix develop . + +# Watch using nix environment +[group('nix')] +nix-watch: + nix run .#watch + +# Build using nix environment +[group('nix')] +nix-build: + nix run .#build + +# Clean generated PDFs +[group('utils'), confirm] +clean: + @rm -rvf *.pdf + +# Show generated filename +# [group('utils')] +# show-output: +# @echo "{{out}}" \ No newline at end of file diff --git a/erv/lb4/src/assets/sample.c b/erv/lb4/src/assets/sample.c new file mode 100644 index 0000000..9ad18c4 --- /dev/null +++ b/erv/lb4/src/assets/sample.c @@ -0,0 +1,30 @@ +#include +int main() { + int i, j; + + // Number of rows + int rows = 3; + + // Taking first character of alphabet + // which is useful to print pattern + char character = 'A'; + + // This loop is used to identify + // number rows + for (i = 0; i < rows; i++) { + // This for loop is used to + // identify number of columns + // based on the rows + for (j = 0; j <= i; j++) { + // Printing character to get + // the required pattern + printf("%c ", character); + + // Incrementing character value so + // that it will print the next character + character++; + } + printf("\n"); + } + return 0; +} diff --git a/erv/lb4/src/assets/table.csv b/erv/lb4/src/assets/table.csv new file mode 100644 index 0000000..2ec748f --- /dev/null +++ b/erv/lb4/src/assets/table.csv @@ -0,0 +1,2 @@ +1,2,3,4 +5,6,7,8 diff --git a/erv/lb4/src/chapters/appendices.typ b/erv/lb4/src/chapters/appendices.typ new file mode 100644 index 0000000..b221b49 --- /dev/null +++ b/erv/lb4/src/chapters/appendices.typ @@ -0,0 +1,4 @@ +#import "/utils.typ": code + += Код програми sample.c +#code(read("/assets/sample.c")) diff --git a/erv/lb4/src/doc.toml b/erv/lb4/src/doc.toml new file mode 100644 index 0000000..e5c5103 --- /dev/null +++ b/erv/lb4/src/doc.toml @@ -0,0 +1,24 @@ +university = "ХНУРЕ" +subject = "ЕРВ" +type = "ЛБ" +number = 4 + +[[mentors]] +name = "Шевченко Т. Г." +degree = "Доцент кафедри ПІ" +gender = "m" + +[[mentors]] +name = "Франко І. Я." +degree = "Асистент кафедри ПІ" +gender = "m" + +[[authors]] +name = "Косач Л. П." +edu_program = "КУІБ" +group = "23-2" +gender = "f" +variant = 8 +full_name_gen = "Косач Лариси Петрівни" +course = 2 +semester = 4 diff --git a/erv/lb4/src/figures/Google-Logo-700x394.png b/erv/lb4/src/figures/Google-Logo-700x394.png new file mode 100644 index 0000000000000000000000000000000000000000..9967a3c6d4441e8524acdb2536c07580ee3c3698 GIT binary patch literal 10380 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 literal 0 HcmV?d00001 diff --git a/erv/lb4/src/main.typ b/erv/lb4/src/main.typ new file mode 100644 index 0000000..a3d4e65 --- /dev/null +++ b/erv/lb4/src/main.typ @@ -0,0 +1,54 @@ +#import "@unexplrd/test-multifile:0.1.0": * +// #import "/lib/lib.typ": * +#import "utils.typ": * + +#import style: spacing + +// #show: correctly-indent-list-and-enum-items + +// #show: style.dstu +#show: pz-lb.with( + ..toml("doc.toml"), + title: lorem(2), +) + +== #lorem(3) +#v(-spacing) +=== #lorem(5) + +#lorem(20) + ++ #lorem(10) + + #lorem(10) ++ #lorem(10) + + #lorem(10) + $ 1/2 dot 3 = 3/2 $ + + #lorem(10) +$ 1/2 dot 3 = 3/2 $ ++ #lorem(10) + + #lorem(10) + + #lorem(10) + +#lorem(20) + +// #img("/figures/Google-Logo-700x394.png", [Корпорація зла], width: 60%) + + +#lorem(50) + +#figure(caption: "Приклад коду на C", code(read("assets/sample.c"))) + +#lorem(20) + +#figure( + caption: [Цифри], + table( + columns: 4, + table.header([Один], [Два], [Три], [Чотири]), + ..csv("assets/table.csv").flatten(), + ), +) + +#lorem(20) + +#style.appendices(include "chapters/appendices.typ") diff --git a/erv/lb4/src/utils.typ b/erv/lb4/src/utils.typ new file mode 100644 index 0000000..7e1ba9b --- /dev/null +++ b/erv/lb4/src/utils.typ @@ -0,0 +1,109 @@ +/// takes in a string of code, e.g. #code(read("foo.c")) +#let code(content) = raw(block: true, theme: none, content) + +/// read file as bytes +#let p(path) = bytes(read(path, encoding: none)) + +/// include chapters by file names from /chapters +#let chapters(ch) = ( + array(ch).map(chapter => include str(chapter) + ".typ").join() +) + +#let pz-header(worknumber, name) = columns[#text(weight: "bold", [ + #align(left)[Практичне заняття №#worknumber] + #colbreak() + #align(right)[#name] +])] + +/// https://forum.typst.app/t/how-to-make-bullet-list-item-bodies-flow-like-paragraphs/3756/3?u=andrew +/// Spacing doesn't work the same way as native solution if par leading and +/// spacing are different. +#let correctly-indent-list-and-enum-items(doc) = { + let first-line-indent() = if type(par.first-line-indent) == dictionary { + par.first-line-indent.amount + } else { + par.first-line-indent + } + + show list: li => { + for (i, it) in li.children.enumerate() { + let nesting = state("list-nesting", 0) + let indent = context h((nesting.get() + 1) * li.indent) + let get-nesting() = calc.div-euclid(nesting.get(), 10) + let marker = context { + let n = get-nesting() + if type(li.marker) == array { + li.marker.at(calc.rem-euclid(n, li.marker.len())) + } else if type(li.marker) == content { + li.marker + } else { + li.marker(n) + } + } + let parents = state("enum-parents", ()) // Support enum nesting. + let body = { + parents.update(arr => arr + (-1,)) + nesting.update(x => x + 10) + it.body + parbreak() + nesting.update(x => x - 10) + parents.update(arr => arr.slice(0, -1)) + } + let content = { + marker + h(li.body-indent) + body + } + context pad(left: int(nesting.get() != 0) * li.indent, content) + } + } + + show enum: en => { + let start = if en.start == auto { + if en.children.first().has("number") { + if en.reversed { en.children.first().number } else { 1 } + } else { + if en.reversed { en.children.len() } else { 1 } + } + } else { + en.start + } + let number = start + for (i, it) in en.children.enumerate() { + number = if it.number != auto { it.number } else { number } + if en.reversed { number = start - i } + let parents = state("enum-parents", ()) + let get-parents() = parents.get().filter(x => x >= 0) + let indent = context h((get-parents().len() + 1) * en.indent) + let num = if en.full { + context numbering(en.numbering, ..get-parents(), number) + } else { + numbering(en.numbering, number) + } + let max-num = if en.full { + context numbering(en.numbering, ..get-parents(), en.children.len()) + } else { + numbering(en.numbering, en.children.len()) + } + num = context box( + width: measure(max-num).width, + align(right, text(overhang: false, num)), + ) + let list-nesting = state("list-nesting", 0) // Support list nesting. + let body = { + parents.update(arr => arr + (number,)) + list-nesting.update(x => x + 1) + it.body + parbreak() + list-nesting.update(x => x - 1) + parents.update(arr => arr.slice(0, -1)) + } + if not en.reversed { number += 1 } + let content = { + num + h(en.body-indent) + body + } + context pad(left: int(parents.get().len() != 0) * en.indent, content) + } + } + doc +} diff --git a/erv/lb5/flake.lock b/erv/lb5/flake.lock new file mode 100644 index 0000000..7027761 --- /dev/null +++ b/erv/lb5/flake.lock @@ -0,0 +1,113 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "local-nure": { + "flake": false, + "locked": { + "lastModified": 1769126611, + "narHash": "sha256-4qmXN7kx87pEpZHFJpyRbLfZ5GanF5Jbi1Bmfx6ZXss=", + "path": "/storage/git/typst_nure_template", + "type": "path" + }, + "original": { + "path": "/storage/git/typst_nure_template", + "type": "path" + } + }, + "local-nure-upstream": { + "flake": false, + "locked": { + "lastModified": 1768301144, + "narHash": "sha256-VHZXALfaAw5f32mClZTS7MeTSaDSQtErAjI+lgpYIZk=", + "ref": "refs/heads/0.1.0", + "rev": "549d7f060f81a6356c43b2c231e6453ddae19fca", + "revCount": 111, + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + }, + "original": { + "type": "git", + "url": "ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1763421233, + "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "local-nure": "local-nure", + "local-nure-upstream": "local-nure-upstream", + "nixpkgs": "nixpkgs", + "typix": "typix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "typix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769071922, + "narHash": "sha256-WD8cMrUlqWJWDAD8+B6MUyEuWvi/fgGgv5Wg0xF/Zkc=", + "owner": "loqusion", + "repo": "typix", + "rev": "5d334996b24af342b0992f7f432fcb301ed67314", + "type": "github" + }, + "original": { + "owner": "loqusion", + "repo": "typix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/erv/lb5/flake.nix b/erv/lb5/flake.nix new file mode 100644 index 0000000..e044c10 --- /dev/null +++ b/erv/lb5/flake.nix @@ -0,0 +1,176 @@ +{ + description = "A Nix flake for compiling NURE works"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + typix.url = "github:loqusion/typix"; + typix.inputs.nixpkgs.follows = "nixpkgs"; + + flake-utils.url = "github:numtide/flake-utils"; + + # local-nure.url = "git+ssh://gitea@gitea.linerds.us/unexplrd/typst_nure_template"; + local-nure-upstream.url = "git+ssh://gitea@gitea.linerds.us/pencelheimer/typst_nure_template"; + local-nure-upstream.flake = false; + + local-nure.url = "path:/storage/git/typst_nure_template"; + local-nure.flake = false; + + # Example of downloading icons from a non-flake source + # font-awesome = { + # url = "github:FortAwesome/Font-Awesome"; + # flake = false; + # }; + }; + + outputs = inputs @ { + nixpkgs, + typix, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; + inherit (pkgs) lib; + inherit (lib.strings) escapeShellArg; + + typixLib = typix.lib.${system}; + + src = lib.fileset.toSource { + root = ./.; + fileset = lib.fileset.unions [ + # lib/ gets imported, which is unwanted + # (lib.fileset.fromSource (typixLib.cleanTypstSource ./.)) + # ./main.typ + # (lib.fileset.maybeMissing ./doc.toml) + # (lib.fileset.maybeMissing ./utils.typ) + # (lib.fileset.maybeMissing ./chapters) + # (lib.fileset.maybeMissing ./assets) + # (lib.fileset.maybeMissing ./figures) + ./src + ]; + }; + commonArgs = { + typstSource = "src/main.typ"; + + fontPaths = [ + "${pkgs.liberation_ttf}/share/fonts/truetype" + ]; + + # Make sure to override outdated files/links (in case of updated flake.lock) + # (may be undesirable with config/universities.yaml in case of custom subjects) + forceVirtualPaths = true; + + virtualPaths = [ + # Add paths that must be locally accessible to typst here + # { + # dest = "src/lib"; + # src = "${inputs.local-nure}/src"; + # } + # { + # dest = "config/universities.yaml"; + # src = "${inputs.local-nure}/src/config/universities.yaml"; + # } + ]; + }; + + mkTypstPackagesDrv = name: entries: let + linkFarmEntries = + lib.foldl (set: { + name, + version, + namespace, + input, + }: + set + // { + "${namespace}/${name}/${version}" = input; + }) + {} + entries; + in + pkgs.linkFarm name linkFarmEntries; + + unpublishedTypstPackages = mkTypstPackagesDrv "unpublished-packages" [ + { + namespace = "unexplrd"; + name = "test-multifile"; + version = "0.1.0"; + input = inputs.local-nure; + } + { + namespace = "local"; + name = "nure"; + version = "0.1.0"; + input = inputs.local-nure-upstream; + } + ]; + + # Any transitive dependencies must be added here + # See https://loqusion.github.io/typix/recipes/using-typst-packages.html#the-typstpackages-attribute + # unstable_typstPackages = [ + # { + # name = "oxifmt"; + # version = "0.2.1"; + # hash = "sha256-8PNPa9TGFybMZ1uuJwb5ET0WGIInmIgg8h24BmdfxlU="; + # } + # ]; + + # Compile a Typst project, *without* copying the result + # to the current directory + build-drv = typixLib.buildTypstProject (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Compile a Typst project, and then copy the result + # to the current directory + build-script = typixLib.buildTypstProjectLocal (commonArgs + // { + inherit src; + # inherit unstable_typstPackages; + TYPST_PACKAGE_PATH = unpublishedTypstPackages; + }); + + # Watch a project and recompile on changes + watch-script = typixLib.watchTypstProject (lib.recursiveUpdate commonArgs + { + typstWatchCommand = "TYPST_PACKAGE_PATH=${escapeShellArg unpublishedTypstPackages} typst watch"; + }); + in { + checks = {inherit build-drv build-script watch-script;}; + + packages.default = build-drv; + packages.watch = watch-script; + + apps = rec { + default = watch; + build = flake-utils.lib.mkApp { + drv = build-script; + }; + watch = flake-utils.lib.mkApp { + drv = watch-script; + }; + }; + + devShells.default = typixLib.devShell { + inherit (commonArgs) fontPaths virtualPaths; + + env = { + TYPST_PACKAGE_PATH = escapeShellArg unpublishedTypstPackages; + }; + packages = with pkgs; [ + # WARNING: Don't run `typst-build` directly, instead use `nix run .#build` + # See https://github.com/loqusion/typix/issues/2 + # build-script + watch-script + + just + typstyle + yq + ]; + }; + }); +} diff --git a/erv/lb5/justfile b/erv/lb5/justfile new file mode 100644 index 0000000..43fd58e --- /dev/null +++ b/erv/lb5/justfile @@ -0,0 +1,79 @@ +# File aliases for common commands +alias w := watch +alias c := compile +alias nw := nix-watch +alias nb := nix-build +alias nd := nix-develop + + +# Configuration +set shell := ["fish", "-ic"] + +file := "src/main.typ" +doc_config := "src/doc.toml" +# out := `cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"'` +# out := 'bla' + +# Default target - show available recipes +default: + @just --list + +# Validate required files exist +_check-files: + #!/usr/bin/env bash + set -euo pipefail + if [[ ! -f "{{file}}" ]]; then + echo "Error: Source file {{file}} not found" + exit 1 + fi + if [[ ! -f "{{doc_config}}" ]]; then + echo "Error: Config file {{doc_config}} not found" + exit 1 + fi + +# Watch file for changes and recompile automatically +[group('typst')] +watch: _check-files + typst w {{file}} + +# Compile the document once +[group('typst')] +compile: _check-files + typst c {{file}} + +# Compile and copy to parent directory +[group('typst')] +copy: compile + #!/usr/bin/env bash + # set -euo pipefail + # if [[ ! -f "{{out}}" ]]; then + # echo "Error: Output file {{out}} not found after compilation" + # exit 1 + # fi + local final_name = $(cat {{doc_config}} | tomlq '.doctype + (.worknumber | tostring) + "_" + (.authors[0].name | split(" ")[0]) + "_" + (.authors[0].edu + "-" + .authors[0].group) + "_" + .subject + ".pdf"') + cp "main.typ" "$final_name" + +# Enter nix development environment +[group('nix')] +nix-develop: + nix develop . + +# Watch using nix environment +[group('nix')] +nix-watch: + nix run .#watch + +# Build using nix environment +[group('nix')] +nix-build: + nix run .#build + +# Clean generated PDFs +[group('utils'), confirm] +clean: + @rm -rvf *.pdf + +# Show generated filename +# [group('utils')] +# show-output: +# @echo "{{out}}" \ No newline at end of file diff --git a/erv/lb5/src/assets/sample.c b/erv/lb5/src/assets/sample.c new file mode 100644 index 0000000..9ad18c4 --- /dev/null +++ b/erv/lb5/src/assets/sample.c @@ -0,0 +1,30 @@ +#include +int main() { + int i, j; + + // Number of rows + int rows = 3; + + // Taking first character of alphabet + // which is useful to print pattern + char character = 'A'; + + // This loop is used to identify + // number rows + for (i = 0; i < rows; i++) { + // This for loop is used to + // identify number of columns + // based on the rows + for (j = 0; j <= i; j++) { + // Printing character to get + // the required pattern + printf("%c ", character); + + // Incrementing character value so + // that it will print the next character + character++; + } + printf("\n"); + } + return 0; +} diff --git a/erv/lb5/src/assets/table.csv b/erv/lb5/src/assets/table.csv new file mode 100644 index 0000000..2ec748f --- /dev/null +++ b/erv/lb5/src/assets/table.csv @@ -0,0 +1,2 @@ +1,2,3,4 +5,6,7,8 diff --git a/erv/lb5/src/chapters/appendices.typ b/erv/lb5/src/chapters/appendices.typ new file mode 100644 index 0000000..b221b49 --- /dev/null +++ b/erv/lb5/src/chapters/appendices.typ @@ -0,0 +1,4 @@ +#import "/utils.typ": code + += Код програми sample.c +#code(read("/assets/sample.c")) diff --git a/erv/lb5/src/doc.toml b/erv/lb5/src/doc.toml new file mode 100644 index 0000000..d66e41a --- /dev/null +++ b/erv/lb5/src/doc.toml @@ -0,0 +1,24 @@ +university = "ХНУРЕ" +subject = "ЕРВ" +type = "ЛБ" +number = 5 + +[[mentors]] +name = "Шевченко Т. Г." +degree = "Доцент кафедри ПІ" +gender = "m" + +[[mentors]] +name = "Франко І. Я." +degree = "Асистент кафедри ПІ" +gender = "m" + +[[authors]] +name = "Косач Л. П." +edu_program = "КУІБ" +group = "23-2" +gender = "f" +variant = 8 +full_name_gen = "Косач Лариси Петрівни" +course = 2 +semester = 4 diff --git a/erv/lb5/src/figures/Google-Logo-700x394.png b/erv/lb5/src/figures/Google-Logo-700x394.png new file mode 100644 index 0000000000000000000000000000000000000000..9967a3c6d4441e8524acdb2536c07580ee3c3698 GIT binary patch literal 10380 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 literal 0 HcmV?d00001 diff --git a/erv/lb5/src/main.typ b/erv/lb5/src/main.typ new file mode 100644 index 0000000..a3d4e65 --- /dev/null +++ b/erv/lb5/src/main.typ @@ -0,0 +1,54 @@ +#import "@unexplrd/test-multifile:0.1.0": * +// #import "/lib/lib.typ": * +#import "utils.typ": * + +#import style: spacing + +// #show: correctly-indent-list-and-enum-items + +// #show: style.dstu +#show: pz-lb.with( + ..toml("doc.toml"), + title: lorem(2), +) + +== #lorem(3) +#v(-spacing) +=== #lorem(5) + +#lorem(20) + ++ #lorem(10) + + #lorem(10) ++ #lorem(10) + + #lorem(10) + $ 1/2 dot 3 = 3/2 $ + + #lorem(10) +$ 1/2 dot 3 = 3/2 $ ++ #lorem(10) + + #lorem(10) + + #lorem(10) + +#lorem(20) + +// #img("/figures/Google-Logo-700x394.png", [Корпорація зла], width: 60%) + + +#lorem(50) + +#figure(caption: "Приклад коду на C", code(read("assets/sample.c"))) + +#lorem(20) + +#figure( + caption: [Цифри], + table( + columns: 4, + table.header([Один], [Два], [Три], [Чотири]), + ..csv("assets/table.csv").flatten(), + ), +) + +#lorem(20) + +#style.appendices(include "chapters/appendices.typ") diff --git a/erv/lb5/src/utils.typ b/erv/lb5/src/utils.typ new file mode 100644 index 0000000..7e1ba9b --- /dev/null +++ b/erv/lb5/src/utils.typ @@ -0,0 +1,109 @@ +/// takes in a string of code, e.g. #code(read("foo.c")) +#let code(content) = raw(block: true, theme: none, content) + +/// read file as bytes +#let p(path) = bytes(read(path, encoding: none)) + +/// include chapters by file names from /chapters +#let chapters(ch) = ( + array(ch).map(chapter => include str(chapter) + ".typ").join() +) + +#let pz-header(worknumber, name) = columns[#text(weight: "bold", [ + #align(left)[Практичне заняття №#worknumber] + #colbreak() + #align(right)[#name] +])] + +/// https://forum.typst.app/t/how-to-make-bullet-list-item-bodies-flow-like-paragraphs/3756/3?u=andrew +/// Spacing doesn't work the same way as native solution if par leading and +/// spacing are different. +#let correctly-indent-list-and-enum-items(doc) = { + let first-line-indent() = if type(par.first-line-indent) == dictionary { + par.first-line-indent.amount + } else { + par.first-line-indent + } + + show list: li => { + for (i, it) in li.children.enumerate() { + let nesting = state("list-nesting", 0) + let indent = context h((nesting.get() + 1) * li.indent) + let get-nesting() = calc.div-euclid(nesting.get(), 10) + let marker = context { + let n = get-nesting() + if type(li.marker) == array { + li.marker.at(calc.rem-euclid(n, li.marker.len())) + } else if type(li.marker) == content { + li.marker + } else { + li.marker(n) + } + } + let parents = state("enum-parents", ()) // Support enum nesting. + let body = { + parents.update(arr => arr + (-1,)) + nesting.update(x => x + 10) + it.body + parbreak() + nesting.update(x => x - 10) + parents.update(arr => arr.slice(0, -1)) + } + let content = { + marker + h(li.body-indent) + body + } + context pad(left: int(nesting.get() != 0) * li.indent, content) + } + } + + show enum: en => { + let start = if en.start == auto { + if en.children.first().has("number") { + if en.reversed { en.children.first().number } else { 1 } + } else { + if en.reversed { en.children.len() } else { 1 } + } + } else { + en.start + } + let number = start + for (i, it) in en.children.enumerate() { + number = if it.number != auto { it.number } else { number } + if en.reversed { number = start - i } + let parents = state("enum-parents", ()) + let get-parents() = parents.get().filter(x => x >= 0) + let indent = context h((get-parents().len() + 1) * en.indent) + let num = if en.full { + context numbering(en.numbering, ..get-parents(), number) + } else { + numbering(en.numbering, number) + } + let max-num = if en.full { + context numbering(en.numbering, ..get-parents(), en.children.len()) + } else { + numbering(en.numbering, en.children.len()) + } + num = context box( + width: measure(max-num).width, + align(right, text(overhang: false, num)), + ) + let list-nesting = state("list-nesting", 0) // Support list nesting. + let body = { + parents.update(arr => arr + (number,)) + list-nesting.update(x => x + 1) + it.body + parbreak() + list-nesting.update(x => x - 1) + parents.update(arr => arr.slice(0, -1)) + } + if not en.reversed { number += 1 } + let content = { + num + h(en.body-indent) + body + } + context pad(left: int(parents.get().len() != 0) * en.indent, content) + } + } + doc +}