use typst_syntax::Spanned; use crate::diag::bail; use crate::foundations::{elem, Content, Value}; use crate::math::Mathy; /// A mathematical fraction. /// /// # Example /// ```example /// $ 1/2 < (x+1)/2 $ /// $ ((x+1)) / 2 = frac(a, b) $ /// ``` /// /// # Syntax /// This function also has dedicated syntax: Use a slash to turn neighbouring /// expressions into a fraction. Multiple atoms can be grouped into a single /// expression using round grouping parentheses. Such parentheses are removed /// from the output, but you can nest multiple to force them. #[elem(title = "Fraction", Mathy)] pub struct FracElem { /// The fraction's numerator. #[required] pub num: Content, /// The fraction's denominator. #[required] pub denom: Content, } /// A binomial expression. /// /// # Example /// ```example /// $ binom(n, k) $ /// $ binom(n, k_1, k_2, k_3, ..., k_m) $ /// ``` #[elem(title = "Binomial", Mathy)] pub struct BinomElem { /// The binomial's upper index. #[required] pub upper: Content, /// The binomial's lower index. #[required] #[variadic] #[parse( let values = args.all::>()?; if values.is_empty() { // Prevents one element binomials bail!(args.span, "missing argument: lower"); } values.into_iter().map(|spanned| spanned.v.display()).collect() )] pub lower: Vec, }