]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
Cmake export tests: Added sublabel handling also to revertedTests
[lyx.git] / src / mathed / InsetMathHull.cpp
index e1e339dacb70ead10c1c5a7d545e374e7a272721..6ff8833fee2fb0c5fe1a16be4ea4e9d202a9f89a 100644 (file)
@@ -37,6 +37,7 @@
 #include "LyXRC.h"
 #include "MacroTable.h"
 #include "MathMacro.h"
+#include "MathMacroTemplate.h"
 #include "output_xhtml.h"
 #include "Paragraph.h"
 #include "ParIterator.h"
@@ -291,7 +292,8 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
 }
 
 
-void InsetMathHull::addToToc(DocIterator const & pit, bool output_active) const
+void InsetMathHull::addToToc(DocIterator const & pit, bool output_active,
+                                                        UpdateType utype) const
 {
        if (!buffer_) {
                //FIXME: buffer_ should be set at creation for this inset! Problem is
@@ -300,14 +302,14 @@ void InsetMathHull::addToToc(DocIterator const & pit, bool output_active) const
                return;
        }
 
-       Toc & toc = buffer().tocBackend().toc("equation");
+       shared_ptr<Toc> toc = buffer().tocBackend().toc("equation");
 
        for (row_type row = 0; row != nrows(); ++row) {
                if (!numbered(row))
                        continue;
                if (label_[row])
-                       label_[row]->addToToc(pit, output_active);
-               toc.push_back(TocItem(pit, 0, nicelabel(row), output_active));
+                       label_[row]->addToToc(pit, output_active, utype);
+               toc->push_back(TocItem(pit, 0, nicelabel(row), output_active));
        }
 }
 
@@ -573,7 +575,9 @@ void InsetMathHull::metricsT(TextMetricsInfo const & mi, Dimension & dim) const
                InsetMathGrid::metricsT(mi, dim);
        } else {
                odocstringstream os;
-               WriteStream wi(os, false, true, WriteStream::wsDefault);
+               TexRow texrow(false);
+               otexrowstream ots(os,texrow);
+               WriteStream wi(ots, false, true, WriteStream::wsDefault);
                write(wi);
                dim.wid = os.str().size();
                dim.asc = 1;
@@ -588,7 +592,9 @@ void InsetMathHull::drawT(TextPainter & pain, int x, int y) const
                InsetMathGrid::drawT(pain, x, y);
        } else {
                odocstringstream os;
-               WriteStream wi(os, false, true, WriteStream::wsDefault);
+               TexRow texrow(false);
+               otexrowstream ots(os,texrow);
+               WriteStream wi(ots, false, true, WriteStream::wsDefault);
                write(wi);
                pain.draw(x, y, os.str().c_str());
        }
@@ -606,7 +612,9 @@ static docstring latexString(InsetMathHull const & inset)
        static Encoding const * encoding = 0;
        if (inset.isBufferValid())
                encoding = &(inset.buffer().params().encoding());
-       WriteStream wi(ls, false, true, WriteStream::wsPreview, encoding);
+       TexRow texrow(false);
+       otexrowstream ots(ls,texrow);
+       WriteStream wi(ots, false, true, WriteStream::wsPreview, encoding);
        inset.write(wi);
        return ls.str();
 }
@@ -635,6 +643,7 @@ void InsetMathHull::usedMacros(MathData const & md, DocIterator const & pos,
 
        for (size_t i = 0; i < md.size(); ++i) {
                MathMacro const * mi = md[i].nucleus()->asMacro();
+               MathMacroTemplate const * mt = md[i].nucleus()->asMacroTemplate();
                InsetMathScript const * si = md[i].nucleus()->asScriptInset();
                InsetMathFracBase const * fi = md[i].nucleus()->asFracBaseInset();
                InsetMathGrid const * gi = md[i].nucleus()->asGridInset();
@@ -662,6 +671,10 @@ void InsetMathHull::usedMacros(MathData const & md, DocIterator const & pos,
                                asArray(data->definition(), ar);
                        }
                        usedMacros(ar, pos, macros, defs);
+               } else if (mt) {
+                       MathData ar(pos.buffer());
+                       asArray(mt->definition(), ar);
+                       usedMacros(ar, pos, macros, defs);
                } else if (si) {
                        if (!si->nuc().empty())
                                usedMacros(si->nuc(), pos, macros, defs);
@@ -706,6 +719,23 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
        for (; it != end; ++it)
                macro_preamble.append(*it);
 
+       // set the font series and size for this snippet
+       DocIterator dit = pos;
+       while (dit.inMathed())
+               dit.pop_back();
+       Paragraph const & par = dit.paragraph();
+       Font font = par.getFontSettings(buffer->params(), dit.pos());
+       font.fontInfo().realize(par.layout().font);
+       string const lsize = font.latexSize();
+       docstring setfont;
+       docstring endfont;
+       if (font.fontInfo().series() == BOLD_SERIES) {
+               setfont += from_ascii("\\textbf{");
+               endfont += '}';
+       }
+       if (lsize != "normalsize" && !prefixIs(lsize, "error"))
+               setfont += from_ascii("\\" + lsize + '\n'); 
+
        docstring setcnt;
        if (forexport && haveNumbers()) {
                docstring eqstr = from_ascii("equation");
@@ -727,7 +757,8 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
                                          '{' + convert<docstring>(num) + '}';
                }
        }
-       docstring const snippet = macro_preamble + setcnt + latexString(*this);
+       docstring const snippet = macro_preamble + setfont + setcnt
+                                 + latexString(*this) + endfont;
        LYXERR(Debug::MACROS, "Preview snippet: " << snippet);
        preview_->addPreview(snippet, *buffer, forexport);
 }
@@ -903,15 +934,18 @@ void InsetMathHull::header_write(WriteStream & os) const
 
        case hullSimple:
                os << '$';
+               os.startOuterRow();
                if (cell(0).empty())
                        os << ' ';
                break;
 
        case hullEquation:
+               os << "\n";
+               os.startOuterRow();
                if (n)
-                       os << "\n\\begin{equation" << star(n) << "}\n";
+                       os << "\\begin{equation" << star(n) << "}\n";
                else
-                       os << "\n\\[\n";
+                       os << "\\[\n";
                break;
 
        case hullEqnArray:
@@ -919,17 +953,23 @@ void InsetMathHull::header_write(WriteStream & os) const
        case hullFlAlign:
        case hullGather:
        case hullMultline:
-               os << "\n\\begin{" << hullName(type_) << star(n) << "}\n";
+               os << "\n";
+               os.startOuterRow();
+               os << "\\begin{" << hullName(type_) << star(n) << "}\n";
                break;
 
        case hullAlignAt:
        case hullXAlignAt:
-               os << "\n\\begin{" << hullName(type_) << star(n) << '}'
+               os << "\n";
+               os.startOuterRow();
+               os << "\\begin{" << hullName(type_) << star(n) << '}'
                  << '{' << static_cast<unsigned int>((ncols() + 1)/2) << "}\n";
                break;
 
        case hullXXAlignAt:
-               os << "\n\\begin{" << hullName(type_) << '}'
+               os << "\n";
+               os.startOuterRow();
+               os << "\\begin{" << hullName(type_) << '}'
                  << '{' << static_cast<unsigned int>((ncols() + 1)/2) << "}\n";
                break;
 
@@ -938,7 +978,9 @@ void InsetMathHull::header_write(WriteStream & os) const
                break;
 
        default:
-               os << "\n\\begin{unknown" << star(n) << "}\n";
+               os << "\n";
+               os.startOuterRow();
+               os << "\\begin{unknown" << star(n) << "}\n";
                break;
        }
 }
@@ -958,10 +1000,12 @@ void InsetMathHull::footer_write(WriteStream & os) const
                break;
 
        case hullEquation:
+               os << "\n";
+               os.startOuterRow();
                if (n)
-                       os << "\n\\end{equation" << star(n) << "}\n";
+                       os << "\\end{equation" << star(n) << "}\n";
                else
-                       os << "\n\\]\n";
+                       os << "\\]\n";
                break;
 
        case hullEqnArray:
@@ -971,11 +1015,15 @@ void InsetMathHull::footer_write(WriteStream & os) const
        case hullXAlignAt:
        case hullGather:
        case hullMultline:
-               os << "\n\\end{" << hullName(type_) << star(n) << "}\n";
+               os << "\n";
+               os.startOuterRow();
+               os << "\\end{" << hullName(type_) << star(n) << "}\n";
                break;
 
        case hullXXAlignAt:
-               os << "\n\\end{" << hullName(type_) << "}\n";
+               os << "\n";
+               os.startOuterRow();
+               os << "\\end{" << hullName(type_) << "}\n";
                break;
 
        case hullRegexp:
@@ -984,7 +1032,9 @@ void InsetMathHull::footer_write(WriteStream & os) const
                break;
 
        default:
-               os << "\n\\end{unknown" << star(n) << "}\n";
+               os << "\n";
+               os.startOuterRow();
+               os << "\\end{unknown" << star(n) << "}\n";
                break;
        }
 }
@@ -1342,7 +1392,6 @@ docstring InsetMathHull::eolString(row_type row, bool fragile, bool latex,
        return res + InsetMathGrid::eolString(row, fragile, latex, last_eoln);
 }
 
-
 void InsetMathHull::write(WriteStream & os) const
 {
        ModeSpecifier specifier(os, MATH_MODE);
@@ -1641,9 +1690,15 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MATH_DISPLAY: {
                cur.recordUndoInset();
                mutate(type_ == hullSimple ? hullEquation : hullSimple);
-               cur.idx() = 0;
-               cur.pos() = cur.lastpos();
-               //cur.dispatched(FINISHED);
+               // if the cursor is in a cell that got merged, move it to
+               // start of the hull inset.
+               if (cur.idx() > 0) {
+                       cur.idx() = 0;
+                       cur.pos() = 0;
+               }
+               if (cur.pos() > cur.lastpos())
+                       cur.pos() = cur.lastpos();
+
                break;
        }
 
@@ -1973,7 +2028,9 @@ bool InsetMathHull::searchForward(BufferView * bv, string const & str,
 void InsetMathHull::write(ostream & os) const
 {
        odocstringstream oss;
-       WriteStream wi(oss, false, false, WriteStream::wsDefault);
+       TexRow texrow(false);
+       otexrowstream ots(oss,texrow);
+       WriteStream wi(ots, false, false, WriteStream::wsDefault);
        oss << "Formula ";
        write(wi);
        os << to_utf8(oss.str());
@@ -2015,8 +2072,10 @@ int InsetMathHull::plaintext(odocstringstream & os,
        }
 
        odocstringstream oss;
+       TexRow texrow(false);
+       otexrowstream ots(oss,texrow);
        Encoding const * const enc = encodings.fromLyXName("utf8");
-       WriteStream wi(oss, false, true, WriteStream::wsDefault, enc);
+       WriteStream wi(ots, false, true, WriteStream::wsDefault, enc);
 
        // Fix Bug #6139
        if (type_ == hullRegexp)
@@ -2056,12 +2115,14 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
        ++ms.tab(); ms.cr(); ms.os() << '<' << bname << '>';
 
        odocstringstream ls;
+       TexRow texrow;
+       otexstream ols(ls, texrow);
        if (runparams.flavor == OutputParams::XML) {
                ms << MTag("alt role='tex' ");
                // Workaround for db2latex: db2latex always includes equations with
                // \ensuremath{} or \begin{display}\end{display}
                // so we strip LyX' math environment
-               WriteStream wi(ls, false, false, WriteStream::wsDefault, runparams.encoding);
+               WriteStream wi(ols, false, false, WriteStream::wsDefault, runparams.encoding);
                InsetMathGrid::write(wi);
                ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), "<", "&lt;"));
                ms << ETag("alt");
@@ -2071,9 +2132,6 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
                InsetMathGrid::mathmlize(ms);
                ms << ETag("math");
        } else {
-               TexRow texrow;
-               texrow.reset();
-               otexstream ols(ls, texrow);
                ms << MTag("alt role='tex'");
                latex(ols, runparams);
                res = texrow.rows();
@@ -2323,7 +2381,9 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
                // Unfortunately, we cannot use latexString() because we do not want
                // $...$ or whatever.
                odocstringstream ls;
-               WriteStream wi(ls, false, true, WriteStream::wsPreview);
+               TexRow texrow(false);
+               otexrowstream ots(ls,texrow);
+               WriteStream wi(ots, false, true, WriteStream::wsPreview);
                ModeSpecifier specifier(wi, MATH_MODE);
                mathAsLatex(wi);
                docstring const latex = ls.str();
@@ -2350,11 +2410,13 @@ void InsetMathHull::toString(odocstream & os) const
 }
 
 
-void InsetMathHull::forOutliner(docstring & os, size_t) const
+void InsetMathHull::forOutliner(docstring & os, size_t const, bool const) const
 {
        odocstringstream ods;
        OutputParams op(0);
        op.for_toc = true;
+       // FIXME: this results in spilling TeX into the LyXHTML output since the
+       // outliner is used to generate the LyXHTML list of figures/etc.
        plaintext(ods, op);
        os += ods.str();
 }