use core::fmt::{Display, Write};
use crate::{
env::LatexEnvironment,
fmt::LatexFormatter,
lin_sys::{env::CasesEnvironment, unknowns::Unknowns, LinSys},
};
use nalgebra::{Dim, RawStorage};
pub struct PlainLinSysFormatter;
pub struct CasesLinSysFormatter;
impl<T, R, C, S, U> LatexFormatter<LinSys<T, R, C, S, U>> for PlainLinSysFormatter
where
T: Display,
R: Dim,
C: Dim,
S: RawStorage<T, R, C>,
U: Unknowns,
{
fn write_latex<W: Write>(
dest: &mut W,
input: &LinSys<T, R, C, S, U>,
) -> Result<(), core::fmt::Error> {
let nrows = input.matrix.nrows();
let ncols = input.matrix.ncols();
for i in 0..nrows {
for j in 0..ncols {
write!(dest, "{}", input.matrix[(i, j)])?;
unsafe { input.unknowns.write_latex_for_ith_unchecked(dest, j) }?;
if j != ncols - 1 {
write!(dest, "+")?;
}
}
if i != nrows - 1 {
write!(dest, r"\\")?;
}
}
Ok(())
}
}
impl<T, R, C, S, U> LatexFormatter<LinSys<T, R, C, S, U>> for CasesLinSysFormatter
where
T: Display,
R: Dim,
C: Dim,
S: RawStorage<T, R, C>,
U: Unknowns,
{
fn write_latex<W: core::fmt::Write>(
dest: &mut W,
input: &LinSys<T, R, C, S, U>,
) -> Result<(), core::fmt::Error> {
CasesEnvironment::write_opening_tag(dest)?;
PlainLinSysFormatter::write_latex(dest, input)?;
CasesEnvironment::write_closing_tag(dest)
}
}