support for \begin{cases}...\end{cases} (for interactive creation type M-x

math-insert cases <number_of_case_you_want>)


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@3011 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2001-11-12 16:45:09 +00:00
parent f06372807d
commit c12d116ce7
9 changed files with 148 additions and 15 deletions

View File

@ -26,6 +26,8 @@ libmathed_la_SOURCES = \
math_boxinset.h \ math_boxinset.h \
math_binaryopinset.C \ math_binaryopinset.C \
math_binaryopinset.h \ math_binaryopinset.h \
math_casesinset.C \
math_casesinset.h \
math_charinset.C \ math_charinset.C \
math_charinset.h \ math_charinset.h \
math_cursor.C \ math_cursor.C \

View File

@ -207,15 +207,9 @@ namespace {
} }
MathArray pipeThroughExtern(string const & arg, MathArray const & ar) MathArray pipeThroughExtern(string const & lang, string const & extra,
MathArray const & ar)
{ {
string lang;
string extra;
istringstream iss(arg.c_str());
iss >> lang >> extra;
if (extra.empty())
extra = "noextra";
if (lang == "octave") if (lang == "octave")
return pipeThroughOctave(extra, ar); return pipeThroughOctave(extra, ar);
@ -507,27 +501,44 @@ InsetFormula::localDispatch(BufferView * bv, kb_action action,
} }
bool needEqnArray(string const & extra)
{
return extra == "dsolve";
}
void InsetFormula::handleExtern(const string & arg) void InsetFormula::handleExtern(const string & arg)
{ {
// where are we? // where are we?
if (!mathcursor) if (!mathcursor)
return; return;
string lang;
string extra;
istringstream iss(arg.c_str());
iss >> lang >> extra;
if (extra.empty())
extra = "noextra";
bool selected = mathcursor->selection(); bool selected = mathcursor->selection();
MathArray ar; MathArray ar;
if (selected) { if (needEqnArray(extra)) {
mathcursor->last();
mathcursor->readLine(ar);
mathcursor->breakLine();
} else if (selected) {
mathcursor->selGet(ar); mathcursor->selGet(ar);
//lyxerr << "use selection: " << ar << "\n"; //lyxerr << "use selection: " << ar << "\n";
} else { } else {
mathcursor->end(); mathcursor->last();
mathcursor->stripFromLastEqualSign(); mathcursor->stripFromLastEqualSign();
ar = mathcursor->cursor().cell(); ar = mathcursor->cursor().cell();
mathcursor->insert(MathAtom(new MathCharInset('=', LM_TC_VAR))); mathcursor->insert(MathAtom(new MathCharInset('=', LM_TC_VAR)));
//lyxerr << "use whole cell: " << ar << "\n"; //lyxerr << "use whole cell: " << ar << "\n";
} }
mathcursor->insert(pipeThroughExtern(arg, ar)); mathcursor->insert(pipeThroughExtern(lang, extra, ar));
} }

View File

@ -0,0 +1,62 @@
#ifdef __GNUG__
#pragma implementation
#endif
#include "math_casesinset.h"
#include "math_parser.h"
#include "math_mathmlstream.h"
#include "math_support.h"
#include "Painter.h"
MathCasesInset::MathCasesInset(row_type n)
: MathGridInset(2, n, 'c', "ll")
{}
MathInset * MathCasesInset::clone() const
{
return new MathCasesInset(*this);
}
void MathCasesInset::metrics(MathMetricsInfo const & mi) const
{
MathGridInset::metrics(mi);
width_ += 8;
}
void MathCasesInset::draw(Painter & pain, int x, int y) const
{
mathed_draw_deco(pain, x + 1, y - ascent(), 6, height(), "{");
MathGridInset::draw(pain, x + 8, y);
}
void MathCasesInset::write(WriteStream & os) const
{
if (os.fragile)
os << "\\protect";
os << "\\begin{cases}";
MathGridInset::write(os);
if (os.fragile)
os << "\\protect";
os << "\\end{cases}\n";
}
void MathCasesInset::normalize(NormalStream & os) const
{
os << "[cases ";
MathGridInset::normalize(os);
os << "]";
}
void MathCasesInset::maplize(MapleStream & os) const
{
os << "cases(";
MathGridInset::maplize(os);
os << ")";
}

View File

@ -0,0 +1,31 @@
// -*- C++ -*-
#ifndef MATH_CASESINSET_H
#define MATH_CASESINSET_H
#include "math_gridinset.h"
#ifdef __GNUG__
#pragma interface
#endif
class MathCasesInset : public MathGridInset {
public:
///
explicit MathCasesInset(row_type rows = 1u);
///
MathInset * clone() const;
///
void metrics(MathMetricsInfo const & st) const;
///
void draw(Painter & pain, int x, int y) const;
///
void normalize(NormalStream &) const;
///
void maplize(MapleStream &) const;
///
void write(WriteStream & os) const;
};
#endif

View File

@ -31,6 +31,7 @@
#include "math_support.h" #include "math_support.h"
#include "formulabase.h" #include "formulabase.h"
#include "math_cursor.h" #include "math_cursor.h"
#include "math_casesinset.h"
#include "math_factory.h" #include "math_factory.h"
#include "math_arrayinset.h" #include "math_arrayinset.h"
#include "math_braceinset.h" #include "math_braceinset.h"
@ -1114,6 +1115,14 @@ void MathCursor::breakLine()
} }
void MathCursor::readLine(MathArray & ar) const
{
idx_type base = row() * par()->ncols();
for (idx_type off = 0; off < par()->ncols(); ++off)
ar.push_back(par()->cell(base + off));
}
char MathCursor::valign() const char MathCursor::valign() const
{ {
idx_type idx; idx_type idx;
@ -1277,7 +1286,16 @@ void MathCursor::interpret(string const & s)
//owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt); //owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt);
//lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl; //lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl;
if (s.size() > 7 && s.substr(0, 7) == "matrix ") { if (s.size() >= 5 && s.substr(0, 5) == "cases") {
unsigned int n = 1;
istringstream is(s.substr(6).c_str());
is >> n;
n = std::max(1u, n);
niceInsert(MathAtom(new MathCasesInset(n)));
return;
}
if (s.size() >= 6 && s.substr(0, 6) == "matrix") {
unsigned int m = 1; unsigned int m = 1;
unsigned int n = 1; unsigned int n = 1;
string v_align; string v_align;

View File

@ -178,6 +178,8 @@ public:
void splitCell(); void splitCell();
/// Splits line and insert new row of cell /// Splits line and insert new row of cell
void breakLine(); void breakLine();
/// read contents of line into an array
void readLine(MathArray & ar) const;
/// ///
MathTextCodes getLastCode() const; MathTextCodes getLastCode() const;
/// ///
@ -191,6 +193,8 @@ public:
/// ///
char halign() const; char halign() const;
/// ///
col_type ncols() const;
///
col_type col() const; col_type col() const;
/// ///
row_type row() const; row_type row() const;

View File

@ -57,7 +57,7 @@ MathGridInset::MathGridInset(col_type m, row_type n)
} }
MathGridInset::MathGridInset(int m, int n, char v, string const & h) MathGridInset::MathGridInset(col_type m, row_type n, char v, string const & h)
: MathNestInset(m * n), rowinfo_(n), colinfo_(m), v_align_(v) : MathNestInset(m * n), rowinfo_(n), colinfo_(m), v_align_(v)
{ {
setDefaults(); setDefaults();

View File

@ -62,7 +62,7 @@ public:
/// Note: columns first! /// Note: columns first!
MathGridInset(col_type m, row_type n); MathGridInset(col_type m, row_type n);
/// ///
MathGridInset(int m, int n, char valign, string const & halign); MathGridInset(col_type m, row_type n, char valign, string const & halign);
/// ///
void metrics(MathMetricsInfo const & st) const; void metrics(MathMetricsInfo const & st) const;
/// ///

View File

@ -56,6 +56,7 @@ point to write some macros:
#include "math_inset.h" #include "math_inset.h"
#include "math_arrayinset.h" #include "math_arrayinset.h"
#include "math_braceinset.h" #include "math_braceinset.h"
#include "math_casesinset.h"
#include "math_charinset.h" #include "math_charinset.h"
#include "math_deliminset.h" #include "math_deliminset.h"
#include "math_factory.h" #include "math_factory.h"
@ -667,6 +668,7 @@ bool Parser::parse_normal(MathAtom & matrix)
} }
lyxerr[Debug::MATHED] << "1: unknown math environment: " << name << "\n"; lyxerr[Debug::MATHED] << "1: unknown math environment: " << name << "\n";
lyxerr << "1: unknown math environment: " << name << "\n";
return false; return false;
} }
@ -862,8 +864,11 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
} else if (name == "split") { } else if (name == "split") {
array.push_back(MathAtom(new MathSplitInset(1))); array.push_back(MathAtom(new MathSplitInset(1)));
parse_lines(array.back(), false, false); parse_lines(array.back(), false, false);
} else if (name == "cases") {
array.push_back(MathAtom(new MathCasesInset));
parse_lines(array.back(), false, false);
} else } else
lyxerr[Debug::MATHED] << "unknow math inset begin '" << name << "'\n"; lyxerr << "unknow math inset begin '" << name << "'\n";
} }
else if (t.cs() == "kern") { else if (t.cs() == "kern") {