mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 21:21:32 +00:00
Fix dataloss for align env inside math
The math parser aborts with an error message on \begin{align} and \begin{align*} if this is not the hull inset. This is now fixed, however this is not complete support for these two environments (the GUI does not respect the numbering). It is only the minimal fix that ensures that no data loss occurs for documents imported by tex2lyx.
This commit is contained in:
parent
5cb4e11932
commit
5dedf8005d
@ -32,9 +32,12 @@ namespace lyx {
|
|||||||
using support::bformat;
|
using support::bformat;
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME: handle numbers in gui, currently they are only read and written
|
||||||
|
|
||||||
InsetMathSplit::InsetMathSplit(Buffer * buf, docstring const & name,
|
InsetMathSplit::InsetMathSplit(Buffer * buf, docstring const & name,
|
||||||
char valign)
|
char valign, bool numbered)
|
||||||
: InsetMathGrid(buf, 1, 1, valign, docstring()), name_(name)
|
: InsetMathGrid(buf, 1, 1, valign, docstring()), name_(name),
|
||||||
|
numbered_(numbered)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +54,7 @@ char InsetMathSplit::defaultColAlign(col_type col)
|
|||||||
return 'l';
|
return 'l';
|
||||||
if (name_ == "gathered")
|
if (name_ == "gathered")
|
||||||
return 'c';
|
return 'c';
|
||||||
if (name_ == "aligned")
|
if (name_ == "aligned" || name_ == "align")
|
||||||
return (col & 1) ? 'l' : 'r';
|
return (col & 1) ? 'l' : 'r';
|
||||||
if (name_ == "alignedat")
|
if (name_ == "alignedat")
|
||||||
return (col & 1) ? 'l' : 'r';
|
return (col & 1) ? 'l' : 'r';
|
||||||
@ -97,15 +100,18 @@ void InsetMathSplit::write(WriteStream & ws) const
|
|||||||
MathEnsurer ensurer(ws);
|
MathEnsurer ensurer(ws);
|
||||||
if (ws.fragile())
|
if (ws.fragile())
|
||||||
ws << "\\protect";
|
ws << "\\protect";
|
||||||
ws << "\\begin{" << name_ << '}';
|
docstring suffix;
|
||||||
if (name_ != "split" && verticalAlignment() != 'c')
|
if (!numbered_ && name_ == "align")
|
||||||
|
suffix = from_ascii("*");
|
||||||
|
ws << "\\begin{" << name_ << suffix << '}';
|
||||||
|
if (name_ != "split" && name_ != "align" && verticalAlignment() != 'c')
|
||||||
ws << '[' << verticalAlignment() << ']';
|
ws << '[' << verticalAlignment() << ']';
|
||||||
if (name_ == "alignedat")
|
if (name_ == "alignedat")
|
||||||
ws << '{' << static_cast<unsigned int>((ncols() + 1)/2) << '}';
|
ws << '{' << static_cast<unsigned int>((ncols() + 1)/2) << '}';
|
||||||
InsetMathGrid::write(ws);
|
InsetMathGrid::write(ws);
|
||||||
if (ws.fragile())
|
if (ws.fragile())
|
||||||
ws << "\\protect";
|
ws << "\\protect";
|
||||||
ws << "\\end{" << name_ << "}\n";
|
ws << "\\end{" << name_ << suffix << "}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -113,7 +119,10 @@ void InsetMathSplit::infoize(odocstream & os) const
|
|||||||
{
|
{
|
||||||
docstring name = name_;
|
docstring name = name_;
|
||||||
name[0] = support::uppercase(name[0]);
|
name[0] = support::uppercase(name[0]);
|
||||||
os << name << ' ';
|
if (name_ == "align" && !numbered_)
|
||||||
|
os << name << "* ";
|
||||||
|
else
|
||||||
|
os << name << ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -127,6 +136,7 @@ void InsetMathSplit::mathmlize(MathStream & ms) const
|
|||||||
// it's not clear how to do that without copying a lot of code.
|
// it's not clear how to do that without copying a lot of code.
|
||||||
// One idea would be to wrap the table in an <mrow>, and set the
|
// One idea would be to wrap the table in an <mrow>, and set the
|
||||||
// alignment there via CSS.
|
// alignment there via CSS.
|
||||||
|
// FIXME how to handle numbered and unnumbered align?
|
||||||
InsetMathGrid::mathmlize(ms);
|
InsetMathGrid::mathmlize(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,6 +148,7 @@ void InsetMathSplit::htmlize(HtmlStream & ms) const
|
|||||||
// special treatment.
|
// special treatment.
|
||||||
// FIXME
|
// FIXME
|
||||||
// lgathered and rgathered could use the proper alignment.
|
// lgathered and rgathered could use the proper alignment.
|
||||||
|
// FIXME how to handle numbered and unnumbered align?
|
||||||
InsetMathGrid::htmlize(ms);
|
InsetMathGrid::htmlize(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +156,7 @@ void InsetMathSplit::htmlize(HtmlStream & ms) const
|
|||||||
void InsetMathSplit::validate(LaTeXFeatures & features) const
|
void InsetMathSplit::validate(LaTeXFeatures & features) const
|
||||||
{
|
{
|
||||||
if (name_ == "split" || name_ == "gathered" || name_ == "aligned" ||
|
if (name_ == "split" || name_ == "gathered" || name_ == "aligned" ||
|
||||||
name_ == "alignedat")
|
name_ == "alignedat" || name_ == "align")
|
||||||
features.require("amsmath");
|
features.require("amsmath");
|
||||||
else if (name_ == "lgathered" || name_ == "rgathered")
|
else if (name_ == "lgathered" || name_ == "rgathered")
|
||||||
features.require("mathtools");
|
features.require("mathtools");
|
||||||
|
@ -22,7 +22,7 @@ class InsetMathSplit : public InsetMathGrid {
|
|||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
explicit InsetMathSplit(Buffer * buf, docstring const & name,
|
explicit InsetMathSplit(Buffer * buf, docstring const & name,
|
||||||
char valign = 'c');
|
char valign = 'c', bool numbered = false);
|
||||||
///
|
///
|
||||||
void draw(PainterInfo & pi, int x, int y) const;
|
void draw(PainterInfo & pi, int x, int y) const;
|
||||||
///
|
///
|
||||||
@ -50,6 +50,8 @@ private:
|
|||||||
virtual Inset * clone() const;
|
virtual Inset * clone() const;
|
||||||
///
|
///
|
||||||
docstring name_;
|
docstring name_;
|
||||||
|
///
|
||||||
|
bool numbered_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1603,14 +1603,14 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if (name == "align" || name == "align*") {
|
else if (name == "align" || name == "align*") {
|
||||||
if (mode != InsetMath::UNDECIDED_MODE) {
|
if (mode == InsetMath::UNDECIDED_MODE) {
|
||||||
// FIXME this is wrong: amsmath supports
|
cell->push_back(MathAtom(new InsetMathHull(buf, hullAlign)));
|
||||||
// align* inside gather, see testmath.tex.
|
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
|
||||||
error("bad math environment " + name);
|
} else {
|
||||||
break;
|
cell->push_back(MathAtom(new InsetMathSplit(buf, name,
|
||||||
|
'c', !stared(name))));
|
||||||
|
parse2(cell->back(), FLAG_END, mode, !stared(name));
|
||||||
}
|
}
|
||||||
cell->push_back(MathAtom(new InsetMathHull(buf, hullAlign)));
|
|
||||||
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (name == "flalign" || name == "flalign*") {
|
else if (name == "flalign" || name == "flalign*") {
|
||||||
|
Loading…
Reference in New Issue
Block a user