Slightly hacky but good enough math rendering in emacs 🪄
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

init

+3754
+1
.envrc
··· 1 + use flake
+2
.gitignore
··· 1 + .direnv 2 + /target
+2929
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "adler2" 7 + version = "2.0.1" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 10 + 11 + [[package]] 12 + name = "aho-corasick" 13 + version = "1.1.4" 14 + source = "registry+https://github.com/rust-lang/crates.io-index" 15 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 16 + dependencies = [ 17 + "memchr", 18 + ] 19 + 20 + [[package]] 21 + name = "android_system_properties" 22 + version = "0.1.5" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 25 + dependencies = [ 26 + "libc", 27 + ] 28 + 29 + [[package]] 30 + name = "anstream" 31 + version = "1.0.0" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" 34 + dependencies = [ 35 + "anstyle", 36 + "anstyle-parse", 37 + "anstyle-query", 38 + "anstyle-wincon", 39 + "colorchoice", 40 + "is_terminal_polyfill", 41 + "utf8parse", 42 + ] 43 + 44 + [[package]] 45 + name = "anstyle" 46 + version = "1.0.14" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" 49 + 50 + [[package]] 51 + name = "anstyle-parse" 52 + version = "1.0.0" 53 + source = "registry+https://github.com/rust-lang/crates.io-index" 54 + checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" 55 + dependencies = [ 56 + "utf8parse", 57 + ] 58 + 59 + [[package]] 60 + name = "anstyle-query" 61 + version = "1.1.5" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 64 + dependencies = [ 65 + "windows-sys 0.61.2", 66 + ] 67 + 68 + [[package]] 69 + name = "anstyle-wincon" 70 + version = "3.0.11" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 73 + dependencies = [ 74 + "anstyle", 75 + "once_cell_polyfill", 76 + "windows-sys 0.61.2", 77 + ] 78 + 79 + [[package]] 80 + name = "approx" 81 + version = "0.5.1" 82 + source = "registry+https://github.com/rust-lang/crates.io-index" 83 + checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" 84 + dependencies = [ 85 + "num-traits", 86 + ] 87 + 88 + [[package]] 89 + name = "ar_archive_writer" 90 + version = "0.5.1" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" 93 + dependencies = [ 94 + "object", 95 + ] 96 + 97 + [[package]] 98 + name = "arrayref" 99 + version = "0.3.9" 100 + source = "registry+https://github.com/rust-lang/crates.io-index" 101 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 102 + 103 + [[package]] 104 + name = "arrayvec" 105 + version = "0.7.6" 106 + source = "registry+https://github.com/rust-lang/crates.io-index" 107 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 108 + 109 + [[package]] 110 + name = "autocfg" 111 + version = "1.5.0" 112 + source = "registry+https://github.com/rust-lang/crates.io-index" 113 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 114 + 115 + [[package]] 116 + name = "az" 117 + version = "1.3.0" 118 + source = "registry+https://github.com/rust-lang/crates.io-index" 119 + checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" 120 + 121 + [[package]] 122 + name = "base64" 123 + version = "0.22.1" 124 + source = "registry+https://github.com/rust-lang/crates.io-index" 125 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 126 + 127 + [[package]] 128 + name = "biblatex" 129 + version = "0.10.0" 130 + source = "registry+https://github.com/rust-lang/crates.io-index" 131 + checksum = "a35a7317fcbdbef94b60d0dd0a658711a936accfce4a631fea4bf8e527eff3c2" 132 + dependencies = [ 133 + "numerals", 134 + "paste", 135 + "strum", 136 + "unicode-normalization", 137 + "unscanny", 138 + ] 139 + 140 + [[package]] 141 + name = "bincode" 142 + version = "1.3.3" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 145 + dependencies = [ 146 + "serde", 147 + ] 148 + 149 + [[package]] 150 + name = "bit-set" 151 + version = "0.8.0" 152 + source = "registry+https://github.com/rust-lang/crates.io-index" 153 + checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 154 + dependencies = [ 155 + "bit-vec", 156 + ] 157 + 158 + [[package]] 159 + name = "bit-vec" 160 + version = "0.8.0" 161 + source = "registry+https://github.com/rust-lang/crates.io-index" 162 + checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 163 + 164 + [[package]] 165 + name = "bitflags" 166 + version = "1.3.2" 167 + source = "registry+https://github.com/rust-lang/crates.io-index" 168 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 169 + 170 + [[package]] 171 + name = "bitflags" 172 + version = "2.11.0" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 175 + dependencies = [ 176 + "serde_core", 177 + ] 178 + 179 + [[package]] 180 + name = "bumpalo" 181 + version = "3.20.2" 182 + source = "registry+https://github.com/rust-lang/crates.io-index" 183 + checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" 184 + 185 + [[package]] 186 + name = "by_address" 187 + version = "1.2.1" 188 + source = "registry+https://github.com/rust-lang/crates.io-index" 189 + checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" 190 + 191 + [[package]] 192 + name = "bytemuck" 193 + version = "1.25.0" 194 + source = "registry+https://github.com/rust-lang/crates.io-index" 195 + checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" 196 + 197 + [[package]] 198 + name = "byteorder-lite" 199 + version = "0.1.0" 200 + source = "registry+https://github.com/rust-lang/crates.io-index" 201 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 202 + 203 + [[package]] 204 + name = "cc" 205 + version = "1.2.58" 206 + source = "registry+https://github.com/rust-lang/crates.io-index" 207 + checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" 208 + dependencies = [ 209 + "find-msvc-tools", 210 + "shlex", 211 + ] 212 + 213 + [[package]] 214 + name = "cfg-if" 215 + version = "1.0.4" 216 + source = "registry+https://github.com/rust-lang/crates.io-index" 217 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 218 + 219 + [[package]] 220 + name = "chinese-number" 221 + version = "0.7.8" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "3e964125508474a83c95eb935697abbeb446ff4e9d62c71ce880e3986d1c606b" 224 + dependencies = [ 225 + "chinese-variant", 226 + "enum-ordinalize", 227 + "num-bigint", 228 + "num-traits", 229 + ] 230 + 231 + [[package]] 232 + name = "chinese-variant" 233 + version = "1.1.5" 234 + source = "registry+https://github.com/rust-lang/crates.io-index" 235 + checksum = "58b52a9840ffff5d4d0058ae529fa066a75e794e3125546acfc61c23ad755e49" 236 + 237 + [[package]] 238 + name = "chrono" 239 + version = "0.4.44" 240 + source = "registry+https://github.com/rust-lang/crates.io-index" 241 + checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" 242 + dependencies = [ 243 + "iana-time-zone", 244 + "num-traits", 245 + "windows-link", 246 + ] 247 + 248 + [[package]] 249 + name = "ciborium" 250 + version = "0.2.2" 251 + source = "registry+https://github.com/rust-lang/crates.io-index" 252 + checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 253 + dependencies = [ 254 + "ciborium-io", 255 + "ciborium-ll", 256 + "serde", 257 + ] 258 + 259 + [[package]] 260 + name = "ciborium-io" 261 + version = "0.2.2" 262 + source = "registry+https://github.com/rust-lang/crates.io-index" 263 + checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 264 + 265 + [[package]] 266 + name = "ciborium-ll" 267 + version = "0.2.2" 268 + source = "registry+https://github.com/rust-lang/crates.io-index" 269 + checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 270 + dependencies = [ 271 + "ciborium-io", 272 + "half", 273 + ] 274 + 275 + [[package]] 276 + name = "citationberg" 277 + version = "0.5.0" 278 + source = "registry+https://github.com/rust-lang/crates.io-index" 279 + checksum = "e4595e03beafb40235070080b5286d3662525efc622cca599585ff1d63f844fa" 280 + dependencies = [ 281 + "quick-xml 0.36.2", 282 + "serde", 283 + ] 284 + 285 + [[package]] 286 + name = "clap" 287 + version = "4.6.0" 288 + source = "registry+https://github.com/rust-lang/crates.io-index" 289 + checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" 290 + dependencies = [ 291 + "clap_builder", 292 + "clap_derive", 293 + ] 294 + 295 + [[package]] 296 + name = "clap_builder" 297 + version = "4.6.0" 298 + source = "registry+https://github.com/rust-lang/crates.io-index" 299 + checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" 300 + dependencies = [ 301 + "anstream", 302 + "anstyle", 303 + "clap_lex", 304 + "strsim", 305 + ] 306 + 307 + [[package]] 308 + name = "clap_derive" 309 + version = "4.6.0" 310 + source = "registry+https://github.com/rust-lang/crates.io-index" 311 + checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" 312 + dependencies = [ 313 + "heck", 314 + "proc-macro2", 315 + "quote", 316 + "syn", 317 + ] 318 + 319 + [[package]] 320 + name = "clap_lex" 321 + version = "1.1.0" 322 + source = "registry+https://github.com/rust-lang/crates.io-index" 323 + checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" 324 + 325 + [[package]] 326 + name = "cobs" 327 + version = "0.3.0" 328 + source = "registry+https://github.com/rust-lang/crates.io-index" 329 + checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 330 + dependencies = [ 331 + "thiserror 2.0.18", 332 + ] 333 + 334 + [[package]] 335 + name = "codex" 336 + version = "0.1.1" 337 + source = "registry+https://github.com/rust-lang/crates.io-index" 338 + checksum = "724d27a0ee38b700e5e164350e79aba601a0db673ac47fce1cb74c3e38864036" 339 + 340 + [[package]] 341 + name = "color_quant" 342 + version = "1.1.0" 343 + source = "registry+https://github.com/rust-lang/crates.io-index" 344 + checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 345 + 346 + [[package]] 347 + name = "colorchoice" 348 + version = "1.0.5" 349 + source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" 351 + 352 + [[package]] 353 + name = "comemo" 354 + version = "0.4.0" 355 + source = "registry+https://github.com/rust-lang/crates.io-index" 356 + checksum = "df6916408a724339aa77b18214233355f3eb04c42eb895e5f8909215bd8a7a91" 357 + dependencies = [ 358 + "comemo-macros", 359 + "once_cell", 360 + "parking_lot", 361 + "siphasher", 362 + ] 363 + 364 + [[package]] 365 + name = "comemo-macros" 366 + version = "0.4.0" 367 + source = "registry+https://github.com/rust-lang/crates.io-index" 368 + checksum = "c8936e42f9b4f5bdfaf23700609ac1f11cb03ad4c1ec128a4ee4fd0903e228db" 369 + dependencies = [ 370 + "proc-macro2", 371 + "quote", 372 + "syn", 373 + ] 374 + 375 + [[package]] 376 + name = "core-foundation-sys" 377 + version = "0.8.7" 378 + source = "registry+https://github.com/rust-lang/crates.io-index" 379 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 380 + 381 + [[package]] 382 + name = "core_maths" 383 + version = "0.1.1" 384 + source = "registry+https://github.com/rust-lang/crates.io-index" 385 + checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" 386 + dependencies = [ 387 + "libm", 388 + ] 389 + 390 + [[package]] 391 + name = "crc32fast" 392 + version = "1.5.0" 393 + source = "registry+https://github.com/rust-lang/crates.io-index" 394 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 395 + dependencies = [ 396 + "cfg-if", 397 + ] 398 + 399 + [[package]] 400 + name = "crossbeam-deque" 401 + version = "0.8.6" 402 + source = "registry+https://github.com/rust-lang/crates.io-index" 403 + checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 404 + dependencies = [ 405 + "crossbeam-epoch", 406 + "crossbeam-utils", 407 + ] 408 + 409 + [[package]] 410 + name = "crossbeam-epoch" 411 + version = "0.9.18" 412 + source = "registry+https://github.com/rust-lang/crates.io-index" 413 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 414 + dependencies = [ 415 + "crossbeam-utils", 416 + ] 417 + 418 + [[package]] 419 + name = "crossbeam-utils" 420 + version = "0.8.21" 421 + source = "registry+https://github.com/rust-lang/crates.io-index" 422 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 423 + 424 + [[package]] 425 + name = "crunchy" 426 + version = "0.2.4" 427 + source = "registry+https://github.com/rust-lang/crates.io-index" 428 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 429 + 430 + [[package]] 431 + name = "csv" 432 + version = "1.4.0" 433 + source = "registry+https://github.com/rust-lang/crates.io-index" 434 + checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" 435 + dependencies = [ 436 + "csv-core", 437 + "itoa", 438 + "ryu", 439 + "serde_core", 440 + ] 441 + 442 + [[package]] 443 + name = "csv-core" 444 + version = "0.1.13" 445 + source = "registry+https://github.com/rust-lang/crates.io-index" 446 + checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" 447 + dependencies = [ 448 + "memchr", 449 + ] 450 + 451 + [[package]] 452 + name = "data-url" 453 + version = "0.3.2" 454 + source = "registry+https://github.com/rust-lang/crates.io-index" 455 + checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" 456 + 457 + [[package]] 458 + name = "deranged" 459 + version = "0.5.8" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" 462 + dependencies = [ 463 + "powerfmt", 464 + ] 465 + 466 + [[package]] 467 + name = "displaydoc" 468 + version = "0.2.5" 469 + source = "registry+https://github.com/rust-lang/crates.io-index" 470 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 471 + dependencies = [ 472 + "proc-macro2", 473 + "quote", 474 + "syn", 475 + ] 476 + 477 + [[package]] 478 + name = "downcast-rs" 479 + version = "1.2.1" 480 + source = "registry+https://github.com/rust-lang/crates.io-index" 481 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 482 + 483 + [[package]] 484 + name = "ecow" 485 + version = "0.2.6" 486 + source = "registry+https://github.com/rust-lang/crates.io-index" 487 + checksum = "78e4f79b296fbaab6ce2e22d52cb4c7f010fe0ebe7a32e34fa25885fd797bd02" 488 + dependencies = [ 489 + "serde", 490 + ] 491 + 492 + [[package]] 493 + name = "either" 494 + version = "1.15.0" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 497 + 498 + [[package]] 499 + name = "embedded-io" 500 + version = "0.4.0" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 503 + 504 + [[package]] 505 + name = "embedded-io" 506 + version = "0.6.1" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 509 + 510 + [[package]] 511 + name = "enum-ordinalize" 512 + version = "4.3.2" 513 + source = "registry+https://github.com/rust-lang/crates.io-index" 514 + checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" 515 + dependencies = [ 516 + "enum-ordinalize-derive", 517 + ] 518 + 519 + [[package]] 520 + name = "enum-ordinalize-derive" 521 + version = "4.3.2" 522 + source = "registry+https://github.com/rust-lang/crates.io-index" 523 + checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" 524 + dependencies = [ 525 + "proc-macro2", 526 + "quote", 527 + "syn", 528 + ] 529 + 530 + [[package]] 531 + name = "equivalent" 532 + version = "1.0.2" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 535 + 536 + [[package]] 537 + name = "euclid" 538 + version = "0.22.14" 539 + source = "registry+https://github.com/rust-lang/crates.io-index" 540 + checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" 541 + dependencies = [ 542 + "num-traits", 543 + ] 544 + 545 + [[package]] 546 + name = "fancy-regex" 547 + version = "0.16.2" 548 + source = "registry+https://github.com/rust-lang/crates.io-index" 549 + checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" 550 + dependencies = [ 551 + "bit-set", 552 + "regex-automata", 553 + "regex-syntax", 554 + ] 555 + 556 + [[package]] 557 + name = "fast-srgb8" 558 + version = "1.0.0" 559 + source = "registry+https://github.com/rust-lang/crates.io-index" 560 + checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" 561 + 562 + [[package]] 563 + name = "fdeflate" 564 + version = "0.3.7" 565 + source = "registry+https://github.com/rust-lang/crates.io-index" 566 + checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 567 + dependencies = [ 568 + "simd-adler32", 569 + ] 570 + 571 + [[package]] 572 + name = "find-msvc-tools" 573 + version = "0.1.9" 574 + source = "registry+https://github.com/rust-lang/crates.io-index" 575 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 576 + 577 + [[package]] 578 + name = "flate2" 579 + version = "1.1.9" 580 + source = "registry+https://github.com/rust-lang/crates.io-index" 581 + checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" 582 + dependencies = [ 583 + "crc32fast", 584 + "miniz_oxide", 585 + ] 586 + 587 + [[package]] 588 + name = "float-cmp" 589 + version = "0.9.0" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 592 + 593 + [[package]] 594 + name = "fnv" 595 + version = "1.0.7" 596 + source = "registry+https://github.com/rust-lang/crates.io-index" 597 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 598 + 599 + [[package]] 600 + name = "foldhash" 601 + version = "0.1.5" 602 + source = "registry+https://github.com/rust-lang/crates.io-index" 603 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 604 + 605 + [[package]] 606 + name = "fontdb" 607 + version = "0.21.0" 608 + source = "registry+https://github.com/rust-lang/crates.io-index" 609 + checksum = "37be9fc20d966be438cd57a45767f73349477fb0f85ce86e000557f787298afb" 610 + dependencies = [ 611 + "log", 612 + "slotmap", 613 + "tinyvec", 614 + "ttf-parser", 615 + ] 616 + 617 + [[package]] 618 + name = "form_urlencoded" 619 + version = "1.2.2" 620 + source = "registry+https://github.com/rust-lang/crates.io-index" 621 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 622 + dependencies = [ 623 + "percent-encoding", 624 + ] 625 + 626 + [[package]] 627 + name = "gif" 628 + version = "0.14.1" 629 + source = "registry+https://github.com/rust-lang/crates.io-index" 630 + checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" 631 + dependencies = [ 632 + "color_quant", 633 + "weezl", 634 + ] 635 + 636 + [[package]] 637 + name = "half" 638 + version = "2.7.1" 639 + source = "registry+https://github.com/rust-lang/crates.io-index" 640 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 641 + dependencies = [ 642 + "cfg-if", 643 + "crunchy", 644 + "zerocopy", 645 + ] 646 + 647 + [[package]] 648 + name = "hashbrown" 649 + version = "0.15.5" 650 + source = "registry+https://github.com/rust-lang/crates.io-index" 651 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 652 + dependencies = [ 653 + "foldhash", 654 + ] 655 + 656 + [[package]] 657 + name = "hashbrown" 658 + version = "0.16.1" 659 + source = "registry+https://github.com/rust-lang/crates.io-index" 660 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 661 + 662 + [[package]] 663 + name = "hayagriva" 664 + version = "0.8.1" 665 + source = "registry+https://github.com/rust-lang/crates.io-index" 666 + checksum = "954907554bb7fcba29a4f917c2d43e289ec21b69d872ccf97db160eca6caeed8" 667 + dependencies = [ 668 + "biblatex", 669 + "ciborium", 670 + "citationberg", 671 + "indexmap", 672 + "numerals", 673 + "paste", 674 + "serde", 675 + "serde_yaml", 676 + "thiserror 1.0.69", 677 + "unic-langid", 678 + "unicode-segmentation", 679 + "unscanny", 680 + "url", 681 + ] 682 + 683 + [[package]] 684 + name = "heck" 685 + version = "0.5.0" 686 + source = "registry+https://github.com/rust-lang/crates.io-index" 687 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 688 + 689 + [[package]] 690 + name = "hypher" 691 + version = "0.1.6" 692 + source = "registry+https://github.com/rust-lang/crates.io-index" 693 + checksum = "74e25026c579b170c59f8d3ddfc523d7dab0abe079f09eb8edaebd2417044f60" 694 + 695 + [[package]] 696 + name = "iana-time-zone" 697 + version = "0.1.65" 698 + source = "registry+https://github.com/rust-lang/crates.io-index" 699 + checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" 700 + dependencies = [ 701 + "android_system_properties", 702 + "core-foundation-sys", 703 + "iana-time-zone-haiku", 704 + "js-sys", 705 + "log", 706 + "wasm-bindgen", 707 + "windows-core", 708 + ] 709 + 710 + [[package]] 711 + name = "iana-time-zone-haiku" 712 + version = "0.1.2" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 715 + dependencies = [ 716 + "cc", 717 + ] 718 + 719 + [[package]] 720 + name = "icu_collections" 721 + version = "1.5.0" 722 + source = "registry+https://github.com/rust-lang/crates.io-index" 723 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 724 + dependencies = [ 725 + "displaydoc", 726 + "serde", 727 + "yoke 0.7.5", 728 + "zerofrom", 729 + "zerovec 0.10.4", 730 + ] 731 + 732 + [[package]] 733 + name = "icu_collections" 734 + version = "2.1.1" 735 + source = "registry+https://github.com/rust-lang/crates.io-index" 736 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 737 + dependencies = [ 738 + "displaydoc", 739 + "potential_utf", 740 + "yoke 0.8.1", 741 + "zerofrom", 742 + "zerovec 0.11.5", 743 + ] 744 + 745 + [[package]] 746 + name = "icu_locale_core" 747 + version = "2.1.1" 748 + source = "registry+https://github.com/rust-lang/crates.io-index" 749 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 750 + dependencies = [ 751 + "displaydoc", 752 + "litemap 0.8.1", 753 + "tinystr 0.8.2", 754 + "writeable 0.6.2", 755 + "zerovec 0.11.5", 756 + ] 757 + 758 + [[package]] 759 + name = "icu_locid" 760 + version = "1.5.0" 761 + source = "registry+https://github.com/rust-lang/crates.io-index" 762 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 763 + dependencies = [ 764 + "displaydoc", 765 + "litemap 0.7.5", 766 + "tinystr 0.7.6", 767 + "writeable 0.5.5", 768 + "zerovec 0.10.4", 769 + ] 770 + 771 + [[package]] 772 + name = "icu_locid_transform" 773 + version = "1.5.0" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 776 + dependencies = [ 777 + "displaydoc", 778 + "icu_locid", 779 + "icu_locid_transform_data", 780 + "icu_provider 1.5.0", 781 + "tinystr 0.7.6", 782 + "zerovec 0.10.4", 783 + ] 784 + 785 + [[package]] 786 + name = "icu_locid_transform_data" 787 + version = "1.5.1" 788 + source = "registry+https://github.com/rust-lang/crates.io-index" 789 + checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 790 + 791 + [[package]] 792 + name = "icu_normalizer" 793 + version = "2.1.1" 794 + source = "registry+https://github.com/rust-lang/crates.io-index" 795 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 796 + dependencies = [ 797 + "icu_collections 2.1.1", 798 + "icu_normalizer_data", 799 + "icu_properties 2.1.2", 800 + "icu_provider 2.1.1", 801 + "smallvec", 802 + "zerovec 0.11.5", 803 + ] 804 + 805 + [[package]] 806 + name = "icu_normalizer_data" 807 + version = "2.1.1" 808 + source = "registry+https://github.com/rust-lang/crates.io-index" 809 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 810 + 811 + [[package]] 812 + name = "icu_properties" 813 + version = "1.5.1" 814 + source = "registry+https://github.com/rust-lang/crates.io-index" 815 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 816 + dependencies = [ 817 + "displaydoc", 818 + "icu_collections 1.5.0", 819 + "icu_locid_transform", 820 + "icu_properties_data 1.5.1", 821 + "icu_provider 1.5.0", 822 + "serde", 823 + "tinystr 0.7.6", 824 + "zerovec 0.10.4", 825 + ] 826 + 827 + [[package]] 828 + name = "icu_properties" 829 + version = "2.1.2" 830 + source = "registry+https://github.com/rust-lang/crates.io-index" 831 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 832 + dependencies = [ 833 + "icu_collections 2.1.1", 834 + "icu_locale_core", 835 + "icu_properties_data 2.1.2", 836 + "icu_provider 2.1.1", 837 + "zerotrie 0.2.3", 838 + "zerovec 0.11.5", 839 + ] 840 + 841 + [[package]] 842 + name = "icu_properties_data" 843 + version = "1.5.1" 844 + source = "registry+https://github.com/rust-lang/crates.io-index" 845 + checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 846 + 847 + [[package]] 848 + name = "icu_properties_data" 849 + version = "2.1.2" 850 + source = "registry+https://github.com/rust-lang/crates.io-index" 851 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 852 + 853 + [[package]] 854 + name = "icu_provider" 855 + version = "1.5.0" 856 + source = "registry+https://github.com/rust-lang/crates.io-index" 857 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 858 + dependencies = [ 859 + "displaydoc", 860 + "icu_locid", 861 + "icu_provider_macros", 862 + "postcard", 863 + "serde", 864 + "stable_deref_trait", 865 + "tinystr 0.7.6", 866 + "writeable 0.5.5", 867 + "yoke 0.7.5", 868 + "zerofrom", 869 + "zerovec 0.10.4", 870 + ] 871 + 872 + [[package]] 873 + name = "icu_provider" 874 + version = "2.1.1" 875 + source = "registry+https://github.com/rust-lang/crates.io-index" 876 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 877 + dependencies = [ 878 + "displaydoc", 879 + "icu_locale_core", 880 + "writeable 0.6.2", 881 + "yoke 0.8.1", 882 + "zerofrom", 883 + "zerotrie 0.2.3", 884 + "zerovec 0.11.5", 885 + ] 886 + 887 + [[package]] 888 + name = "icu_provider_adapters" 889 + version = "1.5.0" 890 + source = "registry+https://github.com/rust-lang/crates.io-index" 891 + checksum = "d6324dfd08348a8e0374a447ebd334044d766b1839bb8d5ccf2482a99a77c0bc" 892 + dependencies = [ 893 + "icu_locid", 894 + "icu_locid_transform", 895 + "icu_provider 1.5.0", 896 + "tinystr 0.7.6", 897 + "zerovec 0.10.4", 898 + ] 899 + 900 + [[package]] 901 + name = "icu_provider_blob" 902 + version = "1.5.0" 903 + source = "registry+https://github.com/rust-lang/crates.io-index" 904 + checksum = "c24b98d1365f55d78186c205817631a4acf08d7a45bdf5dc9dcf9c5d54dccf51" 905 + dependencies = [ 906 + "icu_provider 1.5.0", 907 + "postcard", 908 + "serde", 909 + "writeable 0.5.5", 910 + "zerotrie 0.1.3", 911 + "zerovec 0.10.4", 912 + ] 913 + 914 + [[package]] 915 + name = "icu_provider_macros" 916 + version = "1.5.0" 917 + source = "registry+https://github.com/rust-lang/crates.io-index" 918 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 919 + dependencies = [ 920 + "proc-macro2", 921 + "quote", 922 + "syn", 923 + ] 924 + 925 + [[package]] 926 + name = "icu_segmenter" 927 + version = "1.5.0" 928 + source = "registry+https://github.com/rust-lang/crates.io-index" 929 + checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" 930 + dependencies = [ 931 + "core_maths", 932 + "displaydoc", 933 + "icu_collections 1.5.0", 934 + "icu_locid", 935 + "icu_provider 1.5.0", 936 + "icu_segmenter_data", 937 + "serde", 938 + "utf8_iter", 939 + "zerovec 0.10.4", 940 + ] 941 + 942 + [[package]] 943 + name = "icu_segmenter_data" 944 + version = "1.5.1" 945 + source = "registry+https://github.com/rust-lang/crates.io-index" 946 + checksum = "a1e52775179941363cc594e49ce99284d13d6948928d8e72c755f55e98caa1eb" 947 + 948 + [[package]] 949 + name = "idna" 950 + version = "1.1.0" 951 + source = "registry+https://github.com/rust-lang/crates.io-index" 952 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 953 + dependencies = [ 954 + "idna_adapter", 955 + "smallvec", 956 + "utf8_iter", 957 + ] 958 + 959 + [[package]] 960 + name = "idna_adapter" 961 + version = "1.2.1" 962 + source = "registry+https://github.com/rust-lang/crates.io-index" 963 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 964 + dependencies = [ 965 + "icu_normalizer", 966 + "icu_properties 2.1.2", 967 + ] 968 + 969 + [[package]] 970 + name = "if_chain" 971 + version = "1.0.3" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" 974 + 975 + [[package]] 976 + name = "image" 977 + version = "0.25.10" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" 980 + dependencies = [ 981 + "bytemuck", 982 + "byteorder-lite", 983 + "color_quant", 984 + "gif", 985 + "moxcms", 986 + "num-traits", 987 + "png 0.18.1", 988 + "zune-core", 989 + "zune-jpeg", 990 + ] 991 + 992 + [[package]] 993 + name = "imagesize" 994 + version = "0.13.0" 995 + source = "registry+https://github.com/rust-lang/crates.io-index" 996 + checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" 997 + 998 + [[package]] 999 + name = "indexmap" 1000 + version = "2.13.0" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 1003 + dependencies = [ 1004 + "equivalent", 1005 + "hashbrown 0.16.1", 1006 + "serde", 1007 + "serde_core", 1008 + ] 1009 + 1010 + [[package]] 1011 + name = "is_terminal_polyfill" 1012 + version = "1.70.2" 1013 + source = "registry+https://github.com/rust-lang/crates.io-index" 1014 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 1015 + 1016 + [[package]] 1017 + name = "itoa" 1018 + version = "1.0.18" 1019 + source = "registry+https://github.com/rust-lang/crates.io-index" 1020 + checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" 1021 + 1022 + [[package]] 1023 + name = "js-sys" 1024 + version = "0.3.93" 1025 + source = "registry+https://github.com/rust-lang/crates.io-index" 1026 + checksum = "797146bb2677299a1eb6b7b50a890f4c361b29ef967addf5b2fa45dae1bb6d7d" 1027 + dependencies = [ 1028 + "once_cell", 1029 + "wasm-bindgen", 1030 + ] 1031 + 1032 + [[package]] 1033 + name = "kamadak-exif" 1034 + version = "0.6.1" 1035 + source = "registry+https://github.com/rust-lang/crates.io-index" 1036 + checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" 1037 + dependencies = [ 1038 + "mutate_once", 1039 + ] 1040 + 1041 + [[package]] 1042 + name = "kurbo" 1043 + version = "0.11.3" 1044 + source = "registry+https://github.com/rust-lang/crates.io-index" 1045 + checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" 1046 + dependencies = [ 1047 + "arrayvec", 1048 + "euclid", 1049 + "smallvec", 1050 + ] 1051 + 1052 + [[package]] 1053 + name = "libc" 1054 + version = "0.2.183" 1055 + source = "registry+https://github.com/rust-lang/crates.io-index" 1056 + checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 1057 + 1058 + [[package]] 1059 + name = "libm" 1060 + version = "0.2.16" 1061 + source = "registry+https://github.com/rust-lang/crates.io-index" 1062 + checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" 1063 + 1064 + [[package]] 1065 + name = "linked-hash-map" 1066 + version = "0.5.6" 1067 + source = "registry+https://github.com/rust-lang/crates.io-index" 1068 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1069 + 1070 + [[package]] 1071 + name = "lipsum" 1072 + version = "0.9.1" 1073 + source = "registry+https://github.com/rust-lang/crates.io-index" 1074 + checksum = "636860251af8963cc40f6b4baadee105f02e21b28131d76eba8e40ce84ab8064" 1075 + dependencies = [ 1076 + "rand", 1077 + "rand_chacha", 1078 + ] 1079 + 1080 + [[package]] 1081 + name = "litemap" 1082 + version = "0.7.5" 1083 + source = "registry+https://github.com/rust-lang/crates.io-index" 1084 + checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 1085 + dependencies = [ 1086 + "serde", 1087 + ] 1088 + 1089 + [[package]] 1090 + name = "litemap" 1091 + version = "0.8.1" 1092 + source = "registry+https://github.com/rust-lang/crates.io-index" 1093 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1094 + 1095 + [[package]] 1096 + name = "lock_api" 1097 + version = "0.4.14" 1098 + source = "registry+https://github.com/rust-lang/crates.io-index" 1099 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1100 + dependencies = [ 1101 + "scopeguard", 1102 + ] 1103 + 1104 + [[package]] 1105 + name = "log" 1106 + version = "0.4.29" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 1109 + 1110 + [[package]] 1111 + name = "mathrender" 1112 + version = "0.1.0" 1113 + dependencies = [ 1114 + "chrono", 1115 + "clap", 1116 + "comemo", 1117 + "tex2typst-rs", 1118 + "typst", 1119 + "typst-assets", 1120 + "typst-library", 1121 + "typst-svg", 1122 + ] 1123 + 1124 + [[package]] 1125 + name = "memchr" 1126 + version = "2.8.0" 1127 + source = "registry+https://github.com/rust-lang/crates.io-index" 1128 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 1129 + 1130 + [[package]] 1131 + name = "miniz_oxide" 1132 + version = "0.8.9" 1133 + source = "registry+https://github.com/rust-lang/crates.io-index" 1134 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1135 + dependencies = [ 1136 + "adler2", 1137 + "simd-adler32", 1138 + ] 1139 + 1140 + [[package]] 1141 + name = "moxcms" 1142 + version = "0.8.1" 1143 + source = "registry+https://github.com/rust-lang/crates.io-index" 1144 + checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" 1145 + dependencies = [ 1146 + "num-traits", 1147 + "pxfm", 1148 + ] 1149 + 1150 + [[package]] 1151 + name = "multi-stash" 1152 + version = "0.2.0" 1153 + source = "registry+https://github.com/rust-lang/crates.io-index" 1154 + checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" 1155 + 1156 + [[package]] 1157 + name = "mutate_once" 1158 + version = "0.1.2" 1159 + source = "registry+https://github.com/rust-lang/crates.io-index" 1160 + checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" 1161 + 1162 + [[package]] 1163 + name = "num-bigint" 1164 + version = "0.4.6" 1165 + source = "registry+https://github.com/rust-lang/crates.io-index" 1166 + checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1167 + dependencies = [ 1168 + "num-integer", 1169 + "num-traits", 1170 + ] 1171 + 1172 + [[package]] 1173 + name = "num-conv" 1174 + version = "0.2.1" 1175 + source = "registry+https://github.com/rust-lang/crates.io-index" 1176 + checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" 1177 + 1178 + [[package]] 1179 + name = "num-integer" 1180 + version = "0.1.46" 1181 + source = "registry+https://github.com/rust-lang/crates.io-index" 1182 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1183 + dependencies = [ 1184 + "num-traits", 1185 + ] 1186 + 1187 + [[package]] 1188 + name = "num-traits" 1189 + version = "0.2.19" 1190 + source = "registry+https://github.com/rust-lang/crates.io-index" 1191 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1192 + dependencies = [ 1193 + "autocfg", 1194 + ] 1195 + 1196 + [[package]] 1197 + name = "numerals" 1198 + version = "0.1.4" 1199 + source = "registry+https://github.com/rust-lang/crates.io-index" 1200 + checksum = "e25be21376a772d15f97ae789845340a9651d3c4246ff5ebb6a2b35f9c37bd31" 1201 + 1202 + [[package]] 1203 + name = "object" 1204 + version = "0.37.3" 1205 + source = "registry+https://github.com/rust-lang/crates.io-index" 1206 + checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 1207 + dependencies = [ 1208 + "memchr", 1209 + ] 1210 + 1211 + [[package]] 1212 + name = "once_cell" 1213 + version = "1.21.4" 1214 + source = "registry+https://github.com/rust-lang/crates.io-index" 1215 + checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" 1216 + 1217 + [[package]] 1218 + name = "once_cell_polyfill" 1219 + version = "1.70.2" 1220 + source = "registry+https://github.com/rust-lang/crates.io-index" 1221 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 1222 + 1223 + [[package]] 1224 + name = "palette" 1225 + version = "0.7.6" 1226 + source = "registry+https://github.com/rust-lang/crates.io-index" 1227 + checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" 1228 + dependencies = [ 1229 + "approx", 1230 + "fast-srgb8", 1231 + "libm", 1232 + "palette_derive", 1233 + ] 1234 + 1235 + [[package]] 1236 + name = "palette_derive" 1237 + version = "0.7.6" 1238 + source = "registry+https://github.com/rust-lang/crates.io-index" 1239 + checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" 1240 + dependencies = [ 1241 + "by_address", 1242 + "proc-macro2", 1243 + "quote", 1244 + "syn", 1245 + ] 1246 + 1247 + [[package]] 1248 + name = "parking_lot" 1249 + version = "0.12.5" 1250 + source = "registry+https://github.com/rust-lang/crates.io-index" 1251 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 1252 + dependencies = [ 1253 + "lock_api", 1254 + "parking_lot_core", 1255 + ] 1256 + 1257 + [[package]] 1258 + name = "parking_lot_core" 1259 + version = "0.9.12" 1260 + source = "registry+https://github.com/rust-lang/crates.io-index" 1261 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 1262 + dependencies = [ 1263 + "cfg-if", 1264 + "libc", 1265 + "redox_syscall", 1266 + "smallvec", 1267 + "windows-link", 1268 + ] 1269 + 1270 + [[package]] 1271 + name = "paste" 1272 + version = "1.0.15" 1273 + source = "registry+https://github.com/rust-lang/crates.io-index" 1274 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1275 + 1276 + [[package]] 1277 + name = "percent-encoding" 1278 + version = "2.3.2" 1279 + source = "registry+https://github.com/rust-lang/crates.io-index" 1280 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1281 + 1282 + [[package]] 1283 + name = "phf" 1284 + version = "0.11.3" 1285 + source = "registry+https://github.com/rust-lang/crates.io-index" 1286 + checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1287 + dependencies = [ 1288 + "phf_macros", 1289 + "phf_shared", 1290 + ] 1291 + 1292 + [[package]] 1293 + name = "phf_generator" 1294 + version = "0.11.3" 1295 + source = "registry+https://github.com/rust-lang/crates.io-index" 1296 + checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 1297 + dependencies = [ 1298 + "phf_shared", 1299 + "rand", 1300 + ] 1301 + 1302 + [[package]] 1303 + name = "phf_macros" 1304 + version = "0.11.3" 1305 + source = "registry+https://github.com/rust-lang/crates.io-index" 1306 + checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" 1307 + dependencies = [ 1308 + "phf_generator", 1309 + "phf_shared", 1310 + "proc-macro2", 1311 + "quote", 1312 + "syn", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "phf_shared" 1317 + version = "0.11.3" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1320 + dependencies = [ 1321 + "siphasher", 1322 + ] 1323 + 1324 + [[package]] 1325 + name = "pico-args" 1326 + version = "0.5.0" 1327 + source = "registry+https://github.com/rust-lang/crates.io-index" 1328 + checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 1329 + 1330 + [[package]] 1331 + name = "plist" 1332 + version = "1.8.0" 1333 + source = "registry+https://github.com/rust-lang/crates.io-index" 1334 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 1335 + dependencies = [ 1336 + "base64", 1337 + "indexmap", 1338 + "quick-xml 0.38.4", 1339 + "serde", 1340 + "time", 1341 + ] 1342 + 1343 + [[package]] 1344 + name = "png" 1345 + version = "0.17.16" 1346 + source = "registry+https://github.com/rust-lang/crates.io-index" 1347 + checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 1348 + dependencies = [ 1349 + "bitflags 1.3.2", 1350 + "crc32fast", 1351 + "fdeflate", 1352 + "flate2", 1353 + "miniz_oxide", 1354 + ] 1355 + 1356 + [[package]] 1357 + name = "png" 1358 + version = "0.18.1" 1359 + source = "registry+https://github.com/rust-lang/crates.io-index" 1360 + checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" 1361 + dependencies = [ 1362 + "bitflags 2.11.0", 1363 + "crc32fast", 1364 + "fdeflate", 1365 + "flate2", 1366 + "miniz_oxide", 1367 + ] 1368 + 1369 + [[package]] 1370 + name = "portable-atomic" 1371 + version = "1.13.1" 1372 + source = "registry+https://github.com/rust-lang/crates.io-index" 1373 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 1374 + 1375 + [[package]] 1376 + name = "postcard" 1377 + version = "1.1.3" 1378 + source = "registry+https://github.com/rust-lang/crates.io-index" 1379 + checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" 1380 + dependencies = [ 1381 + "cobs", 1382 + "embedded-io 0.4.0", 1383 + "embedded-io 0.6.1", 1384 + "serde", 1385 + ] 1386 + 1387 + [[package]] 1388 + name = "potential_utf" 1389 + version = "0.1.4" 1390 + source = "registry+https://github.com/rust-lang/crates.io-index" 1391 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 1392 + dependencies = [ 1393 + "zerovec 0.11.5", 1394 + ] 1395 + 1396 + [[package]] 1397 + name = "powerfmt" 1398 + version = "0.2.0" 1399 + source = "registry+https://github.com/rust-lang/crates.io-index" 1400 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1401 + 1402 + [[package]] 1403 + name = "ppv-lite86" 1404 + version = "0.2.21" 1405 + source = "registry+https://github.com/rust-lang/crates.io-index" 1406 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1407 + dependencies = [ 1408 + "zerocopy", 1409 + ] 1410 + 1411 + [[package]] 1412 + name = "proc-macro2" 1413 + version = "1.0.106" 1414 + source = "registry+https://github.com/rust-lang/crates.io-index" 1415 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 1416 + dependencies = [ 1417 + "unicode-ident", 1418 + ] 1419 + 1420 + [[package]] 1421 + name = "psm" 1422 + version = "0.1.30" 1423 + source = "registry+https://github.com/rust-lang/crates.io-index" 1424 + checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" 1425 + dependencies = [ 1426 + "ar_archive_writer", 1427 + "cc", 1428 + ] 1429 + 1430 + [[package]] 1431 + name = "pxfm" 1432 + version = "0.1.28" 1433 + source = "registry+https://github.com/rust-lang/crates.io-index" 1434 + checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" 1435 + 1436 + [[package]] 1437 + name = "qcms" 1438 + version = "0.3.0" 1439 + source = "registry+https://github.com/rust-lang/crates.io-index" 1440 + checksum = "edecfcd5d755a5e5d98e24cf43113e7cdaec5a070edd0f6b250c03a573da30fa" 1441 + 1442 + [[package]] 1443 + name = "quick-xml" 1444 + version = "0.36.2" 1445 + source = "registry+https://github.com/rust-lang/crates.io-index" 1446 + checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" 1447 + dependencies = [ 1448 + "memchr", 1449 + "serde", 1450 + ] 1451 + 1452 + [[package]] 1453 + name = "quick-xml" 1454 + version = "0.38.4" 1455 + source = "registry+https://github.com/rust-lang/crates.io-index" 1456 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 1457 + dependencies = [ 1458 + "memchr", 1459 + ] 1460 + 1461 + [[package]] 1462 + name = "quote" 1463 + version = "1.0.45" 1464 + source = "registry+https://github.com/rust-lang/crates.io-index" 1465 + checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" 1466 + dependencies = [ 1467 + "proc-macro2", 1468 + ] 1469 + 1470 + [[package]] 1471 + name = "rand" 1472 + version = "0.8.5" 1473 + source = "registry+https://github.com/rust-lang/crates.io-index" 1474 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1475 + dependencies = [ 1476 + "rand_core", 1477 + ] 1478 + 1479 + [[package]] 1480 + name = "rand_chacha" 1481 + version = "0.3.1" 1482 + source = "registry+https://github.com/rust-lang/crates.io-index" 1483 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1484 + dependencies = [ 1485 + "ppv-lite86", 1486 + "rand_core", 1487 + ] 1488 + 1489 + [[package]] 1490 + name = "rand_core" 1491 + version = "0.6.4" 1492 + source = "registry+https://github.com/rust-lang/crates.io-index" 1493 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1494 + 1495 + [[package]] 1496 + name = "rayon" 1497 + version = "1.11.0" 1498 + source = "registry+https://github.com/rust-lang/crates.io-index" 1499 + checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 1500 + dependencies = [ 1501 + "either", 1502 + "rayon-core", 1503 + ] 1504 + 1505 + [[package]] 1506 + name = "rayon-core" 1507 + version = "1.13.0" 1508 + source = "registry+https://github.com/rust-lang/crates.io-index" 1509 + checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 1510 + dependencies = [ 1511 + "crossbeam-deque", 1512 + "crossbeam-utils", 1513 + ] 1514 + 1515 + [[package]] 1516 + name = "redox_syscall" 1517 + version = "0.5.18" 1518 + source = "registry+https://github.com/rust-lang/crates.io-index" 1519 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 1520 + dependencies = [ 1521 + "bitflags 2.11.0", 1522 + ] 1523 + 1524 + [[package]] 1525 + name = "regex" 1526 + version = "1.12.3" 1527 + source = "registry+https://github.com/rust-lang/crates.io-index" 1528 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 1529 + dependencies = [ 1530 + "aho-corasick", 1531 + "memchr", 1532 + "regex-automata", 1533 + "regex-syntax", 1534 + ] 1535 + 1536 + [[package]] 1537 + name = "regex-automata" 1538 + version = "0.4.14" 1539 + source = "registry+https://github.com/rust-lang/crates.io-index" 1540 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 1541 + dependencies = [ 1542 + "aho-corasick", 1543 + "memchr", 1544 + "regex-syntax", 1545 + ] 1546 + 1547 + [[package]] 1548 + name = "regex-syntax" 1549 + version = "0.8.10" 1550 + source = "registry+https://github.com/rust-lang/crates.io-index" 1551 + checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" 1552 + 1553 + [[package]] 1554 + name = "roxmltree" 1555 + version = "0.20.0" 1556 + source = "registry+https://github.com/rust-lang/crates.io-index" 1557 + checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" 1558 + 1559 + [[package]] 1560 + name = "rust_decimal" 1561 + version = "1.41.0" 1562 + source = "registry+https://github.com/rust-lang/crates.io-index" 1563 + checksum = "2ce901f9a19d251159075a4c37af514c3b8ef99c22e02dd8c19161cf397ee94a" 1564 + dependencies = [ 1565 + "arrayvec", 1566 + "num-traits", 1567 + ] 1568 + 1569 + [[package]] 1570 + name = "rustversion" 1571 + version = "1.0.22" 1572 + source = "registry+https://github.com/rust-lang/crates.io-index" 1573 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1574 + 1575 + [[package]] 1576 + name = "rustybuzz" 1577 + version = "0.18.0" 1578 + source = "registry+https://github.com/rust-lang/crates.io-index" 1579 + checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" 1580 + dependencies = [ 1581 + "bitflags 2.11.0", 1582 + "bytemuck", 1583 + "core_maths", 1584 + "log", 1585 + "smallvec", 1586 + "ttf-parser", 1587 + "unicode-bidi-mirroring", 1588 + "unicode-ccc", 1589 + "unicode-properties", 1590 + "unicode-script", 1591 + ] 1592 + 1593 + [[package]] 1594 + name = "ryu" 1595 + version = "1.0.23" 1596 + source = "registry+https://github.com/rust-lang/crates.io-index" 1597 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 1598 + 1599 + [[package]] 1600 + name = "same-file" 1601 + version = "1.0.6" 1602 + source = "registry+https://github.com/rust-lang/crates.io-index" 1603 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1604 + dependencies = [ 1605 + "winapi-util", 1606 + ] 1607 + 1608 + [[package]] 1609 + name = "scopeguard" 1610 + version = "1.2.0" 1611 + source = "registry+https://github.com/rust-lang/crates.io-index" 1612 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1613 + 1614 + [[package]] 1615 + name = "serde" 1616 + version = "1.0.228" 1617 + source = "registry+https://github.com/rust-lang/crates.io-index" 1618 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1619 + dependencies = [ 1620 + "serde_core", 1621 + "serde_derive", 1622 + ] 1623 + 1624 + [[package]] 1625 + name = "serde_core" 1626 + version = "1.0.228" 1627 + source = "registry+https://github.com/rust-lang/crates.io-index" 1628 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1629 + dependencies = [ 1630 + "serde_derive", 1631 + ] 1632 + 1633 + [[package]] 1634 + name = "serde_derive" 1635 + version = "1.0.228" 1636 + source = "registry+https://github.com/rust-lang/crates.io-index" 1637 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1638 + dependencies = [ 1639 + "proc-macro2", 1640 + "quote", 1641 + "syn", 1642 + ] 1643 + 1644 + [[package]] 1645 + name = "serde_json" 1646 + version = "1.0.149" 1647 + source = "registry+https://github.com/rust-lang/crates.io-index" 1648 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 1649 + dependencies = [ 1650 + "itoa", 1651 + "memchr", 1652 + "serde", 1653 + "serde_core", 1654 + "zmij", 1655 + ] 1656 + 1657 + [[package]] 1658 + name = "serde_spanned" 1659 + version = "0.6.9" 1660 + source = "registry+https://github.com/rust-lang/crates.io-index" 1661 + checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" 1662 + dependencies = [ 1663 + "serde", 1664 + ] 1665 + 1666 + [[package]] 1667 + name = "serde_yaml" 1668 + version = "0.9.34+deprecated" 1669 + source = "registry+https://github.com/rust-lang/crates.io-index" 1670 + checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" 1671 + dependencies = [ 1672 + "indexmap", 1673 + "itoa", 1674 + "ryu", 1675 + "serde", 1676 + "unsafe-libyaml", 1677 + ] 1678 + 1679 + [[package]] 1680 + name = "shlex" 1681 + version = "1.3.0" 1682 + source = "registry+https://github.com/rust-lang/crates.io-index" 1683 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1684 + 1685 + [[package]] 1686 + name = "simd-adler32" 1687 + version = "0.3.9" 1688 + source = "registry+https://github.com/rust-lang/crates.io-index" 1689 + checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" 1690 + 1691 + [[package]] 1692 + name = "simplecss" 1693 + version = "0.2.2" 1694 + source = "registry+https://github.com/rust-lang/crates.io-index" 1695 + checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" 1696 + dependencies = [ 1697 + "log", 1698 + ] 1699 + 1700 + [[package]] 1701 + name = "siphasher" 1702 + version = "1.0.2" 1703 + source = "registry+https://github.com/rust-lang/crates.io-index" 1704 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 1705 + 1706 + [[package]] 1707 + name = "slotmap" 1708 + version = "1.1.1" 1709 + source = "registry+https://github.com/rust-lang/crates.io-index" 1710 + checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" 1711 + dependencies = [ 1712 + "version_check", 1713 + ] 1714 + 1715 + [[package]] 1716 + name = "smallvec" 1717 + version = "1.15.1" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1720 + 1721 + [[package]] 1722 + name = "spin" 1723 + version = "0.9.8" 1724 + source = "registry+https://github.com/rust-lang/crates.io-index" 1725 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1726 + 1727 + [[package]] 1728 + name = "stable_deref_trait" 1729 + version = "1.2.1" 1730 + source = "registry+https://github.com/rust-lang/crates.io-index" 1731 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 1732 + 1733 + [[package]] 1734 + name = "stacker" 1735 + version = "0.1.23" 1736 + source = "registry+https://github.com/rust-lang/crates.io-index" 1737 + checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" 1738 + dependencies = [ 1739 + "cc", 1740 + "cfg-if", 1741 + "libc", 1742 + "psm", 1743 + "windows-sys 0.59.0", 1744 + ] 1745 + 1746 + [[package]] 1747 + name = "strict-num" 1748 + version = "0.1.1" 1749 + source = "registry+https://github.com/rust-lang/crates.io-index" 1750 + checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 1751 + dependencies = [ 1752 + "float-cmp", 1753 + ] 1754 + 1755 + [[package]] 1756 + name = "string-interner" 1757 + version = "0.18.0" 1758 + source = "registry+https://github.com/rust-lang/crates.io-index" 1759 + checksum = "1a3275464d7a9f2d4cac57c89c2ef96a8524dba2864c8d6f82e3980baf136f9b" 1760 + dependencies = [ 1761 + "hashbrown 0.15.5", 1762 + "serde", 1763 + ] 1764 + 1765 + [[package]] 1766 + name = "strsim" 1767 + version = "0.11.1" 1768 + source = "registry+https://github.com/rust-lang/crates.io-index" 1769 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1770 + 1771 + [[package]] 1772 + name = "strum" 1773 + version = "0.26.3" 1774 + source = "registry+https://github.com/rust-lang/crates.io-index" 1775 + checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1776 + dependencies = [ 1777 + "strum_macros", 1778 + ] 1779 + 1780 + [[package]] 1781 + name = "strum_macros" 1782 + version = "0.26.4" 1783 + source = "registry+https://github.com/rust-lang/crates.io-index" 1784 + checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1785 + dependencies = [ 1786 + "heck", 1787 + "proc-macro2", 1788 + "quote", 1789 + "rustversion", 1790 + "syn", 1791 + ] 1792 + 1793 + [[package]] 1794 + name = "svgtypes" 1795 + version = "0.15.3" 1796 + source = "registry+https://github.com/rust-lang/crates.io-index" 1797 + checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" 1798 + dependencies = [ 1799 + "kurbo", 1800 + "siphasher", 1801 + ] 1802 + 1803 + [[package]] 1804 + name = "syn" 1805 + version = "2.0.117" 1806 + source = "registry+https://github.com/rust-lang/crates.io-index" 1807 + checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" 1808 + dependencies = [ 1809 + "proc-macro2", 1810 + "quote", 1811 + "unicode-ident", 1812 + ] 1813 + 1814 + [[package]] 1815 + name = "synstructure" 1816 + version = "0.13.2" 1817 + source = "registry+https://github.com/rust-lang/crates.io-index" 1818 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1819 + dependencies = [ 1820 + "proc-macro2", 1821 + "quote", 1822 + "syn", 1823 + ] 1824 + 1825 + [[package]] 1826 + name = "syntect" 1827 + version = "5.3.0" 1828 + source = "registry+https://github.com/rust-lang/crates.io-index" 1829 + checksum = "656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925" 1830 + dependencies = [ 1831 + "bincode", 1832 + "fancy-regex", 1833 + "flate2", 1834 + "fnv", 1835 + "once_cell", 1836 + "plist", 1837 + "regex-syntax", 1838 + "serde", 1839 + "serde_derive", 1840 + "serde_json", 1841 + "thiserror 2.0.18", 1842 + "walkdir", 1843 + "yaml-rust", 1844 + ] 1845 + 1846 + [[package]] 1847 + name = "tex2typst-rs" 1848 + version = "0.1.1" 1849 + source = "registry+https://github.com/rust-lang/crates.io-index" 1850 + checksum = "56c26c8137bfe94380528b96a2a753d2a041348ecb9fd991d6b0c2a6e29c74ad" 1851 + dependencies = [ 1852 + "regex", 1853 + ] 1854 + 1855 + [[package]] 1856 + name = "thin-vec" 1857 + version = "0.2.14" 1858 + source = "registry+https://github.com/rust-lang/crates.io-index" 1859 + checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" 1860 + 1861 + [[package]] 1862 + name = "thiserror" 1863 + version = "1.0.69" 1864 + source = "registry+https://github.com/rust-lang/crates.io-index" 1865 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1866 + dependencies = [ 1867 + "thiserror-impl 1.0.69", 1868 + ] 1869 + 1870 + [[package]] 1871 + name = "thiserror" 1872 + version = "2.0.18" 1873 + source = "registry+https://github.com/rust-lang/crates.io-index" 1874 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 1875 + dependencies = [ 1876 + "thiserror-impl 2.0.18", 1877 + ] 1878 + 1879 + [[package]] 1880 + name = "thiserror-impl" 1881 + version = "1.0.69" 1882 + source = "registry+https://github.com/rust-lang/crates.io-index" 1883 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1884 + dependencies = [ 1885 + "proc-macro2", 1886 + "quote", 1887 + "syn", 1888 + ] 1889 + 1890 + [[package]] 1891 + name = "thiserror-impl" 1892 + version = "2.0.18" 1893 + source = "registry+https://github.com/rust-lang/crates.io-index" 1894 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 1895 + dependencies = [ 1896 + "proc-macro2", 1897 + "quote", 1898 + "syn", 1899 + ] 1900 + 1901 + [[package]] 1902 + name = "time" 1903 + version = "0.3.47" 1904 + source = "registry+https://github.com/rust-lang/crates.io-index" 1905 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 1906 + dependencies = [ 1907 + "deranged", 1908 + "itoa", 1909 + "num-conv", 1910 + "powerfmt", 1911 + "serde_core", 1912 + "time-core", 1913 + "time-macros", 1914 + ] 1915 + 1916 + [[package]] 1917 + name = "time-core" 1918 + version = "0.1.8" 1919 + source = "registry+https://github.com/rust-lang/crates.io-index" 1920 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 1921 + 1922 + [[package]] 1923 + name = "time-macros" 1924 + version = "0.2.27" 1925 + source = "registry+https://github.com/rust-lang/crates.io-index" 1926 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" 1927 + dependencies = [ 1928 + "num-conv", 1929 + "time-core", 1930 + ] 1931 + 1932 + [[package]] 1933 + name = "tiny-skia-path" 1934 + version = "0.11.4" 1935 + source = "registry+https://github.com/rust-lang/crates.io-index" 1936 + checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 1937 + dependencies = [ 1938 + "arrayref", 1939 + "bytemuck", 1940 + "strict-num", 1941 + ] 1942 + 1943 + [[package]] 1944 + name = "tinystr" 1945 + version = "0.7.6" 1946 + source = "registry+https://github.com/rust-lang/crates.io-index" 1947 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1948 + dependencies = [ 1949 + "displaydoc", 1950 + "serde", 1951 + "zerovec 0.10.4", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "tinystr" 1956 + version = "0.8.2" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 1959 + dependencies = [ 1960 + "displaydoc", 1961 + "serde_core", 1962 + "zerovec 0.11.5", 1963 + ] 1964 + 1965 + [[package]] 1966 + name = "tinyvec" 1967 + version = "1.11.0" 1968 + source = "registry+https://github.com/rust-lang/crates.io-index" 1969 + checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" 1970 + dependencies = [ 1971 + "tinyvec_macros", 1972 + ] 1973 + 1974 + [[package]] 1975 + name = "tinyvec_macros" 1976 + version = "0.1.1" 1977 + source = "registry+https://github.com/rust-lang/crates.io-index" 1978 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1979 + 1980 + [[package]] 1981 + name = "toml" 1982 + version = "0.8.23" 1983 + source = "registry+https://github.com/rust-lang/crates.io-index" 1984 + checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 1985 + dependencies = [ 1986 + "serde", 1987 + "serde_spanned", 1988 + "toml_datetime", 1989 + "toml_edit", 1990 + ] 1991 + 1992 + [[package]] 1993 + name = "toml_datetime" 1994 + version = "0.6.11" 1995 + source = "registry+https://github.com/rust-lang/crates.io-index" 1996 + checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 1997 + dependencies = [ 1998 + "serde", 1999 + ] 2000 + 2001 + [[package]] 2002 + name = "toml_edit" 2003 + version = "0.22.27" 2004 + source = "registry+https://github.com/rust-lang/crates.io-index" 2005 + checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 2006 + dependencies = [ 2007 + "indexmap", 2008 + "serde", 2009 + "serde_spanned", 2010 + "toml_datetime", 2011 + "toml_write", 2012 + "winnow", 2013 + ] 2014 + 2015 + [[package]] 2016 + name = "toml_write" 2017 + version = "0.1.2" 2018 + source = "registry+https://github.com/rust-lang/crates.io-index" 2019 + checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 2020 + 2021 + [[package]] 2022 + name = "ttf-parser" 2023 + version = "0.24.1" 2024 + source = "registry+https://github.com/rust-lang/crates.io-index" 2025 + checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" 2026 + dependencies = [ 2027 + "core_maths", 2028 + ] 2029 + 2030 + [[package]] 2031 + name = "two-face" 2032 + version = "0.4.5" 2033 + source = "registry+https://github.com/rust-lang/crates.io-index" 2034 + checksum = "39e51b6e60e545cfdae5a4639ff423818f52372211a8d9a3e892b4b0761f76b2" 2035 + dependencies = [ 2036 + "serde", 2037 + "serde_derive", 2038 + "syntect", 2039 + ] 2040 + 2041 + [[package]] 2042 + name = "typed-arena" 2043 + version = "2.0.2" 2044 + source = "registry+https://github.com/rust-lang/crates.io-index" 2045 + checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" 2046 + 2047 + [[package]] 2048 + name = "typst" 2049 + version = "0.13.1" 2050 + source = "registry+https://github.com/rust-lang/crates.io-index" 2051 + checksum = "140458bc8c72b014266f8ea5fad57165c8159845105eea8949c8954b2a8f49f4" 2052 + dependencies = [ 2053 + "comemo", 2054 + "ecow", 2055 + "typst-eval", 2056 + "typst-html", 2057 + "typst-layout", 2058 + "typst-library", 2059 + "typst-macros", 2060 + "typst-realize", 2061 + "typst-syntax", 2062 + "typst-timing", 2063 + "typst-utils", 2064 + ] 2065 + 2066 + [[package]] 2067 + name = "typst-assets" 2068 + version = "0.13.1" 2069 + source = "registry+https://github.com/rust-lang/crates.io-index" 2070 + checksum = "b5bf0cc3c2265502b51fcb73147cc7c951ceb694507195b93c2ab0b901abb902" 2071 + 2072 + [[package]] 2073 + name = "typst-eval" 2074 + version = "0.13.1" 2075 + source = "registry+https://github.com/rust-lang/crates.io-index" 2076 + checksum = "850733c95becdb1b0153fd50e979b06d1a3d42f2411f2a0206b3a793501205ac" 2077 + dependencies = [ 2078 + "comemo", 2079 + "ecow", 2080 + "if_chain", 2081 + "indexmap", 2082 + "stacker", 2083 + "toml", 2084 + "typst-library", 2085 + "typst-macros", 2086 + "typst-syntax", 2087 + "typst-timing", 2088 + "typst-utils", 2089 + "unicode-segmentation", 2090 + ] 2091 + 2092 + [[package]] 2093 + name = "typst-html" 2094 + version = "0.13.1" 2095 + source = "registry+https://github.com/rust-lang/crates.io-index" 2096 + checksum = "654de5a88b9104f9b19723166eb16b8aec6df72a060d91736b81dc72e905e7cc" 2097 + dependencies = [ 2098 + "comemo", 2099 + "ecow", 2100 + "typst-library", 2101 + "typst-macros", 2102 + "typst-svg", 2103 + "typst-syntax", 2104 + "typst-timing", 2105 + "typst-utils", 2106 + ] 2107 + 2108 + [[package]] 2109 + name = "typst-layout" 2110 + version = "0.13.1" 2111 + source = "registry+https://github.com/rust-lang/crates.io-index" 2112 + checksum = "dc7f7129c44423e54e9943c8a87403a82e8a5a1bdfd3ef08c0aae1b66deec696" 2113 + dependencies = [ 2114 + "az", 2115 + "bumpalo", 2116 + "comemo", 2117 + "ecow", 2118 + "hypher", 2119 + "icu_properties 1.5.1", 2120 + "icu_provider 1.5.0", 2121 + "icu_provider_adapters", 2122 + "icu_provider_blob", 2123 + "icu_segmenter", 2124 + "kurbo", 2125 + "rustybuzz", 2126 + "smallvec", 2127 + "ttf-parser", 2128 + "typst-assets", 2129 + "typst-library", 2130 + "typst-macros", 2131 + "typst-syntax", 2132 + "typst-timing", 2133 + "typst-utils", 2134 + "unicode-bidi", 2135 + "unicode-math-class", 2136 + "unicode-script", 2137 + "unicode-segmentation", 2138 + ] 2139 + 2140 + [[package]] 2141 + name = "typst-library" 2142 + version = "0.13.1" 2143 + source = "registry+https://github.com/rust-lang/crates.io-index" 2144 + checksum = "722b0d6dfd05aa5bb7da7f282586f624f452e3f285cd3a10ac0d7e99f3bc3048" 2145 + dependencies = [ 2146 + "az", 2147 + "bitflags 2.11.0", 2148 + "bumpalo", 2149 + "chinese-number", 2150 + "ciborium", 2151 + "codex", 2152 + "comemo", 2153 + "csv", 2154 + "ecow", 2155 + "flate2", 2156 + "fontdb", 2157 + "hayagriva", 2158 + "icu_properties 1.5.1", 2159 + "icu_provider 1.5.0", 2160 + "icu_provider_blob", 2161 + "image", 2162 + "indexmap", 2163 + "kamadak-exif", 2164 + "kurbo", 2165 + "lipsum", 2166 + "memchr", 2167 + "palette", 2168 + "phf", 2169 + "png 0.17.16", 2170 + "qcms", 2171 + "rayon", 2172 + "regex", 2173 + "regex-syntax", 2174 + "roxmltree", 2175 + "rust_decimal", 2176 + "rustybuzz", 2177 + "serde", 2178 + "serde_json", 2179 + "serde_yaml", 2180 + "siphasher", 2181 + "smallvec", 2182 + "syntect", 2183 + "time", 2184 + "toml", 2185 + "ttf-parser", 2186 + "two-face", 2187 + "typed-arena", 2188 + "typst-assets", 2189 + "typst-macros", 2190 + "typst-syntax", 2191 + "typst-timing", 2192 + "typst-utils", 2193 + "unicode-math-class", 2194 + "unicode-segmentation", 2195 + "unscanny", 2196 + "usvg", 2197 + "wasmi", 2198 + "xmlwriter", 2199 + ] 2200 + 2201 + [[package]] 2202 + name = "typst-macros" 2203 + version = "0.13.1" 2204 + source = "registry+https://github.com/rust-lang/crates.io-index" 2205 + checksum = "c5a7667bf2ff3111e25744e72abfdbbed5fed9a37476043448e935697e55a6fb" 2206 + dependencies = [ 2207 + "heck", 2208 + "proc-macro2", 2209 + "quote", 2210 + "syn", 2211 + ] 2212 + 2213 + [[package]] 2214 + name = "typst-realize" 2215 + version = "0.13.1" 2216 + source = "registry+https://github.com/rust-lang/crates.io-index" 2217 + checksum = "7bc724c3303b9864c01f25292d82c3aa8f0492512bd890836f1fb7242fa5b8af" 2218 + dependencies = [ 2219 + "arrayvec", 2220 + "bumpalo", 2221 + "comemo", 2222 + "ecow", 2223 + "regex", 2224 + "typst-library", 2225 + "typst-macros", 2226 + "typst-syntax", 2227 + "typst-timing", 2228 + "typst-utils", 2229 + ] 2230 + 2231 + [[package]] 2232 + name = "typst-svg" 2233 + version = "0.13.1" 2234 + source = "registry+https://github.com/rust-lang/crates.io-index" 2235 + checksum = "674c8e5cb94015c9f870c48bace6b64eb706075766643f3b1f67606c6b03feae" 2236 + dependencies = [ 2237 + "base64", 2238 + "comemo", 2239 + "ecow", 2240 + "flate2", 2241 + "image", 2242 + "ttf-parser", 2243 + "typst-library", 2244 + "typst-macros", 2245 + "typst-timing", 2246 + "typst-utils", 2247 + "xmlparser", 2248 + "xmlwriter", 2249 + ] 2250 + 2251 + [[package]] 2252 + name = "typst-syntax" 2253 + version = "0.13.1" 2254 + source = "registry+https://github.com/rust-lang/crates.io-index" 2255 + checksum = "5ba949ac75a374ea6b2f61d32e6c63acb818e6179d16f78b2cba988fbb5e23a8" 2256 + dependencies = [ 2257 + "ecow", 2258 + "serde", 2259 + "toml", 2260 + "typst-timing", 2261 + "typst-utils", 2262 + "unicode-ident", 2263 + "unicode-math-class", 2264 + "unicode-script", 2265 + "unicode-segmentation", 2266 + "unscanny", 2267 + ] 2268 + 2269 + [[package]] 2270 + name = "typst-timing" 2271 + version = "0.13.1" 2272 + source = "registry+https://github.com/rust-lang/crates.io-index" 2273 + checksum = "8ba4541664e98be2023db2267d92af206190eb903063a0229c668e1ab9dca976" 2274 + dependencies = [ 2275 + "parking_lot", 2276 + "serde", 2277 + "serde_json", 2278 + ] 2279 + 2280 + [[package]] 2281 + name = "typst-utils" 2282 + version = "0.13.1" 2283 + source = "registry+https://github.com/rust-lang/crates.io-index" 2284 + checksum = "0eb71d59967e0fb32341f8a94f41ced8da520c63705cca2686ae653c9408fd96" 2285 + dependencies = [ 2286 + "once_cell", 2287 + "portable-atomic", 2288 + "rayon", 2289 + "siphasher", 2290 + "thin-vec", 2291 + "unicode-math-class", 2292 + ] 2293 + 2294 + [[package]] 2295 + name = "unic-langid" 2296 + version = "0.9.6" 2297 + source = "registry+https://github.com/rust-lang/crates.io-index" 2298 + checksum = "a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05" 2299 + dependencies = [ 2300 + "unic-langid-impl", 2301 + ] 2302 + 2303 + [[package]] 2304 + name = "unic-langid-impl" 2305 + version = "0.9.6" 2306 + source = "registry+https://github.com/rust-lang/crates.io-index" 2307 + checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" 2308 + dependencies = [ 2309 + "serde", 2310 + "tinystr 0.8.2", 2311 + ] 2312 + 2313 + [[package]] 2314 + name = "unicode-bidi" 2315 + version = "0.3.18" 2316 + source = "registry+https://github.com/rust-lang/crates.io-index" 2317 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2318 + 2319 + [[package]] 2320 + name = "unicode-bidi-mirroring" 2321 + version = "0.3.0" 2322 + source = "registry+https://github.com/rust-lang/crates.io-index" 2323 + checksum = "64af057ad7466495ca113126be61838d8af947f41d93a949980b2389a118082f" 2324 + 2325 + [[package]] 2326 + name = "unicode-ccc" 2327 + version = "0.3.0" 2328 + source = "registry+https://github.com/rust-lang/crates.io-index" 2329 + checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" 2330 + 2331 + [[package]] 2332 + name = "unicode-ident" 2333 + version = "1.0.24" 2334 + source = "registry+https://github.com/rust-lang/crates.io-index" 2335 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 2336 + 2337 + [[package]] 2338 + name = "unicode-math-class" 2339 + version = "0.1.0" 2340 + source = "registry+https://github.com/rust-lang/crates.io-index" 2341 + checksum = "7d246cf599d5fae3c8d56e04b20eb519adb89a8af8d0b0fbcded369aa3647d65" 2342 + 2343 + [[package]] 2344 + name = "unicode-normalization" 2345 + version = "0.1.25" 2346 + source = "registry+https://github.com/rust-lang/crates.io-index" 2347 + checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" 2348 + dependencies = [ 2349 + "tinyvec", 2350 + ] 2351 + 2352 + [[package]] 2353 + name = "unicode-properties" 2354 + version = "0.1.4" 2355 + source = "registry+https://github.com/rust-lang/crates.io-index" 2356 + checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" 2357 + 2358 + [[package]] 2359 + name = "unicode-script" 2360 + version = "0.5.8" 2361 + source = "registry+https://github.com/rust-lang/crates.io-index" 2362 + checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" 2363 + 2364 + [[package]] 2365 + name = "unicode-segmentation" 2366 + version = "1.13.2" 2367 + source = "registry+https://github.com/rust-lang/crates.io-index" 2368 + checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" 2369 + 2370 + [[package]] 2371 + name = "unicode-vo" 2372 + version = "0.1.0" 2373 + source = "registry+https://github.com/rust-lang/crates.io-index" 2374 + checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" 2375 + 2376 + [[package]] 2377 + name = "unsafe-libyaml" 2378 + version = "0.2.11" 2379 + source = "registry+https://github.com/rust-lang/crates.io-index" 2380 + checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" 2381 + 2382 + [[package]] 2383 + name = "unscanny" 2384 + version = "0.1.0" 2385 + source = "registry+https://github.com/rust-lang/crates.io-index" 2386 + checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" 2387 + 2388 + [[package]] 2389 + name = "url" 2390 + version = "2.5.8" 2391 + source = "registry+https://github.com/rust-lang/crates.io-index" 2392 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 2393 + dependencies = [ 2394 + "form_urlencoded", 2395 + "idna", 2396 + "percent-encoding", 2397 + "serde", 2398 + "serde_derive", 2399 + ] 2400 + 2401 + [[package]] 2402 + name = "usvg" 2403 + version = "0.43.0" 2404 + source = "registry+https://github.com/rust-lang/crates.io-index" 2405 + checksum = "6803057b5cbb426e9fb8ce2216f3a9b4ca1dd2c705ba3cbebc13006e437735fd" 2406 + dependencies = [ 2407 + "base64", 2408 + "data-url", 2409 + "flate2", 2410 + "fontdb", 2411 + "imagesize", 2412 + "kurbo", 2413 + "log", 2414 + "pico-args", 2415 + "roxmltree", 2416 + "rustybuzz", 2417 + "simplecss", 2418 + "siphasher", 2419 + "strict-num", 2420 + "svgtypes", 2421 + "tiny-skia-path", 2422 + "unicode-bidi", 2423 + "unicode-script", 2424 + "unicode-vo", 2425 + "xmlwriter", 2426 + ] 2427 + 2428 + [[package]] 2429 + name = "utf8_iter" 2430 + version = "1.0.4" 2431 + source = "registry+https://github.com/rust-lang/crates.io-index" 2432 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2433 + 2434 + [[package]] 2435 + name = "utf8parse" 2436 + version = "0.2.2" 2437 + source = "registry+https://github.com/rust-lang/crates.io-index" 2438 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2439 + 2440 + [[package]] 2441 + name = "version_check" 2442 + version = "0.9.5" 2443 + source = "registry+https://github.com/rust-lang/crates.io-index" 2444 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2445 + 2446 + [[package]] 2447 + name = "walkdir" 2448 + version = "2.5.0" 2449 + source = "registry+https://github.com/rust-lang/crates.io-index" 2450 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2451 + dependencies = [ 2452 + "same-file", 2453 + "winapi-util", 2454 + ] 2455 + 2456 + [[package]] 2457 + name = "wasm-bindgen" 2458 + version = "0.2.116" 2459 + source = "registry+https://github.com/rust-lang/crates.io-index" 2460 + checksum = "7dc0882f7b5bb01ae8c5215a1230832694481c1a4be062fd410e12ea3da5b631" 2461 + dependencies = [ 2462 + "cfg-if", 2463 + "once_cell", 2464 + "rustversion", 2465 + "wasm-bindgen-macro", 2466 + "wasm-bindgen-shared", 2467 + ] 2468 + 2469 + [[package]] 2470 + name = "wasm-bindgen-macro" 2471 + version = "0.2.116" 2472 + source = "registry+https://github.com/rust-lang/crates.io-index" 2473 + checksum = "75973d3066e01d035dbedaad2864c398df42f8dd7b1ea057c35b8407c015b537" 2474 + dependencies = [ 2475 + "quote", 2476 + "wasm-bindgen-macro-support", 2477 + ] 2478 + 2479 + [[package]] 2480 + name = "wasm-bindgen-macro-support" 2481 + version = "0.2.116" 2482 + source = "registry+https://github.com/rust-lang/crates.io-index" 2483 + checksum = "91af5e4be765819e0bcfee7322c14374dc821e35e72fa663a830bbc7dc199eac" 2484 + dependencies = [ 2485 + "bumpalo", 2486 + "proc-macro2", 2487 + "quote", 2488 + "syn", 2489 + "wasm-bindgen-shared", 2490 + ] 2491 + 2492 + [[package]] 2493 + name = "wasm-bindgen-shared" 2494 + version = "0.2.116" 2495 + source = "registry+https://github.com/rust-lang/crates.io-index" 2496 + checksum = "c9bf0406a78f02f336bf1e451799cca198e8acde4ffa278f0fb20487b150a633" 2497 + dependencies = [ 2498 + "unicode-ident", 2499 + ] 2500 + 2501 + [[package]] 2502 + name = "wasmi" 2503 + version = "0.40.0" 2504 + source = "registry+https://github.com/rust-lang/crates.io-index" 2505 + checksum = "a19af97fcb96045dd1d6b4d23e2b4abdbbe81723dbc5c9f016eb52145b320063" 2506 + dependencies = [ 2507 + "arrayvec", 2508 + "multi-stash", 2509 + "smallvec", 2510 + "spin", 2511 + "wasmi_collections", 2512 + "wasmi_core", 2513 + "wasmi_ir", 2514 + "wasmparser", 2515 + ] 2516 + 2517 + [[package]] 2518 + name = "wasmi_collections" 2519 + version = "0.40.0" 2520 + source = "registry+https://github.com/rust-lang/crates.io-index" 2521 + checksum = "e80d6b275b1c922021939d561574bf376613493ae2b61c6963b15db0e8813562" 2522 + dependencies = [ 2523 + "string-interner", 2524 + ] 2525 + 2526 + [[package]] 2527 + name = "wasmi_core" 2528 + version = "0.40.0" 2529 + source = "registry+https://github.com/rust-lang/crates.io-index" 2530 + checksum = "3a8c51482cc32d31c2c7ff211cd2bedd73c5bd057ba16a2ed0110e7a96097c33" 2531 + dependencies = [ 2532 + "downcast-rs", 2533 + "libm", 2534 + ] 2535 + 2536 + [[package]] 2537 + name = "wasmi_ir" 2538 + version = "0.40.0" 2539 + source = "registry+https://github.com/rust-lang/crates.io-index" 2540 + checksum = "6e431a14c186db59212a88516788bd68ed51f87aa1e08d1df742522867b5289a" 2541 + dependencies = [ 2542 + "wasmi_core", 2543 + ] 2544 + 2545 + [[package]] 2546 + name = "wasmparser" 2547 + version = "0.221.3" 2548 + source = "registry+https://github.com/rust-lang/crates.io-index" 2549 + checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" 2550 + dependencies = [ 2551 + "bitflags 2.11.0", 2552 + "indexmap", 2553 + ] 2554 + 2555 + [[package]] 2556 + name = "weezl" 2557 + version = "0.1.12" 2558 + source = "registry+https://github.com/rust-lang/crates.io-index" 2559 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 2560 + 2561 + [[package]] 2562 + name = "winapi-util" 2563 + version = "0.1.11" 2564 + source = "registry+https://github.com/rust-lang/crates.io-index" 2565 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 2566 + dependencies = [ 2567 + "windows-sys 0.61.2", 2568 + ] 2569 + 2570 + [[package]] 2571 + name = "windows-core" 2572 + version = "0.62.2" 2573 + source = "registry+https://github.com/rust-lang/crates.io-index" 2574 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 2575 + dependencies = [ 2576 + "windows-implement", 2577 + "windows-interface", 2578 + "windows-link", 2579 + "windows-result", 2580 + "windows-strings", 2581 + ] 2582 + 2583 + [[package]] 2584 + name = "windows-implement" 2585 + version = "0.60.2" 2586 + source = "registry+https://github.com/rust-lang/crates.io-index" 2587 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 2588 + dependencies = [ 2589 + "proc-macro2", 2590 + "quote", 2591 + "syn", 2592 + ] 2593 + 2594 + [[package]] 2595 + name = "windows-interface" 2596 + version = "0.59.3" 2597 + source = "registry+https://github.com/rust-lang/crates.io-index" 2598 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 2599 + dependencies = [ 2600 + "proc-macro2", 2601 + "quote", 2602 + "syn", 2603 + ] 2604 + 2605 + [[package]] 2606 + name = "windows-link" 2607 + version = "0.2.1" 2608 + source = "registry+https://github.com/rust-lang/crates.io-index" 2609 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 2610 + 2611 + [[package]] 2612 + name = "windows-result" 2613 + version = "0.4.1" 2614 + source = "registry+https://github.com/rust-lang/crates.io-index" 2615 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 2616 + dependencies = [ 2617 + "windows-link", 2618 + ] 2619 + 2620 + [[package]] 2621 + name = "windows-strings" 2622 + version = "0.5.1" 2623 + source = "registry+https://github.com/rust-lang/crates.io-index" 2624 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 2625 + dependencies = [ 2626 + "windows-link", 2627 + ] 2628 + 2629 + [[package]] 2630 + name = "windows-sys" 2631 + version = "0.59.0" 2632 + source = "registry+https://github.com/rust-lang/crates.io-index" 2633 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2634 + dependencies = [ 2635 + "windows-targets", 2636 + ] 2637 + 2638 + [[package]] 2639 + name = "windows-sys" 2640 + version = "0.61.2" 2641 + source = "registry+https://github.com/rust-lang/crates.io-index" 2642 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 2643 + dependencies = [ 2644 + "windows-link", 2645 + ] 2646 + 2647 + [[package]] 2648 + name = "windows-targets" 2649 + version = "0.52.6" 2650 + source = "registry+https://github.com/rust-lang/crates.io-index" 2651 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2652 + dependencies = [ 2653 + "windows_aarch64_gnullvm", 2654 + "windows_aarch64_msvc", 2655 + "windows_i686_gnu", 2656 + "windows_i686_gnullvm", 2657 + "windows_i686_msvc", 2658 + "windows_x86_64_gnu", 2659 + "windows_x86_64_gnullvm", 2660 + "windows_x86_64_msvc", 2661 + ] 2662 + 2663 + [[package]] 2664 + name = "windows_aarch64_gnullvm" 2665 + version = "0.52.6" 2666 + source = "registry+https://github.com/rust-lang/crates.io-index" 2667 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2668 + 2669 + [[package]] 2670 + name = "windows_aarch64_msvc" 2671 + version = "0.52.6" 2672 + source = "registry+https://github.com/rust-lang/crates.io-index" 2673 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2674 + 2675 + [[package]] 2676 + name = "windows_i686_gnu" 2677 + version = "0.52.6" 2678 + source = "registry+https://github.com/rust-lang/crates.io-index" 2679 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2680 + 2681 + [[package]] 2682 + name = "windows_i686_gnullvm" 2683 + version = "0.52.6" 2684 + source = "registry+https://github.com/rust-lang/crates.io-index" 2685 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2686 + 2687 + [[package]] 2688 + name = "windows_i686_msvc" 2689 + version = "0.52.6" 2690 + source = "registry+https://github.com/rust-lang/crates.io-index" 2691 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2692 + 2693 + [[package]] 2694 + name = "windows_x86_64_gnu" 2695 + version = "0.52.6" 2696 + source = "registry+https://github.com/rust-lang/crates.io-index" 2697 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2698 + 2699 + [[package]] 2700 + name = "windows_x86_64_gnullvm" 2701 + version = "0.52.6" 2702 + source = "registry+https://github.com/rust-lang/crates.io-index" 2703 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2704 + 2705 + [[package]] 2706 + name = "windows_x86_64_msvc" 2707 + version = "0.52.6" 2708 + source = "registry+https://github.com/rust-lang/crates.io-index" 2709 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2710 + 2711 + [[package]] 2712 + name = "winnow" 2713 + version = "0.7.15" 2714 + source = "registry+https://github.com/rust-lang/crates.io-index" 2715 + checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" 2716 + dependencies = [ 2717 + "memchr", 2718 + ] 2719 + 2720 + [[package]] 2721 + name = "writeable" 2722 + version = "0.5.5" 2723 + source = "registry+https://github.com/rust-lang/crates.io-index" 2724 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2725 + 2726 + [[package]] 2727 + name = "writeable" 2728 + version = "0.6.2" 2729 + source = "registry+https://github.com/rust-lang/crates.io-index" 2730 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 2731 + 2732 + [[package]] 2733 + name = "xmlparser" 2734 + version = "0.13.6" 2735 + source = "registry+https://github.com/rust-lang/crates.io-index" 2736 + checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 2737 + 2738 + [[package]] 2739 + name = "xmlwriter" 2740 + version = "0.1.0" 2741 + source = "registry+https://github.com/rust-lang/crates.io-index" 2742 + checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" 2743 + 2744 + [[package]] 2745 + name = "yaml-rust" 2746 + version = "0.4.5" 2747 + source = "registry+https://github.com/rust-lang/crates.io-index" 2748 + checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 2749 + dependencies = [ 2750 + "linked-hash-map", 2751 + ] 2752 + 2753 + [[package]] 2754 + name = "yoke" 2755 + version = "0.7.5" 2756 + source = "registry+https://github.com/rust-lang/crates.io-index" 2757 + checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2758 + dependencies = [ 2759 + "serde", 2760 + "stable_deref_trait", 2761 + "yoke-derive 0.7.5", 2762 + "zerofrom", 2763 + ] 2764 + 2765 + [[package]] 2766 + name = "yoke" 2767 + version = "0.8.1" 2768 + source = "registry+https://github.com/rust-lang/crates.io-index" 2769 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 2770 + dependencies = [ 2771 + "stable_deref_trait", 2772 + "yoke-derive 0.8.1", 2773 + "zerofrom", 2774 + ] 2775 + 2776 + [[package]] 2777 + name = "yoke-derive" 2778 + version = "0.7.5" 2779 + source = "registry+https://github.com/rust-lang/crates.io-index" 2780 + checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2781 + dependencies = [ 2782 + "proc-macro2", 2783 + "quote", 2784 + "syn", 2785 + "synstructure", 2786 + ] 2787 + 2788 + [[package]] 2789 + name = "yoke-derive" 2790 + version = "0.8.1" 2791 + source = "registry+https://github.com/rust-lang/crates.io-index" 2792 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 2793 + dependencies = [ 2794 + "proc-macro2", 2795 + "quote", 2796 + "syn", 2797 + "synstructure", 2798 + ] 2799 + 2800 + [[package]] 2801 + name = "zerocopy" 2802 + version = "0.8.48" 2803 + source = "registry+https://github.com/rust-lang/crates.io-index" 2804 + checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" 2805 + dependencies = [ 2806 + "zerocopy-derive", 2807 + ] 2808 + 2809 + [[package]] 2810 + name = "zerocopy-derive" 2811 + version = "0.8.48" 2812 + source = "registry+https://github.com/rust-lang/crates.io-index" 2813 + checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" 2814 + dependencies = [ 2815 + "proc-macro2", 2816 + "quote", 2817 + "syn", 2818 + ] 2819 + 2820 + [[package]] 2821 + name = "zerofrom" 2822 + version = "0.1.6" 2823 + source = "registry+https://github.com/rust-lang/crates.io-index" 2824 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2825 + dependencies = [ 2826 + "zerofrom-derive", 2827 + ] 2828 + 2829 + [[package]] 2830 + name = "zerofrom-derive" 2831 + version = "0.1.6" 2832 + source = "registry+https://github.com/rust-lang/crates.io-index" 2833 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2834 + dependencies = [ 2835 + "proc-macro2", 2836 + "quote", 2837 + "syn", 2838 + "synstructure", 2839 + ] 2840 + 2841 + [[package]] 2842 + name = "zerotrie" 2843 + version = "0.1.3" 2844 + source = "registry+https://github.com/rust-lang/crates.io-index" 2845 + checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" 2846 + dependencies = [ 2847 + "displaydoc", 2848 + "litemap 0.7.5", 2849 + "serde", 2850 + "zerovec 0.10.4", 2851 + ] 2852 + 2853 + [[package]] 2854 + name = "zerotrie" 2855 + version = "0.2.3" 2856 + source = "registry+https://github.com/rust-lang/crates.io-index" 2857 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 2858 + dependencies = [ 2859 + "displaydoc", 2860 + "yoke 0.8.1", 2861 + "zerofrom", 2862 + ] 2863 + 2864 + [[package]] 2865 + name = "zerovec" 2866 + version = "0.10.4" 2867 + source = "registry+https://github.com/rust-lang/crates.io-index" 2868 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2869 + dependencies = [ 2870 + "serde", 2871 + "yoke 0.7.5", 2872 + "zerofrom", 2873 + "zerovec-derive 0.10.3", 2874 + ] 2875 + 2876 + [[package]] 2877 + name = "zerovec" 2878 + version = "0.11.5" 2879 + source = "registry+https://github.com/rust-lang/crates.io-index" 2880 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 2881 + dependencies = [ 2882 + "serde", 2883 + "yoke 0.8.1", 2884 + "zerofrom", 2885 + "zerovec-derive 0.11.2", 2886 + ] 2887 + 2888 + [[package]] 2889 + name = "zerovec-derive" 2890 + version = "0.10.3" 2891 + source = "registry+https://github.com/rust-lang/crates.io-index" 2892 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2893 + dependencies = [ 2894 + "proc-macro2", 2895 + "quote", 2896 + "syn", 2897 + ] 2898 + 2899 + [[package]] 2900 + name = "zerovec-derive" 2901 + version = "0.11.2" 2902 + source = "registry+https://github.com/rust-lang/crates.io-index" 2903 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 2904 + dependencies = [ 2905 + "proc-macro2", 2906 + "quote", 2907 + "syn", 2908 + ] 2909 + 2910 + [[package]] 2911 + name = "zmij" 2912 + version = "1.0.21" 2913 + source = "registry+https://github.com/rust-lang/crates.io-index" 2914 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" 2915 + 2916 + [[package]] 2917 + name = "zune-core" 2918 + version = "0.5.1" 2919 + source = "registry+https://github.com/rust-lang/crates.io-index" 2920 + checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" 2921 + 2922 + [[package]] 2923 + name = "zune-jpeg" 2924 + version = "0.5.15" 2925 + source = "registry+https://github.com/rust-lang/crates.io-index" 2926 + checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" 2927 + dependencies = [ 2928 + "zune-core", 2929 + ]
+21
Cargo.toml
··· 1 + [package] 2 + name = "mathrender" 3 + version = "0.1.0" 4 + edition = "2024" 5 + description = "Render LaTeX/Typst math to SVG via Typst's layout engine" 6 + 7 + [[bin]] 8 + name = "mathrender" 9 + path = "src/main.rs" 10 + 11 + [dependencies] 12 + typst = "0.13" 13 + typst-svg = "0.13" 14 + typst-library = "0.13" 15 + typst-assets = { version = "0.13", features = ["fonts"] } 16 + 17 + tex2typst-rs = "0.1" 18 + 19 + comemo = "0.4" 20 + chrono = { version = "0.4", features = ["clock"], default-features = false } 21 + clap = { version = "4", features = ["derive"] }
+22
README
··· 1 + mathrender.el 2 + 3 + Emacs minor mode that renders LaTeX math blocks as inline SVG images. 4 + Includes a CLI tool (src/) that converts LaTeX to SVG via Typst. 5 + 6 + Supported delimiters: $$...$$, \[...\], \(...\), $...$ 7 + 8 + Moving the cursor into a preview removes it for editing; moving out 9 + re-renders it immediately. The idle timer scans for newly typed math. 10 + Click a preview to dismiss it manually. 11 + Integrates with gptel automatically when loaded. 12 + 13 + Requirements: 14 + Emacs 27.1+ 15 + mathrender binary in PATH 16 + cargo build --release (or: nix build) 17 + 18 + Usage: 19 + (load "path/to/mathrender.el") 20 + M-x mathrender-mode 21 + 22 + License: GPL-3.0-or-later
+61
flake.lock
··· 1 + { 2 + "nodes": { 3 + "nixpkgs": { 4 + "locked": { 5 + "lastModified": 1774855581, 6 + "narHash": "sha256-YkreHeMgTCYvJ5fESV0YyqQK49bHGe2B51tH6claUh4=", 7 + "owner": "NixOS", 8 + "repo": "nixpkgs", 9 + "rev": "15c6719d8c604779cf59e03c245ea61d3d7ab69b", 10 + "type": "github" 11 + }, 12 + "original": { 13 + "owner": "NixOS", 14 + "ref": "nixpkgs-unstable", 15 + "repo": "nixpkgs", 16 + "type": "github" 17 + } 18 + }, 19 + "root": { 20 + "inputs": { 21 + "nixpkgs": "nixpkgs", 22 + "utils": "utils" 23 + } 24 + }, 25 + "systems": { 26 + "locked": { 27 + "lastModified": 1681028828, 28 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 29 + "owner": "nix-systems", 30 + "repo": "default", 31 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 32 + "type": "github" 33 + }, 34 + "original": { 35 + "owner": "nix-systems", 36 + "repo": "default", 37 + "type": "github" 38 + } 39 + }, 40 + "utils": { 41 + "inputs": { 42 + "systems": "systems" 43 + }, 44 + "locked": { 45 + "lastModified": 1731533236, 46 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 47 + "owner": "numtide", 48 + "repo": "flake-utils", 49 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 50 + "type": "github" 51 + }, 52 + "original": { 53 + "owner": "numtide", 54 + "repo": "flake-utils", 55 + "type": "github" 56 + } 57 + } 58 + }, 59 + "root": "root", 60 + "version": 7 61 + }
+33
flake.nix
··· 1 + { 2 + inputs = { 3 + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 + utils.url = "github:numtide/flake-utils"; 5 + }; 6 + 7 + outputs = { self, nixpkgs, utils }: 8 + utils.lib.eachDefaultSystem (system: 9 + let 10 + pkgs = import nixpkgs { inherit system; }; 11 + in 12 + { 13 + packages.default = pkgs.rustPlatform.buildRustPackage { 14 + pname = "mathrender"; 15 + version = "0.1.0"; 16 + src = ./.; 17 + cargoLock = { 18 + lockFile = ./Cargo.lock; 19 + }; 20 + buildInputs = pkgs.lib.optionals pkgs.stdenv.isDarwin [ 21 + pkgs.libiconv 22 + ]; 23 + }; 24 + 25 + devShells.default = pkgs.mkShell { 26 + inputsFrom = [ self.packages.${system}.default ]; 27 + buildInputs = [ 28 + pkgs.cargo 29 + pkgs.rustc 30 + ]; 31 + }; 32 + }); 33 + }
+406
mathrender.el
··· 1 + ;;; mathrender.el --- Inline math preview via mathrender CLI -*- lexical-binding: t; -*- 2 + 3 + ;; Copyright (C) 2026 Vilhelm Bergsøe 4 + 5 + ;; Author: Vilhelm Bergsøe 6 + ;; Version: 0.1.0 7 + ;; Package-Requires: ((emacs "27.1")) 8 + ;; Keywords: tex, math, multimedia 9 + ;; SPDX-License-Identifier: GPL-3.0-or-later 10 + 11 + ;; This file is NOT part of GNU Emacs. 12 + 13 + ;; This program is free software: you can redistribute it and/or modify 14 + ;; it under the terms of the GNU General Public License as published by 15 + ;; the Free Software Foundation, either version 3 of the License, or 16 + ;; (at your option) any later version. 17 + 18 + ;; This program is distributed in the hope that it will be useful, 19 + ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 20 + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 + ;; GNU General Public License for more details. 22 + 23 + ;; You should have received a copy of the GNU General Public License 24 + ;; along with this program. If not, see <https://www.gnu.org/licenses/>. 25 + 26 + ;;; Commentary: 27 + 28 + ;; Minor mode that renders LaTeX math blocks as inline SVG images using 29 + ;; the external mathrender CLI. Supports $$...$$, \[...\], \(...\), $...$. 30 + ;; 31 + ;; Architecture: 32 + ;; Detection -- idle timer rescans dirty regions for new/changed blocks. 33 + ;; Rendering -- async via make-process; Emacs is never blocked. 34 + ;; Editing -- entering a block hides its overlay (display=nil); leaving 35 + ;; re-renders immediately if dirty, or restores cached image. 36 + 37 + ;;; Code: 38 + 39 + (require 'cl-lib) 40 + 41 + (defvar mathrender-idle-delay 0.3 42 + "Idle seconds before rescanning dirty regions for new math blocks.") 43 + 44 + (defvar mathrender-font-scale 1.0 45 + "Scale factor applied to the font size when rendering math. 46 + Increase (e.g. to 1.15) if rendered math appears smaller than the 47 + surrounding text; decrease to taste. Overlays are re-rendered on 48 + the next idle cycle after changing this.") 49 + 50 + (defvar mathrender--timer nil) 51 + (defvar mathrender--binary nil 52 + "Cached path to the mathrender executable.") 53 + 54 + (defvar-local mathrender--active-ov nil 55 + "Overlay whose display is hidden while the cursor is inside it, or nil.") 56 + (defvar-local mathrender--dirty nil 57 + "Cons (BEG . END) of the buffer region that changed and needs rescanning.") 58 + 59 + ;;; Overlay helpers 60 + 61 + (defun mathrender--clear-previews () 62 + "Remove all mathrender overlays from the current buffer." 63 + (let ((inhibit-modification-hooks t)) 64 + (dolist (ov (overlays-in (point-min) (point-max))) 65 + (when (overlay-get ov 'mathrender-preview) 66 + (when (eq ov mathrender--active-ov) 67 + (setq mathrender--active-ov nil)) 68 + (mathrender--cancel-process ov) 69 + (delete-overlay ov))))) 70 + 71 + (defun mathrender--overlay-at (pos) 72 + "Return the mathrender overlay at POS, or nil." 73 + (cl-find-if (lambda (ov) (overlay-get ov 'mathrender-preview)) 74 + (overlays-at pos))) 75 + 76 + (defun mathrender--make-overlay (beg end) 77 + "Create a mathrender overlay from BEG to END with no display yet." 78 + ;; front-advance=t: text inserted before the opening delimiter stays outside. 79 + (let ((ov (make-overlay beg end nil t nil)) 80 + (inhibit-modification-hooks t)) 81 + (overlay-put ov 'mathrender-preview t) 82 + (overlay-put ov 'priority 100) 83 + (overlay-put ov 'keymap 84 + (let ((map (make-sparse-keymap))) 85 + (define-key map [mouse-1] 86 + (lambda () 87 + (interactive) 88 + (let ((inhibit-modification-hooks t)) 89 + (overlay-put ov 'display nil)))) 90 + map)) 91 + ov)) 92 + 93 + ;;; Math parsing 94 + 95 + (defun mathrender--parse-overlay (ov) 96 + "Return (MATH-TEXT . INLINE-P) for OV's current buffer content, or nil." 97 + (let ((raw (buffer-substring-no-properties 98 + (overlay-start ov) (overlay-end ov)))) 99 + (cond 100 + ((string-match "\\`\\$\\$\\(\\(?:.\\|\n\\)+\\)\\$\\$\\'" raw) 101 + (cons (string-trim (match-string 1 raw)) nil)) 102 + ((string-match "\\`\\\\\\[\\(\\(?:.\\|\n\\)+\\)\\\\\\]\\'" raw) 103 + (cons (string-trim (match-string 1 raw)) nil)) 104 + ((string-match "\\`\\\\(\\(\\(?:.\\|\n\\)+\\)\\\\)\\'" raw) 105 + (cons (string-trim (match-string 1 raw)) t)) 106 + ;; Single $: no nested $ or newline allowed; content must be non-empty. 107 + ((string-match "\\`\\$\\([^$\n]+\\)\\$\\'" raw) 108 + (let ((c (string-trim (match-string 1 raw)))) 109 + (when (not (string-empty-p c)) (cons c t)))) 110 + (t nil)))) 111 + 112 + ;;; Font size 113 + 114 + (defun mathrender--font-size-pt () 115 + "Return the current buffer's effective font size in pt. 116 + Accounts for text-scale-mode (C-x C-+/C--) so math scales with the buffer." 117 + (let* ((h (face-attribute 'default :height nil t)) 118 + (pt (/ (if (numberp h) (float h) 120.0) 10.0)) 119 + (steps (if (bound-and-true-p text-scale-mode) text-scale-mode-amount 0)) 120 + (step (if (boundp 'text-scale-mode-step) text-scale-mode-step 1.2))) 121 + (* pt mathrender-font-scale (expt step steps)))) 122 + 123 + (defun mathrender--fg-color () 124 + "Return the current buffer's foreground color as a CSS hex string." 125 + (let* ((fg (face-attribute 'default :foreground nil t)) 126 + (rgb (and (stringp fg) 127 + (not (string-prefix-p "unspecified" fg)) 128 + (color-values fg)))) 129 + (if rgb 130 + (format "#%02x%02x%02x" 131 + (/ (nth 0 rgb) 256) 132 + (/ (nth 1 rgb) 256) 133 + (/ (nth 2 rgb) 256)) 134 + "#000000"))) 135 + 136 + ;;; Async rendering 137 + 138 + (defun mathrender--cancel-process (ov) 139 + "Kill any in-flight render process attached to OV." 140 + (let ((inhibit-modification-hooks t)) 141 + (when-let ((proc (overlay-get ov 'mathrender-process))) 142 + (when (process-live-p proc) 143 + (set-process-sentinel proc nil) 144 + (when-let* ((err-buf (process-get proc 'stderr-buf)) 145 + (err-proc (and (buffer-live-p err-buf) (get-buffer-process err-buf)))) 146 + (set-process-sentinel err-proc nil)) 147 + (delete-process proc)) 148 + (let ((out-buf (process-buffer proc)) 149 + (err-buf (process-get proc 'stderr-buf))) 150 + (when (buffer-live-p out-buf) 151 + (let ((kill-buffer-query-functions nil)) 152 + (kill-buffer out-buf))) 153 + (when (buffer-live-p err-buf) 154 + (let ((kill-buffer-query-functions nil)) 155 + (kill-buffer err-buf)))) 156 + (overlay-put ov 'mathrender-process nil)))) 157 + 158 + (defun mathrender--any-active-p () 159 + "Return t if mathrender-mode is active in any buffer." 160 + (cl-some (lambda (buf) 161 + (buffer-local-value 'mathrender-mode buf)) 162 + (buffer-list))) 163 + 164 + (defun mathrender--render-overlay (ov) 165 + "Start an async render for OV; update its display when the process finishes." 166 + (when (and mathrender--binary (overlay-buffer ov)) 167 + (mathrender--cancel-process ov) 168 + (when-let ((parsed (mathrender--parse-overlay ov))) 169 + (let* ((math-text (car parsed)) 170 + (inline-p (cdr parsed)) 171 + (target-buf (overlay-buffer ov)) 172 + (font-size (with-current-buffer target-buf (mathrender--font-size-pt))) 173 + (fg-color (with-current-buffer target-buf (mathrender--fg-color))) 174 + (cmd `(,mathrender--binary 175 + "--font-size" ,(number-to-string font-size) 176 + "--color" ,fg-color 177 + ,@(when inline-p '("--inline")))) 178 + (out-buf (generate-new-buffer " *mathrender*")) 179 + (err-buf (generate-new-buffer " *mathrender-err*"))) 180 + (condition-case err 181 + (let ((proc 182 + (make-process 183 + :name "mathrender" 184 + :buffer out-buf 185 + :stderr err-buf 186 + :command cmd 187 + :connection-type 'pipe 188 + :sentinel 189 + (lambda (p event) 190 + (set-process-sentinel p nil) 191 + (when (buffer-live-p err-buf) 192 + (when-let ((ep (get-buffer-process err-buf))) 193 + (set-process-sentinel ep nil))) 194 + (unwind-protect 195 + (when (memq (process-status p) '(exit signal)) 196 + (when (and (buffer-live-p target-buf) 197 + (overlay-buffer ov)) 198 + (let ((svg (when (string-prefix-p "finished" event) 199 + (with-current-buffer out-buf (buffer-string))))) 200 + (if (and svg (> (length svg) 0)) 201 + (let ((img (create-image svg 'svg t :ascent 'center))) 202 + (overlay-put ov 'mathrender-image img) 203 + (overlay-put ov 'mathrender-font-size font-size) 204 + (overlay-put ov 'mathrender-color fg-color) 205 + (with-current-buffer target-buf 206 + (unless (eq ov mathrender--active-ov) 207 + (overlay-put ov 'display img)))) 208 + (overlay-put ov 'mathrender-image nil) 209 + (with-current-buffer target-buf 210 + (overlay-put ov 'display nil)))) 211 + (overlay-put ov 'mathrender-process nil))) 212 + (let ((kill-buffer-query-functions nil)) 213 + (when (buffer-live-p out-buf) (kill-buffer out-buf)) 214 + (when (buffer-live-p err-buf) (kill-buffer err-buf)))))))) 215 + (process-put proc 'stderr-buf err-buf) 216 + (overlay-put ov 'mathrender-process proc) 217 + (process-send-string proc math-text) 218 + (process-send-eof proc)) 219 + (error 220 + (let ((kill-buffer-query-functions nil)) 221 + (when (buffer-live-p out-buf) (kill-buffer out-buf)) 222 + (when (buffer-live-p err-buf) (kill-buffer err-buf))) 223 + (message "mathrender render error: %S" err))))))) 224 + 225 + ;;; Block detection 226 + 227 + (defun mathrender--scan (beg end) 228 + "Scan BEG..END for math blocks; create and render overlays for new ones." 229 + (let ((inhibit-modification-hooks t)) 230 + (save-excursion 231 + (goto-char beg) 232 + (let ((pairs `(("$$" "\\$\\$" nil) 233 + (,(concat "\\" "[") ,(concat "\\\\" "]") nil) 234 + (,(concat "\\" "(") ,(concat "\\\\" ")") t) 235 + ("$" "\\$" t)))) 236 + (while (re-search-forward "\\$\\$\\|\\\\\\[\\|\\\\(\\|\\$" end t) 237 + (let* ((opener (match-string-no-properties 0)) 238 + (full-beg (match-beginning 0)) 239 + (math-beg (match-end 0)) 240 + (pair (assoc opener pairs)) 241 + (close-re (nth 1 pair)) 242 + (inline-p (nth 2 pair))) 243 + (when (and pair (not (mathrender--overlay-at full-beg))) 244 + (when (or (not (string-equal opener "$")) 245 + ;; Single $: reject if preceded by alphanumeric or a 246 + ;; closing delimiter — those are closing $, not openers. 247 + ;; Also reject if followed immediately by whitespace or $. 248 + (and (or (= full-beg (point-min)) 249 + (not (string-match-p "[[:alnum:])\]}]" 250 + (string (char-before full-beg))))) 251 + (< math-beg (point-max)) 252 + (not (memq (char-after math-beg) 253 + '(?\s ?\t ?\n ?\$))))) 254 + ;; Search for the closing delimiter without save-excursion: on 255 + ;; success point advances past the closer so the outer loop 256 + ;; skips the whole block, preventing the closing $ from being 257 + ;; mistaken for a new opener on the next iteration. 258 + (let ((limit (if (string-equal opener "$") 259 + (line-end-position) 260 + nil))) 261 + (when (re-search-forward close-re limit t) 262 + (let* ((math-end (match-beginning 0)) 263 + (full-end (match-end 0)) 264 + (math-text (string-trim (buffer-substring-no-properties 265 + math-beg math-end)))) 266 + (when (and (not (string-empty-p math-text)) 267 + (or (not (string-equal opener "$")) 268 + (not (string-match-p "[$\n]" math-text)))) 269 + ;; Remove any existing overlay subsumed by this new 270 + ;; (potentially larger) block — e.g. a $x$ overlay 271 + ;; that is now inside a $$x$$ block. 272 + (dolist (old (overlays-in full-beg full-end)) 273 + (when (and (overlay-get old 'mathrender-preview) 274 + (not (eq old mathrender--active-ov))) 275 + (mathrender--cancel-process old) 276 + (delete-overlay old))) 277 + (mathrender--render-overlay 278 + (mathrender--make-overlay full-beg full-end)))))))))))))) 279 + 280 + ;;; Change detection 281 + 282 + (defun mathrender--after-change (beg end _len) 283 + "Mark overlapping overlays dirty and record BEG..END for rescanning." 284 + (when mathrender-mode 285 + (let ((lo (max (point-min) (- beg 3))) 286 + (hi (min (point-max) (+ end 3)))) 287 + (dolist (ov (overlays-in lo hi)) 288 + (when (overlay-get ov 'mathrender-preview) 289 + (overlay-put ov 'mathrender-dirty t))) 290 + (setq mathrender--dirty 291 + (if mathrender--dirty 292 + (cons (min lo (car mathrender--dirty)) 293 + (max hi (cdr mathrender--dirty))) 294 + (cons lo hi)))))) 295 + 296 + (defun mathrender--cursor-check () 297 + "Hide the overlay at point on entry; restore or re-render on exit." 298 + (let ((inhibit-modification-hooks t)) 299 + ;; Guard: the active overlay may have been deleted externally (e.g. by the 300 + ;; idle timer cleaning up a block whose delimiters were removed mid-edit). 301 + (when (and mathrender--active-ov 302 + (not (overlay-buffer mathrender--active-ov))) 303 + (setq mathrender--active-ov nil)) 304 + (if mathrender--active-ov 305 + (unless (and (>= (point) (overlay-start mathrender--active-ov)) 306 + (< (point) (overlay-end mathrender--active-ov))) 307 + (let ((ov mathrender--active-ov)) 308 + (setq mathrender--active-ov nil) 309 + (if (overlay-get ov 'mathrender-dirty) 310 + (mathrender--render-overlay ov) 311 + (when-let ((img (overlay-get ov 'mathrender-image))) 312 + (overlay-put ov 'display img))))) 313 + (when-let ((ov (mathrender--overlay-at (point)))) 314 + (setq mathrender--active-ov ov) 315 + (overlay-put ov 'display nil))))) 316 + 317 + (defvar mathrender--in-idle-refresh nil 318 + "Prevent recursive calls to mathrender--idle-refresh.") 319 + 320 + (defun mathrender--scan-visible () 321 + "Scan currently visible regions for math blocks." 322 + (dolist (win (window-list)) 323 + (let ((buf (window-buffer win))) 324 + (when (and (buffer-live-p buf) 325 + (buffer-local-value 'mathrender-mode buf)) 326 + (with-current-buffer buf 327 + (mathrender--scan (window-start win) (window-end win t))))))) 328 + 329 + ;;; Idle refresh 330 + 331 + (defun mathrender--idle-refresh () 332 + "Process dirty regions and re-render stale overlays in visible windows." 333 + (unless mathrender--in-idle-refresh 334 + (let ((mathrender--in-idle-refresh t) 335 + (inhibit-modification-hooks t)) 336 + ;; Only scan visible windows rather than relying solely on global dirty states 337 + (mathrender--scan-visible) 338 + (dolist (win (cl-remove-duplicates (window-list) :key #'window-buffer)) 339 + (let ((buf (window-buffer win))) 340 + (when (buffer-live-p buf) 341 + (with-current-buffer buf 342 + (when (and (bound-and-true-p mathrender-mode) 343 + (not (minibufferp))) 344 + (when mathrender--dirty 345 + (let ((lo (car mathrender--dirty)) 346 + (hi (cdr mathrender--dirty))) 347 + (setq mathrender--dirty nil) 348 + ;; Remove overlays whose delimiters were broken 349 + (dolist (ov (overlays-in lo hi)) 350 + (when (and (overlay-get ov 'mathrender-preview) 351 + (not (eq ov mathrender--active-ov)) 352 + (not (mathrender--parse-overlay ov))) 353 + (mathrender--cancel-process ov) 354 + (delete-overlay ov))) 355 + (mathrender--scan lo hi))) 356 + ;; Mark overlays dirty if font size or foreground color changed 357 + (let ((cur-size (mathrender--font-size-pt)) 358 + (cur-color (mathrender--fg-color)) 359 + (inhibit-modification-hooks t)) 360 + (dolist (ov (overlays-in (window-start win) (window-end win t))) 361 + (when (and (overlay-get ov 'mathrender-preview) 362 + (or (and (overlay-get ov 'mathrender-font-size) 363 + (/= (overlay-get ov 'mathrender-font-size) cur-size)) 364 + (and (overlay-get ov 'mathrender-color) 365 + (not (equal (overlay-get ov 'mathrender-color) cur-color))))) 366 + (overlay-put ov 'mathrender-dirty t)))) 367 + (let ((inhibit-modification-hooks t)) 368 + (dolist (ov (overlays-in (window-start win) (window-end win t))) 369 + (when (and (overlay-get ov 'mathrender-preview) 370 + (overlay-get ov 'mathrender-dirty) 371 + (not (eq ov mathrender--active-ov))) 372 + (overlay-put ov 'mathrender-dirty nil) 373 + (mathrender--render-overlay ov)))))))))))) 374 + 375 + ;;; Minor mode 376 + 377 + (define-minor-mode mathrender-mode 378 + "Render LaTeX math blocks as inline SVG images. 379 + Each block is an Emacs overlay. Changes are detected immediately and 380 + rendered asynchronously — Emacs is never blocked. Enter a block to edit 381 + the raw LaTeX; leaving triggers an instant re-render. Click to dismiss." 382 + :lighter " Math" 383 + :global nil 384 + (if mathrender-mode 385 + (progn 386 + (setq mathrender--binary (or mathrender--binary (executable-find "mathrender"))) 387 + (unless mathrender--binary 388 + (message "mathrender: binary not found in exec-path.")) 389 + (add-hook 'after-change-functions #'mathrender--after-change nil t) 390 + (add-hook 'post-command-hook #'mathrender--cursor-check nil t) 391 + (mathrender--scan-visible) 392 + (unless mathrender--timer 393 + (setq mathrender--timer 394 + (run-with-idle-timer mathrender-idle-delay t 395 + #'mathrender--idle-refresh)))) 396 + (remove-hook 'after-change-functions #'mathrender--after-change t) 397 + (remove-hook 'post-command-hook #'mathrender--cursor-check t) 398 + (mathrender--clear-previews) 399 + (setq mathrender--dirty nil) 400 + (unless (mathrender--any-active-p) 401 + (when mathrender--timer 402 + (cancel-timer mathrender--timer) 403 + (setq mathrender--timer nil))))) 404 + 405 + (provide 'mathrender) 406 + ;;; mathrender.el ends here
+279
src/main.rs
··· 1 + use std::io::{self, Read}; 2 + use std::panic; 3 + use std::path::PathBuf; 4 + 5 + use chrono::Datelike; 6 + use clap::Parser; 7 + use typst::diag::{FileError, FileResult}; 8 + use typst::foundations::{Bytes, Datetime}; 9 + use typst::layout::PagedDocument; 10 + use typst::syntax::{FileId, Source, VirtualPath}; 11 + use typst::text::{Font, FontBook}; 12 + use typst::utils::LazyHash; 13 + use typst::{Library, World}; 14 + 15 + #[derive(Parser, Debug)] 16 + #[command(name = "mathrender", about = "Render LaTeX or Typst math to SVG")] 17 + struct Args { 18 + input: Option<String>, 19 + 20 + #[arg(long, short = 't')] 21 + typst: bool, 22 + 23 + #[arg(long, short = 'i')] 24 + inline: bool, 25 + 26 + #[arg(long, default_value_t = 16.0)] 27 + font_size: f64, 28 + 29 + #[arg(long, default_value = "#000000")] 30 + color: String, 31 + } 32 + 33 + /// tex2typst-rs 0.1 panics on unsupported tokens like \begin{...}. 34 + fn safe_tex2typst(s: &str) -> String { 35 + if s.trim().is_empty() { 36 + return s.to_owned(); 37 + } 38 + match panic::catch_unwind(|| tex2typst_rs::tex2typst(s)) { 39 + Ok(r) => r, 40 + Err(_) => s.to_owned(), 41 + } 42 + } 43 + 44 + fn convert_matrix_env(env: &str, content: &str) -> String { 45 + let delim = match env { 46 + "pmatrix" | "pmatrix*" => "(", 47 + "bmatrix" | "bmatrix*" => "[", 48 + "vmatrix" | "vmatrix*" => "|", 49 + "Bmatrix" | "Bmatrix*" => "{", 50 + "Vmatrix" | "Vmatrix*" => "‖", 51 + "matrix" | "matrix*" => "", 52 + "smallmatrix" => "(", 53 + _ => "(", 54 + }; 55 + 56 + let rows: Vec<Vec<String>> = content 57 + .split("\\\\") 58 + .map(|row| { 59 + row.split('&') 60 + .map(|cell| safe_tex2typst(cell.trim())) 61 + .collect() 62 + }) 63 + .filter(|row: &Vec<String>| !row.is_empty() && !row[0].is_empty()) 64 + .collect(); 65 + 66 + let mat_content = rows.iter() 67 + .map(|row| row.join(", ")) 68 + .collect::<Vec<_>>() 69 + .join("; "); 70 + 71 + match delim { 72 + "" => format!("mat(delim: #none, {mat_content})"), 73 + "(" => format!("mat({mat_content})"), 74 + d => format!("mat(delim: \"{d}\", {mat_content})"), 75 + } 76 + } 77 + 78 + fn convert_cases_env(content: &str) -> String { 79 + let rows: Vec<String> = content 80 + .split("\\\\") 81 + .filter_map(|row| { 82 + let row = row.trim(); 83 + if row.is_empty() { return None; } 84 + let parts: Vec<&str> = row.splitn(2, '&').collect(); 85 + Some(match parts.as_slice() { 86 + [expr, cond] => format!("{} {}", 87 + safe_tex2typst(expr.trim()), 88 + safe_tex2typst(cond.trim())), 89 + [expr] => safe_tex2typst(expr.trim()), 90 + _ => safe_tex2typst(row), 91 + }) 92 + }) 93 + .collect(); 94 + format!("cases({})", rows.join(", ")) 95 + } 96 + 97 + /// tex2typst-rs panics on \begin{...} environments; we intercept and convert 98 + /// them to Typst equivalents before calling the library. 99 + fn latex_to_typst(input: &str) -> String { 100 + let mut result = String::new(); 101 + let mut rest = input; 102 + 103 + while let Some(begin_pos) = rest.find("\\begin{") { 104 + result.push_str(&safe_tex2typst(&rest[..begin_pos])); 105 + rest = &rest[begin_pos + 7..]; 106 + 107 + let Some(brace_end) = rest.find('}') else { 108 + result.push_str("\\begin{"); 109 + continue; 110 + }; 111 + let env = &rest[..brace_end]; 112 + rest = &rest[brace_end + 1..]; 113 + 114 + let end_tag = format!("\\end{{{env}}}"); 115 + let Some(end_pos) = rest.find(end_tag.as_str()) else { 116 + result.push_str(&format!("\\begin{{{env}}}")); 117 + continue; 118 + }; 119 + let content = &rest[..end_pos]; 120 + rest = &rest[end_pos + end_tag.len()..]; 121 + 122 + let converted = match env { 123 + "pmatrix" | "pmatrix*" | 124 + "bmatrix" | "bmatrix*" | 125 + "vmatrix" | "vmatrix*" | 126 + "Bmatrix" | "Bmatrix*" | 127 + "Vmatrix" | "Vmatrix*" | 128 + "matrix" | "matrix*" | 129 + "smallmatrix" => convert_matrix_env(env, content), 130 + 131 + "cases" | "dcases" => convert_cases_env(content), 132 + 133 + "align" | "align*" | 134 + "aligned" | "alignat" | "alignat*" | 135 + "gather" | "gather*" | 136 + "multline" | "multline*" | 137 + "split" | "equation" | "equation*" => safe_tex2typst(content), 138 + 139 + _ => format!("\\begin{{{env}}}{content}\\end{{{env}}}"), 140 + }; 141 + result.push_str(&converted); 142 + } 143 + 144 + result.push_str(&safe_tex2typst(rest)); 145 + result 146 + } 147 + 148 + struct MathWorld { 149 + library: LazyHash<Library>, 150 + book: LazyHash<FontBook>, 151 + fonts: Vec<Font>, 152 + source: Source, 153 + } 154 + 155 + impl MathWorld { 156 + fn new(source_text: String) -> Self { 157 + let main_id = FileId::new(None, VirtualPath::new("/main.typ")); 158 + let source = Source::new(main_id, source_text); 159 + 160 + let mut book = FontBook::new(); 161 + let mut fonts = Vec::new(); 162 + 163 + for font_data in typst_assets::fonts() { 164 + let bytes = Bytes::new(font_data); 165 + for index in 0u32.. { 166 + match Font::new(bytes.clone(), index) { 167 + Some(font) => { 168 + book.push(font.info().clone()); 169 + fonts.push(font); 170 + } 171 + None => break, 172 + } 173 + } 174 + } 175 + 176 + Self { 177 + library: LazyHash::new(typst_library::LibraryBuilder::default().build()), 178 + book: LazyHash::new(book), 179 + fonts, 180 + source, 181 + } 182 + } 183 + } 184 + 185 + impl World for MathWorld { 186 + fn library(&self) -> &LazyHash<Library> { &self.library } 187 + fn book(&self) -> &LazyHash<FontBook> { &self.book } 188 + fn main(&self) -> FileId { self.source.id() } 189 + 190 + fn source(&self, id: FileId) -> FileResult<Source> { 191 + if id == self.source.id() { 192 + Ok(self.source.clone()) 193 + } else { 194 + Err(FileError::NotFound(PathBuf::from("<virtual>"))) 195 + } 196 + } 197 + 198 + fn file(&self, _id: FileId) -> FileResult<Bytes> { 199 + Err(FileError::NotFound(PathBuf::from("<virtual>"))) 200 + } 201 + 202 + fn font(&self, index: usize) -> Option<Font> { 203 + self.fonts.get(index).cloned() 204 + } 205 + 206 + fn today(&self, offset: Option<i64>) -> Option<Datetime> { 207 + let now = chrono::Local::now(); 208 + let _ = offset; 209 + Datetime::from_ymd(now.year(), now.month() as u8, now.day() as u8) 210 + } 211 + } 212 + 213 + fn build_typst_source(math_expr: &str, display: bool, font_size: f64, color: &str) -> String { 214 + let wrapped = if display { 215 + format!("$ {} $", math_expr) 216 + } else { 217 + format!("${}$", math_expr) 218 + }; 219 + 220 + // 0.5em margin prevents clipping of subscripts and matrices. 221 + format!( 222 + "#set page(width: auto, height: auto, margin: 0.5em, fill: none)\n\ 223 + #set text(size: {font_size}pt, fill: rgb(\"{color}\"))\n\ 224 + {wrapped}" 225 + ) 226 + } 227 + 228 + fn render_to_svg( 229 + input: &str, 230 + is_typst: bool, 231 + display: bool, 232 + font_size: f64, 233 + color: &str, 234 + ) -> Result<String, Box<dyn std::error::Error>> { 235 + 236 + let typst_math = if is_typst { 237 + input.to_owned() 238 + } else { 239 + latex_to_typst(input) 240 + }; 241 + 242 + let source = build_typst_source(&typst_math, display, font_size, color); 243 + let world = MathWorld::new(source); 244 + let compiled = typst::compile::<PagedDocument>(&world); 245 + 246 + let document: PagedDocument = compiled.output.map_err(|errors| { 247 + let msgs: Vec<String> = errors.iter().map(|e| e.message.to_string()).collect(); 248 + format!("Typst compile error(s):\n {}", msgs.join("\n ")) 249 + })?; 250 + 251 + let page = document.pages.first().ok_or("Typst produced no pages")?; 252 + Ok(typst_svg::svg(page)) 253 + } 254 + 255 + fn main() { 256 + let args = Args::parse(); 257 + 258 + let input = match args.input { 259 + Some(s) => s, 260 + None => { 261 + let mut buf = String::new(); 262 + io::stdin().read_to_string(&mut buf).expect("Failed to read stdin"); 263 + buf.trim().to_owned() 264 + } 265 + }; 266 + 267 + if input.is_empty() { 268 + eprintln!("Error: no input provided."); 269 + std::process::exit(1); 270 + } 271 + 272 + match render_to_svg(&input, args.typst, !args.inline, args.font_size, &args.color) { 273 + Ok(svg) => print!("{}", svg), 274 + Err(e) => { 275 + eprintln!("Error: {e}"); 276 + std::process::exit(1); 277 + } 278 + } 279 + }