X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_write.C;h=10f91d4dfe8e56927b779e4949367b649d89ab99;hb=abb623f7872ba960a92a6d069dcb6aa5add0d8b0;hp=b93badd1c180c23f7030d5a1248b744bb369a5ab;hpb=e19f533b0e3be182795a12ebb5514b8c594b82dd;p=features.git diff --git a/src/mathed/math_write.C b/src/mathed/math_write.C index b93badd1c1..10f91d4dfe 100644 --- a/src/mathed/math_write.C +++ b/src/mathed/math_write.C @@ -43,15 +43,22 @@ char const * math_font_name[] = { void MathSpaceInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + if (space >= 0 && space < 6) { + os << '\\' << latex_mathspace[space] << ' '; + } +#else if (space >= 0 && space < 6) { string output; MathSpaceInset::Write(output); os << output; } +#endif } +#ifndef USE_OSTREAM_ONLY void MathSpaceInset::Write(string & outf) { @@ -61,34 +68,48 @@ MathSpaceInset::Write(string & outf) outf += ' '; } } +#endif void MathDotsInset::Write(ostream & os) { +#ifdef USE_OSTREAM_ONLY + os << '\\' << name << ' '; +#else string output; MathDotsInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathDotsInset::Write(string & outf) { outf += '\\'; outf += name; outf += ' '; -} +} +#endif void MathSqrtInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + os << '\\' << name << '{'; + MathParInset::Write(os); + os << '}'; +#else string output; MathSqrtInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathSqrtInset::Write(string & outf) { outf += '\\'; @@ -97,18 +118,46 @@ void MathSqrtInset::Write(string & outf) MathParInset::Write(outf); outf += '}'; } +#endif void MathDelimInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + latexkeys * l = (left != '|') ? lm_get_key_by_id(left, LM_TK_SYM): 0; + latexkeys * r = (right != '|') ? lm_get_key_by_id(right, LM_TK_SYM): 0; + os << "\\left"; + if (l) { + os << '\\' << l->name << ' '; + } else { + if (left == '{' || left == '}') { + os << '\\' << char(left) << ' '; + } else { + os << char(left) << ' '; + } + } + MathParInset::Write(os); + os << "\\right"; + if (r) { + os << '\\' << r->name << ' '; + } else { + if (right == '{' || right == '}') { + os << '\\' << char(right) << ' '; + } else { + os << char(right) << ' '; + } + } +#else string output; MathDelimInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathDelimInset::Write(string & outf) -{ +{ latexkeys * l = (left != '|') ? lm_get_key_by_id(left, LM_TK_SYM): 0; latexkeys * r = (right != '|') ? lm_get_key_by_id(right, LM_TK_SYM): 0; outf += "\\left"; @@ -143,16 +192,25 @@ void MathDelimInset::Write(string & outf) } } } +#endif void MathDecorationInset::Write(ostream & os) { +#ifdef USE_OSTREAM_ONLY + latexkeys * l = lm_get_key_by_id(deco, LM_TK_WIDE); + os << '\\' << l->name << '{'; + MathParInset::Write(os); + os << '}'; +#else string output; MathDecorationInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathDecorationInset::Write(string & outf) { latexkeys * l = lm_get_key_by_id(deco, LM_TK_WIDE); @@ -162,16 +220,50 @@ void MathDecorationInset::Write(string & outf) MathParInset::Write(outf); outf += '}'; } +#endif void MathAccentInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + latexkeys * l = lm_get_key_by_id(code, LM_TK_ACCENT); + os << '\\' << l->name; + if (code!= LM_not) + os << '{'; + else + os << ' '; + + if (inset) { + inset->Write(os); + } else { + if (fn>= LM_TC_RM && fn<= LM_TC_TEXTRM) { + os << '\\' + << math_font_name[fn-LM_TC_RM] + << '{'; + } + if (MathIsSymbol(fn)) { + latexkeys * l = lm_get_key_by_id(c, LM_TK_SYM); + if (l) { + os << '\\' << l->name << ' '; + } + } else + os << char(c); + + if (fn>= LM_TC_RM && fn<= LM_TC_TEXTRM) + os << '}'; + } + + if (code!= LM_not) + os << '}'; +#else string output; MathAccentInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathAccentInset::Write(string & outf) { latexkeys * l = lm_get_key_by_id(code, LM_TK_ACCENT); @@ -207,16 +299,34 @@ void MathAccentInset::Write(string & outf) if (code!= LM_not) outf += '}'; } +#endif void MathBigopInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + bool limp = GetLimits(); + + os << '\\' << name; + + if (limp && !(sym != LM_int && sym != LM_oint + && (GetStyle() == LM_ST_DISPLAY))) + os << "\\limits "; + else + if (!limp && (sym != LM_int && sym != LM_oint + && (GetStyle() == LM_ST_DISPLAY))) + os << "\\nolimits "; + else + os << ' '; +#else string output; MathBigopInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathBigopInset::Write(string & outf) { bool limp = GetLimits(); @@ -232,16 +342,26 @@ void MathBigopInset::Write(string & outf) else outf += ' '; } +#endif void MathFracInset::Write(ostream & os) -{ +{ +#ifdef USE_OSTREAM_ONLY + os << '\\' << name << '{'; + MathParInset::Write(os); + os << "}{"; + den->Write(os); + os << '}'; +#else string output; MathFracInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathFracInset::Write(string & outf) { outf += '\\'; @@ -252,17 +372,136 @@ void MathFracInset::Write(string & outf) den->Write(outf); outf += '}'; } +#endif void MathParInset::Write(ostream & os) { +#ifdef USE_OSTREAM_ONLY + if (!array) return; + int brace = 0; + latexkeys * l; + MathedIter data(array); + // hack + MathedRowSt const * crow = getRowSt(); + data.Reset(); + + if (!Permit(LMPF_FIXED_SIZE)) { + l = lm_get_key_by_id(size, LM_TK_STY); + if (l) { + os << '\\' << l->name << ' '; + } + } + while (data.OK()) { + byte cx = data.GetChar(); + if (cx >= ' ') { + int ls; + byte * s = data.GetString(ls); + + if (data.FCode() >= LM_TC_RM && data.FCode() <= LM_TC_TEXTRM) { + os << '\\' << math_font_name[data.FCode()-LM_TC_RM] << '{'; + } + while (ls > 0) { + if (MathIsSymbol(data.FCode())) { + l = lm_get_key_by_id(*s, (data.FCode() == LM_TC_BSYM) ? + LM_TK_BIGSYM : LM_TK_SYM); + if (l) { + os << '\\' << l->name << ' '; + } else { + lyxerr << "Illegal symbol code[" << *s + << " " << ls << " " << data.FCode() << "]"; + } + } else { + // Is there a standard logical XOR? + if ((data.FCode() == LM_TC_TEX && *s != '{' && *s != '}') || + (data.FCode() == LM_TC_SPECIAL)) + os << '\\'; + else { + if (*s == '{') ++brace; + if (*s == '}') --brace; + } + if (*s == '}' && data.FCode() == LM_TC_TEX && brace < 0) + lyxerr <<"Math warning: Unexpected closing brace." + << endl; + else + os << char(*s); + } + ++s; --ls; + } + if (data.FCode()>= LM_TC_RM && data.FCode()<= LM_TC_TEXTRM) + os << '}'; + } else + if (MathIsInset(cx)) { + MathedInset * p = data.GetInset(); + if (cx == LM_TC_UP) + os << "^{"; + if (cx == LM_TC_DOWN) + os << "_{"; + p->Write(os); + if (cx == LM_TC_UP || cx == LM_TC_DOWN) + os << '}'; + data.Next(); + } else + switch(cx) { + case LM_TC_TAB: + { + os << " & "; + data.Next(); + break; + } + case LM_TC_CR: + { + if (crow) { + if (!crow->isNumbered()) { + os << "\\nonumber "; + } + if (crow->getLabel()) { + os << "\\label{" + << crow->getLabel() + << "} "; + } + crow = crow->getNext(); + } + os << "\\\\\n"; + ++number_of_newlines; + data.Next(); + break; + } + default: + lyxerr << "WMath Error: unrecognized code[" << cx << "]"; + return; + } + } + + if (crow) { + if (!crow->isNumbered()) { + os << "\\nonumber "; + } + if (crow->getLabel()) { + os << "\\label{" + << crow->getLabel() + << "} "; + } + } +#if 1 + while (brace > 0) { + os << '}'; + --brace; + } +#else + // Something like this should work too: + os << string(brace, '}'); // not one-off error I hope. +#endif +#else if (!array) return; string output; MathParInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathParInset::Write(string & outf) { if (!array) return; @@ -380,16 +619,42 @@ void MathParInset::Write(string & outf) --brace; } } +#endif void MathMatrixInset::Write(ostream & os) { +#ifdef USE_OSTREAM_ONLY + if (GetType() == LM_OT_MATRIX){ + os << "\\begin{" + << name + << '}'; + if (v_align == 't' || v_align == 'b') { + os << '[' + << char(v_align) + << ']'; + } + os << '{' + << h_align + << "}\n"; + ++number_of_newlines; + } + MathParInset::Write(os); + if (GetType() == LM_OT_MATRIX){ + os << "\n\\end{" + << name + << '}'; + ++number_of_newlines; + } +#else string output; MathMatrixInset::Write(output); os << output; +#endif } +#ifndef USE_OSTREAM_ONLY void MathMatrixInset::Write(string & outf) { if (GetType() == LM_OT_MATRIX){ @@ -414,22 +679,83 @@ void MathMatrixInset::Write(string & outf) ++number_of_newlines; } } +#endif void mathed_write(MathParInset * p, ostream & os, int * newlines, char fragile, char const * label) { +#ifdef USE_OSTREAM_ONLY + number_of_newlines = 0; + short mathed_env = p->GetType(); + + if (mathed_env == LM_EN_INTEXT) { + if (fragile) os << "\\protect"; + os << "\\( "; // changed from " \\( " (Albrecht Dress) + } + else { + // Thinko! + // Is this '\n' really needed, what can go wrong + //if it is not there? +#warning Thinko! +#if 0 + if (!suffixIs(outf, '\n')) { + // in batchmode we need to make sure + // a space before an equation doesn't + // make the LaTeX output different + // compared to "Exported LaTeX" ARRae + // Modified to work in a cleaner and hopefully more general way + // (JMarc) + outf += "\n"; + ++number_of_newlines; + } +#endif + if (mathed_env == LM_EN_DISPLAY){ + os << "\\[\n"; + } else { + os << "\\begin{" + << latex_mathenv[mathed_env] + << "}\n"; + } + ++number_of_newlines; + } + + if (label && label[0] > ' ' && mathed_env == LM_EN_EQUATION){ + os << "\\label{" + << label + << "}\n"; + ++number_of_newlines; + } + + p->Write(os); + + if (mathed_env == LM_EN_INTEXT){ + if (fragile) os << "\\protect"; + os << " \\)"; + } + else if (mathed_env == LM_EN_DISPLAY) { + os << "\\]\n"; + ++number_of_newlines; + } + else { + os << "\n\\end{" + << latex_mathenv[mathed_env] + << "}\n"; + number_of_newlines += 2; + } + *newlines = number_of_newlines; +#else string output; mathed_write(p, output, newlines, fragile, label); os << output; +#endif } -extern int tex_code_break_column; - +#ifndef USE_OSTREAM_ONLY void mathed_write(MathParInset * p, string & outf, int * newlines, char fragile, char const * label) -{ +{ number_of_newlines = 0; short mathed_env = p->GetType(); @@ -484,3 +810,4 @@ void mathed_write(MathParInset * p, string & outf, int * newlines, } *newlines = number_of_newlines; } +#endif