mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 13:18:28 +00:00
Fix regression of 5261ae6a2
Somehow I overlooked that \sideset also supports nonscript arguments for left and right. This is now fixed, although I do not like the toolbar names. If somebody knows something better, please improve.
This commit is contained in:
parent
284f991519
commit
efaae780db
@ -1110,6 +1110,9 @@ dist_imagesmath_DATA = \
|
|||||||
images/math/shortrightarrow.png \
|
images/math/shortrightarrow.png \
|
||||||
images/math/shortuparrow.png \
|
images/math/shortuparrow.png \
|
||||||
images/math/sideset.png \
|
images/math/sideset.png \
|
||||||
|
images/math/sideset1.png \
|
||||||
|
images/math/sideset2.png \
|
||||||
|
images/math/sideset3.png \
|
||||||
images/math/sigma.png \
|
images/math/sigma.png \
|
||||||
images/math/sigma2.png \
|
images/math/sigma2.png \
|
||||||
images/math/sim.png \
|
images/math/sim.png \
|
||||||
|
BIN
lib/images/math/sideset1.png
Normal file
BIN
lib/images/math/sideset1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 138 B |
BIN
lib/images/math/sideset2.png
Normal file
BIN
lib/images/math/sideset2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 142 B |
BIN
lib/images/math/sideset3.png
Normal file
BIN
lib/images/math/sideset3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 134 B |
@ -183,7 +183,10 @@ ToolbarSet
|
|||||||
Item "Insert sum" "math-insert \sum"
|
Item "Insert sum" "math-insert \sum"
|
||||||
Item "Insert integral" "math-insert \int"
|
Item "Insert integral" "math-insert \int"
|
||||||
Item "Insert product" "math-insert \prod"
|
Item "Insert product" "math-insert \prod"
|
||||||
Item "Insert side scripts" "math-insert \sideset"
|
Item "Insert left/right side scripts" "math-insert \sideset"
|
||||||
|
Item "Insert right side scripts" "math-insert \sideset1"
|
||||||
|
Item "Insert left side scripts" "math-insert \sideset2"
|
||||||
|
Item "Insert side scripts" "math-insert \sideset3"
|
||||||
Separator
|
Separator
|
||||||
Item "Insert ( )" "math-delim ( )"
|
Item "Insert ( )" "math-delim ( )"
|
||||||
Item "Insert [ ]" "math-delim [ ]"
|
Item "Insert [ ]" "math-delim [ ]"
|
||||||
|
@ -39,13 +39,16 @@ namespace {
|
|||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
|
|
||||||
InsetMathSideset::InsetMathSideset(Buffer * buf)
|
InsetMathSideset::InsetMathSideset(Buffer * buf, bool scriptl, bool scriptr)
|
||||||
: InsetMathNest(buf, 5)
|
: InsetMathNest(buf, 3 + scriptl + scriptr), scriptl_(scriptl),
|
||||||
|
scriptr_(scriptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
InsetMathSideset::InsetMathSideset(Buffer * buf, MathAtom const & at)
|
InsetMathSideset::InsetMathSideset(Buffer * buf, bool scriptl, bool scriptr,
|
||||||
: InsetMathNest(buf, 5)
|
MathAtom const & at)
|
||||||
|
: InsetMathNest(buf, 3 + scriptl + scriptr), scriptl_(scriptl),
|
||||||
|
scriptr_(scriptr)
|
||||||
{
|
{
|
||||||
nuc().push_back(at);
|
nuc().push_back(at);
|
||||||
}
|
}
|
||||||
@ -76,7 +79,13 @@ bool InsetMathSideset::idxLast(Cursor & cur) const
|
|||||||
int InsetMathSideset::dybt(BufferView const & bv, int asc, int des, bool top) const
|
int InsetMathSideset::dybt(BufferView const & bv, int asc, int des, bool top) const
|
||||||
{
|
{
|
||||||
bool isCharBox = nuc().empty() ? false : isAlphaSymbol(nuc().back());
|
bool isCharBox = nuc().empty() ? false : isAlphaSymbol(nuc().back());
|
||||||
int dasc = max(bl().dimension(bv).ascent(), br().dimension(bv).ascent());
|
int dasc = 0;
|
||||||
|
if (scriptl_ && scriptr_)
|
||||||
|
dasc = max(bl().dimension(bv).ascent(), br().dimension(bv).ascent());
|
||||||
|
else if (scriptl_)
|
||||||
|
dasc = bl().dimension(bv).ascent();
|
||||||
|
else if (scriptr_)
|
||||||
|
dasc = br().dimension(bv).ascent();
|
||||||
int slevel = nuc().slevel();
|
int slevel = nuc().slevel();
|
||||||
int ascdrop = dasc - slevel;
|
int ascdrop = dasc - slevel;
|
||||||
int desdrop = isCharBox ? 0 : des + nuc().sshift();
|
int desdrop = isCharBox ? 0 : des + nuc().sshift();
|
||||||
@ -84,8 +93,20 @@ int InsetMathSideset::dybt(BufferView const & bv, int asc, int des, bool top) co
|
|||||||
des = max(desdrop, ascdrop);
|
des = max(desdrop, ascdrop);
|
||||||
des = max(mindes, des);
|
des = max(mindes, des);
|
||||||
int minasc = nuc().minasc();
|
int minasc = nuc().minasc();
|
||||||
ascdrop = isCharBox ? 0 : asc - min(tl().mindes(), tr().mindes());
|
ascdrop = 0;
|
||||||
int udes = max(bl().dimension(bv).descent(), tr().dimension(bv).descent());
|
if (!isCharBox && (scriptl_ || scriptr_)) {
|
||||||
|
if (scriptl_ && scriptr_)
|
||||||
|
ascdrop = asc - min(tl().mindes(), tr().mindes());
|
||||||
|
else if (scriptl_)
|
||||||
|
ascdrop = asc - tl().mindes();
|
||||||
|
else if (scriptr_)
|
||||||
|
ascdrop = asc - tr().mindes();
|
||||||
|
}
|
||||||
|
int udes = 0;
|
||||||
|
if (scriptl_)
|
||||||
|
udes = bl().dimension(bv).descent();
|
||||||
|
if (scriptr_)
|
||||||
|
udes = max(udes, br().dimension(bv).descent());
|
||||||
asc = udes + nuc().sshift();
|
asc = udes + nuc().sshift();
|
||||||
asc = max(ascdrop, asc);
|
asc = max(ascdrop, asc);
|
||||||
asc = max(minasc, asc);
|
asc = max(minasc, asc);
|
||||||
@ -106,7 +127,13 @@ int InsetMathSideset::dybt(BufferView const & bv, int asc, int des, bool top) co
|
|||||||
int InsetMathSideset::dyb(BufferView const & bv) const
|
int InsetMathSideset::dyb(BufferView const & bv) const
|
||||||
{
|
{
|
||||||
int nd = ndes(bv);
|
int nd = ndes(bv);
|
||||||
int des = max(bl().dimension(bv).ascent(), br().dimension(bv).ascent());
|
int des = 0;
|
||||||
|
if (scriptl_ && scriptr_)
|
||||||
|
des = max(bl().dimension(bv).ascent(), br().dimension(bv).ascent());
|
||||||
|
else if (scriptl_)
|
||||||
|
des = bl().dimension(bv).ascent();
|
||||||
|
else if (scriptr_)
|
||||||
|
des = br().dimension(bv).ascent();
|
||||||
int na = nasc(bv);
|
int na = nasc(bv);
|
||||||
des = dybt(bv, na, nd, false);
|
des = dybt(bv, na, nd, false);
|
||||||
return des;
|
return des;
|
||||||
@ -116,7 +143,13 @@ int InsetMathSideset::dyb(BufferView const & bv) const
|
|||||||
int InsetMathSideset::dyt(BufferView const & bv) const
|
int InsetMathSideset::dyt(BufferView const & bv) const
|
||||||
{
|
{
|
||||||
int na = nasc(bv);
|
int na = nasc(bv);
|
||||||
int asc = max(tl().dimension(bv).descent(), tr().dimension(bv).descent());
|
int asc = 0;
|
||||||
|
if (scriptl_ && scriptr_)
|
||||||
|
asc = max(tl().dimension(bv).descent(), tr().dimension(bv).descent());
|
||||||
|
else if (scriptl_)
|
||||||
|
asc = tl().dimension(bv).descent();
|
||||||
|
else if (scriptr_)
|
||||||
|
asc = tr().dimension(bv).descent();
|
||||||
int nd = ndes(bv);
|
int nd = ndes(bv);
|
||||||
asc = dybt(bv, na, nd, true);
|
asc = dybt(bv, na, nd, true);
|
||||||
return asc;
|
return asc;
|
||||||
@ -170,11 +203,23 @@ void InsetMathSideset::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
Dimension dimbr;
|
Dimension dimbr;
|
||||||
Dimension dimtr;
|
Dimension dimtr;
|
||||||
nuc().metrics(mi, dimn);
|
nuc().metrics(mi, dimn);
|
||||||
|
if (!scriptl_) {
|
||||||
|
bl().metrics(mi, dimbl);
|
||||||
|
dimtl = dimbl;
|
||||||
|
}
|
||||||
|
if (!scriptr_) {
|
||||||
|
br().metrics(mi, dimbr);
|
||||||
|
dimtr = dimbr;
|
||||||
|
}
|
||||||
ScriptChanger dummy(mi.base);
|
ScriptChanger dummy(mi.base);
|
||||||
bl().metrics(mi, dimbl);
|
if (scriptl_) {
|
||||||
tl().metrics(mi, dimtl);
|
bl().metrics(mi, dimbl);
|
||||||
br().metrics(mi, dimbr);
|
tl().metrics(mi, dimtl);
|
||||||
tr().metrics(mi, dimtr);
|
}
|
||||||
|
if (scriptr_) {
|
||||||
|
br().metrics(mi, dimbr);
|
||||||
|
tr().metrics(mi, dimtr);
|
||||||
|
}
|
||||||
|
|
||||||
BufferView & bv = *mi.base.bv;
|
BufferView & bv = *mi.base.bv;
|
||||||
// FIXME: data copying... not very efficient.
|
// FIXME: data copying... not very efficient.
|
||||||
@ -196,11 +241,19 @@ void InsetMathSideset::draw(PainterInfo & pi, int x, int y) const
|
|||||||
{
|
{
|
||||||
BufferView & bv = *pi.base.bv;
|
BufferView & bv = *pi.base.bv;
|
||||||
nuc().draw(pi, x + dxn(bv), y);
|
nuc().draw(pi, x + dxn(bv), y);
|
||||||
|
if (!scriptl_)
|
||||||
|
bl().draw(pi, x , y);
|
||||||
|
if (!scriptr_)
|
||||||
|
br().draw(pi, x + dxr(bv), y);
|
||||||
ScriptChanger dummy(pi.base);
|
ScriptChanger dummy(pi.base);
|
||||||
bl().draw(pi, x , y + dyb(bv));
|
if (scriptl_) {
|
||||||
tl().draw(pi, x , y - dyt(bv));
|
bl().draw(pi, x , y + dyb(bv));
|
||||||
br().draw(pi, x + dxr(bv), y + dyb(bv));
|
tl().draw(pi, x , y - dyt(bv));
|
||||||
tr().draw(pi, x + dxr(bv), y - dyt(bv));
|
}
|
||||||
|
if (scriptr_) {
|
||||||
|
br().draw(pi, x + dxr(bv), y + dyb(bv));
|
||||||
|
tr().draw(pi, x + dxr(bv), y - dyt(bv));
|
||||||
|
}
|
||||||
drawMarkers(pi, x, y);
|
drawMarkers(pi, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,14 +280,32 @@ void InsetMathSideset::drawT(TextPainter & pain, int x, int y) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool InsetMathSideset::idxForward(Cursor &) const
|
bool InsetMathSideset::idxForward(Cursor & cur) const
|
||||||
{
|
{
|
||||||
|
if (!scriptl_ && cur.idx() == 1) {
|
||||||
|
// left => nucleus
|
||||||
|
cur.idx() = 0;
|
||||||
|
return true;
|
||||||
|
} else if (!scriptr_ && cur.idx() == 0) {
|
||||||
|
// nucleus => right
|
||||||
|
cur.idx() = 2 + scriptl_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool InsetMathSideset::idxBackward(Cursor &) const
|
bool InsetMathSideset::idxBackward(Cursor & cur) const
|
||||||
{
|
{
|
||||||
|
if (!scriptr_ && cur.idx() == (scriptl_ ? 3 : 2)) {
|
||||||
|
// right => nucleus
|
||||||
|
cur.idx() = 0;
|
||||||
|
return true;
|
||||||
|
} else if (!scriptl_ && cur.idx() == 0) {
|
||||||
|
// nucleus => left
|
||||||
|
cur.idx() = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,11 +316,12 @@ bool InsetMathSideset::idxUpDown(Cursor & cur, bool up) const
|
|||||||
if (cur.idx() == 0) {
|
if (cur.idx() == 0) {
|
||||||
// go up/down only if in the last position
|
// go up/down only if in the last position
|
||||||
// or in the first position
|
// or in the first position
|
||||||
if (cur.pos() == cur.lastpos() || cur.pos() == 0) {
|
if ((scriptr_ && cur.pos() == cur.lastpos()) ||
|
||||||
|
(scriptl_ && cur.pos() == 0)) {
|
||||||
if (cur.pos() == 0)
|
if (cur.pos() == 0)
|
||||||
cur.idx() = up ? 2 : 1;
|
cur.idx() = up ? 2 : 1;
|
||||||
else
|
else
|
||||||
cur.idx() = up ? 4 : 3;
|
cur.idx() = (up ? 3 : 2) + scriptl_;
|
||||||
cur.pos() = 0;
|
cur.pos() = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -257,7 +329,8 @@ bool InsetMathSideset::idxUpDown(Cursor & cur, bool up) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Are we 'up'?
|
// Are we 'up'?
|
||||||
if (cur.idx() == 2 || cur.idx() == 4) {
|
if ((scriptl_ && cur.idx() == 2) ||
|
||||||
|
(scriptr_ && cur.idx() == (scriptl_ ? 4 : 3))) {
|
||||||
// can't go further up
|
// can't go further up
|
||||||
if (up)
|
if (up)
|
||||||
return false;
|
return false;
|
||||||
@ -271,7 +344,8 @@ bool InsetMathSideset::idxUpDown(Cursor & cur, bool up) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Are we 'down'?
|
// Are we 'down'?
|
||||||
if (cur.idx() == 1 || cur.idx() == 3) {
|
if ((scriptl_ && cur.idx() == 1) ||
|
||||||
|
(scriptr_ && cur.idx() == (scriptl_ ? 3 : 2))) {
|
||||||
// can't go further down
|
// can't go further down
|
||||||
if (!up)
|
if (!up)
|
||||||
return false;
|
return false;
|
||||||
@ -293,15 +367,24 @@ void InsetMathSideset::write(WriteStream & os) const
|
|||||||
MathEnsurer ensurer(os);
|
MathEnsurer ensurer(os);
|
||||||
|
|
||||||
os << "\\sideset";
|
os << "\\sideset";
|
||||||
for (int i = 0; i < 2; ++i) {
|
os << '{';
|
||||||
os << '{';
|
if (scriptl_) {
|
||||||
if (!cell(2*i+1).empty())
|
if (!bl().empty())
|
||||||
os << "_{" << cell(2*i+1) << '}';
|
os << "_{" << bl() << '}';
|
||||||
if (!cell(2*i+2).empty())
|
if (!tl().empty())
|
||||||
os << "^{" << cell(2*i+2) << '}';
|
os << "^{" << tl() << '}';
|
||||||
os << '}';
|
} else
|
||||||
}
|
os << bl();
|
||||||
os << '{' << nuc() << '}';
|
os << "}{";
|
||||||
|
if (scriptr_) {
|
||||||
|
if (!br().empty())
|
||||||
|
os << "_{" << br() << '}';
|
||||||
|
if (!tr().empty())
|
||||||
|
os << "^{" << tr() << '}';
|
||||||
|
} else
|
||||||
|
os << br();
|
||||||
|
os << '}';
|
||||||
|
os << nuc();
|
||||||
|
|
||||||
if (lock_ && !os.latex())
|
if (lock_ && !os.latex())
|
||||||
os << "\\lyxlock ";
|
os << "\\lyxlock ";
|
||||||
@ -314,7 +397,7 @@ void InsetMathSideset::normalize(NormalStream & os) const
|
|||||||
|
|
||||||
if (!bl().empty())
|
if (!bl().empty())
|
||||||
os << bl() << ' ';
|
os << bl() << ' ';
|
||||||
if (!tl().empty())
|
if (scriptl_ && !tl().empty())
|
||||||
os << tl() << ' ';
|
os << tl() << ' ';
|
||||||
|
|
||||||
if (!nuc().empty())
|
if (!nuc().empty())
|
||||||
@ -324,7 +407,7 @@ void InsetMathSideset::normalize(NormalStream & os) const
|
|||||||
|
|
||||||
if (!br().empty())
|
if (!br().empty())
|
||||||
os << br() << ' ';
|
os << br() << ' ';
|
||||||
if (!tr().empty())
|
if (scriptr_ && !tr().empty())
|
||||||
os << tr() << ' ';
|
os << tr() << ' ';
|
||||||
os << ']';
|
os << ']';
|
||||||
}
|
}
|
||||||
@ -332,41 +415,52 @@ void InsetMathSideset::normalize(NormalStream & os) const
|
|||||||
|
|
||||||
void InsetMathSideset::mathmlize(MathStream & os) const
|
void InsetMathSideset::mathmlize(MathStream & os) const
|
||||||
{
|
{
|
||||||
os << MTag("mmultiscripts");
|
// FIXME This is only accurate if both scriptl_ and scriptr_ are true
|
||||||
|
if (!scriptl_)
|
||||||
if (nuc().empty())
|
|
||||||
os << "<mrow />";
|
|
||||||
else
|
|
||||||
os << MTag("mrow") << nuc() << ETag("mrow");
|
|
||||||
|
|
||||||
if (br().empty())
|
|
||||||
os << "<none />";
|
|
||||||
else
|
|
||||||
os << MTag("mrow") << br() << ETag("mrow");
|
|
||||||
if (tr().empty())
|
|
||||||
os << "<none />";
|
|
||||||
else
|
|
||||||
os << MTag("mrow") << tr() << ETag("mrow");
|
|
||||||
|
|
||||||
if (bl().empty())
|
|
||||||
os << "<none />";
|
|
||||||
else
|
|
||||||
os << MTag("mrow") << bl() << ETag("mrow");
|
os << MTag("mrow") << bl() << ETag("mrow");
|
||||||
if (tl().empty())
|
if (scriptl_ || scriptr_) {
|
||||||
os << "<none />";
|
os << MTag("mmultiscripts");
|
||||||
else
|
|
||||||
os << MTag("mrow") << tl() << ETag("mrow");
|
|
||||||
|
|
||||||
os << ETag("mmultiscripts");
|
if (nuc().empty())
|
||||||
|
os << "<mrow />";
|
||||||
|
else
|
||||||
|
os << MTag("mrow") << nuc() << ETag("mrow");
|
||||||
|
|
||||||
|
if (br().empty() || !scriptr_)
|
||||||
|
os << "<none />";
|
||||||
|
else
|
||||||
|
os << MTag("mrow") << br() << ETag("mrow");
|
||||||
|
if (tr().empty() || !scriptr_)
|
||||||
|
os << "<none />";
|
||||||
|
else
|
||||||
|
os << MTag("mrow") << tr() << ETag("mrow");
|
||||||
|
|
||||||
|
if (bl().empty() || !scriptl_)
|
||||||
|
os << "<none />";
|
||||||
|
else
|
||||||
|
os << MTag("mrow") << bl() << ETag("mrow");
|
||||||
|
if (tl().empty() || !scriptl_)
|
||||||
|
os << "<none />";
|
||||||
|
else
|
||||||
|
os << MTag("mrow") << tl() << ETag("mrow");
|
||||||
|
|
||||||
|
os << ETag("mmultiscripts");
|
||||||
|
}
|
||||||
|
if (!scriptr_)
|
||||||
|
os << MTag("mrow") << br() << ETag("mrow");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetMathSideset::htmlize(HtmlStream & os) const
|
void InsetMathSideset::htmlize(HtmlStream & os) const
|
||||||
{
|
{
|
||||||
bool const havebl = !bl().empty();
|
// FIXME This is only accurate if both scriptl_ and scriptr_ are true
|
||||||
bool const havetl = !tl().empty();
|
bool const havebl = scriptl_ && !bl().empty();
|
||||||
bool const havebr = !br().empty();
|
bool const havetl = scriptl_ && !tl().empty();
|
||||||
bool const havetr = !tr().empty();
|
bool const havebr = scriptr_ && !br().empty();
|
||||||
|
bool const havetr = scriptr_ && !tr().empty();
|
||||||
|
|
||||||
|
if (!scriptl_ && !bl().empty())
|
||||||
|
os << bl();
|
||||||
|
|
||||||
if (havebl && havetl)
|
if (havebl && havetl)
|
||||||
os << MTag("span", "class='scripts'")
|
os << MTag("span", "class='scripts'")
|
||||||
@ -390,6 +484,9 @@ void InsetMathSideset::htmlize(HtmlStream & os) const
|
|||||||
os << MTag("sub", "class='math'") << br() << ETag("sub");
|
os << MTag("sub", "class='math'") << br() << ETag("sub");
|
||||||
else if (havetr)
|
else if (havetr)
|
||||||
os << MTag("sup", "class='math'") << tr() << ETag("sup");
|
os << MTag("sup", "class='math'") << tr() << ETag("sup");
|
||||||
|
|
||||||
|
if (!scriptr_ && !br().empty())
|
||||||
|
os << br();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,9 +25,10 @@ namespace lyx {
|
|||||||
class InsetMathSideset : public InsetMathNest {
|
class InsetMathSideset : public InsetMathNest {
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
InsetMathSideset(Buffer * buf);
|
InsetMathSideset(Buffer * buf, bool scriptl, bool scriptr);
|
||||||
/// create inset with given nucleus
|
/// create inset with given nucleus
|
||||||
InsetMathSideset(Buffer * buf, MathAtom const & at);
|
InsetMathSideset(Buffer * buf, bool scriptl, bool scriptr,
|
||||||
|
MathAtom const & at);
|
||||||
///
|
///
|
||||||
mode_type currentMode() const { return MATH_MODE; }
|
mode_type currentMode() const { return MATH_MODE; }
|
||||||
///
|
///
|
||||||
@ -63,22 +64,22 @@ public:
|
|||||||
MathData const & nuc() const { return cell(0); };
|
MathData const & nuc() const { return cell(0); };
|
||||||
/// returns nucleus
|
/// returns nucleus
|
||||||
MathData & nuc() { return cell(0); };
|
MathData & nuc() { return cell(0); };
|
||||||
/// bottom left index
|
/// bottom left index or single left cell
|
||||||
MathData const & bl() const { return cell(1); }
|
MathData const & bl() const { return cell(1); }
|
||||||
/// bottom left index
|
/// bottom left index or single left cell
|
||||||
MathData & bl() { return cell(1); }
|
MathData & bl() { return cell(1); }
|
||||||
/// top left index
|
/// top left index or single left cell
|
||||||
MathData const & tl() const { return cell(2); }
|
MathData const & tl() const { return cell(1 + scriptl_); }
|
||||||
/// top left index
|
/// top left index or single left cell
|
||||||
MathData & tl() { return cell(2); }
|
MathData & tl() { return cell(1 + scriptl_); }
|
||||||
/// bottom right index
|
/// bottom right index or single right cell
|
||||||
MathData const & br() const { return cell(3); }
|
MathData const & br() const { return cell(2 + scriptl_); }
|
||||||
/// bottom right index
|
/// bottom right index or single right cell
|
||||||
MathData & br() { return cell(3); }
|
MathData & br() { return cell(2 + scriptl_); }
|
||||||
/// top right index
|
/// top right index or single right cell
|
||||||
MathData const & tr() const { return cell(4); }
|
MathData const & tr() const { return cell(2 + scriptl_ + scriptr_); }
|
||||||
/// top right index
|
/// top right index or single right cell
|
||||||
MathData & tr() { return cell(4); }
|
MathData & tr() { return cell(2 + scriptl_ + scriptr_); }
|
||||||
/// say that we have scripts
|
/// say that we have scripts
|
||||||
void infoize(odocstream & os) const;
|
void infoize(odocstream & os) const;
|
||||||
///
|
///
|
||||||
@ -105,6 +106,10 @@ private:
|
|||||||
int ndes(BufferView const &) const;
|
int ndes(BufferView const &) const;
|
||||||
/// returns subscript and superscript kerning of nucleus if any
|
/// returns subscript and superscript kerning of nucleus if any
|
||||||
int nker(BufferView const * bv) const;
|
int nker(BufferView const * bv) const;
|
||||||
|
/// Whether there are two left scripts or one single cell
|
||||||
|
bool scriptl_;
|
||||||
|
/// Whether there are two right scripts or one single cell
|
||||||
|
bool scriptr_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -537,7 +537,14 @@ MathAtom createInsetMath(docstring const & s, Buffer * buf)
|
|||||||
if (s == "ensuremath")
|
if (s == "ensuremath")
|
||||||
return MathAtom(new InsetMathEnsureMath(buf));
|
return MathAtom(new InsetMathEnsureMath(buf));
|
||||||
if (s == "sideset")
|
if (s == "sideset")
|
||||||
return MathAtom(new InsetMathSideset(buf));
|
return MathAtom(new InsetMathSideset(buf, true, true));
|
||||||
|
// The following 3 string values are only for math toolbar use, no LaTeX names
|
||||||
|
if (s == "sideset1")
|
||||||
|
return MathAtom(new InsetMathSideset(buf, false, true));
|
||||||
|
if (s == "sideset2")
|
||||||
|
return MathAtom(new InsetMathSideset(buf, true, false));
|
||||||
|
if (s == "sideset3")
|
||||||
|
return MathAtom(new InsetMathSideset(buf, false, false));
|
||||||
if (isSpecialChar(s))
|
if (isSpecialChar(s))
|
||||||
return MathAtom(new InsetMathSpecialChar(s));
|
return MathAtom(new InsetMathSpecialChar(s));
|
||||||
if (s == " ")
|
if (s == " ")
|
||||||
|
@ -1445,23 +1445,29 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
|
|||||||
|
|
||||||
else if (t.cs() == "sideset") {
|
else if (t.cs() == "sideset") {
|
||||||
// Here allowed formats are \sideset{_{bl}^{tl}}{_{br}^{tr}}{operator}
|
// Here allowed formats are \sideset{_{bl}^{tl}}{_{br}^{tr}}{operator}
|
||||||
cell->push_back(MathAtom(new InsetMathSideset(buf)));
|
MathData ar[2];
|
||||||
|
InsetMathScript * script[2] = {0, 0};
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
MathData ar;
|
parse(ar[i], FLAG_ITEM, mode);
|
||||||
parse(ar, FLAG_ITEM, mode);
|
if (ar[i].size() == 1)
|
||||||
if (!ar.empty()) {
|
script[i] = ar[i][0].nucleus()->asScriptInset();
|
||||||
InsetMathScript * script = (ar.size() == 1) ?
|
|
||||||
ar[0].nucleus()->asScriptInset() : 0;
|
|
||||||
if (!script) {
|
|
||||||
error("found invalid sideset argument");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (script->hasDown())
|
|
||||||
cell->back().nucleus()->cell(2 * i + 1) = script->down();
|
|
||||||
if (script->hasUp())
|
|
||||||
cell->back().nucleus()->cell(2 * i + 2) = script->up();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
bool const hasscript[2] = {script[0] ? true : false, script[1] ? true : false};
|
||||||
|
cell->push_back(MathAtom(new InsetMathSideset(buf, hasscript[0], hasscript[1])));
|
||||||
|
if (hasscript[0]) {
|
||||||
|
if (script[0]->hasDown())
|
||||||
|
cell->back().nucleus()->cell(1) = script[0]->down();
|
||||||
|
if (script[0]->hasUp())
|
||||||
|
cell->back().nucleus()->cell(2) = script[0]->up();
|
||||||
|
} else
|
||||||
|
cell->back().nucleus()->cell(1) = ar[0];
|
||||||
|
if (hasscript[1]) {
|
||||||
|
if (script[1]->hasDown())
|
||||||
|
cell->back().nucleus()->cell(2 + hasscript[0]) = script[1]->down();
|
||||||
|
if (script[1]->hasUp())
|
||||||
|
cell->back().nucleus()->cell(3 + hasscript[0]) = script[1]->up();
|
||||||
|
} else
|
||||||
|
cell->back().nucleus()->cell(2 + hasscript[0]) = ar[1];
|
||||||
parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
|
parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user