Skip to content

Load linked bitmap images in SVG images#6794

Merged
laurmaedje merged 26 commits intotypst:mainfrom
tovrstra:svg-href
Sep 2, 2025
Merged

Load linked bitmap images in SVG images#6794
laurmaedje merged 26 commits intotypst:mainfrom
tovrstra:svg-href

Conversation

@tovrstra
Copy link
Contributor

@tovrstra tovrstra commented Aug 20, 2025

This (at least partially) fixes #5335

This is my first contribution to a Rust project. I'm sorry if things are not up to expectations. In any case, even if the change works for me in a simple test, the current PR is not final. I still have some questions and comments on how to proceed:

TODO in this PR

  • I'll make a corresponding PR to typst-dev-assets with small files to test the new feature. Actual tests still need to be written. (For now, I just manually tested.) The following can be tested:
    • Minimal example with inline SVG in typst as bytes(...)
    • Example in Add files to test linked images in SVG images typst-dev-assets#12 (including testing the --make-deps flag)
    • An example with an linked image outside the root of the typst project, should fail. (not trivially possible at the moment)
    • An example with an absolute path linked image in the SVG, should fail, because these are interpreted different by typst than in the SVG format.
    • An example with a non-existing linked image, should fail.
    • An example with a link to a non-supported file format, should fail.
    • An example with a link to a PDF, should fail.
    • An example with an URL (https://) href, should fail, except for file://
    • Add a test with an SVG image linking to a bitmap, both files inside a package (postponed to future PR)
  • Check formatting of all error messages (see discussion below)
  • Improve caching of loading of SVGs (with or without linked images, see discussion below, maybe future PR)
  • Reuse file extension matching code from visualize/image/mod.rs (see below, requires new function)

TODO in later PRs

  • SVG images linked from SVG images are not supported yet, even if this is possible in usvg. The reason is that it seemed unwise to just copy the private function of usvg::load_sub_svg. I think it would make sense for this function to become public in usvg, or not?
  • For now, image file formats are just inferred from file extensions, in line with how the image function in typst works. This may not be ideal. Image file extensions can be easily wrong, e.g. due to how CDNs work etc. The magic bytes approach from usvg would a be better solution. Also here, it seems wiser to reuse the code than reimplementing it, these functions are not public in usvg either. (Typst also checks magic bytes.)

Questions answered below

  • Should the image resolver also be implemented in the new method of SvgImage? For now, I've only added it to the with_fonts method, whose name is no longer very accurate. with_fonts_and_images would be better, but I did not rename it yet.
  • Because of the previous point, I left the base_options() unchanged. I believe the new method still needs it in its original form, not sure though.

@w1th0utnam3 Would you be able to try out this change for your use case?

(I'm quite occupied with other stuff at the moment, but I will certainly follow up to imporve things where needed. There may be some delay in my responses.)

@w1th0utnam3
Copy link

w1th0utnam3 commented Aug 20, 2025

Thank you for your work! Great to see that somebody is working on this. I can test it for my use case. Currently, I'm getting errors "Failed to load linked images in SVG (Cannot use linked image" because it resolves paths relative to the including .typ file, while my SVG files specify them relative to the SVG file. In my opinion the latter would be the more common use case because typically SVG files are completely independent from the typ files? (my image files are in a different folder than the .typ content files)

@tovrstra
Copy link
Contributor Author

tovrstra commented Aug 20, 2025

Yes, I agree, it should be relative to the SVG. It seems that the span object I'm using is not referring to the SVG image, but rather to the typ file.

Solving this is a bit more tricky than I first guessed, but it should be possible. The catch is that the image() function also accepts a bytes as argument, in which case the relative path to the linked image does not exist and some error should be raised when there are linked images.

@w1th0utnam3
Copy link

Hm, I mean in case of the bytes it could also be something generated inside of the Typst document where it could make sense to fall back to the path of the current Typst file or the root of the Typst project. Might be worth to discuss this. But I don't have a strong opinion on this.

@tovrstra
Copy link
Contributor Author

@w1th0utnam3 Makes a lot of sense. I've changed the relative path logic and it should work better now. If the SVG image has a bytes source, the parent of the typ file is used as reference (also if it is inside a package). If the typ file cannot be resolved, it falls back to the parent of the main typ file. (At least, that's the idea.)

@w1th0utnam3
Copy link

Great, now it works for my use case. Maybe somebody from the core team can have a look and comment on the PR, I'll ask in the Discord.

@laurmaedje
Copy link
Member

Thanks for opening a PR! I think adding this makes sense generally.

Behaviour-wise, I'd say the images should be loaded relative to the SVG (like an import would be relative to a Typst file) and in SVGs decoded from bytes it should be relative to the file that called image (like an import in eval would). I think this is already what you implemented?

Should the image resolver also be implemented in the new method of SvgImage?

No, that's only used for OpenType SVG fonts.

The reason is that it seemed unwise to just copy the private function of usvg::load_sub_svg. I think it would make sense for this function to become public in usvg, or not?

Probably yeah. Maybe it could even just be a higher-level function. Not sure. Worth discussing this upstream.

For now, image file formats are just inferred from file extensions, in line with how the image function in typst works. This may not be ideal.

We should for sure reuse existing logic, either that from resvg or the one from Typst itself.

#[comemo::memoize]
#[typst_macros::time(name = "load svg")]
pub fn with_fonts(
svg_parent_file: FileId,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not ideal as it prevents an image from being cached if it's used across files even if it does not use this at all.

It can be probably be prevented by creating a new tracked type that wraps World and handles this logic internally. (Extra points for also handling families in there.) But it's definitely tricky and could also be done in a followup PR or maybe I'd just push this over the PR once it's otherwise ready.

@tovrstra
Copy link
Contributor Author

Thanks for all the feedback! I'll update the todo list on top. I'm going to try fixing one thing at a time.

Behaviour-wise, I'd say the images should be loaded relative to the SVG (like an import would be relative to a Typst file) and in SVGs decoded from bytes it should be relative to the file that called image (like an import in eval would). I think this is already what you implemented?

This is indeed how it works now.

I've tried improving the error messages and using span.resolve_path in the latest commit. It feels a bit like I'm abusing instead of properly reusing existing logic. A typical error message now looks as follows:

error: failed to load linked image ../small.jpg (failed to load file (access denied))
  ┌─ link-jpg.svg:1:0
  │  
1 │ ╭ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 20" style="background:#fff" width="50">
2 │ │ <circle r="11" cx="10" cy="10" fill="red" />
3 │ │ <image width="30" height="20" href="../small.jpg" x="20" y="0" />
4 │ │ <circle r="20" cx="10" cy="10" fill="none" stroke="red" />
  · │
7 │ │ </svg>
8 │ │ 
  │ ╰^

I'll comment on another line where it's not clear how to format the error message....

@tovrstra
Copy link
Contributor Author

tovrstra commented Aug 23, 2025

I've improved the error messages further, e.g.

error: failed to load linked image ../small.jpg in SVG (access denied)
  ┌─ link-jpg.svg:1:0
  │  
1 │ ╭ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 20" style="background:#fff" width="50">
2 │ │ <circle r="11" cx="10" cy="10" fill="red" />
3 │ │ <image width="30" height="20" href="../small.jpg" x="20" y="0" />
4 │ │ <circle r="20" cx="10" cy="10" fill="none" stroke="red" />
  · │
7 │ │ </svg>
8 │ │ 
  │ ╰^

@tovrstra
Copy link
Contributor Author

tovrstra commented Aug 25, 2025

@laurmaedje I've made several changes and tried to address most of your comments. (Caching is still on the list.) There are some points where I'm a bit in doubt. If you can comment, I may be able to fix a few more things:

  • span.resolve_path(...) is now called in mod.rs before SvgImage::with_fonts. I tried putting the resolve_path() call inside the new ImageResolver. However, as you mentioned, this requires passing in the span to the ImageResolver, which terribly breaks caching. I took it back out. I hope this is OK?

  • With the last commit below, I believe caching works (except for the font families, I did not touch this part). It now works as follows: when a second SVG is loaded with the same contents and the same parent directory as a previously loaded SVG, it will be a cache hit. Either of these two change, and it will be a miss. This seems fairly optimal. I had to use a workaround for the behavior of FileId::join to get to this point. The only possibility to make caching more efficient is to make a distinction between SVGs with linked images (for which the parent directory matters) and SVGs without (for which only the image contents itself matters.)

  • We may also consider another form of caching, namely when the same image is linked multiple times from one or more SVG files. I wonder if it would matter much? I don't believe this form of caching in typst will stop usvg from processing the image data twice.

  • I've added a couple of test cases, but could not implement some of the tests I had in mind. For example, adding the following test does not produce an access denied error as hoped:

    --- image-svg-linked-access-denied ---
    #image(bytes(
      ```
      <svg xmlns="http://www.w3.org/2000/svg">
        <image href="../../../../../up.jpg" />
      ```.text
    ))

    This gives me:

    Error: 8-7:2 failed to load linked image ../../../../up.jpg in SVG (file not found, searched at up.jpg)
    

    When I create a similar test manually, I do get the right "access denied" error.

  • I've manually tested that an SVG image in a package can link to a bitmap inside the package, which is nice. I'm not sure how to include this scenario in the tests?

@tovrstra
Copy link
Contributor Author

@w1th0utnam3 There have been several changes. Would you be able to test the latest update?

@w1th0utnam3
Copy link

Yes, with commit 597ebeee my SVGs show up correctly.

@tovrstra tovrstra requested a review from laurmaedje August 26, 2025 19:48
Copy link
Member

@laurmaedje laurmaedje left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added a couple of test cases, but could not implement some of the tests I had in mind. For example, adding the following test does not produce an access denied error as hoped. [...]

Yeah, that is a quirk of the test runner. We don't want the error output messages to contain any system-dependant paths, so the rest root is "", but then this code here doesn't ever trigger the access denied code path:

pub fn resolve(&self, root: &Path) -> Option<PathBuf> {
let root_len = root.as_os_str().len();
let mut out = root.to_path_buf();
for component in self.0.components() {
match component {
Component::Prefix(_) => {}
Component::RootDir => {}
Component::CurDir => {}
Component::ParentDir => {
out.pop();
if out.as_os_str().len() < root_len {
return None;
}
}
Component::Normal(_) => out.push(component),
}
}
Some(out)
}

Maybe that code should be considered buggy because it doesn't handle the case that .pop() does nothing... I'm not sure (edit: see #6794 (comment)).

I've manually tested that an SVG image in a package can link to a bitmap inside the package, which is nice. I'm not sure how to include this scenario in the tests?

The tests have a package mechanism with packages stored at tests/packages/. It wouldn't be needed from my side, but if you want, you can add a test there.

@laurmaedje
Copy link
Member

Maybe that code should be considered buggy because it doesn't handle the case that .pop() does nothing... I'm not sure.

It's possible to observe the same thing in the CLI when setting the root to /:

typst c hi.typ --root /
#image("/../../Users/laurenz/Desktop/cylinder.svg", width: 40%)

You can add arbitrary .. when you're already at the physical FS root. But cat and ls behave the same, so I guess that's just how it works.

@tovrstra
Copy link
Contributor Author

tovrstra commented Sep 2, 2025

Thanks again for the second round of feedback, very much appreciated!

I believe it is better to omit the additional tests I had in mind, at least for now. We may come back to the image-in-package test when linking to SVG images is supported (future PR). With that feature, it would become possible to make a tiny test package with just SVG text files that only take a handful of bytes. I'm a bit reluctant to add such an example now with a bitmap image in the main typst repo.

@tovrstra
Copy link
Contributor Author

tovrstra commented Sep 2, 2025

Unless I missed something, this PR should be ready. In any case, if something else pops up, no problem to address future comments.

@laurmaedje laurmaedje added this pull request to the merge queue Sep 2, 2025
@laurmaedje
Copy link
Member

Thank you!

Merged via the queue into typst:main with commit 560e49b Sep 2, 2025
8 checks passed
@tovrstra tovrstra deleted the svg-href branch September 2, 2025 14:27
hiandy24 pushed a commit to hiandy24/typst that referenced this pull request Sep 27, 2025
… upstream (#1)

* Numbering implementation refactor (typst#6122)

* Pin colspan and rowspan for blank cells (typst#6401)

* Clean up some parser comments (typst#6398)

* Autocomplete fixes for math mode (typst#6415)

* Update docs for gradient.repeat (typst#6385)

* Document how to escape lr delimiter auto-scaling (typst#6410)

Co-authored-by: Laurenz <[email protected]>

* Improve number lexing (typst#5969)

* Report errors in external files (typst#6308)

Co-authored-by: Laurenz <[email protected]>

* Table multiple headers and subheaders (typst#6168)

* Use the shaper in math (typst#6336)

* Standardize trailing slashes in docs route paths (typst#6420)

* Make a more descriptive definition of `module` (typst#6380)

* Specify which CSL style is not suitable for bibliographies (typst#6306)

Co-authored-by: Laurenz <[email protected]>

* Adjust source file API surface (typst#6423)

* Do not force `math.mid` elements to have the Large math class (typst#5980)

* List both YAML file extensions in bibliography docs (typst#6426)

* Fix panic when test source is not found in world (typst#6428)

* Use `codex::ModifierSet` (typst#6159)

Co-authored-by: Laurenz <[email protected]>

* Render `#super` as `<sup>`, `#sub` as `<sub>` in HTML (typst#6422)

* Warning when watching stdin (typst#6381)

Co-authored-by: Laurenz <[email protected]>

* Fix untidy Cargo.lock

* Warn when using variable fonts (typst#6425)

* Check that all translation files are added to TRANSLATIONS and ends with newline (typst#6424)

Co-authored-by: Laurenz <[email protected]>

* Unify `EvalMode` and `LexMode` into `SyntaxMode` (typst#6432)

* Consume `data` argument in `pdf.embed()` (typst#6435)

* Better error message for compile time string interning failure (typst#6439)

* Ensure that label repr is syntactically valid (typst#6456)

* Hint for label in both document and bibliography (typst#6457)

* Prefer `.yaml` over `.yml` in the docs (typst#6436)

* Fix align link in layout documentation (typst#6451)

* Fix param autocompletion false positive (typst#6475)

* Encode empty attributes with shorthand syntax

* Add `Duration::decompose`

* Generic casting for `Axes<T>`

* More type-safe color conversions

* Add  `typst_utils::display`

* Support for generating native functions at runtime

* Typed HTML API (typst#6476)

* Consistent codepoint formatting in HTML and PDF error messages

* Test runner support for HTML export errors

* Turn non-empty void element into export error

* Handle pre elements that start with a newline

* Extract `write_children` function

* Properly handle raw text elements

* Fix stroke cap of shapes with partial stroke (typst#5688)

* Adding Croatian translations entries (typst#6413)

* Rewrite `outline.indent` example (typst#6383)

Co-authored-by: Laurenz <[email protected]>

* Use ICU data to check if accent is bottom (typst#6393)

Co-authored-by: Laurenz <[email protected]>

* Add docs for `std` module (typst#6407)

Co-authored-by: Laurenz <[email protected]>

* Improve equation reference example (typst#6481)

* Add page reference customization example (typst#6480)

Co-authored-by: Laurenz <[email protected]>

* Bump `krilla` to current Git version (typst#6488)

Co-authored-by: Laurenz <[email protected]>

* Check that git tree is clean after build (typst#6495)

* Also fix encoding of `<textarea>` (typst#6497)

* Minor fixes to doc comments (typst#6500)

* Fix typos in page-setup.md (typst#6499)

* Support `in` operator on strings and modules (typst#6498)

* Consistent sizing for `html.frame` (typst#6505)

* Allow deprecating symbol variants (typst#6441)

* Disallow empty labels and references (typst#5776) (typst#6332)

Co-authored-by: Laurenz <[email protected]>

* Fix nested HTML frames (typst#6509)

* Basic support for text decoration functions in HTML (typst#6510)

* Improve sentence in guide for LaTeX users (typst#6511)

* Sort line items by logical order when constructing frame (typst#5887)

Co-authored-by: Laurenz <[email protected]>

* Fix panic when sampling across two coincident gradient stops (typst#6166)

* Bump `typst-dev-assets` (typst#6514)

* Acknowledgements (typst#6528)

* Support HTML tests in test-helper extension (typst#6504)

* Fix typo in Advanced Styling docs tutorial (typst#6517)

* Fix typo in PDF standard CLI help (typst#6518)

* Fix typo in PDF standard CLI help part 2 (typst#6531)

* Fix minor typo in `array.product` docs (typst#6532)

* Fix typos in calc module docs (typst#6535)

* Use "subs" and "sups" font features for typographic scripts (typst#5777)

* Use punctuation math class for Arabic comma (typst#6537)

* Remove duplicate language computation (typst#6557)

* Fix typo in PackageStorage (typst#6556)

* Fix nightly warnings (typst#6558)

* Fix minor typo in function docs (typst#6542)

* Refer to json function instead of deprecated json.decode in groups docs (typst#6552)

* Rewrite foundations of native elements (typst#6547)

* Target-specific native show rules (typst#6569)

* Construct library via extension trait instead of default & inherent impl (typst#6576)

* Move `html` module to `typst-html` crate (typst#6577)

* Fix typo of Typst domain in quote docs (typst#6573)

* Anti-alias clip paths (typst#6570)

* Use "displayed" instead of "repeated" to avoid ambiguity in numbering docs (typst#6565)

* Ignore spans when checking for RawElem equality (typst#6560)

* Add `default` argument for `str.first` and `str.last` (typst#6554)

Co-authored-by: Laurenz <[email protected]>

* Add completions subcommand (typst#6568)

* Update Swedish translations based on defaults used for LaTeX and cleveref (typst#6519)

* Move math styling to codex and add `math.scr` (typst#6309)

* More consistent `Packed<T>` to `Content` conversion methods (typst#6579)

* Support images in HTML export (typst#6578)

* Fix tooltip for figure reference (typst#6580)

* Complete movement of HTML export code to `typst-html` (typst#6584)

* Handle `lower` and `upper` in HTML export (typst#6585)

* Deduplicate labels for code completion (typst#6516)

* Fix regression in reference autocomplete (typst#6586)

* Use "whitespace" instead of "space" to denote block-level equation in docs (typst#6591)

* Fix minor typo in text docs (typst#6589)

* Rephrase docs for truncation of float/decimal to integer (typst#6543)

* HTML frame improvements (typst#6605)

* Change `enum.item.number` to `Smart` instead of `Option` (typst#6609)

* Support setting fonts repeatedly with different `covers` (typst#6604)

* Support intra-doc links in HTML (typst#6602)

* Partially automate span assignment in native show rule (typst#6613)

* Bump `zip` dependency (typst#6615)

* Restore timing scopes for native show rules (typst#6616)

* Slightly improve selector docs (typst#6544)

* Add show rule for smallcaps in HTML (typst#6600)

* Mention Tinymist in README.md (typst#6601)

* Fix documentation oneliners (typst#6608)

* Add rust-analyzer to flake devShell (typst#6618)

* Add Lithuanian translations (typst#6587)

* Bump CI Rust to 1.88

* Bump MSRV to 1.88

* Migrate to 2024 edition

* Fix 2024 clippy warnings

* Yeet `if_chain` macro

* Reformat with 2024 edition

* Add support for PDF embedding (typst#6623)

Co-authored-by: Laurenz <[email protected]>

* Add `pdf` extension to image autocompletions (typst#6643)

* Fix bounding box computation for lines in curves (typst#6647)

Co-authored-by: Laurenz <[email protected]>

* Lint for iterations over hash types (typst#6652)

* Create constructor methods for manifest types (typst#6625)

* Remove unnecessary `comemo` dependency in `typst-syntax` (typst#6668)

* Remove duplicate center alignment style for equations (typst#6667)

* Fix incorrect `vline.x` docs (typst#6657)

* Miscellaneous minor docs improvements (typst#6651)

Co-authored-by: Laurenz <[email protected]>

* Allow explicit autocomplete immediately after comma and colon (typst#6550)

* Improve Guide for LaTeX users, Query Function, and replace invisible emojis (typst#6620)

Co-authored-by: PgBiel <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Hint that deprecated items will be removed in `0.15.0` (typst#6617)

* Specify the standard smart quotes for `Arabic` (typst#6626)

* Use `rustc-hash` for hash maps and sets (typst#6678)

* Faster constraint checking in comemo (bumps comemo & krilla) (typst#6683)

* Add `--target` argument for `typst query` (typst#6405)

Co-authored-by: Laurenz <[email protected]>

* Require parentheses in all function-like sub/superscripts (typst#6442)

Co-authored-by: Laurenz <[email protected]>

* Fix several wrong anchors in `$` docs link resolution  (typst#6684)

* Add `cargo testit` alias for running integration tests (typst#6682)

Co-authored-by: Laurenz <[email protected]>

* Update guides welcome text to refer to list instead of specific guides (typst#6685)

Co-authored-by: Laurenz <[email protected]>

* Prevent broken glyph assemblies when font data is incorrect (typst#6688)

* Allow custom element names in HTML tag syntax  (typst#6676)

Co-authored-by: Laurenz <[email protected]>

* Add interface to disable timer (typst#6695)

Co-authored-by: Derived Cat <[email protected]>

* Add support for drawing COLR glyphs in SVG export (typst#6693)

* Apply aspect ratio correction for linear gradients in PDF export (typst#6689)

* Wrap raw blocks in `<code>` tag additionally to `<pre>` tag (typst#6701)

* Support for raw syntax highlighting in HTML export (typst#6691)

* Ensure that whitespace is not collapsed in inline raw blocks (typst#6703)

* Show aliases of citation styles in docs and completions (typst#6696)

* Correct CeTZ spelling (typst#6706)

* Add `title` element (typst#5618)

Co-authored-by: Laurenz <[email protected]>

* Make HTML data structures cheaper to clone (typst#6708)

* Move `par`, `box`, and `block` to show rules in HTML export (typst#6709)

* Support smartquotes in HTML export (typst#6710)

Co-authored-by: Malo <[email protected]>

* Avoid dangling reference output for HTML tests (typst#6711)

* Support multiple fonts in math (typst#6365)

* Add link to position field of grid.hline and grid.vline docs (typst#6670)

* Rename `pdf.embed` to `pdf.attach` (typst#6705)

* Include numbering in PDF bookmark (typst#6622)

Co-authored-by: Laurenz <[email protected]>

* Document escaping semicolon, valid identifiers, and `state` tips (typst#6674)

Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Yaksher <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Ensure table headers trigger rowbreak (typst#6687)

* Fix phrasing of iff (if and only if) in docs (typst#6713)

* Remove redundant "This can be" from stroke docs of curve and polygon (typst#6715)

* Fix curve docs for fill (refer to curve instead of rectangle) (typst#6714)

* Add span to `html.frame` node (typst#6716)

* Fix return type of `missing_method` (typst#6718)

* Encoding fixes for HTML raw text elements (typst#6720)

* Update RelativeTo to include tiling in docs (typst#6730)

* Add missing "the" for cmyk function of color docs (typst#6731)

* Remove use of "last" and "end" for conic gradient circle docs (typst#6733)

* Fix broken links in docs (typst#6734)

* Simplify links in docs (typst#6732)

Co-authored-by: Laurenz <[email protected]>

* Bump hayro and krilla (typst#6741)

* Deduplicate fallback smart quotes (typst#6747)

* Move `is_inline` to `HtmlElem` (typst#6748)

* Move grid cell locator creation to GridLayouter (typst#6746)

* HTML whitespace protection (typst#6750)

* Improve code snippets in Table Guide (typst#6658)

* More accessible color scheme for raw blocks (typst#6754)

Co-authored-by: Laurenz <[email protected]>

* Use `stylistic-set: 1` in favor of `ss01` in docs and tests (typst#6766)

* Implement fraction styles: vertical, skewed, and horizontal. (typst#6672)

* Bump Rust to 1.89 in CI (typst#6775)

Co-authored-by: Drodt <[email protected]>
Co-authored-by: Daniel Drodt <[email protected]>

* Fix typo in doc on quotes parameter of smartquote (typst#6779)

* Fix logical order in bidirectional lines (typst#6796)

* Extract `trim_weak_spacing` function (typst#6797)

* Separate items for hyphens, fixing style of repeated hyphen (typst#6798)

* Fix Unicode mapping of hyphenation artifacts (typst#6799)

* Do not consider default ignorables when picking last resort font (typst#6805)

* Compute width of shaped text on-demand (typst#6806)

* Fix `sub` and `super` oneliners (typst#6791)

* Ensure that hyphenation is possible after a tag (typst#6807)

* Make links to `$grid` in `table` docs more specific (typst#6776)

Co-authored-by: PgBiel <[email protected]>

* Fix `repr` of `foo.with(..)` (typst#6773)

* Fix case in docs serialization (typst#6808)

* Add links and examples in the docs of `str` (typst#6751)

Co-authored-by: Laurenz <[email protected]>

* Hash page instead of frame for watch command (typst#6810)

* Update nix flake and use nixfmt (typst#6827)

* Update & fix tutorial part 3 & 4 example code (typst#6778)

* Improve docs on customizing `raw` (typst#6000)

Co-authored-by: Malo <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Better handle large numbers (u128/i128) in deserialization (typst#6836)

* Follow the comment on setting the `State`'s mask (typst#6642)

* Allow augment line at the beginning and end of a matrix (typst#5806)

Co-authored-by: Laurenz <[email protected]>

* Fix slicing last n elements using count (typst#6838)

* Fix auto hanging-indent for centered headings (typst#6839)

* Use rust-analyzer from fenix toolchain in flake (typst#6826)

* Type safety for logical indices in line layout (typst#6848)

* Load linked bitmap images in SVG images (typst#6794)

Co-authored-by: Laurenz <[email protected]>

* Fix CJ-Latin space at manual line breaks (typst#6700)

Co-authored-by: Laurenz Mädje <[email protected]>

* Allow multi-character symbols (typst#6489)

Co-authored-by: Max <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Keep end of line whitespace glyphs (typst#6866)

* Fix punctuation in HTML placeholder (typst#6854)

* Unify and document the behaviours of `{json,yaml,toml,cbor}.encode` (typst#6743)

Co-authored-by: Laurenz <[email protected]>

* Improve docs of various numbering parameters (typst#6757)

Co-authored-by: Laurenz <[email protected]>

* Document and test `Sides<T>` parameters (typst#6862)

Co-authored-by: Laurenz <[email protected]>

* Remove unused `Styles::set_family` (typst#6879)

* Make clear that `Content::query_first` is naive (typst#6880)

* Ensure correct tag nesting with grouping rules (typst#6881)

* Avoid breaking after an empty frame (typst#6335)

* Add test for default ignorables before a breakpoint (typst#6782)

* Fix typos (typst#6878)

* Improve the docs on function params of `array.{sorted,dedup}` (typst#6756)

* Add a link from `math.vec` to `math.{arrow,bold}` in docs (typst#6867)

* Add a disclaimer about embedding PDFs (typst#6888)

Co-authored-by: Laurenz <[email protected]>

* Improve examples in the docs for under/over functions (typst#6889)

* Improve docs of `Celled<T>` params of `table` and `grid` (typst#6764)

Co-authored-by: Laurenz <[email protected]>

* Fix off by one in tag expansion (typst#6900)

* More useful `Debug` impls for `Tag` and `Location` (typst#6901)

* Fix potential crash in `Debug` impl of `Property` (typst#6902)

* Fix `Debug` impl for end tags (typst#6906)

* Make `select_where!` usable outside of typst-library (typst#6910)

* Fix footnote links in presence of styling (typst#6912)

* Consistently ignore styles for tags (typst#6911)

* Expand tags even a bit more around groupings (typst#6909)

* Don't warn for zero-sized horizontal spacing in HTML export

* Use `singleton!` for `HElem::hole`

* Add way to attach role to closest element in HTML export

* Add logical parent mechanism to HTML export

* Generalize mechanism for root styles to HTML export

* Support footnotes in HTML export

* Add `default` argument to `array.join` (typst#6932)

* Replace the non-existent `$math.arrow` with `$math.accent` in the docs for vector (typst#6918)

* Initial Hayagriva bump (typst#6920)

Co-authored-by: Laurenz <[email protected]>

* Use different colors for object keys and string-based values in JSON listings (typst#6873)

* Support for outline in HTML (typst#6606)

* Use Title Case for Doc Pages (typst#6936)

* Improve the docs for dictionary (typst#6899)

* Add an illustration for `par.{leading,spacing}` in docs (typst#6915)

Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Initial plan

---------

Co-authored-by: Sam Ireson <[email protected]>
Co-authored-by: PgBiel <[email protected]>
Co-authored-by: Ian Wrzesinski <[email protected]>
Co-authored-by: cAttte <[email protected]>
Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Laurenz <[email protected]>
Co-authored-by: Tobias Schmitz <[email protected]>
Co-authored-by: Max <[email protected]>
Co-authored-by: 3w36zj6 <[email protected]>
Co-authored-by: Malo <[email protected]>
Co-authored-by: T0mstone <[email protected]>
Co-authored-by: Lachlan Kermode <[email protected]>
Co-authored-by: Y.D.X. <[email protected]>
Co-authored-by: Ilia <[email protected]>
Co-authored-by: Noam Zaks <[email protected]>
Co-authored-by: Wannes Malfait <[email protected]>
Co-authored-by: Ivica Nakić <[email protected]>
Co-authored-by: +merlan #flirora <[email protected]>
Co-authored-by: Connor K <[email protected]>
Co-authored-by: Said A. <[email protected]>
Co-authored-by: Florian Bohlken <[email protected]>
Co-authored-by: Robin <[email protected]>
Co-authored-by: Adrián Delgado <[email protected]>
Co-authored-by: frozolotl <[email protected]>
Co-authored-by: Jassiel Ovando <[email protected]>
Co-authored-by: Patrick Massot <[email protected]>
Co-authored-by: Erik <[email protected]>
Co-authored-by: pog102 <[email protected]>
Co-authored-by: Laurenz Stampfl <[email protected]>
Co-authored-by: Niklas Eicker <[email protected]>
Co-authored-by: Marcono1234 <[email protected]>
Co-authored-by: Igor Khanin <[email protected]>
Co-authored-by: hpcfzl <[email protected]>
Co-authored-by: zefr0x <[email protected]>
Co-authored-by: Abdul-Rahman Sibahi <[email protected]>
Co-authored-by: 枚鴉 <[email protected]>
Co-authored-by: Myriad-Dreamin <[email protected]>
Co-authored-by: Derived Cat <[email protected]>
Co-authored-by: Sebastian Eberle <[email protected]>
Co-authored-by: Johann Birnick <[email protected]>
Co-authored-by: Yaksher <[email protected]>
Co-authored-by: Tau <[email protected]>
Co-authored-by: Martin Haug <[email protected]>
Co-authored-by: Théophile Cailliau <[email protected]>
Co-authored-by: Drodt <[email protected]>
Co-authored-by: Daniel Drodt <[email protected]>
Co-authored-by: ultimatile <[email protected]>
Co-authored-by: Poh <[email protected]>
Co-authored-by: Clemens Koza <[email protected]>
Co-authored-by: Siddhant Agarwal <[email protected]>
Co-authored-by: Philipp Niedermayer <[email protected]>
Co-authored-by: Toon Verstraelen <[email protected]>
Co-authored-by: Eric Biedert <[email protected]>
Co-authored-by: Jan Romann <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support for "linked" images in SVGs with xlink:href attribute of <image>

3 participants