Skip to content

Conversation

@MDLC01
Copy link
Collaborator

@MDLC01 MDLC01 commented Jan 29, 2025

This changes the typographic parameter of sub and super to use the "subs" and "sups" font features instead of special Unicode characters that should not be used that way.1

Footnotes

  1. From Section 7.8.1 of the Unicode 16.0.0 Core Specification: "Superscript modifier letters are intended for cases where the letters carry a specific meaning, as in phonetic transcription systems, and are not a substitute for generic styling mechanisms for superscripting of text, as for footnotes, mathematical and chemical expressions, and the like."

@MDLC01
Copy link
Collaborator Author

MDLC01 commented Jan 29, 2025

New Computer Modern, Roboto, Liberation, do not support "sups" even for digits. So show footnote: set super(typographic: true) is probably a bad idea.

@T0mstone
Copy link
Contributor

T0mstone commented Jan 30, 2025

Note that the standard you quoted only applies to superscript letters, not numbers like ¹.
It might actually be good to keep using the superscript characters for numbers, they tend to look better IMO.

Edit: The relevant section for the superscript digits is https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-22/#G42931

It also seems to agree with you here tho:

In general, the Unicode Standard does not attempt to describe the positioning of a character above or below the baseline in typographical layout. Therefore, the preferred means to encode superscripted letters or digits, such as “1st” or “DC0016”, is by style or markup in rich text.

The question being whether typst's output counts as "rich text", similar to the discussion about #5734 (The thread there doesn't have any, so it might have been on Discord).

@MDLC01
Copy link
Collaborator Author

MDLC01 commented Jan 30, 2025

It might actually be good to keep using the superscript characters for numbers, they tend to look better IMO.

But as you noted later, they shouldn't really be used that way. The real solution is to use the font features (at least for footnotes, it should be the default imo), which does indeed look betters with fonts that support it (e.g., Libertinus Serif uses the same glyph for "²" and sups "2" I believe)

The question being whether typst's output counts as "rich text"

I don't see any reason why it wouldn't. Quoting Wikipedia:

In computing, formatted text, styled text, or rich text, as opposed to plain text, is digital text which has styling information beyond the minimum of semantic elements: colours, styles (boldface, italic), sizes, and special features in HTML (such as hyperlinks).

Copy link
Contributor

@PgBiel PgBiel left a comment

Choose a reason for hiding this comment

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

I'm also concerned with the font support deal, but leaving that discussion aside for a moment, I'll add some other comments.

@MDLC01 MDLC01 marked this pull request as draft February 1, 2025 12:15
@MDLC01
Copy link
Collaborator Author

MDLC01 commented Feb 1, 2025

I converted the PR to a draft as it seems there are still some possible improvements.

@khaledhosny
Copy link

CSS specification describe a fallback behavior that should help with inconsistent font coverage of these features. Quoting some of that text:

Because of the semantic nature of subscripts and superscripts, when the value is either sub or super for a given contiguous run of text, if a variant glyph is not available for all the characters in the run, simulated glyphs should be synthesized for all characters using reduced forms of the glyphs that would be used without this feature applied.

@MDLC01
Copy link
Collaborator Author

MDLC01 commented Mar 14, 2025

Just to keep you updated, I am now working on this again, and I hope to have a working solution in the upcoming days/weeks. In the meantime, feel free to close the PR to prevent clutter.

@laurmaedje
Copy link
Member

If you plan to work on it in the next days or weeks, there is no need to close.

@laurmaedje laurmaedje added interface PRs that add to or change Typst's user-facing interface as opposed to internals or docs changes. text Text layout, shaping, internationalization, etc. labels Mar 24, 2025
@MDLC01 MDLC01 force-pushed the opentype-text-scripts branch from 76c5187 to 3cb6e86 Compare March 27, 2025 10:36
Copy link
Collaborator Author

@MDLC01 MDLC01 left a comment

Choose a reason for hiding this comment

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

I pushed a prototype that uses the OpenType features by default, and synthesizes scripts when typographic is set to false.

When the OpenType features are used, non-textual elements are raised using the metrics provided by the font (although italic compensation, i.e., horizontal offset, is not applied). When scripts are synthesized, the metrics from the fonts are used (for if they are available, and otherwise, there is a fallback to the metrics that were used before this PR). Regarding font support for those metrics, see #5777 (comment).

This is still not fully ready to be merged. Below are some concerns and open questions.

Currently, the typographic argument is a boolean. When set to false, scripts are synthesized. When set to true, the corresponding OpenType feature is enabled, and that's it. There is no check that the font does in fact support the feature, and that it has subs/sups glyphs for all the characters used. I don't think there is an easy way to do that, other than manually comparing that all glyphs are different. What's bad is that the default text font, Libertinus Serif, does not have many sups/subs glyphs, so users are likely to encounter an issue if we set typographic: true by default. This is similar to the way smallcaps currently works, except Libertinus Serif has better support for smcp and c2sc than for subs and sups.

Finally, fonts can provide a different scaling for both axes for scripts (typically, the glyphs are scaled down vertically more than horizontally). When synthesizing scripts and when scaling non-textual elements, we scale them evenly in both axes, according to the font's vertical scaling factor. Should we use the horizontal scaling factor instead? Or should we use both?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

For now, 1em within a script resolves to the same absolute length as 1em outside. Maybe this should be changed to account for the reduced script size.

@laurmaedje
Copy link
Member

laurmaedje commented Mar 31, 2025

There is no check that the font does in fact support the feature, and that it has subs/sups glyphs for all the characters used. I don't think there is an easy way to do that, other than manually comparing that all glyphs are different.

For a basic check that the feature is supported, you could probably check for the GSUB table, check thats its features have matches for the subs and sups Tags. I haven't tested it, but worth a try.

@khaledhosny
Copy link

There is no check that the font does in fact support the feature, and that it has subs/sups glyphs for all the characters used. I don't think there is an easy way to do that, other than manually comparing that all glyphs are different.

For a basic check that the feature is supported, you could probably check for the GSUB table, check thats its features have matches for the subs and sups Tags. I haven't tested it, but worth a try.

HarfBuzz has hb_ot_layout_lookup_collect_glyphs() which can be used to get the glyphs covered by a given lookup (and other APIs to get lookups for a feature). I don't know if rustybuzz has equivalent APIs.

@MDLC01
Copy link
Collaborator Author

MDLC01 commented Mar 31, 2025

Thanks for the pointer! I will look into that.

@laurmaedje laurmaedje added the waiting-on-author Pull request waits on author label Apr 7, 2025
@MDLC01
Copy link
Collaborator Author

MDLC01 commented Apr 18, 2025

I now enable the feature only if it is supported (in the sense that all glyphs required to display a specific script are available). I still want to add more tests before merging to make sure everything works as intended, but it is pretty much in the final state for now.

The commits are a bit all over the place if you review the PR from the beginning. Tell me if you would like me to clean all that.

@MDLC01 MDLC01 force-pushed the opentype-text-scripts branch from 9330741 to ce7636b Compare April 19, 2025 16:02
@MDLC01
Copy link
Collaborator Author

MDLC01 commented Apr 19, 2025

I cleaned up the commits and added some tests.

There is still the question of whether 1em within scripts should resolve to the same absolute size as outside the scripts or not (#5777 (comment)). For now, 1em within scripts is the same as 1em outside of scripts, as illustrated by the super-1em test. If we decide to keep this behavior, this is ready to be merged!

Additionally, the behavior of underline and highlight together with super and sub could be improved. I think this can be left as a future improvement, as the current behavior is already imperfect, and comparable to the behavior with this PR (#5777 (comment)).

@MDLC01 MDLC01 marked this pull request as ready for review April 19, 2025 16:13
@laurmaedje laurmaedje removed the waiting-on-author Pull request waits on author label Jun 3, 2025
MDLC01 added 2 commits June 7, 2025 22:32
# Conflicts:
#	tests/ref/issue-4454-footnote-ref-numbering.png
@MDLC01
Copy link
Collaborator Author

MDLC01 commented Jun 29, 2025

This is now ready for review. As noted in #5777 (comment), I'm unsure in which places TextElem::size_in(shaped_text.styles) vs. glyph.size should be used.

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

Thanks a lot for your work and patience with this!

Merged via the queue into typst:main with commit 09c831d Jul 2, 2025
7 checks passed
@MDLC01 MDLC01 deleted the opentype-text-scripts branch July 2, 2025 17:13
Vanille-N pushed a commit to Vanille-N/typst that referenced this pull request Aug 14, 2025
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 <laurmaedje@gmail.com>

* Improve number lexing (typst#5969)

* Report errors in external files (typst#6308)

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

* Warning when watching stdin (typst#6381)

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* Improve equation reference example (typst#6481)

* Add page reference customization example (typst#6480)

Co-authored-by: Laurenz <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <9021226+PgBiel@users.noreply.github.com>
Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

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

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* Add interface to disable timer (typst#6695)

Co-authored-by: Derived Cat <hooyuser@outlook.com>

* 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 <laurmaedje@gmail.com>

* 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 <57839069+MDLC01@users.noreply.github.com>

* 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 <laurmaedje@gmail.com>

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

Co-authored-by: Andrew Voynov <37143421+Andrew15-5@users.noreply.github.com>
Co-authored-by: Yaksher <yaksher.git@gmail.com>
Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <daniel.drodt@tu-darmstadt.de>
Co-authored-by: Daniel Drodt <132357467+Drodt@users.noreply.github.com>

* 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 <9021226+PgBiel@users.noreply.github.com>

* 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 <laurmaedje@gmail.com>

* 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 <57839069+MDLC01@users.noreply.github.com>
Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz Mädje <laurmaedje@gmail.com>

* Allow multi-character symbols (typst#6489)

Co-authored-by: Max <max@mkor.je>
Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

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

Co-authored-by: Laurenz <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <laurmaedje@gmail.com>

* 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 <37143421+Andrew15-5@users.noreply.github.com>
Co-authored-by: Laurenz <laurmaedje@gmail.com>

* Initial plan

---------

Co-authored-by: Sam Ireson <107627922+samuelireson@users.noreply.github.com>
Co-authored-by: PgBiel <9021226+PgBiel@users.noreply.github.com>
Co-authored-by: Ian Wrzesinski <133046678+wrzian@users.noreply.github.com>
Co-authored-by: cAttte <26514199+cAttte@users.noreply.github.com>
Co-authored-by: Andrew Voynov <37143421+Andrew15-5@users.noreply.github.com>
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Co-authored-by: Tobias Schmitz <tobiasschmitz2001@gmail.com>
Co-authored-by: Max <max@mkor.je>
Co-authored-by: 3w36zj6 <52315048+3w36zj6@users.noreply.github.com>
Co-authored-by: Malo <57839069+MDLC01@users.noreply.github.com>
Co-authored-by: T0mstone <39707032+T0mstone@users.noreply.github.com>
Co-authored-by: Lachlan Kermode <lachiekermode@gmail.com>
Co-authored-by: Y.D.X. <73375426+YDX-2147483647@users.noreply.github.com>
Co-authored-by: Ilia <43654815+istudyatuni@users.noreply.github.com>
Co-authored-by: Noam Zaks <63877260+noamzaks@users.noreply.github.com>
Co-authored-by: Wannes Malfait <46323945+WannesMalfait@users.noreply.github.com>
Co-authored-by: Ivica Nakić <ssemigr@gmail.com>
Co-authored-by: +merlan #flirora <flirora@flirora.xyz>
Co-authored-by: Connor K <sigstackfault@gmail.com>
Co-authored-by: Said A. <47973576+Daaiid@users.noreply.github.com>
Co-authored-by: Florian Bohlken <flibbo@gmail.com>
Co-authored-by: Robin <mewmew@users.noreply.github.com>
Co-authored-by: Adrián Delgado <11708972+adriandelgado@users.noreply.github.com>
Co-authored-by: frozolotl <44589151+frozolotl@users.noreply.github.com>
Co-authored-by: Jassiel Ovando <jassielovando@protonmail.com>
Co-authored-by: Patrick Massot <patrickmassot@free.fr>
Co-authored-by: Erik <tinger@tinger.dev>
Co-authored-by: pog102 <85764555+pog102@users.noreply.github.com>
Co-authored-by: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com>
Co-authored-by: Niklas Eicker <git@nikl.me>
Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com>
Co-authored-by: Igor Khanin <igor@khanin.biz>
Co-authored-by: hpcfzl <hopcfizl@gmail.com>
Co-authored-by: zefr0x <65136727+zefr0x@users.noreply.github.com>
Co-authored-by: Abdul-Rahman Sibahi <asibahi@users.noreply.github.com>
Co-authored-by: 枚鴉 <ling@omots.io>
Co-authored-by: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com>
Co-authored-by: Derived Cat <hooyuser@outlook.com>
Co-authored-by: Sebastian Eberle <152992757+sebaseb98@users.noreply.github.com>
Co-authored-by: Johann Birnick <6528009+jbirnick@users.noreply.github.com>
Co-authored-by: Yaksher <yaksher.git@gmail.com>
Co-authored-by: Tau <git@alice-carroll.pet>
Co-authored-by: Martin Haug <mhaug@live.de>
Co-authored-by: Théophile Cailliau <tjbcg@pm.me>
Co-authored-by: Drodt <daniel.drodt@tu-darmstadt.de>
Co-authored-by: Daniel Drodt <132357467+Drodt@users.noreply.github.com>
Co-authored-by: ultimatile <ultimatile@users.noreply.github.com>
Co-authored-by: Poh <167305720+pohlrabi404@users.noreply.github.com>
Co-authored-by: Clemens Koza <clemens.koza@gmx.at>
Co-authored-by: Siddhant Agarwal <68201519+siddhantdev@users.noreply.github.com>
Co-authored-by: Philipp Niedermayer <eltos@outlook.de>
Co-authored-by: Toon Verstraelen <Toon.Verstraelen@UGent.be>
Co-authored-by: Eric Biedert <github@ericbiedert.de>
Co-authored-by: Jan Romann <jan.romann@uni-bremen.de>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
// In case of a problem, we just early exit
let gsub = font.rusty().tables().gsub?;
let subtable_index =
gsub.features.find(settings.kind.feature())?.lookup_indices.get(0)?;

Choose a reason for hiding this comment

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

If I’m reading this correctly, this code collects the glyph coverage from the first lookup in the feature, but the feature can have multiple lookups. This might be the cause for #7249.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

So if I understand correctly, I should instead consider the union of the coverages from all subtables from all lookups to test whether there exists a scripted glyph?

Choose a reason for hiding this comment

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

I believe so.

Choose a reason for hiding this comment

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

The code should also take script and language into account, different OpenType language systems might have different feature records with different lookups and coverage.

.lookups
.get(subtable_index)?
.subtables
.get::<SubstitutionSubtable>(0)?

Choose a reason for hiding this comment

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

This also gets the coverage from the first subtable in the lookup, but lookups can have more than one subtable.

text.chars()
.all(|c| {
font.rusty().glyph_index(c).is_some_and(|i| coverage.contains(i))
})

Choose a reason for hiding this comment

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

This check is problematic as well. It gets glyph indices from cmap then it checks of they are covered by the feature, but when shaping text you might end up with different glyphs (e.g. a ligature or small caps or an alternate glyph) and it these glyphs might not be supported by the features compared to their base glyphs. Ideally, this function should take as input the already shaped glyph indices not the Unicode text.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

interface PRs that add to or change Typst's user-facing interface as opposed to internals or docs changes. text Text layout, shaping, internationalization, etc.

Projects

None yet

5 participants