]> git.lyx.org Git - features.git/blobdiff - src/mathed/math_write.C
apply the ostream changes to mathed, some other small related things
[features.git] / src / mathed / math_write.C
index b93badd1c180c23f7030d5a1248b744bb369a5ab..10f91d4dfe8e56927b779e4949367b649d89ab99 100644 (file)
@@ -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