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] 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