use crate::foundations::{Content, Packed, elem};
use crate::layout::{Length, Rel};
use crate::math::{EquationElem, Mathy};
#[elem(Mathy)]
pub struct AttachElem {
#[required]
pub base: Content,
pub t: Option<Content>,
pub b: Option<Content>,
pub tl: Option<Content>,
pub bl: Option<Content>,
pub tr: Option<Content>,
pub br: Option<Content>,
}
impl Packed<AttachElem> {
pub fn merge_base(&self) -> Option<Self> {
let mut base = &self.base;
while let Some(equation) = base.to_packed::<EquationElem>() {
base = &equation.body;
}
if let Some(base) = base.to_packed::<AttachElem>() {
let mut elem = self.clone();
let mut base = base.clone();
macro_rules! merge {
($content:ident) => {
if !base.$content.is_set() && elem.$content.is_set() {
base.$content = elem.$content.clone();
elem.$content.unset();
}
};
}
merge!(t);
merge!(b);
merge!(tl);
merge!(tr);
merge!(bl);
merge!(br);
elem.base = base.pack();
return Some(elem);
}
None
}
}
#[elem(Mathy)]
pub struct PrimesElem {
#[required]
pub count: usize,
}
#[elem(Mathy)]
pub struct ScriptsElem {
#[required]
pub body: Content,
}
#[elem(Mathy)]
pub struct LimitsElem {
#[required]
pub body: Content,
#[default(true)]
pub inline: bool,
}
#[elem(Mathy)]
pub struct StretchElem {
#[required]
pub body: Content,
#[default(Rel::one())]
pub size: Rel<Length>,
}