/** * \file math_macrotemplate.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author André Pönitz * * Full author contact details are available in file CREDITS. */ #include #include "math_macrotemplate.h" #include "math_mathmlstream.h" #include "math_parser.h" #include "frontends/Painter.h" #include "debug.h" using std::auto_ptr; using std::endl; MathMacroTemplate::MathMacroTemplate() : MathNestInset(2), numargs_(0), name_(), type_("newcommand") {} MathMacroTemplate::MathMacroTemplate(string const & nm, int numargs, string const & type, MathArray const & ar1, MathArray const & ar2) : MathNestInset(2), numargs_(numargs), name_(nm), type_(type) { if (numargs_ > 9) lyxerr << "MathMacroTemplate::MathMacroTemplate: wrong # of arguments: " << numargs_ << std::endl; cell(0) = ar1; cell(1) = ar2; } MathMacroTemplate::MathMacroTemplate(std::istream & is) : MathNestInset(2), numargs_(0), name_() { MathArray ar; mathed_parse_cell(ar, is); if (ar.size() != 1 || !ar[0]->asMacroTemplate()) { lyxerr << "cannot read macro from '" << ar << "'" << endl; return; } operator=( *(ar[0]->asMacroTemplate()) ); } auto_ptr MathMacroTemplate::clone() const { //lyxerr << "cloning MacroTemplate!" << endl; return auto_ptr(new MathMacroTemplate(*this)); } int MathMacroTemplate::numargs() const { return numargs_; } void MathMacroTemplate::numargs(int numargs) { numargs_ = numargs; } string MathMacroTemplate::name() const { return name_; } void MathMacroTemplate::metrics(MetricsInfo & mi, Dimension & dim) const { cell(0).metrics(mi); cell(1).metrics(mi); dim_.wid = cell(0).width() + cell(1).width() + 10; dim_.asc = std::max(cell(0).ascent(), cell(1).ascent()) + 2; dim_.des = std::max(cell(0).descent(), cell(1).descent()) + 2; dim = dim_; } void MathMacroTemplate::draw(PainterInfo & pi, int x, int y) const { int const w0 = cell(0).width(); int const w1 = cell(1).width(); cell(0).draw(pi, x + 2, y + 1); pi.pain.rectangle(x, y - dim_.ascent() + 1, w0 + 4, dim_.height(), LColor::mathline); cell(1).draw(pi, x + 8 + w0, y + 1); pi.pain.rectangle(x + w0 + 6 , y - dim_.ascent() + 1, w1 + 4, dim_.height(), LColor::mathline); } void MathMacroTemplate::write(WriteStream & os) const { if (type_ == "def") { os << "\n\\def\\" << name_.c_str(); for (int i = 1; i <= numargs_; ++i) os << '#' << i; } else { // newcommand or renewcommand os << "\n\\" << type_.c_str() << "{\\" << name_.c_str() << '}'; if (numargs_ > 0) os << '[' << numargs_ << ']'; } os << '{' << cell(0) << "}"; if (os.latex()) { // writing .tex. done. os << "\n"; } else { // writing .lyx, write special .tex export only if necessary if (!cell(1).empty()) os << "\n{" << cell(1) << '}'; } }