Am Montag, 17. April 2006 18:24 schrieb Enrico Forestieri: > BTW, when changing the zoom factor by writing its value instead of > using the small arrows, the Apply button is not highlighted (this > occurs in both 1.4 and 1.5).
So why don't you fix it? > When changing the zoom in 1.5 I also get the following written to the > console: > > LyX: Unknown tag `\use_session' [around line 180 of file ] > LyX: Unknown tag `true' [around line 181 of file ] > > It would also be nice having a report in the status line about the > size of the delimiter when the cursor is next to it. That is not possible with this approach, since the status line info is only obtained if the cursor is inside an inset. > However, even converting it to 1.4, I don't obtain correct results > loading it in 1.5. I also attach here a test file test-1.4.lyx and > the results I obtain with 1.4 (test-1.4.png) and 1.5 (test-1.5.png). The reason was a stupid mistake I made. Please try the attached, updated patch. I intend to commit this unless I get objections regarding the general approach. Georg Log: Make MathBigInset working * src/cursor.C (LCursor::plainInsert): combine the previous math atom with the new one to a MathBigInset if possible * src/mathed/math_biginset.[Ch] (MathBigInset::name): implement (MathBigInset::isBigInsetDelim): new, test whether a given token is a valid MathBigInset delimiter * src/mathed/math_biginset.C (MathBigInset::size): handle Big, Bigg and Biggg (MathBigInset::increase): ditto (MathBigInset::draw): fix deco drawing (MathBigInset::write): append space if necessary * src/mathed/math_factory.C (createMathInset): handle l->inset == "big" * src/mathed/math_parser.C (Token::asInput): return a token as input, stolen from tex2lyx (void Parser::parse1): Create a MathBigInset when needed * src/mathed/math_nestinset.C (MathNestInset::interpret): combine the previous math atom with the new character to a MathBigInset if possible * src/ParagraphParameters.C (findToken): move from here * src/support/lstrings.[Ch] (findToken): to here * lib/symbols: add MathBigInset symbols
Index: src/cursor.C =================================================================== --- src/cursor.C (Revision 13689) +++ src/cursor.C (Arbeitskopie) @@ -35,10 +35,12 @@ #include "insets/insettabular.h" #include "insets/insettext.h" +#include "mathed/math_biginset.h" #include "mathed/math_data.h" #include "mathed/math_inset.h" #include "mathed/math_scriptinset.h" #include "mathed/math_macrotable.h" +#include "mathed/math_parser.h" #include "support/limited_stack.h" @@ -650,6 +652,22 @@ void LCursor::markErase() void LCursor::plainInsert(MathAtom const & t) { + // Create a MathBigInset from cell()[pos() - 1] and t if possible + if (!empty() && pos() > 0 && cell()[pos() - 1]->asUnknownInset()) { + string const name = asString(t); + if (MathBigInset::isBigInsetDelim(name)) { + string prev = asString(cell()[pos() - 1]); + if (prev[0] == '\\') { + prev = prev.substr(1); + latexkeys const * l = in_word_set(prev); + if (l && l->inset == "big") { + cell()[pos() - 1] = + MathAtom(new MathBigInset(prev, name)); + return; + } + } + } + } cell().insert(pos(), t); ++pos(); } Index: src/mathed/math_biginset.h =================================================================== --- src/mathed/math_biginset.h (Revision 13689) +++ src/mathed/math_biginset.h (Arbeitskopie) @@ -16,12 +16,14 @@ #include <string> -/// Inset for \bigl & Co. +/// Inset for \\bigl & Co. class MathBigInset : public MathDimInset { public: /// MathBigInset(std::string const & name, std::string const & delim); /// + std::string name() const; + /// void metrics(MetricsInfo & mi, Dimension & dim) const; /// void draw(PainterInfo & pi, int x, int y) const; @@ -29,6 +31,8 @@ public: void write(WriteStream & os) const; /// void normalize(NormalStream & os) const; + /// + static bool isBigInsetDelim(std::string const &); private: virtual std::auto_ptr<InsetBase> doClone() const; @@ -37,9 +41,9 @@ private: /// double increase() const; - /// \bigl or what? + /// \\bigl or what? std::string const name_; - /// ( or [ or Vert... + /// ( or [ or \\Vert... std::string const delim_; }; Index: src/mathed/math_factory.C =================================================================== --- src/mathed/math_factory.C (Revision 13689) +++ src/mathed/math_factory.C (Arbeitskopie) @@ -276,6 +276,10 @@ MathAtom createMathInset(string const & return MathAtom(new MathFontOldInset(l)); if (inset == "matrix") return MathAtom(new MathAMSArrayInset(s)); + if (inset == "big") + // we can't create a MathBigInset, since the argument + // is missing. + return MathAtom(new MathUnknownInset(s)); return MathAtom(new MathSymbolInset(l)); } Index: src/mathed/math_parser.C =================================================================== --- src/mathed/math_parser.C (Revision 13689) +++ src/mathed/math_parser.C (Arbeitskopie) @@ -40,6 +40,7 @@ following hack as starting point to writ #include "math_parser.h" #include "math_arrayinset.h" +#include "math_biginset.h" #include "math_braceinset.h" #include "math_charinset.h" #include "math_colorinset.h" @@ -256,6 +257,8 @@ public: char character() const { return char_; } /// string asString() const { return cs_.size() ? cs_ : string(1, char_); } + /// + string asInput() const { return cs_.size() ? '\\' + cs_ : string(1, char_); } private: /// @@ -1298,7 +1301,20 @@ void Parser::parse1(MathGridInset & grid else if (t.cs().size()) { latexkeys const * l = in_word_set(t.cs()); if (l) { - if (l->inset == "font") { + if (l->inset == "big") { + skipSpaces(); + string const delim = getToken().asInput(); + if (MathBigInset::isBigInsetDelim(delim)) + cell->push_back(MathAtom( + new MathBigInset(t.cs(), delim))); + else { + cell->push_back(createMathInset(t.cs())); + cell->push_back(createMathInset( + delim.substr(1))); + } + } + + else if (l->inset == "font") { cell->push_back(createMathInset(t.cs())); parse(cell->back().nucleus()->cell(0), FLAG_ITEM, asMode(mode, l->extra)); Index: src/mathed/math_nestinset.C =================================================================== --- src/mathed/math_nestinset.C (Revision 13689) +++ src/mathed/math_nestinset.C (Arbeitskopie) @@ -13,6 +13,7 @@ #include "math_nestinset.h" #include "math_arrayinset.h" +#include "math_biginset.h" #include "math_boxinset.h" #include "math_braceinset.h" #include "math_colorinset.h" @@ -1144,6 +1145,25 @@ bool MathNestInset::interpret(LCursor & return true; } + // One character big delimiters. The others are handled in + // LCursor::plainInsert. + latexkeys const * l = in_word_set(name.substr(1)); + if (name[0] == '\\' && l && l->inset == "big") { + string const delim = string(1, c); + if (MathBigInset::isBigInsetDelim(delim)) { + // name + delim ared a valid MathBigInset. + // We can't use cur.macroModeClose() because + // it does not handle delim. + MathUnknownInset * p = cur.activeMacro(); + p->finalize(); + --cur.pos(); + cur.cell().erase(cur.pos()); + cur.plainInsert(MathAtom( + new MathBigInset(name.substr(1), delim))); + return true; + } + } + // leave macro mode and try again if necessary cur.macroModeClose(); if (c == '{') Index: src/mathed/math_biginset.C =================================================================== --- src/mathed/math_biginset.C (Revision 13689) +++ src/mathed/math_biginset.C (Arbeitskopie) @@ -15,6 +15,8 @@ #include "math_mathmlstream.h" #include "math_streamstr.h" +#include "support/lstrings.h" + using std::string; using std::auto_ptr; @@ -25,6 +27,12 @@ MathBigInset::MathBigInset(string const {} +string MathBigInset::name() const +{ + return name_; +} + + auto_ptr<InsetBase> MathBigInset::doClone() const { return auto_ptr<InsetBase>(new MathBigInset(*this)); @@ -33,18 +41,21 @@ auto_ptr<InsetBase> MathBigInset::doClon MathBigInset::size_type MathBigInset::size() const { - return name_.size() - 4; + // order: big Big bigg Bigg biggg Biggg + // 0 1 2 3 4 5 + return name_[0] == 'B' ? + 2 * (name_.size() - 4) + 1: + 2 * (name_.size() - 4); } double MathBigInset::increase() const { - switch (size()) { - case 1: return 0.2; - case 2: return 0.44; - case 3: return 0.7; - default: return 0.0; - } + // The formula used in amsmath.sty is + // 1.2 * (1.0 + size() * 0.5) - 1.0. + // We use a smaller step and a bigger offset because our base size + // is different. + return (size() + 1) * 0.3; } @@ -61,13 +72,23 @@ void MathBigInset::metrics(MetricsInfo & void MathBigInset::draw(PainterInfo & pi, int x, int y) const { - mathed_draw_deco(pi, x + 1, y - dim_.ascent(), 4, dim_.height(), delim_); + // mathed_draw_deco does not use the leading backslash, so remove it. + // Replace \| by \Vert (equivalent in LaTeX), since mathed_draw_deco + // would treat it as |. + string const delim = (delim_ == "\\|") ? + "Vert" : + lyx::support::ltrim(delim_, "\\"); + mathed_draw_deco(pi, x + 1, y - dim_.ascent(), 4, dim_.height(), + delim); + setPosCache(pi, x, y); } void MathBigInset::write(WriteStream & os) const { os << '\\' << name_ << ' ' << delim_; + if (delim_[0] == '\\') + os.pendingSpace(true); } @@ -75,3 +96,19 @@ void MathBigInset::normalize(NormalStrea { os << '[' << name_ << ' ' << delim_ << ']'; } + + +bool MathBigInset::isBigInsetDelim(string const & delim) +{ + // mathed_draw_deco must handle these + static char const * const delimiters[] = { + "(", ")", "{", "}", "[", "]", "|", "/", + "\\|", "\\vert", "\\Vert", "'", "\\backslash", + "\\langle", "\\lceil", "\\lfloor", + "\\rangle", "\\rceil", "\\rfloor", + "\\downarrow", "\\Downarrow", + "\\uparrow", "\\Uparrow", + "\\updownarrow", "\\Updownarrow", "" + }; + return (lyx::support::findToken(delimiters, delim) >= 0); +} Index: src/ParagraphParameters.C =================================================================== --- src/ParagraphParameters.C (Revision 13689) +++ src/ParagraphParameters.C (Arbeitskopie) @@ -40,20 +40,11 @@ using std::string; // anonym namespace namespace { -int findToken(char const * const str[], string const search_token) +int findToken(char const * const str[], string const & search_token) { - int i = 0; - - if (search_token != "default") { - while (str[i][0] && str[i] != search_token) { - ++i; - } - if (!str[i][0]) { - i = -1; - } - } - - return i; + return search_token == "default" ? + 0 : + lyx::support::findToken(str, search_token); } } Index: src/support/lstrings.C =================================================================== --- src/support/lstrings.C (Revision 13689) +++ src/support/lstrings.C (Arbeitskopie) @@ -534,6 +534,18 @@ string const getStringFromVector(vector< } +int findToken(char const * const str[], string const & search_token) +{ + int i = 0; + + while (str[i][0] && str[i] != search_token) + ++i; + if (!str[i][0]) + i = -1; + return i; +} + + #ifndef I_AM_NOT_AFRAID_OF_HEADER_LIBRARIES #if USE_BOOST_FORMAT Index: src/support/lstrings.h =================================================================== --- src/support/lstrings.h (Revision 13689) +++ src/support/lstrings.h (Arbeitskopie) @@ -176,6 +176,10 @@ std::vector<std::string> const getVector std::string const getStringFromVector(std::vector<std::string> const & vec, std::string const & delim = std::string(",")); +/// Search \p search_token in \p str and return the position if it is +/// found, else -1. The last item in \p str must be "". +int findToken(char const * const str[], std::string const & search_token); + #ifdef I_AM_NOT_AFRAID_OF_HEADER_LIBRARIES Index: lib/symbols =================================================================== --- lib/symbols (Revision 13689) +++ lib/symbols (Arbeitskopie) @@ -41,6 +41,28 @@ dotso dots none ldots dots none vdots dots none +# big delimiters +bigl big none +bigm big none +bigr big none +Bigl big none +Bigm big none +Bigr big none +biggl big none +biggm big none +biggr big none +Biggl big none +Biggm big none +Biggr big none +# The following are not standard LaTeX, but defined in the lucida font +# packages. No 'm' versions! +# See lucidabr.dtx for a possible implementation if you want to use these +# with other fonts. +bigggl big none +bigggr big none +Bigggl big none +Bigggr big none + # font changes # name "font" math/text family series shape color # mathnormal should stay the first