use super::*; use crate::layout::{FixedNode, GridNode, PadNode, StackChild, StackNode, TrackSizing}; use crate::paper::{Paper, PaperClass}; /// `page`: Configure pages. pub fn page(ctx: &mut EvalContext, args: &mut Arguments) -> TypResult { let paper = match args.eat::>() { Some(name) => match Paper::from_name(&name.v) { None => bail!(name.span, "invalid paper name"), paper => paper, }, None => None, }; let width = args.named("width")?; let height = args.named("height")?; let margins = args.named("margins")?; let left = args.named("left")?; let top = args.named("top")?; let right = args.named("right")?; let bottom = args.named("bottom")?; let flip = args.named("flip")?; ctx.template.modify(move |state| { let page = state.page_mut(); if let Some(paper) = paper { page.class = paper.class(); page.size = paper.size(); } if let Some(width) = width { page.class = PaperClass::Custom; page.size.w = width; } if let Some(height) = height { page.class = PaperClass::Custom; page.size.h = height; } if let Some(margins) = margins { page.margins = Sides::splat(Some(margins)); } if let Some(left) = left { page.margins.left = Some(left); } if let Some(top) = top { page.margins.top = Some(top); } if let Some(right) = right { page.margins.right = Some(right); } if let Some(bottom) = bottom { page.margins.bottom = Some(bottom); } if flip.unwrap_or(false) { std::mem::swap(&mut page.size.w, &mut page.size.h); } }); ctx.template.pagebreak(false); Ok(Value::None) } /// `pagebreak`: Start a new page. pub fn pagebreak(ctx: &mut EvalContext, _: &mut Arguments) -> TypResult { ctx.template.pagebreak(true); Ok(Value::None) } /// `h`: Horizontal spacing. pub fn h(ctx: &mut EvalContext, args: &mut Arguments) -> TypResult { let spacing = args.expect("spacing")?; ctx.template.spacing(GenAxis::Inline, spacing); Ok(Value::None) } /// `v`: Vertical spacing. pub fn v(ctx: &mut EvalContext, args: &mut Arguments) -> TypResult { let spacing = args.expect("spacing")?; ctx.template.spacing(GenAxis::Block, spacing); Ok(Value::None) } /// `align`: Configure the alignment along the layouting axes. pub fn align(ctx: &mut EvalContext, args: &mut Arguments) -> TypResult { let first = args.eat::(); let second = args.eat::(); let body = args.eat::