summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/library.rs7
-rw-r--r--src/eval/mod.rs11
2 files changed, 18 insertions, 0 deletions
diff --git a/src/eval/library.rs b/src/eval/library.rs
index 13825d7e..25f715f8 100644
--- a/src/eval/library.rs
+++ b/src/eval/library.rs
@@ -103,6 +103,8 @@ pub struct LangItems {
pub math_accent: fn(base: Content, accent: char) -> Content,
/// A fraction in math: `x/2`.
pub math_frac: fn(num: Content, denom: Content) -> Content,
+ /// A root in math: `√x`, `∛x` or `∜x`.
+ pub math_root: fn(index: Option<Content>, radicand: Content) -> Content,
/// Dispatch a method on a library value.
pub library_method: fn(
vm: &mut Vm,
@@ -134,9 +136,12 @@ impl Hash for LangItems {
self.strong.hash(state);
self.emph.hash(state);
self.raw.hash(state);
+ self.raw_languages.hash(state);
self.link.hash(state);
self.reference.hash(state);
+ (self.bibliography_keys as usize).hash(state);
self.heading.hash(state);
+ self.heading_func.hash(state);
self.list_item.hash(state);
self.enum_item.hash(state);
self.term_item.hash(state);
@@ -146,6 +151,8 @@ impl Hash for LangItems {
self.math_attach.hash(state);
self.math_accent.hash(state);
self.math_frac.hash(state);
+ self.math_root.hash(state);
+ (self.library_method as usize).hash(state);
}
}
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 2719c298..fe1fac3b 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -438,6 +438,7 @@ impl Eval for ast::Expr {
Self::MathDelimited(v) => v.eval(vm).map(Value::Content),
Self::MathAttach(v) => v.eval(vm).map(Value::Content),
Self::MathFrac(v) => v.eval(vm).map(Value::Content),
+ Self::MathRoot(v) => v.eval(vm).map(Value::Content),
Self::Ident(v) => v.eval(vm),
Self::None(v) => v.eval(vm),
Self::Auto(v) => v.eval(vm),
@@ -726,6 +727,16 @@ impl Eval for ast::MathFrac {
}
}
+impl Eval for ast::MathRoot {
+ type Output = Content;
+
+ fn eval(&self, vm: &mut Vm) -> SourceResult<Self::Output> {
+ let index = self.index().map(|i| (vm.items.text)(eco_format!("{i}")));
+ let radicand = self.radicand().eval_display(vm)?;
+ Ok((vm.items.math_root)(index, radicand))
+ }
+}
+
impl Eval for ast::Ident {
type Output = Value;