use ecow::EcoString;
use crate::foundations::{Content, NativeElement, Scope, SymbolElem, elem};
use crate::layout::HElem;
use crate::math::{Mathy, THIN, upright};
use crate::text::TextElem;
#[elem(title = "Text Operator", Mathy)]
pub struct OpElem {
#[required]
pub text: Content,
#[default(false)]
pub limits: bool,
}
macro_rules! ops {
($($name:ident $(: $value:literal)? $(($tts:tt))?),* $(,)?) => {
pub(super) fn define(math: &mut Scope) {
$({
let operator = EcoString::from(ops!(@name $name $(: $value)?));
math.define(
stringify!($name),
OpElem::new(TextElem::new(operator).into())
.with_limits(ops!(@limit $($tts)*))
.pack()
);
})*
let dif = |d| {
HElem::new(THIN.into()).with_weak(true).pack()
+ upright(SymbolElem::packed(d))
};
math.define("dif", dif('d'));
math.define("Dif", dif('D'));
}
};
(@name $name:ident) => { stringify!($name) };
(@name $name:ident: $value:literal) => { $value };
(@limit limits) => { true };
(@limit) => { false };
}
ops! {
arccos,
arcsin,
arctan,
arg,
cos,
cosh,
cot,
coth,
csc,
csch,
ctg,
deg,
det (limits),
dim,
exp,
gcd (limits),
lcm (limits),
hom,
id,
im,
inf (limits),
ker,
lg,
lim (limits),
liminf: "lim inf" (limits),
limsup: "lim sup" (limits),
ln,
log,
max (limits),
min (limits),
mod,
Pr (limits),
sec,
sech,
sin,
sinc,
sinh,
sup (limits),
tan,
tanh,
tg,
tr,
}