mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-26 03:11:59 +00:00
write \mathrm{x}\mathrm{y} as \mathrm{xy} again
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2966 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
9c4d5b9889
commit
dff2911bda
@ -224,9 +224,11 @@ From:
|
|||||||
// there, because otherwise more math symbols would be ready by now..
|
// there, because otherwise more math symbols would be ready by now..
|
||||||
// just a thought.
|
// just a thought.
|
||||||
|
|
||||||
- Some math symbols aren't very well supported (to my knowledge). I'm
|
//- Some math symbols aren't very well supported (to my knowledge). I'm
|
||||||
thinking of underbraces with extra data in them,or [] options.
|
// thinking of underbraces with extra data in them
|
||||||
|
|
||||||
|
- Some math symbols aren't very well supported (to my knowledge). I'm
|
||||||
|
thinking of [] options.
|
||||||
|
|
||||||
Herbert Voss:
|
Herbert Voss:
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ libmathed_la_SOURCES = \
|
|||||||
math_braceinset.h \
|
math_braceinset.h \
|
||||||
math_boxinset.C \
|
math_boxinset.C \
|
||||||
math_boxinset.h \
|
math_boxinset.h \
|
||||||
|
math_binaryopinset.C \
|
||||||
|
math_binaryopinset.h \
|
||||||
math_charinset.C \
|
math_charinset.C \
|
||||||
math_charinset.h \
|
math_charinset.h \
|
||||||
math_cursor.C \
|
math_cursor.C \
|
||||||
@ -94,6 +96,8 @@ libmathed_la_SOURCES = \
|
|||||||
math_sqrtinset.h \
|
math_sqrtinset.h \
|
||||||
math_stackrelinset.C \
|
math_stackrelinset.C \
|
||||||
math_stackrelinset.h \
|
math_stackrelinset.h \
|
||||||
|
math_stringinset.C \
|
||||||
|
math_stringinset.h \
|
||||||
math_symbolinset.C \
|
math_symbolinset.C \
|
||||||
math_symbolinset.h \
|
math_symbolinset.h \
|
||||||
support.C \
|
support.C \
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "math_inset.h"
|
#include "math_inset.h"
|
||||||
#include "math_charinset.h"
|
#include "math_charinset.h"
|
||||||
#include "math_scriptinset.h"
|
#include "math_scriptinset.h"
|
||||||
|
#include "math_stringinset.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "mathed/support.h"
|
#include "mathed/support.h"
|
||||||
@ -171,24 +172,37 @@ string charSequence(MathArray::const_iterator it, MathArray::const_iterator end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathArray MathArray::glueChars() const
|
||||||
|
{
|
||||||
|
MathArray ar;
|
||||||
|
const_iterator it = begin();
|
||||||
|
while (it != end()) {
|
||||||
|
if (it->nucleus() && it->nucleus()->asCharInset()) {
|
||||||
|
string s = charSequence(it, end());
|
||||||
|
MathTextCodes c = it->nucleus()->asCharInset()->code();
|
||||||
|
ar.push_back(MathAtom(new MathStringInset(s, c)));
|
||||||
|
it += s.size();
|
||||||
|
} else {
|
||||||
|
ar.push_back(*it);
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ar;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MathArray::write(MathWriteInfo & wi) const
|
void MathArray::write(MathWriteInfo & wi) const
|
||||||
|
{
|
||||||
|
glueChars().write1(wi);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathArray::write1(MathWriteInfo & wi) const
|
||||||
{
|
{
|
||||||
for (const_iterator it = begin(); it != end(); ++it) {
|
for (const_iterator it = begin(); it != end(); ++it) {
|
||||||
MathInset * p = it->nucleus();
|
MathInset * p = it->nucleus();
|
||||||
if (!p)
|
if (!p)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
|
||||||
if (p->asCharInset()) {
|
|
||||||
MathCharInset const * c = p->asCharInset();
|
|
||||||
// special handling for character sequences with the same code
|
|
||||||
string s = charSequence(it, end());
|
|
||||||
c->writeHeader(os);
|
|
||||||
os << s;
|
|
||||||
c->writeTrailer(os);
|
|
||||||
it += s.size() - 1;
|
|
||||||
} else
|
|
||||||
*/
|
|
||||||
if (MathScriptInset const * q = asScript(it)) {
|
if (MathScriptInset const * q = asScript(it)) {
|
||||||
q->write(p, wi);
|
q->write(p, wi);
|
||||||
++it;
|
++it;
|
||||||
|
@ -97,8 +97,10 @@ public:
|
|||||||
MathAtom & at(size_type pos);
|
MathAtom & at(size_type pos);
|
||||||
///
|
///
|
||||||
MathAtom const & at(size_type pos) const;
|
MathAtom const & at(size_type pos) const;
|
||||||
///
|
/// glue chars if necessary
|
||||||
void write(MathWriteInfo & os) const;
|
void write(MathWriteInfo & os) const;
|
||||||
|
/// raw write
|
||||||
|
void write1(MathWriteInfo & os) const;
|
||||||
///
|
///
|
||||||
void writeNormal(std::ostream &) const;
|
void writeNormal(std::ostream &) const;
|
||||||
///
|
///
|
||||||
@ -113,6 +115,8 @@ public:
|
|||||||
iterator end();
|
iterator end();
|
||||||
///
|
///
|
||||||
MathScriptInset const * asScript(const_iterator it) const;
|
MathScriptInset const * asScript(const_iterator it) const;
|
||||||
|
/// glues chars with the same attributes into MathStringInsets
|
||||||
|
MathArray glueChars() const;
|
||||||
private:
|
private:
|
||||||
/// Buffer
|
/// Buffer
|
||||||
buffer_type bf_;
|
buffer_type bf_;
|
||||||
|
60
src/mathed/math_binaryopinset.C
Normal file
60
src/mathed/math_binaryopinset.C
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "math_binaryopinset.h"
|
||||||
|
#include "Painter.h"
|
||||||
|
#include "support/LOstream.h"
|
||||||
|
#include "support.h"
|
||||||
|
|
||||||
|
|
||||||
|
MathBinaryOpInset::MathBinaryOpInset(char op)
|
||||||
|
: MathNestInset(2), op_(op)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
MathInset * MathBinaryOpInset::clone() const
|
||||||
|
{
|
||||||
|
return new MathBinaryOpInset(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathBinaryOpInset::opwidth() const
|
||||||
|
{
|
||||||
|
return mathed_char_width(LM_TC_CONST, mi_, op_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathBinaryOpInset::metrics(MathMetricsInfo const & mi) const
|
||||||
|
{
|
||||||
|
mi_ = mi;
|
||||||
|
xcell(0).metrics(mi);
|
||||||
|
xcell(1).metrics(mi);
|
||||||
|
width_ = xcell(0).width() + xcell(1).width() + opwidth();
|
||||||
|
ascent_ = std::max(xcell(0).ascent(), xcell(1).ascent());
|
||||||
|
descent_ = std::max(xcell(0).descent(), xcell(1).descent());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathBinaryOpInset::draw(Painter & pain, int x, int y) const
|
||||||
|
{
|
||||||
|
xcell(0).draw(pain, x, y);
|
||||||
|
drawChar(pain, LM_TC_CONST, mi_, x + xcell(0).width() , y, op_);
|
||||||
|
xcell(1).draw(pain, x + width() - xcell(1).width(), y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathBinaryOpInset::write(MathWriteInfo & os) const
|
||||||
|
{
|
||||||
|
os << '{' << cell(0) << op_ << cell(1) << '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathBinaryOpInset::writeNormal(std::ostream & os) const
|
||||||
|
{
|
||||||
|
os << "[binop " << op_ << ' ';
|
||||||
|
cell(0).writeNormal(os);
|
||||||
|
os << " ";
|
||||||
|
cell(1).writeNormal(os);
|
||||||
|
os << "]";
|
||||||
|
}
|
37
src/mathed/math_binaryopinset.h
Normal file
37
src/mathed/math_binaryopinset.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MATH_BINARYOPINSET_H
|
||||||
|
#define MATH_BINARYOPINSET_H
|
||||||
|
|
||||||
|
#include "math_nestinset.h"
|
||||||
|
#include "math_nestinset.h"
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** An inset for multiplication
|
||||||
|
\author André Pönitz
|
||||||
|
*/
|
||||||
|
class MathBinaryOpInset : public MathNestInset {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
explicit MathBinaryOpInset(char op);
|
||||||
|
///
|
||||||
|
MathInset * clone() const;
|
||||||
|
///
|
||||||
|
void draw(Painter &, int x, int y) const;
|
||||||
|
///
|
||||||
|
void write(MathWriteInfo & os) const;
|
||||||
|
///
|
||||||
|
void writeNormal(std::ostream &) const;
|
||||||
|
///
|
||||||
|
void metrics(MathMetricsInfo const & st) const;
|
||||||
|
private:
|
||||||
|
///
|
||||||
|
int opwidth() const;
|
||||||
|
///
|
||||||
|
char op_;
|
||||||
|
///
|
||||||
|
mutable MathMetricsInfo mi_;
|
||||||
|
};
|
||||||
|
#endif
|
@ -13,22 +13,6 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
char const * math_font_name[] = {
|
|
||||||
"mathrm",
|
|
||||||
"mathcal",
|
|
||||||
"mathbf",
|
|
||||||
"mathbb",
|
|
||||||
"mathsf",
|
|
||||||
"mathtt",
|
|
||||||
"mathit",
|
|
||||||
"textrm"
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MathCharInset::MathCharInset(char c)
|
MathCharInset::MathCharInset(char c)
|
||||||
: char_(c), code_(nativeCode(c))
|
: char_(c), code_(nativeCode(c))
|
||||||
{
|
{
|
||||||
@ -91,14 +75,14 @@ void MathCharInset::draw(Painter & pain, int x, int y) const
|
|||||||
|
|
||||||
void MathCharInset::writeHeader(std::ostream & os) const
|
void MathCharInset::writeHeader(std::ostream & os) const
|
||||||
{
|
{
|
||||||
if (code_ >= LM_TC_RM && code_ <= LM_TC_TEXTRM)
|
if (math_font_name(code_))
|
||||||
os << '\\' << math_font_name[code_ - LM_TC_RM] << '{';
|
os << '\\' << math_font_name(code_) << '{';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MathCharInset::writeTrailer(std::ostream & os) const
|
void MathCharInset::writeTrailer(std::ostream & os) const
|
||||||
{
|
{
|
||||||
if (code_ >= LM_TC_RM && code_ <= LM_TC_TEXTRM)
|
if (math_font_name(code_))
|
||||||
os << '}';
|
os << '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +243,14 @@ bool MathMatrixInset::numbered(row_type row) const
|
|||||||
bool MathMatrixInset::ams() const
|
bool MathMatrixInset::ams() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
return
|
||||||
|
objtype_ == LM_OT_ALIGN ||
|
||||||
|
objtype_ == LM_OT_MULTLINE ||
|
||||||
|
objtype_ == LM_OT_GATHER ||
|
||||||
|
objtype_ == LM_OT_ALIGNAT ||
|
||||||
|
objtype_ == LM_OT_XALIGNAT ||
|
||||||
|
objtype_ == LM_OT_XXALIGNAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
70
src/mathed/math_stringinset.C
Normal file
70
src/mathed/math_stringinset.C
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
#include "math_stringinset.h"
|
||||||
|
#include "LColor.h"
|
||||||
|
#include "Painter.h"
|
||||||
|
#include "support/LOstream.h"
|
||||||
|
#include "support.h"
|
||||||
|
#include "math_parser.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
MathStringInset::MathStringInset(string const & s, MathTextCodes t)
|
||||||
|
: str_(s), code_(t)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
MathInset * MathStringInset::clone() const
|
||||||
|
{
|
||||||
|
return new MathStringInset(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathStringInset::ascent() const
|
||||||
|
{
|
||||||
|
return mathed_string_ascent(code_, mi_, str_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathStringInset::descent() const
|
||||||
|
{
|
||||||
|
return mathed_string_descent(code_, mi_, str_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MathStringInset::width() const
|
||||||
|
{
|
||||||
|
return mathed_string_width(code_, mi_, str_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathStringInset::metrics(MathMetricsInfo const & mi) const
|
||||||
|
{
|
||||||
|
mi_ = mi;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathStringInset::draw(Painter & pain, int x, int y) const
|
||||||
|
{
|
||||||
|
//lyxerr << "drawing '" << str_ << "' code: " << code_ << endl;
|
||||||
|
drawStr(pain, code_, mi_, x, y, str_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathStringInset::write(MathWriteInfo & os) const
|
||||||
|
{
|
||||||
|
if (math_font_name(code_))
|
||||||
|
os << '\\' << math_font_name(code_) << '{' << str_ << '}';
|
||||||
|
else
|
||||||
|
os << str_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathStringInset::writeNormal(std::ostream & os) const
|
||||||
|
{
|
||||||
|
os << "[string " << str_ << " " << "mathalpha" << "]";
|
||||||
|
}
|
46
src/mathed/math_stringinset.h
Normal file
46
src/mathed/math_stringinset.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
#ifndef MATH_STRINGINSET_H
|
||||||
|
#define MATH_STRINGINSET_H
|
||||||
|
|
||||||
|
#include "math_inset.h"
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Some cllection of chars with similar properties
|
||||||
|
\author André Pönitz
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MathStringInset : public MathInset {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
MathStringInset(string const & s, MathTextCodes t);
|
||||||
|
///
|
||||||
|
MathInset * clone() const;
|
||||||
|
///
|
||||||
|
void metrics(MathMetricsInfo const & st) const;
|
||||||
|
///
|
||||||
|
void draw(Painter &, int x, int y) const;
|
||||||
|
///
|
||||||
|
void write(MathWriteInfo & os) const;
|
||||||
|
///
|
||||||
|
void writeNormal(std::ostream &) const;
|
||||||
|
///
|
||||||
|
int ascent() const;
|
||||||
|
///
|
||||||
|
int descent() const;
|
||||||
|
///
|
||||||
|
int width() const;
|
||||||
|
///
|
||||||
|
string & str();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// the string
|
||||||
|
string str_;
|
||||||
|
/// the font to be used on screen
|
||||||
|
MathTextCodes code_;
|
||||||
|
///
|
||||||
|
mutable MathMetricsInfo mi_;
|
||||||
|
};
|
||||||
|
#endif
|
@ -591,6 +591,29 @@ int mathed_string_width(MathTextCodes type, MathMetricsInfo const & size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int mathed_string_ascent(MathTextCodes type, MathMetricsInfo const & size,
|
||||||
|
string const & s)
|
||||||
|
{
|
||||||
|
LyXFont const font = whichFont(type, size);
|
||||||
|
int asc = 0;
|
||||||
|
for (string::const_iterator it = s.begin(); it != s.end(); ++it)
|
||||||
|
asc = max(asc, lyxfont::ascent(*it, font));
|
||||||
|
return asc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int mathed_string_descent(MathTextCodes type, MathMetricsInfo const & size,
|
||||||
|
string const & s)
|
||||||
|
{
|
||||||
|
LyXFont const font = whichFont(type, size);
|
||||||
|
int des = 0;
|
||||||
|
for (string::const_iterator it = s.begin(); it != s.end(); ++it)
|
||||||
|
des = max(des, lyxfont::descent(*it, font));
|
||||||
|
return des;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void mathed_draw_deco(Painter & pain, int x, int y, int w, int h,
|
void mathed_draw_deco(Painter & pain, int x, int y, int w, int h,
|
||||||
const string & name)
|
const string & name)
|
||||||
{
|
{
|
||||||
@ -714,3 +737,22 @@ void math_font_max_dim(MathTextCodes code, MathMetricsInfo const & siz,
|
|||||||
char const * latex_mathspace[] = {
|
char const * latex_mathspace[] = {
|
||||||
"!", ",", ":", ";", "quad", "qquad"
|
"!", ",", ":", ";", "quad", "qquad"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
char const * math_font_name(MathTextCodes code)
|
||||||
|
{
|
||||||
|
static char const * theFontNames[] = {
|
||||||
|
"mathrm",
|
||||||
|
"mathcal",
|
||||||
|
"mathbf",
|
||||||
|
"mathbb",
|
||||||
|
"mathsf",
|
||||||
|
"mathtt",
|
||||||
|
"mathit",
|
||||||
|
"textrm"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (code >= LM_TC_RM && code <= LM_TC_TEXTRM)
|
||||||
|
return theFontNames[code - LM_TC_RM];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -54,6 +54,7 @@ void smallerStyleScript(MathMetricsInfo &);
|
|||||||
// decrease math size for fractions
|
// decrease math size for fractions
|
||||||
void smallerStyleFrac(MathMetricsInfo & st);
|
void smallerStyleFrac(MathMetricsInfo & st);
|
||||||
|
|
||||||
|
char const * math_font_name(MathTextCodes type);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user