From 1df33f72b4f9bad88c96261ffd23626cac7af251 Mon Sep 17 00:00:00 2001 From: fGolke <87950255+fGolke@users.noreply.github.com> Date: Sat, 5 Apr 2025 21:23:01 +0200 Subject: [PATCH 1/3] Add default-style parameter to math.equation --- crates/typst-layout/src/math/text.rs | 23 ++++++++++++++-------- crates/typst-library/src/math/equation.rs | 6 +++++- crates/typst-library/src/math/style.rs | 16 +++++++++++++++ tests/ref/math-style-italic-default.png | Bin 466 -> 1532 bytes tests/suite/math/style.typ | 11 ++++++++++- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/crates/typst-layout/src/math/text.rs b/crates/typst-layout/src/math/text.rs index 59ac5b089..043d95b3f 100644 --- a/crates/typst-layout/src/math/text.rs +++ b/crates/typst-layout/src/math/text.rs @@ -4,7 +4,7 @@ use ecow::EcoString; use typst_library::diag::SourceResult; use typst_library::foundations::{Packed, StyleChain, SymbolElem}; use typst_library::layout::{Abs, Size}; -use typst_library::math::{EquationElem, MathSize, MathVariant}; +use typst_library::math::{EquationElem, MathSize, MathStyle, MathVariant}; use typst_library::text::{ BottomEdge, BottomEdgeMetric, TextElem, TopEdge, TopEdgeMetric, }; @@ -187,14 +187,21 @@ fn styled_char(styles: StyleChain, c: char, auto_italic: bool) -> char { let variant = EquationElem::variant_in(styles); let bold = EquationElem::bold_in(styles); + let default_style = EquationElem::default_style_in(styles); + let default_italic = match c { + 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | + 'α'..='ω' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' => + matches!(default_style, MathStyle::Iso | MathStyle::Tex | MathStyle::French), + 'A'..='Z' => + matches!(default_style, MathStyle::Iso | MathStyle::Tex), + 'Α'..='Ω' => + matches!(default_style, MathStyle::Iso), + '∂' => + matches!(default_style, MathStyle::Tex | MathStyle::French), + _ => false + }; let italic = EquationElem::italic_in(styles).unwrap_or( - auto_italic - && matches!( - c, - 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | 'A'..='Z' | - 'α'..='ω' | '∂' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' - ) - && matches!(variant, Sans | Serif), + auto_italic && default_italic && matches!(variant, Sans | Serif), ); if let Some(c) = basic_exception(c) { diff --git a/crates/typst-library/src/math/equation.rs b/crates/typst-library/src/math/equation.rs index 32be216a4..a5548e4aa 100644 --- a/crates/typst-library/src/math/equation.rs +++ b/crates/typst-library/src/math/equation.rs @@ -14,7 +14,7 @@ use crate::layout::{ AlignElem, Alignment, BlockElem, InlineElem, OuterHAlignment, SpecificAlignment, VAlignment, }; -use crate::math::{MathSize, MathVariant}; +use crate::math::{MathSize, MathStyle, MathVariant}; use crate::model::{Numbering, Outlinable, ParLine, Refable, Supplement}; use crate::text::{FontFamily, FontList, FontWeight, LocalName, TextElem}; @@ -52,6 +52,10 @@ pub struct EquationElem { #[default(false)] pub block: bool, + /// The rule determining which letters and symbols are italic by default. + #[default(MathStyle::Tex)] + pub default_style: MathStyle, + /// How to [number]($numbering) block-level equations. /// /// ```example diff --git a/crates/typst-library/src/math/style.rs b/crates/typst-library/src/math/style.rs index f3d28f2a9..759f3ed17 100644 --- a/crates/typst-library/src/math/style.rs +++ b/crates/typst-library/src/math/style.rs @@ -252,3 +252,19 @@ pub enum MathVariant { Mono, Bb, } + + +/// A rule describing which letters and symbols are italic by default. +#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Cast, Hash)] +// #[derive(Serialize, Deserialize, Cast)] +// #[serde(rename_all = "kebab-case")] +pub enum MathStyle { + // Every latin or greek letter italic, [partial] upright. + Iso, + // Everything but capital greek letters italic. + Tex, + // Lowercase letters and [partial] italic. + French, + // Everything upright. + Upright +} diff --git a/tests/ref/math-style-italic-default.png b/tests/ref/math-style-italic-default.png index 0a25f6facb12378d26cd55e7df65625830ba56e0..075856c2435eb5c26572ec04d3751b1d8db20c74 100644 GIT binary patch delta 1527 zcmVwSDWzRR~{QqZ|-F!Mc*fi%ivooJ_&ck>9GkeY*+<&IsVT6sa5&r*%{au=x z8VQ_I=|o%qb}B%dq)ig13U{~(Sn}1P7|p9zqb=o^mL&6}!+pz^Nwt4Z(BfdG zU$8BE$`!;a-UH@W=?Qmdm33&|Q#V(tV|u;7pw%hxXI}BsZowqBu0d>JhN38GALs}V zFYre0m##b6^?!^|{m$}LDz44#LtRWB_9q3~N*JEfCH(x&FOwDkU$BZ?zFN!bbSN5FTmJl$-4nkQ>amD@?2mZS{q%Og}k0e$=C}~b})sh`%QU!1Zemr zKYzYk|G&D$HQ_TJiIFCWI<&P8NCe*2A3k#{pH&EcDkU$BZ?zFN!bbQ%5Y9xKH+74f zfL+dxcWJJ!Lz}-Kzet&ExZ}=VjmMfU5xAAO7iwPmiYD)(R?aUOpJX`w^JI;~?+~;L zZf1-KmYtt&M=b6u;Ikw>;eD2EcF8@pGk=lGeJ?|xc!v{!zc-hqJ}ys|Nd7FuUR|G+ zmGxzaj_}zqBC6$?Oy}?K6ttE!FI90YqziQ+tvFuP4h++e3eQ*`9UZ;&RUP5YIm{aq zOs%T=bf@6V@wN>rzKyLI1?YbkOljJIVgGEz^AsTAdmZ6j)fZmhN9GXR_z|4XDSwzf z@G%KZl(s^l4d18KKSUwkT;)qa%HA0X-V!SOXfQrW%=z8iq+U;8>( z=Z4ZkLRkYa zR&fg3WuVGZ3+D={{{gCbdLwqS>L~yK002ovPDHLkV1nbq=iC4Q delta 453 zcmV;$0XqKt3(^CS7k?WF00000l5Z6H0004*Nkl+;U9y3WKX_Q=siSfu|MsvUFo_mwW>QajP zTYXM<@$J^>MDR;!1Skkn&%lpa8ZnRz9fVSuT(0>nv9c3zZrWzi2x7IUP zt>%J4w6(V#Il8|c_UGiNI z0;6NoaSwtHYKjm`@0VrSnXMyyZw*z9tKQs};)Oho3k3=;EPj;Ljz Date: Sat, 5 Apr 2025 21:58:33 +0200 Subject: [PATCH 2/3] Fix formatting --- crates/typst-layout/src/math/text.rs | 20 ++++++++------------ crates/typst-library/src/math/style.rs | 3 +-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/crates/typst-layout/src/math/text.rs b/crates/typst-layout/src/math/text.rs index 043d95b3f..8c6c62af6 100644 --- a/crates/typst-layout/src/math/text.rs +++ b/crates/typst-layout/src/math/text.rs @@ -189,20 +189,16 @@ fn styled_char(styles: StyleChain, c: char, auto_italic: bool) -> char { let bold = EquationElem::bold_in(styles); let default_style = EquationElem::default_style_in(styles); let default_italic = match c { - 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | - 'α'..='ω' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' => - matches!(default_style, MathStyle::Iso | MathStyle::Tex | MathStyle::French), - 'A'..='Z' => - matches!(default_style, MathStyle::Iso | MathStyle::Tex), - 'Α'..='Ω' => - matches!(default_style, MathStyle::Iso), - '∂' => - matches!(default_style, MathStyle::Tex | MathStyle::French), + 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | 'α'..='ω' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' => { + matches!(default_style, MathStyle::Iso | MathStyle::Tex | MathStyle::French) + } + 'A'..='Z' => matches!(default_style, MathStyle::Iso | MathStyle::Tex), + 'Α'..='Ω' => matches!(default_style, MathStyle::Iso), + '∂' => matches!(default_style, MathStyle::Tex | MathStyle::French), _ => false }; - let italic = EquationElem::italic_in(styles).unwrap_or( - auto_italic && default_italic && matches!(variant, Sans | Serif), - ); + let italic = EquationElem::italic_in(styles) + .unwrap_or(auto_italic && default_italic && matches!(variant, Sans | Serif)); if let Some(c) = basic_exception(c) { return c; diff --git a/crates/typst-library/src/math/style.rs b/crates/typst-library/src/math/style.rs index 759f3ed17..f74082994 100644 --- a/crates/typst-library/src/math/style.rs +++ b/crates/typst-library/src/math/style.rs @@ -253,7 +253,6 @@ pub enum MathVariant { Bb, } - /// A rule describing which letters and symbols are italic by default. #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Cast, Hash)] // #[derive(Serialize, Deserialize, Cast)] @@ -266,5 +265,5 @@ pub enum MathStyle { // Lowercase letters and [partial] italic. French, // Everything upright. - Upright + Upright, } From 3dc9acf4b39127ab399ea3e8a292ff83c6dcd48e Mon Sep 17 00:00:00 2001 From: fGolke <87950255+fGolke@users.noreply.github.com> Date: Sat, 5 Apr 2025 22:13:13 +0200 Subject: [PATCH 3/3] Fix formatting v2 --- crates/typst-layout/src/math/text.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/typst-layout/src/math/text.rs b/crates/typst-layout/src/math/text.rs index 8c6c62af6..e0ca646b0 100644 --- a/crates/typst-layout/src/math/text.rs +++ b/crates/typst-layout/src/math/text.rs @@ -189,16 +189,17 @@ fn styled_char(styles: StyleChain, c: char, auto_italic: bool) -> char { let bold = EquationElem::bold_in(styles); let default_style = EquationElem::default_style_in(styles); let default_italic = match c { - 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | 'α'..='ω' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' => { + 'a'..='z' | 'ħ' | 'ı' | 'ȷ' | 'α'..='ω' | 'ϵ' | 'ϑ' | 'ϰ' | 'ϕ' | 'ϱ' | 'ϖ' => + { matches!(default_style, MathStyle::Iso | MathStyle::Tex | MathStyle::French) - } + } 'A'..='Z' => matches!(default_style, MathStyle::Iso | MathStyle::Tex), 'Α'..='Ω' => matches!(default_style, MathStyle::Iso), '∂' => matches!(default_style, MathStyle::Tex | MathStyle::French), - _ => false + _ => false, }; let italic = EquationElem::italic_in(styles) - .unwrap_or(auto_italic && default_italic && matches!(variant, Sans | Serif)); + .unwrap_or(auto_italic && default_italic && matches!(variant, Sans | Serif)); if let Some(c) = basic_exception(c) { return c;