|
|
|
@ -1,6261 +0,0 @@
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
#include <QMap>
|
|
|
|
|
#include <QDesktopWidget>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QDomNode>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
|
|
#include "qwt_mml_document.h"
|
|
|
|
|
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
// Declarations
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
|
|
|
|
|
#define ROUND(a) (int)((a)+.5)
|
|
|
|
|
|
|
|
|
|
static bool g_draw_frames = false;
|
|
|
|
|
static const double g_mfrac_spacing = 0.1;
|
|
|
|
|
static const double g_mroot_base_margin = 0.1;
|
|
|
|
|
static const double g_script_size_multiplier = 0.7071; // sqrt(1/2)
|
|
|
|
|
static const int g_min_font_point_size = 8;
|
|
|
|
|
static const QChar g_radical_char = QChar( 0x1A, 0x22 );
|
|
|
|
|
static const unsigned g_oper_spec_rows = 9;
|
|
|
|
|
|
|
|
|
|
struct QwtMml
|
|
|
|
|
{
|
|
|
|
|
enum NodeType
|
|
|
|
|
{
|
|
|
|
|
NoNode = 0, MiNode, MnNode, MfracNode, MrowNode, MsqrtNode,
|
|
|
|
|
MrootNode, MsupNode, MsubNode, MsubsupNode, MoNode,
|
|
|
|
|
MstyleNode, TextNode, MphantomNode, MfencedNode,
|
|
|
|
|
MtableNode, MtrNode, MtdNode, MoverNode, MunderNode,
|
|
|
|
|
MunderoverNode, MerrorNode, MtextNode, MpaddedNode,
|
|
|
|
|
MspaceNode, MalignMarkNode, UnknownNode
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum MathVariant
|
|
|
|
|
{
|
|
|
|
|
NormalMV = 0x0000,
|
|
|
|
|
BoldMV = 0x0001,
|
|
|
|
|
ItalicMV = 0x0002,
|
|
|
|
|
DoubleStruckMV = 0x0004,
|
|
|
|
|
ScriptMV = 0x0008,
|
|
|
|
|
FrakturMV = 0x0010,
|
|
|
|
|
SansSerifMV = 0x0020,
|
|
|
|
|
MonospaceMV = 0x0040
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum FormType { PrefixForm, InfixForm, PostfixForm };
|
|
|
|
|
enum ColAlign { ColAlignLeft, ColAlignCenter, ColAlignRight };
|
|
|
|
|
enum RowAlign { RowAlignTop, RowAlignCenter, RowAlignBottom,
|
|
|
|
|
RowAlignAxis, RowAlignBaseline
|
|
|
|
|
};
|
|
|
|
|
enum FrameType { FrameNone, FrameSolid, FrameDashed };
|
|
|
|
|
|
|
|
|
|
struct FrameSpacing
|
|
|
|
|
{
|
|
|
|
|
FrameSpacing( int hor = 0, int ver = 0 )
|
|
|
|
|
: m_hor( hor ), m_ver( ver ) {}
|
|
|
|
|
int m_hor, m_ver;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct QwtMmlOperSpec
|
|
|
|
|
{
|
|
|
|
|
enum StretchDir { NoStretch, HStretch, VStretch, HVStretch };
|
|
|
|
|
|
|
|
|
|
const char *name;
|
|
|
|
|
QwtMml::FormType form;
|
|
|
|
|
const char *attributes[g_oper_spec_rows];
|
|
|
|
|
StretchDir stretch_dir;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct QwtMmlNodeSpec
|
|
|
|
|
{
|
|
|
|
|
QwtMml::NodeType type;
|
|
|
|
|
const char *tag;
|
|
|
|
|
const char *type_str;
|
|
|
|
|
int child_spec;
|
|
|
|
|
const char *child_types;
|
|
|
|
|
const char *attributes;
|
|
|
|
|
|
|
|
|
|
enum ChildSpec
|
|
|
|
|
{
|
|
|
|
|
ChildAny = -1, // any number of children allowed
|
|
|
|
|
ChildIgnore = -2, // do not build subexpression of children
|
|
|
|
|
ImplicitMrow = -3 // if more than one child, build mrow
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct QwtMmlEntitySpec
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
const char *value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef QMap<QString, QString> QwtMmlAttributeMap;
|
|
|
|
|
class QwtMmlNode;
|
|
|
|
|
|
|
|
|
|
class QwtMmlDocument : public QwtMml
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlDocument();
|
|
|
|
|
~QwtMmlDocument();
|
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
|
|
bool setContent( QString text, QString *errorMsg = 0,
|
|
|
|
|
int *errorLine = 0, int *errorColumn = 0 );
|
|
|
|
|
void paint( QPainter *p, const QPoint &pos ) const;
|
|
|
|
|
void dump() const;
|
|
|
|
|
QSize size() const;
|
|
|
|
|
void layout();
|
|
|
|
|
|
|
|
|
|
QString fontName( QwtMathMLDocument::MmlFont type ) const;
|
|
|
|
|
void setFontName( QwtMathMLDocument::MmlFont type, const QString &name );
|
|
|
|
|
|
|
|
|
|
int baseFontPointSize() const
|
|
|
|
|
{ return m_base_font_point_size; }
|
|
|
|
|
void setBaseFontPointSize( int size )
|
|
|
|
|
{ m_base_font_point_size = size; }
|
|
|
|
|
QColor foregroundColor() const
|
|
|
|
|
{ return m_foreground_color; }
|
|
|
|
|
void setForegroundColor( const QColor &color )
|
|
|
|
|
{ m_foreground_color = color; }
|
|
|
|
|
QColor backgroundColor() const
|
|
|
|
|
{ return m_background_color; }
|
|
|
|
|
void setBackgroundColor( const QColor &color )
|
|
|
|
|
{ m_background_color = color; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void _dump( const QwtMmlNode *node, QString &indent ) const;
|
|
|
|
|
bool insertChild( QwtMmlNode *parent, QwtMmlNode *new_node, QString *errorMsg );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg );
|
|
|
|
|
QwtMmlNode *createNode( NodeType type, const QwtMmlAttributeMap &mml_attr,
|
|
|
|
|
const QString &mml_value, QString *errorMsg );
|
|
|
|
|
QwtMmlNode *createImplicitMrowNode( const QDomNode &dom_node, bool *ok,
|
|
|
|
|
QString *errorMsg );
|
|
|
|
|
|
|
|
|
|
void insertOperator( QwtMmlNode *node, const QString &text );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *m_root_node;
|
|
|
|
|
|
|
|
|
|
QString m_normal_font_name;
|
|
|
|
|
QString m_fraktur_font_name;
|
|
|
|
|
QString m_sans_serif_font_name;
|
|
|
|
|
QString m_script_font_name;
|
|
|
|
|
QString m_monospace_font_name;
|
|
|
|
|
QString m_doublestruck_font_name;
|
|
|
|
|
int m_base_font_point_size;
|
|
|
|
|
QColor m_foreground_color;
|
|
|
|
|
QColor m_background_color;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlNode : public QwtMml
|
|
|
|
|
{
|
|
|
|
|
friend class QwtMmlDocument;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map );
|
|
|
|
|
virtual ~QwtMmlNode();
|
|
|
|
|
|
|
|
|
|
// Mml stuff
|
|
|
|
|
NodeType nodeType() const
|
|
|
|
|
{ return m_node_type; }
|
|
|
|
|
|
|
|
|
|
virtual QString toStr() const;
|
|
|
|
|
|
|
|
|
|
void setRelOrigin( const QPoint &rel_origin );
|
|
|
|
|
QPoint relOrigin() const
|
|
|
|
|
{ return m_rel_origin; }
|
|
|
|
|
void stretchTo( const QRect &rect );
|
|
|
|
|
bool isStretched() const
|
|
|
|
|
{ return m_stretched; }
|
|
|
|
|
QPoint devicePoint( const QPoint &p ) const;
|
|
|
|
|
|
|
|
|
|
QRect myRect() const
|
|
|
|
|
{ return m_my_rect; }
|
|
|
|
|
QRect parentRect() const;
|
|
|
|
|
virtual QRect deviceRect() const;
|
|
|
|
|
void updateMyRect();
|
|
|
|
|
virtual void setMyRect( const QRect &rect )
|
|
|
|
|
{ m_my_rect = rect; }
|
|
|
|
|
|
|
|
|
|
virtual void stretch();
|
|
|
|
|
virtual void layout();
|
|
|
|
|
virtual void paint( QPainter *p );
|
|
|
|
|
|
|
|
|
|
int basePos() const;
|
|
|
|
|
int overlinePos() const;
|
|
|
|
|
int underlinePos() const;
|
|
|
|
|
int em() const;
|
|
|
|
|
int ex() const;
|
|
|
|
|
|
|
|
|
|
QString explicitAttribute( const QString &name, const QString &def = QString::null ) const;
|
|
|
|
|
QString inheritAttributeFromMrow( const QString &name, const QString &def = QString::null ) const;
|
|
|
|
|
|
|
|
|
|
virtual QFont font() const;
|
|
|
|
|
virtual QColor color() const;
|
|
|
|
|
virtual QColor background() const;
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Node stuff
|
|
|
|
|
QwtMmlDocument *document() const
|
|
|
|
|
{ return m_document; }
|
|
|
|
|
QwtMmlNode *parent() const
|
|
|
|
|
{ return m_parent; }
|
|
|
|
|
QwtMmlNode *firstChild() const
|
|
|
|
|
{ return m_first_child; }
|
|
|
|
|
QwtMmlNode *nextSibling() const
|
|
|
|
|
{ return m_next_sibling; }
|
|
|
|
|
QwtMmlNode *previousSibling() const
|
|
|
|
|
{ return m_previous_sibling; }
|
|
|
|
|
QwtMmlNode *lastSibling() const;
|
|
|
|
|
QwtMmlNode *firstSibling() const;
|
|
|
|
|
bool isLastSibling() const
|
|
|
|
|
{ return m_next_sibling == 0; }
|
|
|
|
|
bool isFirstSibling() const
|
|
|
|
|
{ return m_previous_sibling == 0; }
|
|
|
|
|
bool hasChildNodes() const
|
|
|
|
|
{ return m_first_child != 0; }
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual void paintSymbol( QPainter *p ) const;
|
|
|
|
|
virtual QRect symbolRect() const
|
|
|
|
|
{ return QRect( 0, 0, 0, 0 ); }
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *parentWithExplicitAttribute( const QString &name, NodeType type = NoNode );
|
|
|
|
|
int interpretSpacing( const QString &value, bool *ok ) const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QwtMmlAttributeMap m_attribute_map;
|
|
|
|
|
bool m_stretched;
|
|
|
|
|
QRect m_my_rect, m_parent_rect;
|
|
|
|
|
QPoint m_rel_origin;
|
|
|
|
|
|
|
|
|
|
NodeType m_node_type;
|
|
|
|
|
QwtMmlDocument *m_document;
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *m_parent,
|
|
|
|
|
*m_first_child,
|
|
|
|
|
*m_next_sibling,
|
|
|
|
|
*m_previous_sibling;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlTokenNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlTokenNode( NodeType type, QwtMmlDocument *document,
|
|
|
|
|
const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( type, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
QString text() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMphantomNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMphantomNode( QwtMmlDocument *document,
|
|
|
|
|
const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MphantomNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
virtual void paint( QPainter * ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlUnknownNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlUnknownNode( QwtMmlDocument *document,
|
|
|
|
|
const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( UnknownNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMfencedNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMfencedNode( QwtMmlDocument *document,
|
|
|
|
|
const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MfencedNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMalignMarkNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMalignMarkNode( QwtMmlDocument *document )
|
|
|
|
|
: QwtMmlNode( MalignMarkNode, document, QwtMmlAttributeMap() ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMfracNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMfracNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MfracNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *numerator() const;
|
|
|
|
|
QwtMmlNode *denominator() const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual void paintSymbol( QPainter *p ) const;
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMrowNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMrowNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MrowNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlRootBaseNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlRootBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( type, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *base() const;
|
|
|
|
|
QwtMmlNode *index() const;
|
|
|
|
|
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual void paintSymbol( QPainter *p ) const;
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
int tailWidth() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMrootNode : public QwtMmlRootBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMrootNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlRootBaseNode( MrootNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMsqrtNode : public QwtMmlRootBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMsqrtNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlRootBaseNode( MsqrtNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QwtMmlTextNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlTextNode( const QString &text, QwtMmlDocument *document );
|
|
|
|
|
|
|
|
|
|
virtual QString toStr() const;
|
|
|
|
|
QString text() const
|
|
|
|
|
{ return m_text; }
|
|
|
|
|
|
|
|
|
|
// TextNodes are not xml elements, so they can't have attributes of
|
|
|
|
|
// their own. Everything is taken from the parent.
|
|
|
|
|
virtual QFont font() const
|
|
|
|
|
{ return parent()->font(); }
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode* = 0 ) const
|
|
|
|
|
{ return parent()->scriptlevel( this ); }
|
|
|
|
|
virtual QColor color() const
|
|
|
|
|
{ return parent()->color(); }
|
|
|
|
|
virtual QColor background() const
|
|
|
|
|
{ return parent()->background(); }
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void paintSymbol( QPainter *p ) const;
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
|
|
|
|
|
QString m_text;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMiNode : public QwtMmlTokenNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMiNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTokenNode( MiNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMnNode : public QwtMmlTokenNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMnNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTokenNode( MnNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlSubsupBaseNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlSubsupBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( type, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *base() const;
|
|
|
|
|
QwtMmlNode *sscript() const;
|
|
|
|
|
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMsupNode : public QwtMmlSubsupBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlSubsupBaseNode( MsupNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMsubNode : public QwtMmlSubsupBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMsubNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlSubsupBaseNode( MsubNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMsubsupNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMsubsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MsubsupNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *base() const;
|
|
|
|
|
QwtMmlNode *superscript() const;
|
|
|
|
|
QwtMmlNode *subscript() const;
|
|
|
|
|
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMoNode : public QwtMmlTokenNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map );
|
|
|
|
|
|
|
|
|
|
QString dictionaryAttribute( const QString &name ) const;
|
|
|
|
|
virtual void stretch();
|
|
|
|
|
virtual int lspace() const;
|
|
|
|
|
virtual int rspace() const;
|
|
|
|
|
|
|
|
|
|
virtual QString toStr() const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
|
|
|
|
|
virtual FormType form() const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
const QwtMmlOperSpec *m_oper_spec;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMstyleNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMstyleNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MstyleNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlTableBaseNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlTableBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( type, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMtableNode : public QwtMmlTableBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMtableNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTableBaseNode( MtableNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
int rowspacing() const;
|
|
|
|
|
int columnspacing() const;
|
|
|
|
|
int framespacing_hor() const;
|
|
|
|
|
int framespacing_ver() const;
|
|
|
|
|
FrameType frame() const;
|
|
|
|
|
FrameType columnlines( int idx ) const;
|
|
|
|
|
FrameType rowlines( int idx ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
virtual void paintSymbol( QPainter *p ) const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
struct CellSizeData
|
|
|
|
|
{
|
|
|
|
|
void init( const QwtMmlNode *first_row );
|
|
|
|
|
QList<int> col_widths, row_heights;
|
|
|
|
|
int numCols() const { return col_widths.count(); }
|
|
|
|
|
int numRows() const { return row_heights.count(); }
|
|
|
|
|
uint colWidthSum() const;
|
|
|
|
|
uint rowHeightSum() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
CellSizeData m_cell_size_data;
|
|
|
|
|
int m_content_width, m_content_height;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMtrNode : public QwtMmlTableBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMtrNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTableBaseNode( MtrNode, document, attribute_map ) {}
|
|
|
|
|
void layoutCells( const QList<int> &col_widths, int col_spc );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMtdNode : public QwtMmlTableBaseNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMtdNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTableBaseNode( MtdNode, document, attribute_map )
|
|
|
|
|
{ m_scriptlevel_adjust = 0; }
|
|
|
|
|
virtual void setMyRect( const QRect &rect );
|
|
|
|
|
|
|
|
|
|
ColAlign columnalign();
|
|
|
|
|
RowAlign rowalign();
|
|
|
|
|
uint colNum();
|
|
|
|
|
uint rowNum();
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
int m_scriptlevel_adjust; // added or subtracted to scriptlevel to
|
|
|
|
|
// make contents fit the cell
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMoverNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MoverNode, document, attribute_map ) {}
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMunderNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMunderNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MunderNode, document, attribute_map ) {}
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMunderoverNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMunderoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MunderoverNode, document, attribute_map ) {}
|
|
|
|
|
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMerrorNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMerrorNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MerrorNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMtextNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMtextNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MtextNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMpaddedNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMpaddedNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MpaddedNode, document, attribute_map ) {}
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
int lspace() const;
|
|
|
|
|
int width() const;
|
|
|
|
|
int height() const;
|
|
|
|
|
int depth() const;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
int interpretSpacing( QString value, int base_value, bool *ok ) const;
|
|
|
|
|
virtual void layoutSymbol();
|
|
|
|
|
virtual QRect symbolRect() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class QwtMmlMspaceNode : public QwtMmlNode
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QwtMmlMspaceNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlNode( MspaceNode, document, attribute_map ) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type );
|
|
|
|
|
static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag );
|
|
|
|
|
static bool mmlCheckChildType( QwtMml::NodeType parent_type,
|
|
|
|
|
QwtMml::NodeType child_type, QString *error_str );
|
|
|
|
|
static bool mmlCheckAttributes( QwtMml::NodeType child_type,
|
|
|
|
|
const QwtMmlAttributeMap &attr, QString *error_str );
|
|
|
|
|
static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec );
|
|
|
|
|
static const QwtMmlOperSpec *mmlFindOperSpec( const QString &name, QwtMml::FormType form );
|
|
|
|
|
static int interpretSpacing( QString name, int em, int ex, bool *ok );
|
|
|
|
|
static int interpretPercentSpacing( QString value, int base, bool *ok );
|
|
|
|
|
static uint interpretMathVariant( const QString &value, bool *ok );
|
|
|
|
|
static QwtMml::FormType interpretForm( const QString &value, bool *ok );
|
|
|
|
|
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok );
|
|
|
|
|
static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok );
|
|
|
|
|
static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok );
|
|
|
|
|
static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok );
|
|
|
|
|
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok );
|
|
|
|
|
static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex );
|
|
|
|
|
static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok );
|
|
|
|
|
static QString interpretListAttr( const QString &value_list, int idx, const QString &def );
|
|
|
|
|
static QString rectToStr( const QRect &rect );
|
|
|
|
|
static QString entityDeclarations();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define MML_ATT_COMMON " class style id xref actiontype "
|
|
|
|
|
#define MML_ATT_FONTSIZE " fontsize fontweight fontstyle fontfamily color "
|
|
|
|
|
#define MML_ATT_MATHVARIANT " mathvariant mathsize mathcolor mathbackground "
|
|
|
|
|
#define MML_ATT_FONTINFO MML_ATT_FONTSIZE MML_ATT_MATHVARIANT
|
|
|
|
|
#define MML_ATT_OPINFO " form fence separator lspace rspace stretchy symmetric " \
|
|
|
|
|
" maxsize minsize largeop movablelimits accent "
|
|
|
|
|
#define MML_ATT_SIZEINFO " width height depth "
|
|
|
|
|
#define MML_ATT_TABLEINFO " align rowalign columnalign columnwidth groupalign " \
|
|
|
|
|
" alignmentscope side rowspacing columnspacing rowlines " \
|
|
|
|
|
" columnlines width frame framespacing equalrows " \
|
|
|
|
|
" equalcolumns displaystyle "
|
|
|
|
|
#define MML_ATT_MFRAC " bevelled numalign denomalign linethickness "
|
|
|
|
|
#define MML_ATT_MSTYLE MML_ATT_FONTINFO MML_ATT_OPINFO \
|
|
|
|
|
" scriptlevel lquote rquote linethickness displaystyle " \
|
|
|
|
|
" scriptsizemultiplier scriptminsize background " \
|
|
|
|
|
" veryverythinmathspace verythinmathspace thinmathspace " \
|
|
|
|
|
" mediummathspace thickmathspace verythickmathspace " \
|
|
|
|
|
" veryverythickmathspace open close separators " \
|
|
|
|
|
" subscriptshift superscriptshift accentunder tableinfo " \
|
|
|
|
|
" rowspan columnspan edge selection bevelled "
|
|
|
|
|
#define MML_ATT_MTABLE " align rowalign columnalign groupalign alignmentscope " \
|
|
|
|
|
" columnwidth width rowspacing columnspacing rowlines columnlines " \
|
|
|
|
|
" frame framespacing equalrows equalcolumns displaystyle side " \
|
|
|
|
|
" minlabelspacing "
|
|
|
|
|
|
|
|
|
|
static const QwtMmlNodeSpec g_node_spec_data[] =
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// type tag type_str child_spec child_types attributes ""=none, 0=any
|
|
|
|
|
// ----------------------- --------------- ------------------- ----------------------- ------------------------ ------------------------------------
|
|
|
|
|
{ QwtMml::MiNode, "mi", "MiNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO },
|
|
|
|
|
{ QwtMml::MnNode, "mn", "MnNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO },
|
|
|
|
|
{ QwtMml::MfracNode, "mfrac", "MfracNode", 2, 0, MML_ATT_COMMON MML_ATT_MFRAC },
|
|
|
|
|
{ QwtMml::MrowNode, "mrow", "MrowNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " display mode " },
|
|
|
|
|
{ QwtMml::MsqrtNode, "msqrt", "MsqrtNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
|
|
|
{ QwtMml::MrootNode, "mroot", "MrootNode", 2, 0, MML_ATT_COMMON },
|
|
|
|
|
{ QwtMml::MsupNode, "msup", "MsupNode", 2, 0, MML_ATT_COMMON " subscriptshift " },
|
|
|
|
|
{ QwtMml::MsubNode, "msub", "MsubNode", 2, 0, MML_ATT_COMMON " superscriptshift " },
|
|
|
|
|
{ QwtMml::MsubsupNode, "msubsup", "MsubsupNode", 3, 0, MML_ATT_COMMON " subscriptshift superscriptshift " },
|
|
|
|
|
{ QwtMml::MoNode, "mo", "MoNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO MML_ATT_OPINFO },
|
|
|
|
|
{ QwtMml::MstyleNode, "mstyle", "MstyleNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON MML_ATT_MSTYLE },
|
|
|
|
|
{ QwtMml::MphantomNode, "mphantom", "MphantomNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
|
|
|
{ QwtMml::MalignMarkNode, "malignmark", "MalignMarkNode", 0, 0, "" },
|
|
|
|
|
{ QwtMml::MfencedNode, "mfenced", "MfencedNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " open close separators " },
|
|
|
|
|
{ QwtMml::MtableNode, "mtable", "MtableNode", QwtMmlNodeSpec::ChildAny, " MtrNode ", MML_ATT_COMMON MML_ATT_MTABLE },
|
|
|
|
|
{ QwtMml::MtrNode, "mtr", "MtrNode", QwtMmlNodeSpec::ChildAny, " MtdNode ", MML_ATT_COMMON " rowalign columnalign groupalign " },
|
|
|
|
|
{ QwtMml::MtdNode, "mtd", "MtdNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " rowspan columnspan rowalign columnalign groupalign " },
|
|
|
|
|
{ QwtMml::MoverNode, "mover", "MoverNode", 2, 0, MML_ATT_COMMON " accent " },
|
|
|
|
|
{ QwtMml::MunderNode, "munder", "MunderNode", 2, 0, MML_ATT_COMMON " accentunder " },
|
|
|
|
|
{ QwtMml::MunderoverNode, "munderover", "MunderoverNode", 3, 0, MML_ATT_COMMON " accentunder accent " },
|
|
|
|
|
{ QwtMml::MerrorNode, "merror", "MerrorNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
|
|
|
{ QwtMml::MtextNode, "mtext", "MtextNode", 1, " TextNode ", MML_ATT_COMMON " width height depth linebreak " },
|
|
|
|
|
{ QwtMml::MpaddedNode, "mpadded", "MpaddedNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth lspace " },
|
|
|
|
|
{ QwtMml::MspaceNode, "mspace", "MspaceNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth linebreak " },
|
|
|
|
|
{ QwtMml::TextNode, 0, "TextNode", QwtMmlNodeSpec::ChildIgnore, 0, "" },
|
|
|
|
|
{ QwtMml::UnknownNode, 0, "UnknownNode", QwtMmlNodeSpec::ChildAny, 0, 0 },
|
|
|
|
|
{ QwtMml::NoNode, 0, 0, 0, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const char *g_oper_spec_names[g_oper_spec_rows] = { "accent", "fence", "largeop", "lspace", "minsize", "movablelimits", "rspace", "separator", "stretchy" /* stretchdir */ };
|
|
|
|
|
static const QwtMmlOperSpec g_oper_spec_data[] =
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
{ "!!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!!"
|
|
|
|
|
{ "!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!"
|
|
|
|
|
{ "!=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!="
|
|
|
|
|
{ "⩓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩓"
|
|
|
|
|
{ "⁡" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁡"
|
|
|
|
|
{ "≔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≔"
|
|
|
|
|
{ "∖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "∖"
|
|
|
|
|
{ "∵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∵"
|
|
|
|
|
{ "˘" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˘"
|
|
|
|
|
{ "⋒" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋒"
|
|
|
|
|
{ "ⅅ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⅅ"
|
|
|
|
|
{ "¸" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¸"
|
|
|
|
|
{ "·" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "·"
|
|
|
|
|
{ "⊙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊙"
|
|
|
|
|
{ "⊖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊖"
|
|
|
|
|
{ "⊕" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊕"
|
|
|
|
|
{ "⊗" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊗"
|
|
|
|
|
{ "∲" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true"}, QwtMmlOperSpec::VStretch }, // ∲"
|
|
|
|
|
{ "”" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ”"
|
|
|
|
|
{ "’" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "’"
|
|
|
|
|
{ "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷"
|
|
|
|
|
{ "≡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≡"
|
|
|
|
|
{ "∮" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "∮"
|
|
|
|
|
{ "∐" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∐"
|
|
|
|
|
{ "∳", QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // &CounterClockwiseContourInteg
|
|
|
|
|
{ "⨯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⨯"
|
|
|
|
|
{ "⋓" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋓"
|
|
|
|
|
{ "≍" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≍"
|
|
|
|
|
{ "∇" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∇"
|
|
|
|
|
{ "´" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "´"
|
|
|
|
|
{ "˙" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˙"
|
|
|
|
|
{ "˝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ˝"
|
|
|
|
|
{ "`" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "`"
|
|
|
|
|
{ "&DiacriticalLeftArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftArrow;"
|
|
|
|
|
{ "&DiacriticalLeftRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightArrow;"
|
|
|
|
|
{ "&DiacriticalLeftRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightVector;"
|
|
|
|
|
{ "&DiacriticalLeftVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftVector;"
|
|
|
|
|
{ "&DiacriticalRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightArrow;"
|
|
|
|
|
{ "&DiacriticalRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightVector;"
|
|
|
|
|
{ "˜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "˜"
|
|
|
|
|
{ "⋄" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋄"
|
|
|
|
|
{ "ⅆ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "ⅆ"
|
|
|
|
|
{ "≐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≐"
|
|
|
|
|
{ "∯" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ∯"
|
|
|
|
|
{ "¨" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¨"
|
|
|
|
|
{ "⇓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇓"
|
|
|
|
|
{ "⇐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇐"
|
|
|
|
|
{ "⇔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⇔"
|
|
|
|
|
{ "⫤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫤"
|
|
|
|
|
{ "⟸" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟸"
|
|
|
|
|
{ "⟺" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟺"
|
|
|
|
|
{ "⟹" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟹"
|
|
|
|
|
{ "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒"
|
|
|
|
|
{ "⊨" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊨"
|
|
|
|
|
{ "⇑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇑"
|
|
|
|
|
{ "⇕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇕"
|
|
|
|
|
{ "∥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∥"
|
|
|
|
|
{ "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↓"
|
|
|
|
|
{ "⤓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤓"
|
|
|
|
|
{ "⇵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇵"
|
|
|
|
|
{ "̑" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "̑"
|
|
|
|
|
{ "⥐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥐"
|
|
|
|
|
{ "⥞" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥞"
|
|
|
|
|
{ "↽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↽"
|
|
|
|
|
{ "⥖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥖"
|
|
|
|
|
{ "⥟" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥟"
|
|
|
|
|
{ "⇁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇁"
|
|
|
|
|
{ "⥗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥗"
|
|
|
|
|
{ "⊤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊤"
|
|
|
|
|
{ "↧" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↧"
|
|
|
|
|
{ "∈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∈"
|
|
|
|
|
{ "⩵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩵"
|
|
|
|
|
{ "≂" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂"
|
|
|
|
|
{ "⇌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇌"
|
|
|
|
|
{ "∃" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∃"
|
|
|
|
|
{ "∀" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∀"
|
|
|
|
|
{ "≥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≥"
|
|
|
|
|
{ "⋛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋛"
|
|
|
|
|
{ "≧" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧"
|
|
|
|
|
{ "⪢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪢"
|
|
|
|
|
{ "≷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≷"
|
|
|
|
|
{ "⩾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩾"
|
|
|
|
|
{ "≳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≳"
|
|
|
|
|
{ "ˇ" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "ˇ"
|
|
|
|
|
{ "^" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "^"
|
|
|
|
|
{ "─" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "─"
|
|
|
|
|
{ "≎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎"
|
|
|
|
|
{ "≏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏"
|
|
|
|
|
{ "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒"
|
|
|
|
|
{ "∫" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∫"
|
|
|
|
|
{ "⋂" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋂"
|
|
|
|
|
{ "⁣" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // "⁣"
|
|
|
|
|
{ "⁢" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁢"
|
|
|
|
|
{ "⟨" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟨"
|
|
|
|
|
{ "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "←"
|
|
|
|
|
{ "⇤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇤"
|
|
|
|
|
{ "⇆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇆"
|
|
|
|
|
{ "&LeftBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&LeftBracketingBar;"
|
|
|
|
|
{ "⌈" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌈"
|
|
|
|
|
{ "⟦" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟦"
|
|
|
|
|
{ "&LeftDoubleBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &LeftDoubleBracketingBar;"
|
|
|
|
|
{ "⥡" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥡"
|
|
|
|
|
{ "⇃" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇃"
|
|
|
|
|
{ "⥙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥙"
|
|
|
|
|
{ "⌊" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌊"
|
|
|
|
|
{ "↔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↔"
|
|
|
|
|
{ "⥎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥎"
|
|
|
|
|
{ "&LeftSkeleton;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&LeftSkeleton;"
|
|
|
|
|
{ "⊣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊣"
|
|
|
|
|
{ "↤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↤"
|
|
|
|
|
{ "⥚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥚"
|
|
|
|
|
{ "⊲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊲"
|
|
|
|
|
{ "⧏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏"
|
|
|
|
|
{ "⊴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊴"
|
|
|
|
|
{ "⥑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥑"
|
|
|
|
|
{ "⥠" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥠"
|
|
|
|
|
{ "↿" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↿"
|
|
|
|
|
{ "⥘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥘"
|
|
|
|
|
{ "↼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↼"
|
|
|
|
|
{ "⥒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥒"
|
|
|
|
|
{ "⋚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋚"
|
|
|
|
|
{ "≦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≦"
|
|
|
|
|
{ "≶" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≶"
|
|
|
|
|
{ "⪡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡"
|
|
|
|
|
{ "⩽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽"
|
|
|
|
|
{ "≲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≲"
|
|
|
|
|
{ "⟵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟵"
|
|
|
|
|
{ "⟷" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟷"
|
|
|
|
|
{ "⟶" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟶"
|
|
|
|
|
{ "↙" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↙"
|
|
|
|
|
{ "↘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↘"
|
|
|
|
|
{ "∓" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∓"
|
|
|
|
|
{ "≫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ≫"
|
|
|
|
|
{ "≪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪"
|
|
|
|
|
{ "⫬" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫬"
|
|
|
|
|
{ "≢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≢"
|
|
|
|
|
{ "≭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≭"
|
|
|
|
|
{ "∦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ∦"
|
|
|
|
|
{ "∉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∉"
|
|
|
|
|
{ "≠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≠"
|
|
|
|
|
{ "≂̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂̸"
|
|
|
|
|
{ "∄" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∄"
|
|
|
|
|
{ "≯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≯"
|
|
|
|
|
{ "≱" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≱"
|
|
|
|
|
{ "≧̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧̸"
|
|
|
|
|
{ "≫̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≫̸"
|
|
|
|
|
{ "≹" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≹"
|
|
|
|
|
{ "⩾̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⩾̸"
|
|
|
|
|
{ "≵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≵"
|
|
|
|
|
{ "≎̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎̸"
|
|
|
|
|
{ "≏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏̸"
|
|
|
|
|
{ "⋪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋪"
|
|
|
|
|
{ "⧏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏̸"
|
|
|
|
|
{ "⋬" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋬"
|
|
|
|
|
{ "≮" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≮"
|
|
|
|
|
{ "≰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≰"
|
|
|
|
|
{ "&NotLessFullEqual;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotLessFullEqual;"
|
|
|
|
|
{ "≸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≸"
|
|
|
|
|
{ "≪̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪̸"
|
|
|
|
|
{ "⩽̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽̸"
|
|
|
|
|
{ "≴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≴"
|
|
|
|
|
{ "⪢̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⪢̸"
|
|
|
|
|
{ "⪡̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡̸"
|
|
|
|
|
{ "⊀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊀"
|
|
|
|
|
{ "⪯̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯̸"
|
|
|
|
|
{ "⋠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋠"
|
|
|
|
|
{ "&NotPrecedesTilde;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotPrecedesTilde;"
|
|
|
|
|
{ "∌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∌"
|
|
|
|
|
{ "⋫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋫"
|
|
|
|
|
{ "⧐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐̸"
|
|
|
|
|
{ "⋭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋭"
|
|
|
|
|
{ "⊏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏̸"
|
|
|
|
|
{ "⋢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋢"
|
|
|
|
|
{ "⊐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐̸"
|
|
|
|
|
{ "⋣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋣"
|
|
|
|
|
{ "⊂⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊂⃒"
|
|
|
|
|
{ "⊈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊈"
|
|
|
|
|
{ "⊁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊁"
|
|
|
|
|
{ "⪰̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰̸"
|
|
|
|
|
{ "⋡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋡"
|
|
|
|
|
{ "≿̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿̸"
|
|
|
|
|
{ "⊃⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃⃒"
|
|
|
|
|
{ "⊉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊉"
|
|
|
|
|
{ "≁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≁"
|
|
|
|
|
{ "≄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≄"
|
|
|
|
|
{ "≇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≇"
|
|
|
|
|
{ "≉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≉"
|
|
|
|
|
{ "∤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∤"
|
|
|
|
|
{ "“" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // “"
|
|
|
|
|
{ "‘" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "‘"
|
|
|
|
|
{ "⩔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩔"
|
|
|
|
|
{ "‾" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "‾"
|
|
|
|
|
{ "⏞" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏞"
|
|
|
|
|
{ "⎴" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎴"
|
|
|
|
|
{ "⏜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⏜"
|
|
|
|
|
{ "∂" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∂"
|
|
|
|
|
{ "±" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "±"
|
|
|
|
|
{ "≺" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≺"
|
|
|
|
|
{ "⪯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯"
|
|
|
|
|
{ "≼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≼"
|
|
|
|
|
{ "≾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≾"
|
|
|
|
|
{ "∏" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∏"
|
|
|
|
|
{ "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷"
|
|
|
|
|
{ "∝" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∝"
|
|
|
|
|
{ "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋"
|
|
|
|
|
{ "⇋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇋"
|
|
|
|
|
{ "⥯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⥯"
|
|
|
|
|
{ "⟩" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟩"
|
|
|
|
|
{ "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "→"
|
|
|
|
|
{ "⇥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇥"
|
|
|
|
|
{ "⇄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇄"
|
|
|
|
|
{ "&RightBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&RightBracketingBar;"
|
|
|
|
|
{ "⌉" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌉"
|
|
|
|
|
{ "⟧" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟧"
|
|
|
|
|
{ "&RightDoubleBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &RightDoubleBracketingBar;"
|
|
|
|
|
{ "⥝" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥝"
|
|
|
|
|
{ "⇂" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇂"
|
|
|
|
|
{ "⥕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥕"
|
|
|
|
|
{ "⌋" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌋"
|
|
|
|
|
{ "&RightSkeleton;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&RightSkeleton;"
|
|
|
|
|
{ "⊢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊢"
|
|
|
|
|
{ "↦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↦"
|
|
|
|
|
{ "⥛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥛"
|
|
|
|
|
{ "⊳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊳"
|
|
|
|
|
{ "⧐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐"
|
|
|
|
|
{ "⊵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊵"
|
|
|
|
|
{ "⥏" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥏"
|
|
|
|
|
{ "⥜" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥜"
|
|
|
|
|
{ "↾" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↾"
|
|
|
|
|
{ "⥔" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥔"
|
|
|
|
|
{ "⇀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇀"
|
|
|
|
|
{ "⥓" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥓"
|
|
|
|
|
{ "⥰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⥰"
|
|
|
|
|
{ "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "↓"
|
|
|
|
|
{ "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "←"
|
|
|
|
|
{ "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "→"
|
|
|
|
|
{ "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::VStretch }, // "↑"
|
|
|
|
|
{ "∘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∘"
|
|
|
|
|
{ "√" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "√"
|
|
|
|
|
{ "□" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "□"
|
|
|
|
|
{ "⊓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊓"
|
|
|
|
|
{ "⊏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏"
|
|
|
|
|
{ "⊑" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊑"
|
|
|
|
|
{ "⊐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐"
|
|
|
|
|
{ "⊒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊒"
|
|
|
|
|
{ "⊔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊔"
|
|
|
|
|
{ "⋆" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋆"
|
|
|
|
|
{ "⋐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋐"
|
|
|
|
|
{ "⊆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊆"
|
|
|
|
|
{ "≻" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≻"
|
|
|
|
|
{ "⪰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰"
|
|
|
|
|
{ "≽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≽"
|
|
|
|
|
{ "≿" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿"
|
|
|
|
|
{ "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋"
|
|
|
|
|
{ "∑" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∑"
|
|
|
|
|
{ "⊃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃"
|
|
|
|
|
{ "⊇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊇"
|
|
|
|
|
{ "∴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∴"
|
|
|
|
|
{ "∼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∼"
|
|
|
|
|
{ "≃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≃"
|
|
|
|
|
{ "≅" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≅"
|
|
|
|
|
{ "≈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≈"
|
|
|
|
|
{ "⃛" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⃛"
|
|
|
|
|
{ "_" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "_"
|
|
|
|
|
{ "⏟" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏟"
|
|
|
|
|
{ "⎵" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎵"
|
|
|
|
|
{ "⏝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏝"
|
|
|
|
|
{ "⋃" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋃"
|
|
|
|
|
{ "⊎" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊎"
|
|
|
|
|
{ "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↑"
|
|
|
|
|
{ "⤒" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤒"
|
|
|
|
|
{ "⇅" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇅"
|
|
|
|
|
{ "↕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↕"
|
|
|
|
|
{ "⥮" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥮"
|
|
|
|
|
{ "⊥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊥"
|
|
|
|
|
{ "↥" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↥"
|
|
|
|
|
{ "↖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↖"
|
|
|
|
|
{ "↗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↗"
|
|
|
|
|
{ "⋁" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋁"
|
|
|
|
|
{ "∣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∣"
|
|
|
|
|
{ "|" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|"
|
|
|
|
|
{ "❘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "❘"
|
|
|
|
|
{ "≀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≀"
|
|
|
|
|
{ "⋀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋀"
|
|
|
|
|
{ "&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&"
|
|
|
|
|
{ "&&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&&"
|
|
|
|
|
{ "≤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≤"
|
|
|
|
|
{ "<" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<"
|
|
|
|
|
{ "<=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<="
|
|
|
|
|
{ "<>" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<>"
|
|
|
|
|
{ "'" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "'"
|
|
|
|
|
{ "(" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "("
|
|
|
|
|
{ ")" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ")"
|
|
|
|
|
{ "*" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*"
|
|
|
|
|
{ "**" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "**"
|
|
|
|
|
{ "*=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*="
|
|
|
|
|
{ "+" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+"
|
|
|
|
|
{ "+" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+"
|
|
|
|
|
{ "++" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "++"
|
|
|
|
|
{ "+=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+="
|
|
|
|
|
{ "," , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ","
|
|
|
|
|
{ "-" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-"
|
|
|
|
|
{ "-" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-"
|
|
|
|
|
{ "--" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "--"
|
|
|
|
|
{ "-=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-="
|
|
|
|
|
{ "->" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "->"
|
|
|
|
|
{ "." , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "."
|
|
|
|
|
{ ".." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ".."
|
|
|
|
|
{ "..." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "..."
|
|
|
|
|
{ "/" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "/"
|
|
|
|
|
{ "//" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "//"
|
|
|
|
|
{ "/=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "/="
|
|
|
|
|
{ ":" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":"
|
|
|
|
|
{ ":=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":="
|
|
|
|
|
{ ";" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";"
|
|
|
|
|
{ ";" , QwtMml::PostfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";"
|
|
|
|
|
{ "=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "="
|
|
|
|
|
{ "==" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "=="
|
|
|
|
|
{ ">" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">"
|
|
|
|
|
{ ">=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">="
|
|
|
|
|
{ "?" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "?"
|
|
|
|
|
{ "@" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "@"
|
|
|
|
|
{ "[" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "["
|
|
|
|
|
{ "]" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "]"
|
|
|
|
|
{ "^" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "^"
|
|
|
|
|
{ "_" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "_"
|
|
|
|
|
{ "lim" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "lim"
|
|
|
|
|
{ "max" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "max"
|
|
|
|
|
{ "min" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "min"
|
|
|
|
|
{ "{" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "{"
|
|
|
|
|
{ "|" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|"
|
|
|
|
|
{ "||" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "||"
|
|
|
|
|
{ "}" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "}"
|
|
|
|
|
{ "~" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "~"
|
|
|
|
|
|
|
|
|
|
{ 0 , QwtMml::InfixForm, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, QwtMmlOperSpec::NoStretch }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const QwtMmlOperSpec g_oper_spec_defaults =
|
|
|
|
|
{ 0 , QwtMml::InfixForm, { "false", "false", "false", "thickmathspace", "1", "false", "thickmathspace", "false", "false" }, QwtMmlOperSpec::NoStretch };
|
|
|
|
|
|
|
|
|
|
static const uint g_oper_spec_count = sizeof( g_oper_spec_data ) / sizeof( QwtMmlOperSpec ) - 1;
|
|
|
|
|
|
|
|
|
|
static const QwtMmlEntitySpec g_xml_entity_data[] =
|
|
|
|
|
{
|
|
|
|
|
{ "angzarr", "⍼" },
|
|
|
|
|
{ "cirmid", "⫯" },
|
|
|
|
|
{ "cudarrl", "⤸" },
|
|
|
|
|
{ "cudarrr", "⤵" },
|
|
|
|
|
{ "cularr", "↶" },
|
|
|
|
|
{ "cularrp", "⤽" },
|
|
|
|
|
{ "curarr", "↷" },
|
|
|
|
|
{ "curarrm", "⤼" },
|
|
|
|
|
{ "Darr", "↡" },
|
|
|
|
|
{ "dArr", "⇓" },
|
|
|
|
|
{ "ddarr", "⇊" },
|
|
|
|
|
{ "DDotrahd", "⤑" },
|
|
|
|
|
{ "dfisht", "⥿" },
|
|
|
|
|
{ "dHar", "⥥" },
|
|
|
|
|
{ "dharl", "⇃" },
|
|
|
|
|
{ "dharr", "⇂" },
|
|
|
|
|
{ "duarr", "⇵" },
|
|
|
|
|
{ "duhar", "⥯" },
|
|
|
|
|
{ "dzigrarr", "⟿" },
|
|
|
|
|
{ "erarr", "⥱" },
|
|
|
|
|
{ "hArr", "⇔" },
|
|
|
|
|
{ "harr", "↔" },
|
|
|
|
|
{ "harrcir", "⥈" },
|
|
|
|
|
{ "harrw", "↭" },
|
|
|
|
|
{ "hoarr", "⇿" },
|
|
|
|
|
{ "imof", "⊷" },
|
|
|
|
|
{ "lAarr", "⇚" },
|
|
|
|
|
{ "Larr", "↞" },
|
|
|
|
|
{ "larrbfs", "⤟" },
|
|
|
|
|
{ "larrfs", "⤝" },
|
|
|
|
|
{ "larrhk", "↩" },
|
|
|
|
|
{ "larrlp", "↫" },
|
|
|
|
|
{ "larrpl", "⤹" },
|
|
|
|
|
{ "larrsim", "⥳" },
|
|
|
|
|
{ "larrtl", "↢" },
|
|
|
|
|
{ "lAtail", "⤛" },
|
|
|
|
|
{ "latail", "⤙" },
|
|
|
|
|
{ "lBarr", "⤎" },
|
|
|
|
|
{ "lbarr", "⤌" },
|
|
|
|
|
{ "ldca", "⤶" },
|
|
|
|
|
{ "ldrdhar", "⥧" },
|
|
|
|
|
{ "ldrushar", "⥋" },
|
|
|
|
|
{ "ldsh", "↲" },
|
|
|
|
|
{ "lfisht", "⥼" },
|
|
|
|
|
{ "lHar", "⥢" },
|
|
|
|
|
{ "lhard", "↽" },
|
|
|
|
|
{ "lharu", "↼" },
|
|
|
|
|
{ "lharul", "⥪" },
|
|
|
|
|
{ "llarr", "⇇" },
|
|
|
|
|
{ "llhard", "⥫" },
|
|
|
|
|
{ "loarr", "⇽" },
|
|
|
|
|
{ "lrarr", "⇆" },
|
|
|
|
|
{ "lrhar", "⇋" },
|
|
|
|
|
{ "lrhard", "⥭" },
|
|
|
|
|
{ "lsh", "↰" },
|
|
|
|
|
{ "lurdshar", "⥊" },
|
|
|
|
|
{ "luruhar", "⥦" },
|
|
|
|
|
{ "Map", "⤅" },
|
|
|
|
|
{ "map", "↦" },
|
|
|
|
|
{ "midcir", "⫰" },
|
|
|
|
|
{ "mumap", "⊸" },
|
|
|
|
|
{ "nearhk", "⤤" },
|
|
|
|
|
{ "neArr", "⇗" },
|
|
|
|
|
{ "nearr", "↗" },
|
|
|
|
|
{ "nesear", "⤨" },
|
|
|
|
|
{ "nhArr", "⇎" },
|
|
|
|
|
{ "nharr", "↮" },
|
|
|
|
|
{ "nlArr", "⇍" },
|
|
|
|
|
{ "nlarr", "↚" },
|
|
|
|
|
{ "nrArr", "⇏" },
|
|
|
|
|
{ "nrarr", "↛" },
|
|
|
|
|
{ "nrarrc", "⤳̸" },
|
|
|
|
|
{ "nrarrw", "↝̸" },
|
|
|
|
|
{ "nvHarr", "⤄" },
|
|
|
|
|
{ "nvlArr", "⤂" },
|
|
|
|
|
{ "nvrArr", "⤃" },
|
|
|
|
|
{ "nwarhk", "⤣" },
|
|
|
|
|
{ "nwArr", "⇖" },
|
|
|
|
|
{ "nwarr", "↖" },
|
|
|
|
|
{ "nwnear", "⤧" },
|
|
|
|
|
{ "olarr", "↺" },
|
|
|
|
|
{ "orarr", "↻" },
|
|
|
|
|
{ "origof", "⊶" },
|
|
|
|
|
{ "rAarr", "⇛" },
|
|
|
|
|
{ "Rarr", "↠" },
|
|
|
|
|
{ "rarrap", "⥵" },
|
|
|
|
|
{ "rarrbfs", "⤠" },
|
|
|
|
|
{ "rarrc", "⤳" },
|
|
|
|
|
{ "rarrfs", "⤞" },
|
|
|
|
|
{ "rarrhk", "↪" },
|
|
|
|
|
{ "rarrlp", "↬" },
|
|
|
|
|
{ "rarrpl", "⥅" },
|
|
|
|
|
{ "rarrsim", "⥴" },
|
|
|
|
|
{ "Rarrtl", "⤖" },
|
|
|
|
|
{ "rarrtl", "↣" },
|
|
|
|
|
{ "rarrw", "↝" },
|
|
|
|
|
{ "rAtail", "⤜" },
|
|
|
|
|
{ "ratail", "⤚" },
|
|
|
|
|
{ "RBarr", "⤐" },
|
|
|
|
|
{ "rBarr", "⤏" },
|
|
|
|
|
{ "rbarr", "⤍" },
|
|
|
|
|
{ "rdca", "⤷" },
|
|
|
|
|
{ "rdldhar", "⥩" },
|
|
|
|
|
{ "rdsh", "↳" },
|
|
|
|
|
{ "rfisht", "⥽" },
|
|
|
|
|
{ "rHar", "⥤" },
|
|
|
|
|
{ "rhard", "⇁" },
|
|
|
|
|
{ "rharu", "⇀" },
|
|
|
|
|
{ "rharul", "⥬" },
|
|
|
|
|
{ "rlarr", "⇄" },
|
|
|
|
|
{ "rlhar", "⇌" },
|
|
|
|
|
{ "roarr", "⇾" },
|
|
|
|
|
{ "rrarr", "⇉" },
|
|
|
|
|
{ "rsh", "↱" },
|
|
|
|
|
{ "ruluhar", "⥨" },
|
|
|
|
|
{ "searhk", "⤥" },
|
|
|
|
|
{ "seArr", "⇘" },
|
|
|
|
|
{ "searr", "↘" },
|
|
|
|
|
{ "seswar", "⤩" },
|
|
|
|
|
{ "simrarr", "⥲" },
|
|
|
|
|
{ "slarr", "←" },
|
|
|
|
|
{ "srarr", "→" },
|
|
|
|
|
{ "swarhk", "⤦" },
|
|
|
|
|
{ "swArr", "⇙" },
|
|
|
|
|
{ "swarr", "↙" },
|
|
|
|
|
{ "swnwar", "⤪" },
|
|
|
|
|
{ "Uarr", "↟" },
|
|
|
|
|
{ "uArr", "⇑" },
|
|
|
|
|
{ "Uarrocir", "⥉" },
|
|
|
|
|
{ "udarr", "⇅" },
|
|
|
|
|
{ "udhar", "⥮" },
|
|
|
|
|
{ "ufisht", "⥾" },
|
|
|
|
|
{ "uHar", "⥣" },
|
|
|
|
|
{ "uharl", "↿" },
|
|
|
|
|
{ "uharr", "↾" },
|
|
|
|
|
{ "uuarr", "⇈" },
|
|
|
|
|
{ "vArr", "⇕" },
|
|
|
|
|
{ "varr", "↕" },
|
|
|
|
|
{ "xhArr", "⟺" },
|
|
|
|
|
{ "xharr", "⟷" },
|
|
|
|
|
{ "xlArr", "⟸" },
|
|
|
|
|
{ "xlarr", "⟵" },
|
|
|
|
|
{ "xmap", "⟼" },
|
|
|
|
|
{ "xrArr", "⟹" },
|
|
|
|
|
{ "xrarr", "⟶" },
|
|
|
|
|
{ "zigrarr", "⇝" },
|
|
|
|
|
{ "ac", "∾" },
|
|
|
|
|
{ "acE", "∾̳" },
|
|
|
|
|
{ "amalg", "⨿" },
|
|
|
|
|
{ "barvee", "⊽" },
|
|
|
|
|
{ "Barwed", "⌆" },
|
|
|
|
|
{ "barwed", "⌅" },
|
|
|
|
|
{ "bsolb", "⧅" },
|
|
|
|
|
{ "Cap", "⋒" },
|
|
|
|
|
{ "capand", "⩄" },
|
|
|
|
|
{ "capbrcup", "⩉" },
|
|
|
|
|
{ "capcap", "⩋" },
|
|
|
|
|
{ "capcup", "⩇" },
|
|
|
|
|
{ "capdot", "⩀" },
|
|
|
|
|
{ "caps", "∩︀" },
|
|
|
|
|
{ "ccaps", "⩍" },
|
|
|
|
|
{ "ccups", "⩌" },
|
|
|
|
|
{ "ccupssm", "⩐" },
|
|
|
|
|
{ "coprod", "∐" },
|
|
|
|
|
{ "Cup", "⋓" },
|
|
|
|
|
{ "cupbrcap", "⩈" },
|
|
|
|
|
{ "cupcap", "⩆" },
|
|
|
|
|
{ "cupcup", "⩊" },
|
|
|
|
|
{ "cupdot", "⊍" },
|
|
|
|
|
{ "cupor", "⩅" },
|
|
|
|
|
{ "cups", "∪︀" },
|
|
|
|
|
{ "cuvee", "⋎" },
|
|
|
|
|
{ "cuwed", "⋏" },
|
|
|
|
|
{ "Dagger", "‡" },
|
|
|
|
|
{ "dagger", "†" },
|
|
|
|
|
{ "diam", "⋄" },
|
|
|
|
|
{ "divonx", "⋇" },
|
|
|
|
|
{ "eplus", "⩱" },
|
|
|
|
|
{ "hercon", "⊹" },
|
|
|
|
|
{ "intcal", "⊺" },
|
|
|
|
|
{ "iprod", "⨼" },
|
|
|
|
|
{ "loplus", "⨭" },
|
|
|
|
|
{ "lotimes", "⨴" },
|
|
|
|
|
{ "lthree", "⋋" },
|
|
|
|
|
{ "ltimes", "⋉" },
|
|
|
|
|
{ "midast", "*" },
|
|
|
|
|
{ "minusb", "⊟" },
|
|
|
|
|
{ "minusd", "∸" },
|
|
|
|
|
{ "minusdu", "⨪" },
|
|
|
|
|
{ "ncap", "⩃" },
|
|
|
|
|
{ "ncup", "⩂" },
|
|
|
|
|
{ "oast", "⊛" },
|
|
|
|
|
{ "ocir", "⊚" },
|
|
|
|
|
{ "odash", "⊝" },
|
|
|
|
|
{ "odiv", "⨸" },
|
|
|
|
|
{ "odot", "⊙" },
|
|
|
|
|
{ "odsold", "⦼" },
|
|
|
|
|
{ "ofcir", "⦿" },
|
|
|
|
|
{ "ogt", "⧁" },
|
|
|
|
|
{ "ohbar", "⦵" },
|
|
|
|
|
{ "olcir", "⦾" },
|
|
|
|
|
{ "olt", "⧀" },
|
|
|
|
|
{ "omid", "⦶" },
|
|
|
|
|
{ "ominus", "⊖" },
|
|
|
|
|
{ "opar", "⦷" },
|
|
|
|
|
{ "operp", "⦹" },
|
|
|
|
|
{ "oplus", "⊕" },
|
|
|
|
|
{ "osol", "⊘" },
|
|
|
|
|
{ "Otimes", "⨷" },
|
|
|
|
|
{ "otimes", "⊗" },
|
|
|
|
|
{ "otimesas", "⨶" },
|
|
|
|
|
{ "ovbar", "⌽" },
|
|
|
|
|
{ "plusacir", "⨣" },
|
|
|
|
|
{ "plusb", "⊞" },
|
|
|
|
|
{ "pluscir", "⨢" },
|
|
|
|
|
{ "plusdo", "∔" },
|
|
|
|
|
{ "plusdu", "⨥" },
|
|
|
|
|
{ "pluse", "⩲" },
|
|
|
|
|
{ "plussim", "⨦" },
|
|
|
|
|
{ "plustwo", "⨧" },
|
|
|
|
|
{ "prod", "∏" },
|
|
|
|
|
{ "race", "⧚" },
|
|
|
|
|
{ "roplus", "⨮" },
|
|
|
|
|
{ "rotimes", "⨵" },
|
|
|
|
|
{ "rthree", "⋌" },
|
|
|
|
|
{ "rtimes", "⋊" },
|
|
|
|
|
{ "sdot", "⋅" },
|
|
|
|
|
{ "sdotb", "⊡" },
|
|
|
|
|
{ "setmn", "∖" },
|
|
|
|
|
{ "simplus", "⨤" },
|
|
|
|
|
{ "smashp", "⨳" },
|
|
|
|
|
{ "solb", "⧄" },
|
|
|
|
|
{ "sqcap", "⊓" },
|
|
|
|
|
{ "sqcaps", "⊓︀" },
|
|
|
|
|
{ "sqcup", "⊔" },
|
|
|
|
|
{ "sqcups", "⊔︀" },
|
|
|
|
|
{ "ssetmn", "∖" },
|
|
|
|
|
{ "sstarf", "⋆" },
|
|
|
|
|
{ "subdot", "⪽" },
|
|
|
|
|
{ "sum", "∑" },
|
|
|
|
|
{ "supdot", "⪾" },
|
|
|
|
|
{ "timesb", "⊠" },
|
|
|
|
|
{ "timesbar", "⨱" },
|
|
|
|
|
{ "timesd", "⨰" },
|
|
|
|
|
{ "tridot", "◬" },
|
|
|
|
|
{ "triminus", "⨺" },
|
|
|
|
|
{ "triplus", "⨹" },
|
|
|
|
|
{ "trisb", "⧍" },
|
|
|
|
|
{ "tritime", "⨻" },
|
|
|
|
|
{ "uplus", "⊎" },
|
|
|
|
|
{ "veebar", "⊻" },
|
|
|
|
|
{ "wedbar", "⩟" },
|
|
|
|
|
{ "wreath", "≀" },
|
|
|
|
|
{ "xcap", "⋂" },
|
|
|
|
|
{ "xcirc", "◯" },
|
|
|
|
|
{ "xcup", "⋃" },
|
|
|
|
|
{ "xdtri", "▽" },
|
|
|
|
|
{ "xodot", "⨀" },
|
|
|
|
|
{ "xoplus", "⨁" },
|
|
|
|
|
{ "xotime", "⨂" },
|
|
|
|
|
{ "xsqcup", "⨆" },
|
|
|
|
|
{ "xuplus", "⨄" },
|
|
|
|
|
{ "xutri", "△" },
|
|
|
|
|
{ "xvee", "⋁" },
|
|
|
|
|
{ "xwedge", "⋀" },
|
|
|
|
|
{ "dlcorn", "⌞" },
|
|
|
|
|
{ "drcorn", "⌟" },
|
|
|
|
|
{ "gtlPar", "⦕" },
|
|
|
|
|
{ "langd", "⦑" },
|
|
|
|
|
{ "lbrke", "⦋" },
|
|
|
|
|
{ "lbrksld", "⦏" },
|
|
|
|
|
{ "lbrkslu", "⦍" },
|
|
|
|
|
{ "lceil", "⌈" },
|
|
|
|
|
{ "lfloor", "⌊" },
|
|
|
|
|
{ "lmoust", "⎰" },
|
|
|
|
|
{ "lparlt", "⦓" },
|
|
|
|
|
{ "ltrPar", "⦖" },
|
|
|
|
|
{ "rangd", "⦒" },
|
|
|
|
|
{ "rbrke", "⦌" },
|
|
|
|
|
{ "rbrksld", "⦎" },
|
|
|
|
|
{ "rbrkslu", "⦐" },
|
|
|
|
|
{ "rceil", "⌉" },
|
|
|
|
|
{ "rfloor", "⌋" },
|
|
|
|
|
{ "rmoust", "⎱" },
|
|
|
|
|
{ "rpargt", "⦔" },
|
|
|
|
|
{ "ulcorn", "⌜" },
|
|
|
|
|
{ "urcorn", "⌝" },
|
|
|
|
|
{ "gnap", "⪊" },
|
|
|
|
|
{ "gnE", "≩" },
|
|
|
|
|
{ "gne", "⪈" },
|
|
|
|
|
{ "gnsim", "⋧" },
|
|
|
|
|
{ "gvnE", "≩︀" },
|
|
|
|
|
{ "lnap", "⪉" },
|
|
|
|
|
{ "lnE", "≨" },
|
|
|
|
|
{ "lne", "⪇" },
|
|
|
|
|
{ "lnsim", "⋦" },
|
|
|
|
|
{ "lvnE", "≨︀" },
|
|
|
|
|
{ "nap", "≉" },
|
|
|
|
|
{ "napE", "⩰̸" },
|
|
|
|
|
{ "napid", "≋̸" },
|
|
|
|
|
{ "ncong", "≇" },
|
|
|
|
|
{ "ncongdot", "⩭̸" },
|
|
|
|
|
{ "nequiv", "≢" },
|
|
|
|
|
{ "ngE", "≧̸" },
|
|
|
|
|
{ "nge", "≱" },
|
|
|
|
|
{ "nges", "⩾̸" },
|
|
|
|
|
{ "nGg", "⋙̸" },
|
|
|
|
|
{ "ngsim", "≵" },
|
|
|
|
|
{ "nGt", "≫⃒" },
|
|
|
|
|
{ "ngt", "≯" },
|
|
|
|
|
{ "nGtv", "≫̸" },
|
|
|
|
|
{ "nlE", "≦̸" },
|
|
|
|
|
{ "nle", "≰" },
|
|
|
|
|
{ "nles", "⩽̸" },
|
|
|
|
|
{ "nLl", "⋘̸" },
|
|
|
|
|
{ "nlsim", "≴" },
|
|
|
|
|
{ "nLt", "≪⃒" },
|
|
|
|
|
{ "nlt", "≮" },
|
|
|
|
|
{ "nltri", "⋪" },
|
|
|
|
|
{ "nltrie", "⋬" },
|
|
|
|
|
{ "nLtv", "≪̸" },
|
|
|
|
|
{ "nmid", "∤" },
|
|
|
|
|
{ "npar", "∦" },
|
|
|
|
|
{ "npr", "⊀" },
|
|
|
|
|
{ "nprcue", "⋠" },
|
|
|
|
|
{ "npre", "⪯̸" },
|
|
|
|
|
{ "nrtri", "⋫" },
|
|
|
|
|
{ "nrtrie", "⋭" },
|
|
|
|
|
{ "nsc", "⊁" },
|
|
|
|
|
{ "nsccue", "⋡" },
|
|
|
|
|
{ "nsce", "⪰̸" },
|
|
|
|
|
{ "nsim", "≁" },
|
|
|
|
|
{ "nsime", "≄" },
|
|
|
|
|
{ "nsmid", "∤" },
|
|
|
|
|
{ "nspar", "∦" },
|
|
|
|
|
{ "nsqsube", "⋢" },
|
|
|
|
|
{ "nsqsupe", "⋣" },
|
|
|
|
|
{ "nsub", "⊄" },
|
|
|
|
|
{ "nsubE", "⫅̸" },
|
|
|
|
|
{ "nsube", "⊈" },
|
|
|
|
|
{ "nsup", "⊅" },
|
|
|
|
|
{ "nsupE", "⫆̸" },
|
|
|
|
|
{ "nsupe", "⊉" },
|
|
|
|
|
{ "ntgl", "≹" },
|
|
|
|
|
{ "ntlg", "≸" },
|
|
|
|
|
{ "nvap", "≍⃒" },
|
|
|
|
|
{ "nVDash", "⊯" },
|
|
|
|
|
{ "nVdash", "⊮" },
|
|
|
|
|
{ "nvDash", "⊭" },
|
|
|
|
|
{ "nvdash", "⊬" },
|
|
|
|
|
{ "nvge", "≥⃒" },
|
|
|
|
|
{ "nvgt", ">⃒" },
|
|
|
|
|
{ "nvle", "≤⃒" },
|
|
|
|
|
{ "nvlt", "<⃒" },
|
|
|
|
|
{ "nvltrie", "⊴⃒" },
|
|
|
|
|
{ "nvrtrie", "⊵⃒" },
|
|
|
|
|
{ "nvsim", "∼⃒" },
|
|
|
|
|
{ "parsim", "⫳" },
|
|
|
|
|
{ "prnap", "⪹" },
|
|
|
|
|
{ "prnE", "⪵" },
|
|
|
|
|
{ "prnsim", "⋨" },
|
|
|
|
|
{ "rnmid", "⫮" },
|
|
|
|
|
{ "scnap", "⪺" },
|
|
|
|
|
{ "scnE", "⪶" },
|
|
|
|
|
{ "scnsim", "⋩" },
|
|
|
|
|
{ "simne", "≆" },
|
|
|
|
|
{ "solbar", "⌿" },
|
|
|
|
|
{ "subnE", "⫋" },
|
|
|
|
|
{ "subne", "⊊" },
|
|
|
|
|
{ "supnE", "⫌" },
|
|
|
|
|
{ "supne", "⊋" },
|
|
|
|
|
{ "vnsub", "⊂⃒" },
|
|
|
|
|
{ "vnsup", "⊃⃒" },
|
|
|
|
|
{ "vsubnE", "⫋︀" },
|
|
|
|
|
{ "vsubne", "⊊︀" },
|
|
|
|
|
{ "vsupnE", "⫌︀" },
|
|
|
|
|
{ "vsupne", "⊋︀" },
|
|
|
|
|
{ "ang", "∠" },
|
|
|
|
|
{ "ange", "⦤" },
|
|
|
|
|
{ "angmsd", "∡" },
|
|
|
|
|
{ "angmsdaa", "⦨" },
|
|
|
|
|
{ "angmsdab", "⦩" },
|
|
|
|
|
{ "angmsdac", "⦪" },
|
|
|
|
|
{ "angmsdad", "⦫" },
|
|
|
|
|
{ "angmsdae", "⦬" },
|
|
|
|
|
{ "angmsdaf", "⦭" },
|
|
|
|
|
{ "angmsdag", "⦮" },
|
|
|
|
|
{ "angmsdah", "⦯" },
|
|
|
|
|
{ "angrtvb", "⊾" },
|
|
|
|
|
{ "angrtvbd", "⦝" },
|
|
|
|
|
{ "bbrk", "⎵" },
|
|
|
|
|
{ "bemptyv", "⦰" },
|
|
|
|
|
{ "beth", "ℶ" },
|
|
|
|
|
{ "boxbox", "⧉" },
|
|
|
|
|
{ "bprime", "‵" },
|
|
|
|
|
{ "bsemi", "⁏" },
|
|
|
|
|
{ "cemptyv", "⦲" },
|
|
|
|
|
{ "cirE", "⧃" },
|
|
|
|
|
{ "cirscir", "⧂" },
|
|
|
|
|
{ "comp", "∁" },
|
|
|
|
|
{ "daleth", "ℸ" },
|
|
|
|
|
{ "demptyv", "⦱" },
|
|
|
|
|
{ "ell", "ℓ" },
|
|
|
|
|
{ "empty", "∅" },
|
|
|
|
|
{ "emptyv", "∅" },
|
|
|
|
|
{ "gimel", "ℷ" },
|
|
|
|
|
{ "iiota", "℩" },
|
|
|
|
|
{ "image", "ℑ" },
|
|
|
|
|
{ "imath", "ı" },
|
|
|
|
|
{ "jmath", "j" },
|
|
|
|
|
{ "laemptyv", "⦴" },
|
|
|
|
|
{ "lltri", "◺" },
|
|
|
|
|
{ "lrtri", "⊿" },
|
|
|
|
|
{ "mho", "℧" },
|
|
|
|
|
{ "nang", "∠⃒" },
|
|
|
|
|
{ "nexist", "∄" },
|
|
|
|
|
{ "oS", "Ⓢ" },
|
|
|
|
|
{ "planck", "ℏ" },
|
|
|
|
|
{ "plankv", "ℏ" },
|
|
|
|
|
{ "raemptyv", "⦳" },
|
|
|
|
|
{ "range", "⦥" },
|
|
|
|
|
{ "real", "ℜ" },
|
|
|
|
|
{ "tbrk", "⎴" },
|
|
|
|
|
{ "ultri", "◸" },
|
|
|
|
|
{ "urtri", "◹" },
|
|
|
|
|
{ "vzigzag", "⦚" },
|
|
|
|
|
{ "weierp", "℘" },
|
|
|
|
|
{ "apE", "⩰" },
|
|
|
|
|
{ "ape", "≊" },
|
|
|
|
|
{ "apid", "≋" },
|
|
|
|
|
{ "asymp", "≈" },
|
|
|
|
|
{ "Barv", "⫧" },
|
|
|
|
|
{ "bcong", "≌" },
|
|
|
|
|
{ "bepsi", "϶" },
|
|
|
|
|
{ "bowtie", "⋈" },
|
|
|
|
|
{ "bsim", "∽" },
|
|
|
|
|
{ "bsime", "⋍" },
|
|
|
|
|
{ "bsolhsub", "\⊂" },
|
|
|
|
|
{ "bump", "≎" },
|
|
|
|
|
{ "bumpE", "⪮" },
|
|
|
|
|
{ "bumpe", "≏" },
|
|
|
|
|
{ "cire", "≗" },
|
|
|
|
|
{ "Colon", "∷" },
|
|
|
|
|
{ "Colone", "⩴" },
|
|
|
|
|
{ "colone", "≔" },
|
|
|
|
|
{ "congdot", "⩭" },
|
|
|
|
|
{ "csub", "⫏" },
|
|
|
|
|
{ "csube", "⫑" },
|
|
|
|
|
{ "csup", "⫐" },
|
|
|
|
|
{ "csupe", "⫒" },
|
|
|
|
|
{ "cuepr", "⋞" },
|
|
|
|
|
{ "cuesc", "⋟" },
|
|
|
|
|
{ "Dashv", "⫤" },
|
|
|
|
|
{ "dashv", "⊣" },
|
|
|
|
|
{ "easter", "⩮" },
|
|
|
|
|
{ "ecir", "≖" },
|
|
|
|
|
{ "ecolon", "≕" },
|
|
|
|
|
{ "eDDot", "⩷" },
|
|
|
|
|
{ "eDot", "≑" },
|
|
|
|
|
{ "efDot", "≒" },
|
|
|
|
|
{ "eg", "⪚" },
|
|
|
|
|
{ "egs", "⪖" },
|
|
|
|
|
{ "egsdot", "⪘" },
|
|
|
|
|
{ "el", "⪙" },
|
|
|
|
|
{ "els", "⪕" },
|
|
|
|
|
{ "elsdot", "⪗" },
|
|
|
|
|
{ "equest", "≟" },
|
|
|
|
|
{ "equivDD", "⩸" },
|
|
|
|
|
{ "erDot", "≓" },
|
|
|
|
|
{ "esdot", "≐" },
|
|
|
|
|
{ "Esim", "⩳" },
|
|
|
|
|
{ "esim", "≂" },
|
|
|
|
|
{ "fork", "⋔" },
|
|
|
|
|
{ "forkv", "⫙" },
|
|
|
|
|
{ "frown", "⌢" },
|
|
|
|
|
{ "gap", "⪆" },
|
|
|
|
|
{ "gE", "≧" },
|
|
|
|
|
{ "gEl", "⪌" },
|
|
|
|
|
{ "gel", "⋛" },
|
|
|
|
|
{ "ges", "⩾" },
|
|
|
|
|
{ "gescc", "⪩" },
|
|
|
|
|
{ "gesdot", "⪀" },
|
|
|
|
|
{ "gesdoto", "⪂" },
|
|
|
|
|
{ "gesdotol", "⪄" },
|
|
|
|
|
{ "gesl", "⋛︀" },
|
|
|
|
|
{ "gesles", "⪔" },
|
|
|
|
|
{ "Gg", "⋙" },
|
|
|
|
|
{ "gl", "≷" },
|
|
|
|
|
{ "gla", "⪥" },
|
|
|
|
|
{ "glE", "⪒" },
|
|
|
|
|
{ "glj", "⪤" },
|
|
|
|
|
{ "gsim", "≳" },
|
|
|
|
|
{ "gsime", "⪎" },
|
|
|
|
|
{ "gsiml", "⪐" },
|
|
|
|
|
{ "Gt", "≫" },
|
|
|
|
|
{ "gtcc", "⪧" },
|
|
|
|
|
{ "gtcir", "⩺" },
|
|
|
|
|
{ "gtdot", "⋗" },
|
|
|
|
|
{ "gtquest", "⩼" },
|
|
|
|
|
{ "gtrarr", "⥸" },
|
|
|
|
|
{ "homtht", "∻" },
|
|
|
|
|
{ "lap", "⪅" },
|
|
|
|
|
{ "lat", "⪫" },
|
|
|
|
|
{ "late", "⪭" },
|
|
|
|
|
{ "lates", "⪭︀" },
|
|
|
|
|
{ "lE", "≦" },
|
|
|
|
|
{ "lEg", "⪋" },
|
|
|
|
|
{ "leg", "⋚" },
|
|
|
|
|
{ "les", "⩽" },
|
|
|
|
|
{ "lescc", "⪨" },
|
|
|
|
|
{ "lesdot", "⩿" },
|
|
|
|
|
{ "lesdoto", "⪁" },
|
|
|
|
|
{ "lesdotor", "⪃" },
|
|
|
|
|
{ "lesg", "⋚︀" },
|
|
|
|
|
{ "lesges", "⪓" },
|
|
|
|
|
{ "lg", "≶" },
|
|
|
|
|
{ "lgE", "⪑" },
|
|
|
|
|
{ "Ll", "⋘" },
|
|
|
|
|
{ "lsim", "≲" },
|
|
|
|
|
{ "lsime", "⪍" },
|
|
|
|
|
{ "lsimg", "⪏" },
|
|
|
|
|
{ "Lt", "≪" },
|
|
|
|
|
{ "ltcc", "⪦" },
|
|
|
|
|
{ "ltcir", "⩹" },
|
|
|
|
|
{ "ltdot", "⋖" },
|
|
|
|
|
{ "ltlarr", "⥶" },
|
|
|
|
|
{ "ltquest", "⩻" },
|
|
|
|
|
{ "ltrie", "⊴" },
|
|
|
|
|
{ "mcomma", "⨩" },
|
|
|
|
|
{ "mDDot", "∺" },
|
|
|
|
|
{ "mid", "∣" },
|
|
|
|
|
{ "mlcp", "⫛" },
|
|
|
|
|
{ "models", "⊧" },
|
|
|
|
|
{ "mstpos", "∾" },
|
|
|
|
|
{ "Pr", "⪻" },
|
|
|
|
|
{ "pr", "≺" },
|
|
|
|
|
{ "prap", "⪷" },
|
|
|
|
|
{ "prcue", "≼" },
|
|
|
|
|
{ "prE", "⪳" },
|
|
|
|
|
{ "pre", "⪯" },
|
|
|
|
|
{ "prsim", "≾" },
|
|
|
|
|
{ "prurel", "⊰" },
|
|
|
|
|
{ "ratio", "∶" },
|
|
|
|
|
{ "rtrie", "⊵" },
|
|
|
|
|
{ "rtriltri", "⧎" },
|
|
|
|
|
{ "Sc", "⪼" },
|
|
|
|
|
{ "sc", "≻" },
|
|
|
|
|
{ "scap", "⪸" },
|
|
|
|
|
{ "sccue", "≽" },
|
|
|
|
|
{ "scE", "⪴" },
|
|
|
|
|
{ "sce", "⪰" },
|
|
|
|
|
{ "scsim", "≿" },
|
|
|
|
|
{ "sdote", "⩦" },
|
|
|
|
|
{ "simg", "⪞" },
|
|
|
|
|
{ "simgE", "⪠" },
|
|
|
|
|
{ "siml", "⪝" },
|
|
|
|
|
{ "simlE", "⪟" },
|
|
|
|
|
{ "smid", "∣" },
|
|
|
|
|
{ "smile", "⌣" },
|
|
|
|
|
{ "smt", "⪪" },
|
|
|
|
|
{ "smte", "⪬" },
|
|
|
|
|
{ "smtes", "⪬︀" },
|
|
|
|
|
{ "spar", "∥" },
|
|
|
|
|
{ "sqsub", "⊏" },
|
|
|
|
|
{ "sqsube", "⊑" },
|
|
|
|
|
{ "sqsup", "⊐" },
|
|
|
|
|
{ "sqsupe", "⊒" },
|
|
|
|
|
{ "Sub", "⋐" },
|
|
|
|
|
{ "subE", "⫅" },
|
|
|
|
|
{ "subedot", "⫃" },
|
|
|
|
|
{ "submult", "⫁" },
|
|
|
|
|
{ "subplus", "⪿" },
|
|
|
|
|
{ "subrarr", "⥹" },
|
|
|
|
|
{ "subsim", "⫇" },
|
|
|
|
|
{ "subsub", "⫕" },
|
|
|
|
|
{ "subsup", "⫓" },
|
|
|
|
|
{ "Sup", "⋑" },
|
|
|
|
|
{ "supdsub", "⫘" },
|
|
|
|
|
{ "supE", "⫆" },
|
|
|
|
|
{ "supedot", "⫄" },
|
|
|
|
|
{ "suphsol", "⊅" },
|
|
|
|
|
{ "suphsub", "⫗" },
|
|
|
|
|
{ "suplarr", "⥻" },
|
|
|
|
|
{ "supmult", "⫂" },
|
|
|
|
|
{ "supplus", "⫀" },
|
|
|
|
|
{ "supsim", "⫈" },
|
|
|
|
|
{ "supsub", "⫔" },
|
|
|
|
|
{ "supsup", "⫖" },
|
|
|
|
|
{ "thkap", "≈" },
|
|
|
|
|
{ "topfork", "⫚" },
|
|
|
|
|
{ "trie", "≜" },
|
|
|
|
|
{ "twixt", "≬" },
|
|
|
|
|
{ "Vbar", "⫫" },
|
|
|
|
|
{ "vBar", "⫨" },
|
|
|
|
|
{ "vBarv", "⫩" },
|
|
|
|
|
{ "VDash", "⊫" },
|
|
|
|
|
{ "Vdash", "⊩" },
|
|
|
|
|
{ "vDash", "⊨" },
|
|
|
|
|
{ "vdash", "⊢" },
|
|
|
|
|
{ "Vdashl", "⫦" },
|
|
|
|
|
{ "vltri", "⊲" },
|
|
|
|
|
{ "vprop", "∝" },
|
|
|
|
|
{ "vrtri", "⊳" },
|
|
|
|
|
{ "Vvdash", "⊪" },
|
|
|
|
|
{ "alpha", "α" },
|
|
|
|
|
{ "beta", "β" },
|
|
|
|
|
{ "chi", "χ" },
|
|
|
|
|
{ "Delta", "Δ" },
|
|
|
|
|
{ "delta", "δ" },
|
|
|
|
|
{ "epsi", "ε" },
|
|
|
|
|
{ "epsiv", "ɛ" },
|
|
|
|
|
{ "eta", "η" },
|
|
|
|
|
{ "Gamma", "Γ" },
|
|
|
|
|
{ "gamma", "γ" },
|
|
|
|
|
{ "Gammad", "Ϝ" },
|
|
|
|
|
{ "gammad", "ϝ" },
|
|
|
|
|
{ "iota", "ι" },
|
|
|
|
|
{ "kappa", "κ" },
|
|
|
|
|
{ "kappav", "ϰ" },
|
|
|
|
|
{ "Lambda", "Λ" },
|
|
|
|
|
{ "lambda", "λ" },
|
|
|
|
|
{ "mu", "μ" },
|
|
|
|
|
{ "nu", "ν" },
|
|
|
|
|
{ "Omega", "Ω" },
|
|
|
|
|
{ "omega", "ω" },
|
|
|
|
|
{ "Phi", "Φ" },
|
|
|
|
|
{ "phi", "ϕ" },
|
|
|
|
|
{ "phiv", "φ" },
|
|
|
|
|
{ "Pi", "Π" },
|
|
|
|
|
{ "pi", "π" },
|
|
|
|
|
{ "piv", "ϖ" },
|
|
|
|
|
{ "Psi", "Ψ" },
|
|
|
|
|
{ "psi", "ψ" },
|
|
|
|
|
{ "rho", "ρ" },
|
|
|
|
|
{ "rhov", "ϱ" },
|
|
|
|
|
{ "Sigma", "Σ" },
|
|
|
|
|
{ "sigma", "σ" },
|
|
|
|
|
{ "sigmav", "ς" },
|
|
|
|
|
{ "tau", "τ" },
|
|
|
|
|
{ "Theta", "Θ" },
|
|
|
|
|
{ "theta", "θ" },
|
|
|
|
|
{ "thetav", "ϑ" },
|
|
|
|
|
{ "Upsi", "ϒ" },
|
|
|
|
|
{ "upsi", "υ" },
|
|
|
|
|
{ "Xi", "Ξ" },
|
|
|
|
|
{ "xi", "ξ" },
|
|
|
|
|
{ "zeta", "ζ" },
|
|
|
|
|
{ "Cfr", "ℭ" },
|
|
|
|
|
{ "Hfr", "ℌ" },
|
|
|
|
|
{ "Ifr", "ℑ" },
|
|
|
|
|
{ "Rfr", "ℜ" },
|
|
|
|
|
{ "Zfr", "ℨ" },
|
|
|
|
|
{ "Copf", "ℂ" },
|
|
|
|
|
{ "Hopf", "ℍ" },
|
|
|
|
|
{ "Nopf", "ℕ" },
|
|
|
|
|
{ "Popf", "ℙ" },
|
|
|
|
|
{ "Qopf", "ℚ" },
|
|
|
|
|
{ "Ropf", "ℝ" },
|
|
|
|
|
{ "Zopf", "ℤ" },
|
|
|
|
|
{ "Bscr", "ℬ" },
|
|
|
|
|
{ "Escr", "ℰ" },
|
|
|
|
|
{ "escr", "ℯ" },
|
|
|
|
|
{ "Fscr", "ℱ" },
|
|
|
|
|
{ "gscr", "ℊ" },
|
|
|
|
|
{ "Hscr", "ℋ" },
|
|
|
|
|
{ "Iscr", "ℐ" },
|
|
|
|
|
{ "Lscr", "ℒ" },
|
|
|
|
|
{ "Mscr", "ℳ" },
|
|
|
|
|
{ "oscr", "ℴ" },
|
|
|
|
|
{ "pscr", "𝓅" },
|
|
|
|
|
{ "Rscr", "ℛ" },
|
|
|
|
|
{ "acd", "∿" },
|
|
|
|
|
{ "aleph", "ℵ" },
|
|
|
|
|
{ "And", "⩓" },
|
|
|
|
|
{ "and", "∧" },
|
|
|
|
|
{ "andand", "⩕" },
|
|
|
|
|
{ "andd", "⩜" },
|
|
|
|
|
{ "andslope", "⩘" },
|
|
|
|
|
{ "andv", "⩚" },
|
|
|
|
|
{ "angrt", "∟" },
|
|
|
|
|
{ "angsph", "∢" },
|
|
|
|
|
{ "angst", "Å" },
|
|
|
|
|
{ "ap", "≈" },
|
|
|
|
|
{ "apacir", "⩯" },
|
|
|
|
|
{ "awconint", "∳" },
|
|
|
|
|
{ "awint", "⨑" },
|
|
|
|
|
{ "becaus", "∵" },
|
|
|
|
|
{ "bernou", "ℬ" },
|
|
|
|
|
{ "bne", "=⃥" },
|
|
|
|
|
{ "bnequiv", "≡⃥" },
|
|
|
|
|
{ "bNot", "⫭" },
|
|
|
|
|
{ "bnot", "⌐" },
|
|
|
|
|
{ "bottom", "⊥" },
|
|
|
|
|
{ "cap", "∩" },
|
|
|
|
|
{ "Cconint", "∰" },
|
|
|
|
|
{ "cirfnint", "⨐" },
|
|
|
|
|
{ "compfn", "∘" },
|
|
|
|
|
{ "cong", "≅" },
|
|
|
|
|
{ "Conint", "∯" },
|
|
|
|
|
{ "conint", "∮" },
|
|
|
|
|
{ "ctdot", "⋯" },
|
|
|
|
|
{ "cup", "∪" },
|
|
|
|
|
{ "cwconint", "∲" },
|
|
|
|
|
{ "cwint", "∱" },
|
|
|
|
|
{ "cylcty", "⌭" },
|
|
|
|
|
{ "disin", "⋲" },
|
|
|
|
|
{ "Dot", "¨" },
|
|
|
|
|
{ "DotDot", "⃜" },
|
|
|
|
|
{ "dsol", "⧶" },
|
|
|
|
|
{ "dtdot", "⋱" },
|
|
|
|
|
{ "dwangle", "⦦" },
|
|
|
|
|
{ "epar", "⋕" },
|
|
|
|
|
{ "eparsl", "⧣" },
|
|
|
|
|
{ "equiv", "≡" },
|
|
|
|
|
{ "eqvparsl", "⧥" },
|
|
|
|
|
{ "exist", "∃" },
|
|
|
|
|
{ "fnof", "ƒ" },
|
|
|
|
|
{ "forall", "∀" },
|
|
|
|
|
{ "fpartint", "⨍" },
|
|
|
|
|
{ "ge", "≥" },
|
|
|
|
|
{ "hamilt", "ℋ" },
|
|
|
|
|
{ "iff", "⇔" },
|
|
|
|
|
{ "iinfin", "⧜" },
|
|
|
|
|
{ "infin", "∞" },
|
|
|
|
|
{ "Int", "∬" },
|
|
|
|
|
{ "int", "∫" },
|
|
|
|
|
{ "intlarhk", "⨗" },
|
|
|
|
|
{ "isin", "∈" },
|
|
|
|
|
{ "isindot", "⋵" },
|
|
|
|
|
{ "isinE", "⋹" },
|
|
|
|
|
{ "isins", "⋴" },
|
|
|
|
|
{ "isinsv", "⋳" },
|
|
|
|
|
{ "isinv", "∈" },
|
|
|
|
|
{ "lagran", "ℒ" },
|
|
|
|
|
{ "Lang", "《" },
|
|
|
|
|
{ "lang", "〈" },
|
|
|
|
|
{ "lArr", "⇐" },
|
|
|
|
|
{ "lbbrk", "〔" },
|
|
|
|
|
{ "le", "≤" },
|
|
|
|
|
{ "loang", "〘" },
|
|
|
|
|
{ "lobrk", "〚" },
|
|
|
|
|
{ "lopar", "⦅" },
|
|
|
|
|
{ "lowast", "∗" },
|
|
|
|
|
{ "minus", "−" },
|
|
|
|
|
{ "mnplus", "∓" },
|
|
|
|
|
{ "nabla", "∇" },
|
|
|
|
|
{ "ne", "≠" },
|
|
|
|
|
{ "nedot", "≐̸" },
|
|
|
|
|
{ "nhpar", "⫲" },
|
|
|
|
|
{ "ni", "∋" },
|
|
|
|
|
{ "nis", "⋼" },
|
|
|
|
|
{ "nisd", "⋺" },
|
|
|
|
|
{ "niv", "∋" },
|
|
|
|
|
{ "Not", "⫬" },
|
|
|
|
|
{ "notin", "∉" },
|
|
|
|
|
{ "notindot", "⋵̸" },
|
|
|
|
|
{ "notinva", "∉" },
|
|
|
|
|
{ "notinvb", "⋷" },
|
|
|
|
|
{ "notinvc", "⋶" },
|
|
|
|
|
{ "notni", "∌" },
|
|
|
|
|
{ "notniva", "∌" },
|
|
|
|
|
{ "notnivb", "⋾" },
|
|
|
|
|
{ "notnivc", "⋽" },
|
|
|
|
|
{ "nparsl", "⫽⃥" },
|
|
|
|
|
{ "npart", "∂̸" },
|
|
|
|
|
{ "npolint", "⨔" },
|
|
|
|
|
{ "nvinfin", "⧞" },
|
|
|
|
|
{ "olcross", "⦻" },
|
|
|
|
|
{ "Or", "⩔" },
|
|
|
|
|
{ "or", "∨" },
|
|
|
|
|
{ "ord", "⩝" },
|
|
|
|
|
{ "order", "ℴ" },
|
|
|
|
|
{ "oror", "⩖" },
|
|
|
|
|
{ "orslope", "⩗" },
|
|
|
|
|
{ "orv", "⩛" },
|
|
|
|
|
{ "par", "∥" },
|
|
|
|
|
{ "parsl", "⫽" },
|
|
|
|
|
{ "part", "∂" },
|
|
|
|
|
{ "permil", "‰" },
|
|
|
|
|
{ "perp", "⊥" },
|
|
|
|
|
{ "pertenk", "‱" },
|
|
|
|
|
{ "phmmat", "ℳ" },
|
|
|
|
|
{ "pointint", "⨕" },
|
|
|
|
|
{ "Prime", "″" },
|
|
|
|
|
{ "prime", "′" },
|
|
|
|
|
{ "profalar", "⌮" },
|
|
|
|
|
{ "profline", "⌒" },
|
|
|
|
|
{ "profsurf", "⌓" },
|
|
|
|
|
{ "prop", "∝" },
|
|
|
|
|
{ "qint", "⨌" },
|
|
|
|
|
{ "qprime", "⁗" },
|
|
|
|
|
{ "quatint", "⨖" },
|
|
|
|
|
{ "radic", "√" },
|
|
|
|
|
{ "Rang", "》" },
|
|
|
|
|
{ "rang", "〉" },
|
|
|
|
|
{ "rArr", "⇒" },
|
|
|
|
|
{ "rbbrk", "〕" },
|
|
|
|
|
{ "roang", "〙" },
|
|
|
|
|
{ "robrk", "〛" },
|
|
|
|
|
{ "ropar", "⦆" },
|
|
|
|
|
{ "rppolint", "⨒" },
|
|
|
|
|
{ "scpolint", "⨓" },
|
|
|
|
|
{ "sim", "∼" },
|
|
|
|
|
{ "simdot", "⩪" },
|
|
|
|
|
{ "sime", "≃" },
|
|
|
|
|
{ "smeparsl", "⧤" },
|
|
|
|
|
{ "square", "□" },
|
|
|
|
|
{ "squarf", "▪" },
|
|
|
|
|
{ "sub", "⊂" },
|
|
|
|
|
{ "sube", "⊆" },
|
|
|
|
|
{ "sup", "⊃" },
|
|
|
|
|
{ "supe", "⊇" },
|
|
|
|
|
{ "tdot", "⃛" },
|
|
|
|
|
{ "there4", "∴" },
|
|
|
|
|
{ "tint", "∭" },
|
|
|
|
|
{ "top", "⊤" },
|
|
|
|
|
{ "topbot", "⌶" },
|
|
|
|
|
{ "topcir", "⫱" },
|
|
|
|
|
{ "tprime", "‴" },
|
|
|
|
|
{ "utdot", "⋰" },
|
|
|
|
|
{ "uwangle", "⦧" },
|
|
|
|
|
{ "vangrt", "⦜" },
|
|
|
|
|
{ "veeeq", "≚" },
|
|
|
|
|
{ "Verbar", "‖" },
|
|
|
|
|
{ "wedgeq", "≙" },
|
|
|
|
|
{ "xnis", "⋻" },
|
|
|
|
|
{ "boxDL", "╗" },
|
|
|
|
|
{ "boxDl", "╖" },
|
|
|
|
|
{ "boxdL", "╕" },
|
|
|
|
|
{ "boxdl", "┐" },
|
|
|
|
|
{ "boxDR", "╔" },
|
|
|
|
|
{ "boxDr", "╓" },
|
|
|
|
|
{ "boxdR", "╒" },
|
|
|
|
|
{ "boxdr", "┌" },
|
|
|
|
|
{ "boxH", "═" },
|
|
|
|
|
{ "boxh", "─" },
|
|
|
|
|
{ "boxHD", "╦" },
|
|
|
|
|
{ "boxHd", "╤" },
|
|
|
|
|
{ "boxhD", "╥" },
|
|
|
|
|
{ "boxhd", "┬" },
|
|
|
|
|
{ "boxHU", "╩" },
|
|
|
|
|
{ "boxHu", "╧" },
|
|
|
|
|
{ "boxhU", "╨" },
|
|
|
|
|
{ "boxhu", "┴" },
|
|
|
|
|
{ "boxUL", "╝" },
|
|
|
|
|
{ "boxUl", "╜" },
|
|
|
|
|
{ "boxuL", "╛" },
|
|
|
|
|
{ "boxul", "┘" },
|
|
|
|
|
{ "boxUR", "╚" },
|
|
|
|
|
{ "boxUr", "╙" },
|
|
|
|
|
{ "boxuR", "╘" },
|
|
|
|
|
{ "boxur", "└" },
|
|
|
|
|
{ "boxV", "║" },
|
|
|
|
|
{ "boxv", "│" },
|
|
|
|
|
{ "boxVH", "╬" },
|
|
|
|
|
{ "boxVh", "╫" },
|
|
|
|
|
{ "boxvH", "╪" },
|
|
|
|
|
{ "boxvh", "┼" },
|
|
|
|
|
{ "boxVL", "╣" },
|
|
|
|
|
{ "boxVl", "╢" },
|
|
|
|
|
{ "boxvL", "╡" },
|
|
|
|
|
{ "boxvl", "┤" },
|
|
|
|
|
{ "boxVR", "╠" },
|
|
|
|
|
{ "boxVr", "╟" },
|
|
|
|
|
{ "boxvR", "╞" },
|
|
|
|
|
{ "boxvr", "├" },
|
|
|
|
|
{ "Acy", "А" },
|
|
|
|
|
{ "acy", "а" },
|
|
|
|
|
{ "Bcy", "Б" },
|
|
|
|
|
{ "bcy", "б" },
|
|
|
|
|
{ "CHcy", "Ч" },
|
|
|
|
|
{ "chcy", "ч" },
|
|
|
|
|
{ "Dcy", "Д" },
|
|
|
|
|
{ "dcy", "д" },
|
|
|
|
|
{ "Ecy", "Э" },
|
|
|
|
|
{ "ecy", "э" },
|
|
|
|
|
{ "Fcy", "Ф" },
|
|
|
|
|
{ "fcy", "ф" },
|
|
|
|
|
{ "Gcy", "Г" },
|
|
|
|
|
{ "gcy", "г" },
|
|
|
|
|
{ "HARDcy", "Ъ" },
|
|
|
|
|
{ "hardcy", "ъ" },
|
|
|
|
|
{ "Icy", "И" },
|
|
|
|
|
{ "icy", "и" },
|
|
|
|
|
{ "IEcy", "Е" },
|
|
|
|
|
{ "iecy", "е" },
|
|
|
|
|
{ "IOcy", "Ё" },
|
|
|
|
|
{ "iocy", "ё" },
|
|
|
|
|
{ "Jcy", "Й" },
|
|
|
|
|
{ "jcy", "й" },
|
|
|
|
|
{ "Kcy", "К" },
|
|
|
|
|
{ "kcy", "к" },
|
|
|
|
|
{ "KHcy", "Х" },
|
|
|
|
|
{ "khcy", "х" },
|
|
|
|
|
{ "Lcy", "Л" },
|
|
|
|
|
{ "lcy", "л" },
|
|
|
|
|
{ "Mcy", "М" },
|
|
|
|
|
{ "mcy", "м" },
|
|
|
|
|
{ "Ncy", "Н" },
|
|
|
|
|
{ "ncy", "н" },
|
|
|
|
|
{ "numero", "№" },
|
|
|
|
|
{ "Ocy", "О" },
|
|
|
|
|
{ "ocy", "о" },
|
|
|
|
|
{ "Pcy", "П" },
|
|
|
|
|
{ "pcy", "п" },
|
|
|
|
|
{ "Rcy", "Р" },
|
|
|
|
|
{ "rcy", "р" },
|
|
|
|
|
{ "Scy", "С" },
|
|
|
|
|
{ "scy", "с" },
|
|
|
|
|
{ "SHCHcy", "Щ" },
|
|
|
|
|
{ "shchcy", "щ" },
|
|
|
|
|
{ "SHcy", "Ш" },
|
|
|
|
|
{ "shcy", "ш" },
|
|
|
|
|
{ "SOFTcy", "Ь" },
|
|
|
|
|
{ "softcy", "ь" },
|
|
|
|
|
{ "Tcy", "Т" },
|
|
|
|
|
{ "tcy", "т" },
|
|
|
|
|
{ "TScy", "Ц" },
|
|
|
|
|
{ "tscy", "ц" },
|
|
|
|
|
{ "Ucy", "У" },
|
|
|
|
|
{ "ucy", "у" },
|
|
|
|
|
{ "Vcy", "В" },
|
|
|
|
|
{ "vcy", "в" },
|
|
|
|
|
{ "YAcy", "Я" },
|
|
|
|
|
{ "yacy", "я" },
|
|
|
|
|
{ "Ycy", "Ы" },
|
|
|
|
|
{ "ycy", "ы" },
|
|
|
|
|
{ "YUcy", "Ю" },
|
|
|
|
|
{ "yucy", "ю" },
|
|
|
|
|
{ "Zcy", "З" },
|
|
|
|
|
{ "zcy", "з" },
|
|
|
|
|
{ "ZHcy", "Ж" },
|
|
|
|
|
{ "zhcy", "ж" },
|
|
|
|
|
{ "DJcy", "Ђ" },
|
|
|
|
|
{ "djcy", "ђ" },
|
|
|
|
|
{ "DScy", "Ѕ" },
|
|
|
|
|
{ "dscy", "ѕ" },
|
|
|
|
|
{ "DZcy", "Џ" },
|
|
|
|
|
{ "dzcy", "џ" },
|
|
|
|
|
{ "GJcy", "Ѓ" },
|
|
|
|
|
{ "gjcy", "ѓ" },
|
|
|
|
|
{ "Iukcy", "І" },
|
|
|
|
|
{ "iukcy", "і" },
|
|
|
|
|
{ "Jsercy", "Ј" },
|
|
|
|
|
{ "jsercy", "ј" },
|
|
|
|
|
{ "Jukcy", "Є" },
|
|
|
|
|
{ "jukcy", "є" },
|
|
|
|
|
{ "KJcy", "Ќ" },
|
|
|
|
|
{ "kjcy", "ќ" },
|
|
|
|
|
{ "LJcy", "Љ" },
|
|
|
|
|
{ "ljcy", "љ" },
|
|
|
|
|
{ "NJcy", "Њ" },
|
|
|
|
|
{ "njcy", "њ" },
|
|
|
|
|
{ "TSHcy", "Ћ" },
|
|
|
|
|
{ "tshcy", "ћ" },
|
|
|
|
|
{ "Ubrcy", "Ў" },
|
|
|
|
|
{ "ubrcy", "ў" },
|
|
|
|
|
{ "YIcy", "Ї" },
|
|
|
|
|
{ "yicy", "ї" },
|
|
|
|
|
{ "acute", "´" },
|
|
|
|
|
{ "breve", "˘" },
|
|
|
|
|
{ "caron", "ˇ" },
|
|
|
|
|
{ "cedil", "¸" },
|
|
|
|
|
{ "circ", "ˆ" },
|
|
|
|
|
{ "dblac", "˝" },
|
|
|
|
|
{ "die", "¨" },
|
|
|
|
|
{ "dot", "˙" },
|
|
|
|
|
{ "grave", "`" },
|
|
|
|
|
{ "macr", "¯" },
|
|
|
|
|
{ "ogon", "˛" },
|
|
|
|
|
{ "ring", "˚" },
|
|
|
|
|
{ "tilde", "˜" },
|
|
|
|
|
{ "uml", "¨" },
|
|
|
|
|
{ "Aacute", "Á" },
|
|
|
|
|
{ "aacute", "á" },
|
|
|
|
|
{ "Acirc", "Â" },
|
|
|
|
|
{ "acirc", "â" },
|
|
|
|
|
{ "AElig", "Æ" },
|
|
|
|
|
{ "aelig", "æ" },
|
|
|
|
|
{ "Agrave", "À" },
|
|
|
|
|
{ "agrave", "à" },
|
|
|
|
|
{ "Aring", "Å" },
|
|
|
|
|
{ "aring", "å" },
|
|
|
|
|
{ "Atilde", "Ã" },
|
|
|
|
|
{ "atilde", "ã" },
|
|
|
|
|
{ "Auml", "Ä" },
|
|
|
|
|
{ "auml", "ä" },
|
|
|
|
|
{ "Ccedil", "Ç" },
|
|
|
|
|
{ "ccedil", "ç" },
|
|
|
|
|
{ "Eacute", "É" },
|
|
|
|
|
{ "eacute", "é" },
|
|
|
|
|
{ "Ecirc", "Ê" },
|
|
|
|
|
{ "ecirc", "ê" },
|
|
|
|
|
{ "Egrave", "È" },
|
|
|
|
|
{ "egrave", "è" },
|
|
|
|
|
{ "ETH", "Ð" },
|
|
|
|
|
{ "eth", "ð" },
|
|
|
|
|
{ "Euml", "Ë" },
|
|
|
|
|
{ "euml", "ë" },
|
|
|
|
|
{ "Iacute", "Í" },
|
|
|
|
|
{ "iacute", "í" },
|
|
|
|
|
{ "Icirc", "Î" },
|
|
|
|
|
{ "icirc", "î" },
|
|
|
|
|
{ "Igrave", "Ì" },
|
|
|
|
|
{ "igrave", "ì" },
|
|
|
|
|
{ "Iuml", "Ï" },
|
|
|
|
|
{ "iuml", "ï" },
|
|
|
|
|
{ "Ntilde", "Ñ" },
|
|
|
|
|
{ "ntilde", "ñ" },
|
|
|
|
|
{ "Oacute", "Ó" },
|
|
|
|
|
{ "oacute", "ó" },
|
|
|
|
|
{ "Ocirc", "Ô" },
|
|
|
|
|
{ "ocirc", "ô" },
|
|
|
|
|
{ "Ograve", "Ò" },
|
|
|
|
|
{ "ograve", "ò" },
|
|
|
|
|
{ "Oslash", "Ø" },
|
|
|
|
|
{ "oslash", "ø" },
|
|
|
|
|
{ "Otilde", "Õ" },
|
|
|
|
|
{ "otilde", "õ" },
|
|
|
|
|
{ "Ouml", "Ö" },
|
|
|
|
|
{ "ouml", "ö" },
|
|
|
|
|
{ "szlig", "ß" },
|
|
|
|
|
{ "THORN", "Þ" },
|
|
|
|
|
{ "thorn", "þ" },
|
|
|
|
|
{ "Uacute", "Ú" },
|
|
|
|
|
{ "uacute", "ú" },
|
|
|
|
|
{ "Ucirc", "Û" },
|
|
|
|
|
{ "ucirc", "û" },
|
|
|
|
|
{ "Ugrave", "Ù" },
|
|
|
|
|
{ "ugrave", "ù" },
|
|
|
|
|
{ "Uuml", "Ü" },
|
|
|
|
|
{ "uuml", "ü" },
|
|
|
|
|
{ "Yacute", "Ý" },
|
|
|
|
|
{ "yacute", "ý" },
|
|
|
|
|
{ "yuml", "ÿ" },
|
|
|
|
|
{ "Abreve", "Ă" },
|
|
|
|
|
{ "abreve", "ă" },
|
|
|
|
|
{ "Amacr", "Ā" },
|
|
|
|
|
{ "amacr", "ā" },
|
|
|
|
|
{ "Aogon", "Ą" },
|
|
|
|
|
{ "aogon", "ą" },
|
|
|
|
|
{ "Cacute", "Ć" },
|
|
|
|
|
{ "cacute", "ć" },
|
|
|
|
|
{ "Ccaron", "Č" },
|
|
|
|
|
{ "ccaron", "č" },
|
|
|
|
|
{ "Ccirc", "Ĉ" },
|
|
|
|
|
{ "ccirc", "ĉ" },
|
|
|
|
|
{ "Cdot", "Ċ" },
|
|
|
|
|
{ "cdot", "ċ" },
|
|
|
|
|
{ "Dcaron", "Ď" },
|
|
|
|
|
{ "dcaron", "ď" },
|
|
|
|
|
{ "Dstrok", "Đ" },
|
|
|
|
|
{ "dstrok", "đ" },
|
|
|
|
|
{ "Ecaron", "Ě" },
|
|
|
|
|
{ "ecaron", "ě" },
|
|
|
|
|
{ "Edot", "Ė" },
|
|
|
|
|
{ "edot", "ė" },
|
|
|
|
|
{ "Emacr", "Ē" },
|
|
|
|
|
{ "emacr", "ē" },
|
|
|
|
|
{ "ENG", "Ŋ" },
|
|
|
|
|
{ "eng", "ŋ" },
|
|
|
|
|
{ "Eogon", "Ę" },
|
|
|
|
|
{ "eogon", "ę" },
|
|
|
|
|
{ "gacute", "ǵ" },
|
|
|
|
|
{ "Gbreve", "Ğ" },
|
|
|
|
|
{ "gbreve", "ğ" },
|
|
|
|
|
{ "Gcedil", "Ģ" },
|
|
|
|
|
{ "Gcirc", "Ĝ" },
|
|
|
|
|
{ "gcirc", "ĝ" },
|
|
|
|
|
{ "Gdot", "Ġ" },
|
|
|
|
|
{ "gdot", "ġ" },
|
|
|
|
|
{ "Hcirc", "Ĥ" },
|
|
|
|
|
{ "hcirc", "ĥ" },
|
|
|
|
|
{ "Hstrok", "Ħ" },
|
|
|
|
|
{ "hstrok", "ħ" },
|
|
|
|
|
{ "Idot", "İ" },
|
|
|
|
|
{ "IJlig", "IJ" },
|
|
|
|
|
{ "ijlig", "ij" },
|
|
|
|
|
{ "Imacr", "Ī" },
|
|
|
|
|
{ "imacr", "ī" },
|
|
|
|
|
{ "inodot", "ı" },
|
|
|
|
|
{ "Iogon", "Į" },
|
|
|
|
|
{ "iogon", "į" },
|
|
|
|
|
{ "Itilde", "Ĩ" },
|
|
|
|
|
{ "itilde", "ĩ" },
|
|
|
|
|
{ "Jcirc", "Ĵ" },
|
|
|
|
|
{ "jcirc", "ĵ" },
|
|
|
|
|
{ "Kcedil", "Ķ" },
|
|
|
|
|
{ "kcedil", "ķ" },
|
|
|
|
|
{ "kgreen", "ĸ" },
|
|
|
|
|
{ "Lacute", "Ĺ" },
|
|
|
|
|
{ "lacute", "ĺ" },
|
|
|
|
|
{ "Lcaron", "Ľ" },
|
|
|
|
|
{ "lcaron", "ľ" },
|
|
|
|
|
{ "Lcedil", "Ļ" },
|
|
|
|
|
{ "lcedil", "ļ" },
|
|
|
|
|
{ "Lmidot", "Ŀ" },
|
|
|
|
|
{ "lmidot", "ŀ" },
|
|
|
|
|
{ "Lstrok", "Ł" },
|
|
|
|
|
{ "lstrok", "ł" },
|
|
|
|
|
{ "Nacute", "Ń" },
|
|
|
|
|
{ "nacute", "ń" },
|
|
|
|
|
{ "napos", "ʼn" },
|
|
|
|
|
{ "Ncaron", "Ň" },
|
|
|
|
|
{ "ncaron", "ň" },
|
|
|
|
|
{ "Ncedil", "Ņ" },
|
|
|
|
|
{ "ncedil", "ņ" },
|
|
|
|
|
{ "Odblac", "Ő" },
|
|
|
|
|
{ "odblac", "ő" },
|
|
|
|
|
{ "OElig", "Œ" },
|
|
|
|
|
{ "oelig", "œ" },
|
|
|
|
|
{ "Omacr", "Ō" },
|
|
|
|
|
{ "omacr", "ō" },
|
|
|
|
|
{ "Racute", "Ŕ" },
|
|
|
|
|
{ "racute", "ŕ" },
|
|
|
|
|
{ "Rcaron", "Ř" },
|
|
|
|
|
{ "rcaron", "ř" },
|
|
|
|
|
{ "Rcedil", "Ŗ" },
|
|
|
|
|
{ "rcedil", "ŗ" },
|
|
|
|
|
{ "Sacute", "Ś" },
|
|
|
|
|
{ "sacute", "ś" },
|
|
|
|
|
{ "Scaron", "Š" },
|
|
|
|
|
{ "scaron", "š" },
|
|
|
|
|
{ "Scedil", "Ş" },
|
|
|
|
|
{ "scedil", "ş" },
|
|
|
|
|
{ "Scirc", "Ŝ" },
|
|
|
|
|
{ "scirc", "ŝ" },
|
|
|
|
|
{ "Tcaron", "Ť" },
|
|
|
|
|
{ "tcaron", "ť" },
|
|
|
|
|
{ "Tcedil", "Ţ" },
|
|
|
|
|
{ "tcedil", "ţ" },
|
|
|
|
|
{ "Tstrok", "Ŧ" },
|
|
|
|
|
{ "tstrok", "ŧ" },
|
|
|
|
|
{ "Ubreve", "Ŭ" },
|
|
|
|
|
{ "ubreve", "ŭ" },
|
|
|
|
|
{ "Udblac", "Ű" },
|
|
|
|
|
{ "udblac", "ű" },
|
|
|
|
|
{ "Umacr", "Ū" },
|
|
|
|
|
{ "umacr", "ū" },
|
|
|
|
|
{ "Uogon", "Ų" },
|
|
|
|
|
{ "uogon", "ų" },
|
|
|
|
|
{ "Uring", "Ů" },
|
|
|
|
|
{ "uring", "ů" },
|
|
|
|
|
{ "Utilde", "Ũ" },
|
|
|
|
|
{ "utilde", "ũ" },
|
|
|
|
|
{ "Wcirc", "Ŵ" },
|
|
|
|
|
{ "wcirc", "ŵ" },
|
|
|
|
|
{ "Ycirc", "Ŷ" },
|
|
|
|
|
{ "ycirc", "ŷ" },
|
|
|
|
|
{ "Yuml", "Ÿ" },
|
|
|
|
|
{ "Zacute", "Ź" },
|
|
|
|
|
{ "zacute", "ź" },
|
|
|
|
|
{ "Zcaron", "Ž" },
|
|
|
|
|
{ "zcaron", "ž" },
|
|
|
|
|
{ "Zdot", "Ż" },
|
|
|
|
|
{ "zdot", "ż" },
|
|
|
|
|
{ "apos", "'" },
|
|
|
|
|
{ "ast", "*" },
|
|
|
|
|
{ "brvbar", "¦" },
|
|
|
|
|
{ "bsol", "\" },
|
|
|
|
|
{ "cent", "¢" },
|
|
|
|
|
{ "colon", ":" },
|
|
|
|
|
{ "comma", "," },
|
|
|
|
|
{ "commat", "@" },
|
|
|
|
|
{ "copy", "©" },
|
|
|
|
|
{ "curren", "¤" },
|
|
|
|
|
{ "darr", "↓" },
|
|
|
|
|
{ "deg", "°" },
|
|
|
|
|
{ "divide", "÷" },
|
|
|
|
|
{ "dollar", "$" },
|
|
|
|
|
{ "equals", "=" },
|
|
|
|
|
{ "excl", "!" },
|
|
|
|
|
{ "frac12", "½" },
|
|
|
|
|
{ "frac14", "¼" },
|
|
|
|
|
{ "frac18", "⅛" },
|
|
|
|
|
{ "frac34", "¾" },
|
|
|
|
|
{ "frac38", "⅜" },
|
|
|
|
|
{ "frac58", "⅝" },
|
|
|
|
|
{ "frac78", "⅞" },
|
|
|
|
|
{ "gt", ">" },
|
|
|
|
|
{ "half", "½" },
|
|
|
|
|
{ "horbar", "―" },
|
|
|
|
|
{ "hyphen", "‐" },
|
|
|
|
|
{ "iexcl", "¡" },
|
|
|
|
|
{ "iquest", "¿" },
|
|
|
|
|
{ "laquo", "«" },
|
|
|
|
|
{ "larr", "←" },
|
|
|
|
|
{ "lcub", "{" },
|
|
|
|
|
{ "ldquo", "“" },
|
|
|
|
|
{ "lowbar", "_" },
|
|
|
|
|
{ "lpar", "(" },
|
|
|
|
|
{ "lsqb", "[" },
|
|
|
|
|
{ "lsquo", "‘" },
|
|
|
|
|
{ "lt", "<" },
|
|
|
|
|
{ "micro", "µ" },
|
|
|
|
|
{ "middot", "·" },
|
|
|
|
|
{ "nbsp", " " },
|
|
|
|
|
{ "not", "¬" },
|
|
|
|
|
{ "num", "#" },
|
|
|
|
|
{ "ohm", "Ω" },
|
|
|
|
|
{ "ordf", "ª" },
|
|
|
|
|
{ "ordm", "º" },
|
|
|
|
|
{ "para", "¶" },
|
|
|
|
|
{ "percnt", "%" },
|
|
|
|
|
{ "period", "." },
|
|
|
|
|
{ "plus", "+" },
|
|
|
|
|
{ "plusmn", "±" },
|
|
|
|
|
{ "pound", "£" },
|
|
|
|
|
{ "quest", "?" },
|
|
|
|
|
{ "quot", """ },
|
|
|
|
|
{ "raquo", "»" },
|
|
|
|
|
{ "rarr", "→" },
|
|
|
|
|
{ "rcub", "}" },
|
|
|
|
|
{ "rdquo", "”" },
|
|
|
|
|
{ "reg", "®" },
|
|
|
|
|
{ "rpar", ")" },
|
|
|
|
|
{ "rsqb", "]" },
|
|
|
|
|
{ "rsquo", "’" },
|
|
|
|
|
{ "sect", "§" },
|
|
|
|
|
{ "semi", ";" },
|
|
|
|
|
{ "shy", "­" },
|
|
|
|
|
{ "sol", "/" },
|
|
|
|
|
{ "sung", "♪" },
|
|
|
|
|
{ "sup1", "¹" },
|
|
|
|
|
{ "sup2", "²" },
|
|
|
|
|
{ "sup3", "³" },
|
|
|
|
|
{ "times", "×" },
|
|
|
|
|
{ "trade", "™" },
|
|
|
|
|
{ "uarr", "↑" },
|
|
|
|
|
{ "verbar", "|" },
|
|
|
|
|
{ "yen", "¥" },
|
|
|
|
|
{ "blank", "␣" },
|
|
|
|
|
{ "blk12", "▒" },
|
|
|
|
|
{ "blk14", "░" },
|
|
|
|
|
{ "blk34", "▓" },
|
|
|
|
|
{ "block", "█" },
|
|
|
|
|
{ "bull", "•" },
|
|
|
|
|
{ "caret", "⁁" },
|
|
|
|
|
{ "check", "✓" },
|
|
|
|
|
{ "cir", "○" },
|
|
|
|
|
{ "clubs", "♣" },
|
|
|
|
|
{ "copysr", "℗" },
|
|
|
|
|
{ "cross", "✗" },
|
|
|
|
|
{ "Dagger", "‡" },
|
|
|
|
|
{ "dagger", "†" },
|
|
|
|
|
{ "dash", "‐" },
|
|
|
|
|
{ "diams", "♦" },
|
|
|
|
|
{ "dlcrop", "⌍" },
|
|
|
|
|
{ "drcrop", "⌌" },
|
|
|
|
|
{ "dtri", "▿" },
|
|
|
|
|
{ "dtrif", "▾" },
|
|
|
|
|
{ "emsp", " " },
|
|
|
|
|
{ "emsp13", " " },
|
|
|
|
|
{ "emsp14", " " },
|
|
|
|
|
{ "ensp", " " },
|
|
|
|
|
{ "female", "♀" },
|
|
|
|
|
{ "ffilig", "ffi" },
|
|
|
|
|
{ "fflig", "ff" },
|
|
|
|
|
{ "ffllig", "ffl" },
|
|
|
|
|
{ "filig", "fi" },
|
|
|
|
|
{ "flat", "♭" },
|
|
|
|
|
{ "fllig", "fl" },
|
|
|
|
|
{ "frac13", "⅓" },
|
|
|
|
|
{ "frac15", "⅕" },
|
|
|
|
|
{ "frac16", "⅙" },
|
|
|
|
|
{ "frac23", "⅔" },
|
|
|
|
|
{ "frac25", "⅖" },
|
|
|
|
|
{ "frac35", "⅗" },
|
|
|
|
|
{ "frac45", "⅘" },
|
|
|
|
|
{ "frac56", "⅚" },
|
|
|
|
|
{ "hairsp", " " },
|
|
|
|
|
{ "hearts", "♥" },
|
|
|
|
|
{ "hellip", "…" },
|
|
|
|
|
{ "hybull", "⁃" },
|
|
|
|
|
{ "incare", "℅" },
|
|
|
|
|
{ "ldquor", "„" },
|
|
|
|
|
{ "lhblk", "▄" },
|
|
|
|
|
{ "loz", "◊" },
|
|
|
|
|
{ "lozf", "⧫" },
|
|
|
|
|
{ "lsquor", "‚" },
|
|
|
|
|
{ "ltri", "◃" },
|
|
|
|
|
{ "ltrif", "◂" },
|
|
|
|
|
{ "male", "♂" },
|
|
|
|
|
{ "malt", "✠" },
|
|
|
|
|
{ "marker", "▮" },
|
|
|
|
|
{ "mdash", "—" },
|
|
|
|
|
{ "mldr", "…" },
|
|
|
|
|
{ "natur", "♮" },
|
|
|
|
|
{ "ndash", "–" },
|
|
|
|
|
{ "nldr", "‥" },
|
|
|
|
|
{ "numsp", " " },
|
|
|
|
|
{ "phone", "☎" },
|
|
|
|
|
{ "puncsp", " " },
|
|
|
|
|
{ "rdquor", "”" },
|
|
|
|
|
{ "rect", "▭" },
|
|
|
|
|
{ "rsquor", "’" },
|
|
|
|
|
{ "rtri", "▹" },
|
|
|
|
|
{ "rtrif", "▸" },
|
|
|
|
|
{ "rx", "℞" },
|
|
|
|
|
{ "sext", "✶" },
|
|
|
|
|
{ "sharp", "♯" },
|
|
|
|
|
{ "spades", "♠" },
|
|
|
|
|
{ "squ", "□" },
|
|
|
|
|
{ "squf", "▪" },
|
|
|
|
|
{ "star", "☆" },
|
|
|
|
|
{ "starf", "★" },
|
|
|
|
|
{ "target", "⌖" },
|
|
|
|
|
{ "telrec", "⌕" },
|
|
|
|
|
{ "thinsp", " " },
|
|
|
|
|
{ "uhblk", "▀" },
|
|
|
|
|
{ "ulcrop", "⌏" },
|
|
|
|
|
{ "urcrop", "⌎" },
|
|
|
|
|
{ "utri", "▵" },
|
|
|
|
|
{ "utrif", "▴" },
|
|
|
|
|
{ "vellip", "⋮" },
|
|
|
|
|
{ "af", "⁡" },
|
|
|
|
|
{ "asympeq", "≍" },
|
|
|
|
|
{ "Cross", "⨯" },
|
|
|
|
|
{ "DD", "ⅅ" },
|
|
|
|
|
{ "dd", "ⅆ" },
|
|
|
|
|
{ "DownArrowBar", "⤓" },
|
|
|
|
|
{ "DownBreve", "̑" },
|
|
|
|
|
{ "DownLeftRightVector", "⥐" },
|
|
|
|
|
{ "DownLeftTeeVector", "⥞" },
|
|
|
|
|
{ "DownLeftVectorBar", "⥖" },
|
|
|
|
|
{ "DownRightTeeVector", "⥟" },
|
|
|
|
|
{ "DownRightVectorBar", "⥗" },
|
|
|
|
|
{ "ee", "ⅇ" },
|
|
|
|
|
{ "EmptySmallSquare", "◻" },
|
|
|
|
|
{ "EmptyVerySmallSquare", "▫" },
|
|
|
|
|
{ "Equal", "⩵" },
|
|
|
|
|
{ "FilledSmallSquare", "◼" },
|
|
|
|
|
{ "FilledVerySmallSquare", "▪" },
|
|
|
|
|
{ "GreaterGreater", "⪢" },
|
|
|
|
|
{ "Hat", "^" },
|
|
|
|
|
{ "HorizontalLine", "─" },
|
|
|
|
|
{ "ic", "⁣" },
|
|
|
|
|
{ "ii", "ⅈ" },
|
|
|
|
|
{ "it", "⁢" },
|
|
|
|
|
{ "larrb", "⇤" },
|
|
|
|
|
{ "LeftDownTeeVector", "⥡" },
|
|
|
|
|
{ "LeftDownVectorBar", "⥙" },
|
|
|
|
|
{ "LeftRightVector", "⥎" },
|
|
|
|
|
{ "LeftTeeVector", "⥚" },
|
|
|
|
|
{ "LeftTriangleBar", "⧏" },
|
|
|
|
|
{ "LeftUpDownVector", "⥑" },
|
|
|
|
|
{ "LeftUpTeeVector", "⥠" },
|
|
|
|
|
{ "LeftUpVectorBar", "⥘" },
|
|
|
|
|
{ "LeftVectorBar", "⥒" },
|
|
|
|
|
{ "LessLess", "⪡" },
|
|
|
|
|
{ "mapstodown", "↧" },
|
|
|
|
|
{ "mapstoleft", "↤" },
|
|
|
|
|
{ "mapstoup", "↥" },
|
|
|
|
|
{ "MediumSpace", " " },
|
|
|
|
|
{ "nbump", "≎̸" },
|
|
|
|
|
{ "nbumpe", "≏̸" },
|
|
|
|
|
{ "nesim", "≂̸" },
|
|
|
|
|
{ "NewLine", "
" },
|
|
|
|
|
{ "NoBreak", "⁠" },
|
|
|
|
|
{ "NotCupCap", "≭" },
|
|
|
|
|
{ "NotHumpEqual", "≏̸" },
|
|
|
|
|
{ "NotLeftTriangleBar", "⧏̸" },
|
|
|
|
|
{ "NotNestedGreaterGreater", "⪢̸" },
|
|
|
|
|
{ "NotNestedLessLess", "⪡̸" },
|
|
|
|
|
{ "NotRightTriangleBar", "⧐̸" },
|
|
|
|
|
{ "NotSquareSubset", "⊏̸" },
|
|
|
|
|
{ "NotSquareSuperset", "⊐̸" },
|
|
|
|
|
{ "NotSucceedsTilde", "≿̸" },
|
|
|
|
|
{ "OverBar", "¯" },
|
|
|
|
|
{ "OverBrace", "︷" },
|
|
|
|
|
{ "OverBracket", "⎴" },
|
|
|
|
|
{ "OverParenthesis", "︵" },
|
|
|
|
|
{ "planckh", "ℎ" },
|
|
|
|
|
{ "Product", "∏" },
|
|
|
|
|
{ "rarrb", "⇥" },
|
|
|
|
|
{ "RightDownTeeVector", "⥝" },
|
|
|
|
|
{ "RightDownVectorBar", "⥕" },
|
|
|
|
|
{ "RightTeeVector", "⥛" },
|
|
|
|
|
{ "RightTriangleBar", "⧐" },
|
|
|
|
|
{ "RightUpDownVector", "⥏" },
|
|
|
|
|
{ "RightUpTeeVector", "⥜" },
|
|
|
|
|
{ "RightUpVectorBar", "⥔" },
|
|
|
|
|
{ "RightVectorBar", "⥓" },
|
|
|
|
|
{ "RoundImplies", "⥰" },
|
|
|
|
|
{ "RuleDelayed", "⧴" },
|
|
|
|
|
{ "Tab", "	" },
|
|
|
|
|
{ "ThickSpace", "   " },
|
|
|
|
|
{ "UnderBar", "̲" },
|
|
|
|
|
{ "UnderBrace", "︸" },
|
|
|
|
|
{ "UnderBracket", "⎵" },
|
|
|
|
|
{ "UnderParenthesis", "︶" },
|
|
|
|
|
{ "UpArrowBar", "⤒" },
|
|
|
|
|
{ "Upsilon", "Υ" },
|
|
|
|
|
{ "VerticalLine", "|" },
|
|
|
|
|
{ "VerticalSeparator", "❘" },
|
|
|
|
|
{ "ZeroWidthSpace", "​" },
|
|
|
|
|
{ "angle", "∠" },
|
|
|
|
|
{ "ApplyFunction", "⁡" },
|
|
|
|
|
{ "approx", "≈" },
|
|
|
|
|
{ "approxeq", "≊" },
|
|
|
|
|
{ "Assign", "≔" },
|
|
|
|
|
{ "backcong", "≌" },
|
|
|
|
|
{ "backepsilon", "϶" },
|
|
|
|
|
{ "backprime", "‵" },
|
|
|
|
|
{ "backsim", "∽" },
|
|
|
|
|
{ "backsimeq", "⋍" },
|
|
|
|
|
{ "Backslash", "∖" },
|
|
|
|
|
{ "barwedge", "⌅" },
|
|
|
|
|
{ "Because", "∵" },
|
|
|
|
|
{ "because", "∵" },
|
|
|
|
|
{ "Bernoullis", "ℬ" },
|
|
|
|
|
{ "between", "≬" },
|
|
|
|
|
{ "bigcap", "⋂" },
|
|
|
|
|
{ "bigcirc", "◯" },
|
|
|
|
|
{ "bigcup", "⋃" },
|
|
|
|
|
{ "bigodot", "⨀" },
|
|
|
|
|
{ "bigoplus", "⨁" },
|
|
|
|
|
{ "bigotimes", "⨂" },
|
|
|
|
|
{ "bigsqcup", "⨆" },
|
|
|
|
|
{ "bigstar", "★" },
|
|
|
|
|
{ "bigtriangledown", "▽" },
|
|
|
|
|
{ "bigtriangleup", "△" },
|
|
|
|
|
{ "biguplus", "⨄" },
|
|
|
|
|
{ "bigvee", "⋁" },
|
|
|
|
|
{ "bigwedge", "⋀" },
|
|
|
|
|
{ "bkarow", "⤍" },
|
|
|
|
|
{ "blacklozenge", "⧫" },
|
|
|
|
|
{ "blacksquare", "▪" },
|
|
|
|
|
{ "blacktriangle", "▴" },
|
|
|
|
|
{ "blacktriangledown", "▾" },
|
|
|
|
|
{ "blacktriangleleft", "◂" },
|
|
|
|
|
{ "blacktriangleright", "▸" },
|
|
|
|
|
{ "bot", "⊥" },
|
|
|
|
|
{ "boxminus", "⊟" },
|
|
|
|
|
{ "boxplus", "⊞" },
|
|
|
|
|
{ "boxtimes", "⊠" },
|
|
|
|
|
{ "Breve", "˘" },
|
|
|
|
|
{ "bullet", "•" },
|
|
|
|
|
{ "Bumpeq", "≎" },
|
|
|
|
|
{ "bumpeq", "≏" },
|
|
|
|
|
{ "CapitalDifferentialD", "ⅅ" },
|
|
|
|
|
{ "Cayleys", "ℭ" },
|
|
|
|
|
{ "Cedilla", "¸" },
|
|
|
|
|
{ "CenterDot", "·" },
|
|
|
|
|
{ "centerdot", "·" },
|
|
|
|
|
{ "checkmark", "✓" },
|
|
|
|
|
{ "circeq", "≗" },
|
|
|
|
|
{ "circlearrowleft", "↺" },
|
|
|
|
|
{ "circlearrowright", "↻" },
|
|
|
|
|
{ "circledast", "⊛" },
|
|
|
|
|
{ "circledcirc", "⊚" },
|
|
|
|
|
{ "circleddash", "⊝" },
|
|
|
|
|
{ "CircleDot", "⊙" },
|
|
|
|
|
{ "circledR", "®" },
|
|
|
|
|
{ "circledS", "Ⓢ" },
|
|
|
|
|
{ "CircleMinus", "⊖" },
|
|
|
|
|
{ "CirclePlus", "⊕" },
|
|
|
|
|
{ "CircleTimes", "⊗" },
|
|
|
|
|
{ "ClockwiseContourIntegral", "∲" },
|
|
|
|
|
{ "CloseCurlyDoubleQuote", "”" },
|
|
|
|
|
{ "CloseCurlyQuote", "’" },
|
|
|
|
|
{ "clubsuit", "♣" },
|
|
|
|
|
{ "coloneq", "≔" },
|
|
|
|
|
{ "complement", "∁" },
|
|
|
|
|
{ "complexes", "ℂ" },
|
|
|
|
|
{ "Congruent", "≡" },
|
|
|
|
|
{ "ContourIntegral", "∮" },
|
|
|
|
|
{ "Coproduct", "∐" },
|
|
|
|
|
{ "CounterClockwiseContourIntegral", "∳" },
|
|
|
|
|
{ "CupCap", "≍" },
|
|
|
|
|
{ "curlyeqprec", "⋞" },
|
|
|
|
|
{ "curlyeqsucc", "⋟" },
|
|
|
|
|
{ "curlyvee", "⋎" },
|
|
|
|
|
{ "curlywedge", "⋏" },
|
|
|
|
|
{ "curvearrowleft", "↶" },
|
|
|
|
|
{ "curvearrowright", "↷" },
|
|
|
|
|
{ "dbkarow", "⤏" },
|
|
|
|
|
{ "ddagger", "‡" },
|
|
|
|
|
{ "ddotseq", "⩷" },
|
|
|
|
|
{ "Del", "∇" },
|
|
|
|
|
{ "DiacriticalAcute", "´" },
|
|
|
|
|
{ "DiacriticalDot", "˙" },
|
|
|
|
|
{ "DiacriticalDoubleAcute", "˝" },
|
|
|
|
|
{ "DiacriticalGrave", "`" },
|
|
|
|
|
{ "DiacriticalTilde", "˜" },
|
|
|
|
|
{ "Diamond", "⋄" },
|
|
|
|
|
{ "diamond", "⋄" },
|
|
|
|
|
{ "diamondsuit", "♦" },
|
|
|
|
|
{ "DifferentialD", "ⅆ" },
|
|
|
|
|
{ "digamma", "ϝ" },
|
|
|
|
|
{ "div", "÷" },
|
|
|
|
|
{ "divideontimes", "⋇" },
|
|
|
|
|
{ "doteq", "≐" },
|
|
|
|
|
{ "doteqdot", "≑" },
|
|
|
|
|
{ "DotEqual", "≐" },
|
|
|
|
|
{ "dotminus", "∸" },
|
|
|
|
|
{ "dotplus", "∔" },
|
|
|
|
|
{ "dotsquare", "⊡" },
|
|
|
|
|
{ "doublebarwedge", "⌆" },
|
|
|
|
|
{ "DoubleContourIntegral", "∯" },
|
|
|
|
|
{ "DoubleDot", "¨" },
|
|
|
|
|
{ "DoubleDownArrow", "⇓" },
|
|
|
|
|
{ "DoubleLeftArrow", "⇐" },
|
|
|
|
|
{ "DoubleLeftRightArrow", "⇔" },
|
|
|
|
|
{ "DoubleLeftTee", "⫤" },
|
|
|
|
|
{ "DoubleLongLeftArrow", "⟸" },
|
|
|
|
|
{ "DoubleLongLeftRightArrow", "⟺" },
|
|
|
|
|
{ "DoubleLongRightArrow", "⟹" },
|
|
|
|
|
{ "DoubleRightArrow", "⇒" },
|
|
|
|
|
{ "DoubleRightTee", "⊨" },
|
|
|
|
|
{ "DoubleUpArrow", "⇑" },
|
|
|
|
|
{ "DoubleUpDownArrow", "⇕" },
|
|
|
|
|
{ "DoubleVerticalBar", "∥" },
|
|
|
|
|
{ "DownArrow", "↓" },
|
|
|
|
|
{ "Downarrow", "⇓" },
|
|
|
|
|
{ "downarrow", "↓" },
|
|
|
|
|
{ "DownArrowUpArrow", "⇵" },
|
|
|
|
|
{ "downdownarrows", "⇊" },
|
|
|
|
|
{ "downharpoonleft", "⇃" },
|
|
|
|
|
{ "downharpoonright", "⇂" },
|
|
|
|
|
{ "DownLeftVector", "↽" },
|
|
|
|
|
{ "DownRightVector", "⇁" },
|
|
|
|
|
{ "DownTee", "⊤" },
|
|
|
|
|
{ "DownTeeArrow", "↧" },
|
|
|
|
|
{ "drbkarow", "⤐" },
|
|
|
|
|
{ "Element", "∈" },
|
|
|
|
|
{ "emptyset", "∅" },
|
|
|
|
|
{ "eqcirc", "≖" },
|
|
|
|
|
{ "eqcolon", "≕" },
|
|
|
|
|
{ "eqsim", "≂" },
|
|
|
|
|
{ "eqslantgtr", "⪖" },
|
|
|
|
|
{ "eqslantless", "⪕" },
|
|
|
|
|
{ "EqualTilde", "≂" },
|
|
|
|
|
{ "Equilibrium", "⇌" },
|
|
|
|
|
{ "Exists", "∃" },
|
|
|
|
|
{ "expectation", "ℰ" },
|
|
|
|
|
{ "ExponentialE", "ⅇ" },
|
|
|
|
|
{ "exponentiale", "ⅇ" },
|
|
|
|
|
{ "fallingdotseq", "≒" },
|
|
|
|
|
{ "ForAll", "∀" },
|
|
|
|
|
{ "Fouriertrf", "ℱ" },
|
|
|
|
|
{ "geq", "≥" },
|
|
|
|
|
{ "geqq", "≧" },
|
|
|
|
|
{ "geqslant", "⩾" },
|
|
|
|
|
{ "gg", "≫" },
|
|
|
|
|
{ "ggg", "⋙" },
|
|
|
|
|
{ "gnapprox", "⪊" },
|
|
|
|
|
{ "gneq", "⪈" },
|
|
|
|
|
{ "gneqq", "≩" },
|
|
|
|
|
{ "GreaterEqual", "≥" },
|
|
|
|
|
{ "GreaterEqualLess", "⋛" },
|
|
|
|
|
{ "GreaterFullEqual", "≧" },
|
|
|
|
|
{ "GreaterLess", "≷" },
|
|
|
|
|
{ "GreaterSlantEqual", "⩾" },
|
|
|
|
|
{ "GreaterTilde", "≳" },
|
|
|
|
|
{ "gtrapprox", "⪆" },
|
|
|
|
|
{ "gtrdot", "⋗" },
|
|
|
|
|
{ "gtreqless", "⋛" },
|
|
|
|
|
{ "gtreqqless", "⪌" },
|
|
|
|
|
{ "gtrless", "≷" },
|
|
|
|
|
{ "gtrsim", "≳" },
|
|
|
|
|
{ "gvertneqq", "≩︀" },
|
|
|
|
|
{ "Hacek", "ˇ" },
|
|
|
|
|
{ "hbar", "ℏ" },
|
|
|
|
|
{ "heartsuit", "♥" },
|
|
|
|
|
{ "HilbertSpace", "ℋ" },
|
|
|
|
|
{ "hksearow", "⤥" },
|
|
|
|
|
{ "hkswarow", "⤦" },
|
|
|
|
|
{ "hookleftarrow", "↩" },
|
|
|
|
|
{ "hookrightarrow", "↪" },
|
|
|
|
|
{ "hslash", "ℏ" },
|
|
|
|
|
{ "HumpDownHump", "≎" },
|
|
|
|
|
{ "HumpEqual", "≏" },
|
|
|
|
|
{ "iiiint", "⨌" },
|
|
|
|
|
{ "iiint", "∭" },
|
|
|
|
|
{ "Im", "ℑ" },
|
|
|
|
|
{ "ImaginaryI", "ⅈ" },
|
|
|
|
|
{ "imagline", "ℐ" },
|
|
|
|
|
{ "imagpart", "ℑ" },
|
|
|
|
|
{ "Implies", "⇒" },
|
|
|
|
|
{ "in", "∈" },
|
|
|
|
|
{ "integers", "ℤ" },
|
|
|
|
|
{ "Integral", "∫" },
|
|
|
|
|
{ "intercal", "⊺" },
|
|
|
|
|
{ "Intersection", "⋂" },
|
|
|
|
|
{ "intprod", "⨼" },
|
|
|
|
|
{ "InvisibleComma", "⁣" },
|
|
|
|
|
{ "InvisibleTimes", "⁢" },
|
|
|
|
|
{ "langle", "〈" },
|
|
|
|
|
{ "Laplacetrf", "ℒ" },
|
|
|
|
|
{ "lbrace", "{" },
|
|
|
|
|
{ "lbrack", "[" },
|
|
|
|
|
{ "LeftAngleBracket", "〈" },
|
|
|
|
|
{ "LeftArrow", "←" },
|
|
|
|
|
{ "Leftarrow", "⇐" },
|
|
|
|
|
{ "leftarrow", "←" },
|
|
|
|
|
{ "LeftArrowBar", "⇤" },
|
|
|
|
|
{ "LeftArrowRightArrow", "⇆" },
|
|
|
|
|
{ "leftarrowtail", "↢" },
|
|
|
|
|
{ "LeftCeiling", "⌈" },
|
|
|
|
|
{ "LeftDoubleBracket", "〚" },
|
|
|
|
|
{ "LeftDownVector", "⇃" },
|
|
|
|
|
{ "LeftFloor", "⌊" },
|
|
|
|
|
{ "leftharpoondown", "↽" },
|
|
|
|
|
{ "leftharpoonup", "↼" },
|
|
|
|
|
{ "leftleftarrows", "⇇" },
|
|
|
|
|
{ "LeftRightArrow", "↔" },
|
|
|
|
|
{ "Leftrightarrow", "⇔" },
|
|
|
|
|
{ "leftrightarrow", "↔" },
|
|
|
|
|
{ "leftrightarrows", "⇆" },
|
|
|
|
|
{ "leftrightharpoons", "⇋" },
|
|
|
|
|
{ "leftrightsquigarrow", "↭" },
|
|
|
|
|
{ "LeftTee", "⊣" },
|
|
|
|
|
{ "LeftTeeArrow", "↤" },
|
|
|
|
|
{ "leftthreetimes", "⋋" },
|
|
|
|
|
{ "LeftTriangle", "⊲" },
|
|
|
|
|
{ "LeftTriangleEqual", "⊴" },
|
|
|
|
|
{ "LeftUpVector", "↿" },
|
|
|
|
|
{ "LeftVector", "↼" },
|
|
|
|
|
{ "leq", "≤" },
|
|
|
|
|
{ "leqq", "≦" },
|
|
|
|
|
{ "leqslant", "⩽" },
|
|
|
|
|
{ "lessapprox", "⪅" },
|
|
|
|
|
{ "lessdot", "⋖" },
|
|
|
|
|
{ "lesseqgtr", "⋚" },
|
|
|
|
|
{ "lesseqqgtr", "⪋" },
|
|
|
|
|
{ "LessEqualGreater", "⋚" },
|
|
|
|
|
{ "LessFullEqual", "≦" },
|
|
|
|
|
{ "LessGreater", "≶" },
|
|
|
|
|
{ "lessgtr", "≶" },
|
|
|
|
|
{ "lesssim", "≲" },
|
|
|
|
|
{ "LessSlantEqual", "⩽" },
|
|
|
|
|
{ "LessTilde", "≲" },
|
|
|
|
|
{ "ll", "≪" },
|
|
|
|
|
{ "llcorner", "⌞" },
|
|
|
|
|
{ "Lleftarrow", "⇚" },
|
|
|
|
|
{ "lmoustache", "⎰" },
|
|
|
|
|
{ "lnapprox", "⪉" },
|
|
|
|
|
{ "lneq", "⪇" },
|
|
|
|
|
{ "lneqq", "≨" },
|
|
|
|
|
{ "LongLeftArrow", "⟵" },
|
|
|
|
|
{ "Longleftarrow", "⟸" },
|
|
|
|
|
{ "longleftarrow", "⟵" },
|
|
|
|
|
{ "LongLeftRightArrow", "⟷" },
|
|
|
|
|
{ "Longleftrightarrow", "⟺" },
|
|
|
|
|
{ "longleftrightarrow", "⟷" },
|
|
|
|
|
{ "longmapsto", "⟼" },
|
|
|
|
|
{ "LongRightArrow", "⟶" },
|
|
|
|
|
{ "Longrightarrow", "⟹" },
|
|
|
|
|
{ "longrightarrow", "⟶" },
|
|
|
|
|
{ "looparrowleft", "↫" },
|
|
|
|
|
{ "looparrowright", "↬" },
|
|
|
|
|
{ "LowerLeftArrow", "↙" },
|
|
|
|
|
{ "LowerRightArrow", "↘" },
|
|
|
|
|
{ "lozenge", "◊" },
|
|
|
|
|
{ "lrcorner", "⌟" },
|
|
|
|
|
{ "Lsh", "↰" },
|
|
|
|
|
{ "lvertneqq", "≨︀" },
|
|
|
|
|
{ "maltese", "✠" },
|
|
|
|
|
{ "mapsto", "↦" },
|
|
|
|
|
{ "measuredangle", "∡" },
|
|
|
|
|
{ "Mellintrf", "ℳ" },
|
|
|
|
|
{ "MinusPlus", "∓" },
|
|
|
|
|
{ "mp", "∓" },
|
|
|
|
|
{ "multimap", "⊸" },
|
|
|
|
|
{ "napprox", "≉" },
|
|
|
|
|
{ "natural", "♮" },
|
|
|
|
|
{ "naturals", "ℕ" },
|
|
|
|
|
{ "nearrow", "↗" },
|
|
|
|
|
{ "NegativeMediumSpace", "​" },
|
|
|
|
|
{ "NegativeThickSpace", "​" },
|
|
|
|
|
{ "NegativeThinSpace", "​" },
|
|
|
|
|
{ "NegativeVeryThinSpace", "​" },
|
|
|
|
|
{ "NestedGreaterGreater", "≫" },
|
|
|
|
|
{ "NestedLessLess", "≪" },
|
|
|
|
|
{ "nexists", "∄" },
|
|
|
|
|
{ "ngeq", "≱" },
|
|
|
|
|
{ "ngeqq", "≧̸" },
|
|
|
|
|
{ "ngeqslant", "⩾̸" },
|
|
|
|
|
{ "ngtr", "≯" },
|
|
|
|
|
{ "nLeftarrow", "⇍" },
|
|
|
|
|
{ "nleftarrow", "↚" },
|
|
|
|
|
{ "nLeftrightarrow", "⇎" },
|
|
|
|
|
{ "nleftrightarrow", "↮" },
|
|
|
|
|
{ "nleq", "≰" },
|
|
|
|
|
{ "nleqq", "≦̸" },
|
|
|
|
|
{ "nleqslant", "⩽̸" },
|
|
|
|
|
{ "nless", "≮" },
|
|
|
|
|
{ "NonBreakingSpace", " " },
|
|
|
|
|
{ "NotCongruent", "≢" },
|
|
|
|
|
{ "NotDoubleVerticalBar", "∦" },
|
|
|
|
|
{ "NotElement", "∉" },
|
|
|
|
|
{ "NotEqual", "≠" },
|
|
|
|
|
{ "NotEqualTilde", "≂̸" },
|
|
|
|
|
{ "NotExists", "∄" },
|
|
|
|
|
{ "NotGreater", "≯" },
|
|
|
|
|
{ "NotGreaterEqual", "≱" },
|
|
|
|
|
{ "NotGreaterFullEqual", "≦̸" },
|
|
|
|
|
{ "NotGreaterGreater", "≫̸" },
|
|
|
|
|
{ "NotGreaterLess", "≹" },
|
|
|
|
|
{ "NotGreaterSlantEqual", "⩾̸" },
|
|
|
|
|
{ "NotGreaterTilde", "≵" },
|
|
|
|
|
{ "NotHumpDownHump", "≎̸" },
|
|
|
|
|
{ "NotLeftTriangle", "⋪" },
|
|
|
|
|
{ "NotLeftTriangleEqual", "⋬" },
|
|
|
|
|
{ "NotLess", "≮" },
|
|
|
|
|
{ "NotLessEqual", "≰" },
|
|
|
|
|
{ "NotLessGreater", "≸" },
|
|
|
|
|
{ "NotLessLess", "≪̸" },
|
|
|
|
|
{ "NotLessSlantEqual", "⩽̸" },
|
|
|
|
|
{ "NotLessTilde", "≴" },
|
|
|
|
|
{ "NotPrecedes", "⊀" },
|
|
|
|
|
{ "NotPrecedesEqual", "⪯̸" },
|
|
|
|
|
{ "NotPrecedesSlantEqual", "⋠" },
|
|
|
|
|
{ "NotReverseElement", "∌" },
|
|
|
|
|
{ "NotRightTriangle", "⋫" },
|
|
|
|
|
{ "NotRightTriangleEqual", "⋭" },
|
|
|
|
|
{ "NotSquareSubsetEqual", "⋢" },
|
|
|
|
|
{ "NotSquareSupersetEqual", "⋣" },
|
|
|
|
|
{ "NotSubset", "⊂⃒" },
|
|
|
|
|
{ "NotSubsetEqual", "⊈" },
|
|
|
|
|
{ "NotSucceeds", "⊁" },
|
|
|
|
|
{ "NotSucceedsEqual", "⪰̸" },
|
|
|
|
|
{ "NotSucceedsSlantEqual", "⋡" },
|
|
|
|
|
{ "NotSuperset", "⊃⃒" },
|
|
|
|
|
{ "NotSupersetEqual", "⊉" },
|
|
|
|
|
{ "NotTilde", "≁" },
|
|
|
|
|
{ "NotTildeEqual", "≄" },
|
|
|
|
|
{ "NotTildeFullEqual", "≇" },
|
|
|
|
|
{ "NotTildeTilde", "≉" },
|
|
|
|
|
{ "NotVerticalBar", "∤" },
|
|
|
|
|
{ "nparallel", "∦" },
|
|
|
|
|
{ "nprec", "⊀" },
|
|
|
|
|
{ "npreceq", "⪯̸" },
|
|
|
|
|
{ "nRightarrow", "⇏" },
|
|
|
|
|
{ "nrightarrow", "↛" },
|
|
|
|
|
{ "nshortmid", "∤" },
|
|
|
|
|
{ "nshortparallel", "∦" },
|
|
|
|
|
{ "nsimeq", "≄" },
|
|
|
|
|
{ "nsubset", "⊂⃒" },
|
|
|
|
|
{ "nsubseteq", "⊈" },
|
|
|
|
|
{ "nsubseteqq", "⫅̸" },
|
|
|
|
|
{ "nsucc", "⊁" },
|
|
|
|
|
{ "nsucceq", "⪰̸" },
|
|
|
|
|
{ "nsupset", "⊃⃒" },
|
|
|
|
|
{ "nsupseteq", "⊉" },
|
|
|
|
|
{ "nsupseteqq", "⫆̸" },
|
|
|
|
|
{ "ntriangleleft", "⋪" },
|
|
|
|
|
{ "ntrianglelefteq", "⋬" },
|
|
|
|
|
{ "ntriangleright", "⋫" },
|
|
|
|
|
{ "ntrianglerighteq", "⋭" },
|
|
|
|
|
{ "nwarrow", "↖" },
|
|
|
|
|
{ "oint", "∮" },
|
|
|
|
|
{ "OpenCurlyDoubleQuote", "“" },
|
|
|
|
|
{ "OpenCurlyQuote", "‘" },
|
|
|
|
|
{ "orderof", "ℴ" },
|
|
|
|
|
{ "parallel", "∥" },
|
|
|
|
|
{ "PartialD", "∂" },
|
|
|
|
|
{ "pitchfork", "⋔" },
|
|
|
|
|
{ "PlusMinus", "±" },
|
|
|
|
|
{ "pm", "±" },
|
|
|
|
|
{ "Poincareplane", "ℌ" },
|
|
|
|
|
{ "prec", "≺" },
|
|
|
|
|
{ "precapprox", "⪷" },
|
|
|
|
|
{ "preccurlyeq", "≼" },
|
|
|
|
|
{ "Precedes", "≺" },
|
|
|
|
|
{ "PrecedesEqual", "⪯" },
|
|
|
|
|
{ "PrecedesSlantEqual", "≼" },
|
|
|
|
|
{ "PrecedesTilde", "≾" },
|
|
|
|
|
{ "preceq", "⪯" },
|
|
|
|
|
{ "precnapprox", "⪹" },
|
|
|
|
|
{ "precneqq", "⪵" },
|
|
|
|
|
{ "precnsim", "⋨" },
|
|
|
|
|
{ "precsim", "≾" },
|
|
|
|
|
{ "primes", "ℙ" },
|
|
|
|
|
{ "Proportion", "∷" },
|
|
|
|
|
{ "Proportional", "∝" },
|
|
|
|
|
{ "propto", "∝" },
|
|
|
|
|
{ "quaternions", "ℍ" },
|
|
|
|
|
{ "questeq", "≟" },
|
|
|
|
|
{ "rangle", "〉" },
|
|
|
|
|
{ "rationals", "ℚ" },
|
|
|
|
|
{ "rbrace", "}" },
|
|
|
|
|
{ "rbrack", "]" },
|
|
|
|
|
{ "Re", "ℜ" },
|
|
|
|
|
{ "realine", "ℛ" },
|
|
|
|
|
{ "realpart", "ℜ" },
|
|
|
|
|
{ "reals", "ℝ" },
|
|
|
|
|
{ "ReverseElement", "∋" },
|
|
|
|
|
{ "ReverseEquilibrium", "⇋" },
|
|
|
|
|
{ "ReverseUpEquilibrium", "⥯" },
|
|
|
|
|
{ "RightAngleBracket", "〉" },
|
|
|
|
|
{ "RightArrow", "→" },
|
|
|
|
|
{ "Rightarrow", "⇒" },
|
|
|
|
|
{ "rightarrow", "→" },
|
|
|
|
|
{ "RightArrowBar", "⇥" },
|
|
|
|
|
{ "RightArrowLeftArrow", "⇄" },
|
|
|
|
|
{ "rightarrowtail", "↣" },
|
|
|
|
|
{ "RightCeiling", "⌉" },
|
|
|
|
|
{ "RightDoubleBracket", "〛" },
|
|
|
|
|
{ "RightDownVector", "⇂" },
|
|
|
|
|
{ "RightFloor", "⌋" },
|
|
|
|
|
{ "rightharpoondown", "⇁" },
|
|
|
|
|
{ "rightharpoonup", "⇀" },
|
|
|
|
|
{ "rightleftarrows", "⇄" },
|
|
|
|
|
{ "rightleftharpoons", "⇌" },
|
|
|
|
|
{ "rightrightarrows", "⇉" },
|
|
|
|
|
{ "rightsquigarrow", "↝" },
|
|
|
|
|
{ "RightTee", "⊢" },
|
|
|
|
|
{ "RightTeeArrow", "↦" },
|
|
|
|
|
{ "rightthreetimes", "⋌" },
|
|
|
|
|
{ "RightTriangle", "⊳" },
|
|
|
|
|
{ "RightTriangleEqual", "⊵" },
|
|
|
|
|
{ "RightUpVector", "↾" },
|
|
|
|
|
{ "RightVector", "⇀" },
|
|
|
|
|
{ "risingdotseq", "≓" },
|
|
|
|
|
{ "rmoustache", "⎱" },
|
|
|
|
|
{ "Rrightarrow", "⇛" },
|
|
|
|
|
{ "Rsh", "↱" },
|
|
|
|
|
{ "searrow", "↘" },
|
|
|
|
|
{ "setminus", "∖" },
|
|
|
|
|
{ "ShortDownArrow", "↓" },
|
|
|
|
|
{ "ShortLeftArrow", "←" },
|
|
|
|
|
{ "shortmid", "∣" },
|
|
|
|
|
{ "shortparallel", "∥" },
|
|
|
|
|
{ "ShortRightArrow", "→" },
|
|
|
|
|
{ "ShortUpArrow", "↑" },
|
|
|
|
|
{ "simeq", "≃" },
|
|
|
|
|
{ "SmallCircle", "∘" },
|
|
|
|
|
{ "smallsetminus", "∖" },
|
|
|
|
|
{ "spadesuit", "♠" },
|
|
|
|
|
{ "Sqrt", "√" },
|
|
|
|
|
{ "sqsubset", "⊏" },
|
|
|
|
|
{ "sqsubseteq", "⊑" },
|
|
|
|
|
{ "sqsupset", "⊐" },
|
|
|
|
|
{ "sqsupseteq", "⊒" },
|
|
|
|
|
{ "Square", "□" },
|
|
|
|
|
{ "SquareIntersection", "⊓" },
|
|
|
|
|
{ "SquareSubset", "⊏" },
|
|
|
|
|
{ "SquareSubsetEqual", "⊑" },
|
|
|
|
|
{ "SquareSuperset", "⊐" },
|
|
|
|
|
{ "SquareSupersetEqual", "⊒" },
|
|
|
|
|
{ "SquareUnion", "⊔" },
|
|
|
|
|
{ "Star", "⋆" },
|
|
|
|
|
{ "straightepsilon", "ε" },
|
|
|
|
|
{ "straightphi", "ϕ" },
|
|
|
|
|
{ "Subset", "⋐" },
|
|
|
|
|
{ "subset", "⊂" },
|
|
|
|
|
{ "subseteq", "⊆" },
|
|
|
|
|
{ "subseteqq", "⫅" },
|
|
|
|
|
{ "SubsetEqual", "⊆" },
|
|
|
|
|
{ "subsetneq", "⊊" },
|
|
|
|
|
{ "subsetneqq", "⫋" },
|
|
|
|
|
{ "succ", "≻" },
|
|
|
|
|
{ "succapprox", "⪸" },
|
|
|
|
|
{ "succcurlyeq", "≽" },
|
|
|
|
|
{ "Succeeds", "≻" },
|
|
|
|
|
{ "SucceedsEqual", "⪰" },
|
|
|
|
|
{ "SucceedsSlantEqual", "≽" },
|
|
|
|
|
{ "SucceedsTilde", "≿" },
|
|
|
|
|
{ "succeq", "⪰" },
|
|
|
|
|
{ "succnapprox", "⪺" },
|
|
|
|
|
{ "succneqq", "⪶" },
|
|
|
|
|
{ "succnsim", "⋩" },
|
|
|
|
|
{ "succsim", "≿" },
|
|
|
|
|
{ "SuchThat", "∋" },
|
|
|
|
|
{ "Sum", "∑" },
|
|
|
|
|
{ "Superset", "⊃" },
|
|
|
|
|
{ "SupersetEqual", "⊇" },
|
|
|
|
|
{ "Supset", "⋑" },
|
|
|
|
|
{ "supset", "⊃" },
|
|
|
|
|
{ "supseteq", "⊇" },
|
|
|
|
|
{ "supseteqq", "⫆" },
|
|
|
|
|
{ "supsetneq", "⊋" },
|
|
|
|
|
{ "supsetneqq", "⫌" },
|
|
|
|
|
{ "swarrow", "↙" },
|
|
|
|
|
{ "Therefore", "∴" },
|
|
|
|
|
{ "therefore", "∴" },
|
|
|
|
|
{ "thickapprox", "≈" },
|
|
|
|
|
{ "thicksim", "∼" },
|
|
|
|
|
{ "ThinSpace", " " },
|
|
|
|
|
{ "Tilde", "∼" },
|
|
|
|
|
{ "TildeEqual", "≃" },
|
|
|
|
|
{ "TildeFullEqual", "≅" },
|
|
|
|
|
{ "TildeTilde", "≈" },
|
|
|
|
|
{ "toea", "⤨" },
|
|
|
|
|
{ "tosa", "⤩" },
|
|
|
|
|
{ "triangle", "▵" },
|
|
|
|
|
{ "triangledown", "▿" },
|
|
|
|
|
{ "triangleleft", "◃" },
|
|
|
|
|
{ "trianglelefteq", "⊴" },
|
|
|
|
|
{ "triangleq", "≜" },
|
|
|
|
|
{ "triangleright", "▹" },
|
|
|
|
|
{ "trianglerighteq", "⊵" },
|
|
|
|
|
{ "TripleDot", "⃛" },
|
|
|
|
|
{ "twoheadleftarrow", "↞" },
|
|
|
|
|
{ "twoheadrightarrow", "↠" },
|
|
|
|
|
{ "ulcorner", "⌜" },
|
|
|
|
|
{ "Union", "⋃" },
|
|
|
|
|
{ "UnionPlus", "⊎" },
|
|
|
|
|
{ "UpArrow", "↑" },
|
|
|
|
|
{ "Uparrow", "⇑" },
|
|
|
|
|
{ "uparrow", "↑" },
|
|
|
|
|
{ "UpArrowDownArrow", "⇅" },
|
|
|
|
|
{ "UpDownArrow", "↕" },
|
|
|
|
|
{ "Updownarrow", "⇕" },
|
|
|
|
|
{ "updownarrow", "↕" },
|
|
|
|
|
{ "UpEquilibrium", "⥮" },
|
|
|
|
|
{ "upharpoonleft", "↿" },
|
|
|
|
|
{ "upharpoonright", "↾" },
|
|
|
|
|
{ "UpperLeftArrow", "↖" },
|
|
|
|
|
{ "UpperRightArrow", "↗" },
|
|
|
|
|
{ "upsilon", "υ" },
|
|
|
|
|
{ "UpTee", "⊥" },
|
|
|
|
|
{ "UpTeeArrow", "↥" },
|
|
|
|
|
{ "upuparrows", "⇈" },
|
|
|
|
|
{ "urcorner", "⌝" },
|
|
|
|
|
{ "varepsilon", "ɛ" },
|
|
|
|
|
{ "varkappa", "ϰ" },
|
|
|
|
|
{ "varnothing", "∅" },
|
|
|
|
|
{ "varphi", "φ" },
|
|
|
|
|
{ "varpi", "ϖ" },
|
|
|
|
|
{ "varpropto", "∝" },
|
|
|
|
|
{ "varrho", "ϱ" },
|
|
|
|
|
{ "varsigma", "ς" },
|
|
|
|
|
{ "varsubsetneq", "⊊︀" },
|
|
|
|
|
{ "varsubsetneqq", "⫋︀" },
|
|
|
|
|
{ "varsupsetneq", "⊋︀" },
|
|
|
|
|
{ "varsupsetneqq", "⫌︀" },
|
|
|
|
|
{ "vartheta", "ϑ" },
|
|
|
|
|
{ "vartriangleleft", "⊲" },
|
|
|
|
|
{ "vartriangleright", "⊳" },
|
|
|
|
|
{ "Vee", "⋁" },
|
|
|
|
|
{ "vee", "∨" },
|
|
|
|
|
{ "Vert", "‖" },
|
|
|
|
|
{ "vert", "|" },
|
|
|
|
|
{ "VerticalBar", "∣" },
|
|
|
|
|
{ "VerticalTilde", "≀" },
|
|
|
|
|
{ "VeryThinSpace", " " },
|
|
|
|
|
{ "Wedge", "⋀" },
|
|
|
|
|
{ "wedge", "∧" },
|
|
|
|
|
{ "wp", "℘" },
|
|
|
|
|
{ "wr", "≀" },
|
|
|
|
|
{ "zeetrf", "ℨ" },
|
|
|
|
|
{ 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
// QwtMmlDocument
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
|
|
|
|
|
QString QwtMmlDocument::fontName( QwtMathMLDocument::MmlFont type ) const
|
|
|
|
|
{
|
|
|
|
|
switch ( type )
|
|
|
|
|
{
|
|
|
|
|
case QwtMathMLDocument::NormalFont:
|
|
|
|
|
return m_normal_font_name;
|
|
|
|
|
case QwtMathMLDocument::FrakturFont:
|
|
|
|
|
return m_fraktur_font_name;
|
|
|
|
|
case QwtMathMLDocument::SansSerifFont:
|
|
|
|
|
return m_sans_serif_font_name;
|
|
|
|
|
case QwtMathMLDocument::ScriptFont:
|
|
|
|
|
return m_script_font_name;
|
|
|
|
|
case QwtMathMLDocument::MonospaceFont:
|
|
|
|
|
return m_monospace_font_name;
|
|
|
|
|
case QwtMathMLDocument::DoublestruckFont:
|
|
|
|
|
return m_doublestruck_font_name;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name )
|
|
|
|
|
{
|
|
|
|
|
switch ( type )
|
|
|
|
|
{
|
|
|
|
|
case QwtMathMLDocument::NormalFont:
|
|
|
|
|
m_normal_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
case QwtMathMLDocument::FrakturFont:
|
|
|
|
|
m_fraktur_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
case QwtMathMLDocument::SansSerifFont:
|
|
|
|
|
m_sans_serif_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
case QwtMathMLDocument::ScriptFont:
|
|
|
|
|
m_script_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
case QwtMathMLDocument::MonospaceFont:
|
|
|
|
|
m_monospace_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
case QwtMathMLDocument::DoublestruckFont:
|
|
|
|
|
m_doublestruck_font_name = name;
|
|
|
|
|
break;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMml::NodeType domToQwtMmlNodeType( const QDomNode &dom_node )
|
|
|
|
|
{
|
|
|
|
|
QwtMml::NodeType mml_type = QwtMml::NoNode;
|
|
|
|
|
|
|
|
|
|
switch ( dom_node.nodeType() )
|
|
|
|
|
{
|
|
|
|
|
case QDomNode::ElementNode:
|
|
|
|
|
{
|
|
|
|
|
QString tag = dom_node.nodeName();
|
|
|
|
|
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( tag );
|
|
|
|
|
|
|
|
|
|
// treat urecognised tags as mrow
|
|
|
|
|
if ( spec == 0 )
|
|
|
|
|
mml_type = QwtMml::UnknownNode;
|
|
|
|
|
else
|
|
|
|
|
mml_type = spec->type;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QDomNode::TextNode:
|
|
|
|
|
mml_type = QwtMml::TextNode;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case QDomNode::DocumentNode:
|
|
|
|
|
mml_type = QwtMml::MrowNode;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case QDomNode::EntityReferenceNode:
|
|
|
|
|
// qWarning("EntityReferenceNode: name=\"" + dom_node.nodeName() + "\" value=\"" + dom_node.nodeValue() + "\"");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case QDomNode::AttributeNode:
|
|
|
|
|
case QDomNode::CDATASectionNode:
|
|
|
|
|
case QDomNode::EntityNode:
|
|
|
|
|
case QDomNode::ProcessingInstructionNode:
|
|
|
|
|
case QDomNode::CommentNode:
|
|
|
|
|
case QDomNode::DocumentTypeNode:
|
|
|
|
|
case QDomNode::DocumentFragmentNode:
|
|
|
|
|
case QDomNode::NotationNode:
|
|
|
|
|
case QDomNode::BaseNode:
|
|
|
|
|
case QDomNode::CharacterDataNode:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mml_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QwtMmlDocument::QwtMmlDocument()
|
|
|
|
|
{
|
|
|
|
|
m_root_node = 0;
|
|
|
|
|
|
|
|
|
|
// Some defaults which happen to work on my computer,
|
|
|
|
|
// but probably won't work on other's
|
|
|
|
|
#if defined(Q_OS_WIN)
|
|
|
|
|
m_normal_font_name = "Times New Roman";
|
|
|
|
|
#else
|
|
|
|
|
m_normal_font_name = "Century Schoolbook L";
|
|
|
|
|
#endif
|
|
|
|
|
m_fraktur_font_name = "Fraktur";
|
|
|
|
|
m_sans_serif_font_name = "Luxi Sans";
|
|
|
|
|
m_script_font_name = "Urw Chancery L";
|
|
|
|
|
m_monospace_font_name = "Luxi Mono";
|
|
|
|
|
m_doublestruck_font_name = "Doublestruck";
|
|
|
|
|
m_base_font_point_size = 16;
|
|
|
|
|
m_foreground_color = Qt::black;
|
|
|
|
|
m_background_color = Qt::white;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlDocument::~QwtMmlDocument()
|
|
|
|
|
{
|
|
|
|
|
clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::clear()
|
|
|
|
|
{
|
|
|
|
|
delete m_root_node;
|
|
|
|
|
m_root_node = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::dump() const
|
|
|
|
|
{
|
|
|
|
|
if ( m_root_node == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QString indent;
|
|
|
|
|
_dump( m_root_node, indent );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::_dump( const QwtMmlNode *node, QString &indent ) const
|
|
|
|
|
{
|
|
|
|
|
if ( node == 0 ) return;
|
|
|
|
|
|
|
|
|
|
qWarning() << indent + node->toStr();
|
|
|
|
|
|
|
|
|
|
indent += " ";
|
|
|
|
|
const QwtMmlNode *child = node->firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
_dump( child, indent );
|
|
|
|
|
indent.truncate( indent.length() - 2 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QwtMmlDocument::setContent( QString text, QString *errorMsg,
|
|
|
|
|
int *errorLine, int *errorColumn )
|
|
|
|
|
{
|
|
|
|
|
clear();
|
|
|
|
|
|
|
|
|
|
QString prefix = "<?xml version=\"2.0\"?>\n";
|
|
|
|
|
prefix.append( entityDeclarations() );
|
|
|
|
|
|
|
|
|
|
uint prefix_lines = 0;
|
|
|
|
|
for ( int i = 0; i < prefix.length(); ++i )
|
|
|
|
|
{
|
|
|
|
|
if ( prefix.at( i ) == '\n' )
|
|
|
|
|
++prefix_lines;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QDomDocument dom;
|
|
|
|
|
if ( !dom.setContent( prefix + text, false, errorMsg, errorLine, errorColumn ) )
|
|
|
|
|
{
|
|
|
|
|
if ( errorLine != 0 )
|
|
|
|
|
*errorLine -= prefix_lines;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// we don't have access to line info from now on
|
|
|
|
|
if ( errorLine != 0 ) *errorLine = -1;
|
|
|
|
|
if ( errorColumn != 0 ) *errorColumn = -1;
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
QwtMmlNode *root_node = domToMml( dom, &ok, errorMsg );
|
|
|
|
|
if ( !ok )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if ( root_node == 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( errorMsg != 0 )
|
|
|
|
|
*errorMsg = "empty document";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
insertChild( 0, root_node, 0 );
|
|
|
|
|
layout();
|
|
|
|
|
|
|
|
|
|
/* QFile of("/tmp/dump.xml");
|
|
|
|
|
of.open(IO_WriteOnly);
|
|
|
|
|
QTextStream os(&of);
|
|
|
|
|
os.setEncoding(QTextStream::UnicodeUTF8);
|
|
|
|
|
os << dom.toString(); */
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::layout()
|
|
|
|
|
{
|
|
|
|
|
if ( m_root_node == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_root_node->layout();
|
|
|
|
|
m_root_node->stretch();
|
|
|
|
|
// dump();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QwtMmlDocument::insertChild( QwtMmlNode *parent, QwtMmlNode *new_node,
|
|
|
|
|
QString *errorMsg )
|
|
|
|
|
{
|
|
|
|
|
if ( new_node == 0 )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
Q_ASSERT( new_node->parent() == 0
|
|
|
|
|
&& new_node->nextSibling() == 0
|
|
|
|
|
&& new_node->previousSibling() == 0 );
|
|
|
|
|
|
|
|
|
|
if ( parent != 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( !mmlCheckChildType( parent->nodeType(), new_node->nodeType(), errorMsg ) )
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( parent == 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( m_root_node == 0 )
|
|
|
|
|
m_root_node = new_node;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *n = m_root_node->lastSibling();
|
|
|
|
|
n->m_next_sibling = new_node;
|
|
|
|
|
new_node->m_previous_sibling = n;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
new_node->m_parent = parent;
|
|
|
|
|
if ( parent->hasChildNodes() )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *n = parent->firstChild()->lastSibling();
|
|
|
|
|
n->m_next_sibling = new_node;
|
|
|
|
|
new_node->m_previous_sibling = n;
|
|
|
|
|
}
|
|
|
|
|
else parent->m_first_child = new_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlDocument::createNode( NodeType type,
|
|
|
|
|
const QwtMmlAttributeMap &mml_attr,
|
|
|
|
|
const QString &mml_value,
|
|
|
|
|
QString *errorMsg )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( type != NoNode );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *mml_node = 0;
|
|
|
|
|
|
|
|
|
|
if ( !mmlCheckAttributes( type, mml_attr, errorMsg ) )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
switch ( type )
|
|
|
|
|
{
|
|
|
|
|
case MiNode:
|
|
|
|
|
mml_node = new QwtMmlMiNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MnNode:
|
|
|
|
|
mml_node = new QwtMmlMnNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MfracNode:
|
|
|
|
|
mml_node = new QwtMmlMfracNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MrowNode:
|
|
|
|
|
mml_node = new QwtMmlMrowNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MsqrtNode:
|
|
|
|
|
mml_node = new QwtMmlMsqrtNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MrootNode:
|
|
|
|
|
mml_node = new QwtMmlMrootNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MsupNode:
|
|
|
|
|
mml_node = new QwtMmlMsupNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MsubNode:
|
|
|
|
|
mml_node = new QwtMmlMsubNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MsubsupNode:
|
|
|
|
|
mml_node = new QwtMmlMsubsupNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MoNode:
|
|
|
|
|
mml_node = new QwtMmlMoNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MstyleNode:
|
|
|
|
|
mml_node = new QwtMmlMstyleNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case TextNode:
|
|
|
|
|
mml_node = new QwtMmlTextNode( mml_value, this );
|
|
|
|
|
break;
|
|
|
|
|
case MphantomNode:
|
|
|
|
|
mml_node = new QwtMmlMphantomNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MfencedNode:
|
|
|
|
|
mml_node = new QwtMmlMfencedNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MtableNode:
|
|
|
|
|
mml_node = new QwtMmlMtableNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MtrNode:
|
|
|
|
|
mml_node = new QwtMmlMtrNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MtdNode:
|
|
|
|
|
mml_node = new QwtMmlMtdNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MoverNode:
|
|
|
|
|
mml_node = new QwtMmlMoverNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MunderNode:
|
|
|
|
|
mml_node = new QwtMmlMunderNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MunderoverNode:
|
|
|
|
|
mml_node = new QwtMmlMunderoverNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MalignMarkNode:
|
|
|
|
|
mml_node = new QwtMmlMalignMarkNode( this );
|
|
|
|
|
break;
|
|
|
|
|
case MerrorNode:
|
|
|
|
|
mml_node = new QwtMmlMerrorNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MtextNode:
|
|
|
|
|
mml_node = new QwtMmlMtextNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MpaddedNode:
|
|
|
|
|
mml_node = new QwtMmlMpaddedNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case MspaceNode:
|
|
|
|
|
mml_node = new QwtMmlMspaceNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case UnknownNode:
|
|
|
|
|
mml_node = new QwtMmlUnknownNode( this, mml_attr );
|
|
|
|
|
break;
|
|
|
|
|
case NoNode:
|
|
|
|
|
mml_node = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mml_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::insertOperator( QwtMmlNode *node, const QString &text )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *text_node = createNode( TextNode, QwtMmlAttributeMap(), text, 0 );
|
|
|
|
|
QwtMmlNode *mo_node = createNode( MoNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
|
|
|
|
|
|
|
|
bool ok = insertChild( node, mo_node, 0 );
|
|
|
|
|
Q_ASSERT( ok );
|
|
|
|
|
ok = insertChild( mo_node, text_node, 0 );
|
|
|
|
|
Q_ASSERT( ok );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlDocument::domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg )
|
|
|
|
|
{
|
|
|
|
|
// create the node
|
|
|
|
|
|
|
|
|
|
Q_ASSERT( ok != 0 );
|
|
|
|
|
|
|
|
|
|
NodeType mml_type = domToQwtMmlNodeType( dom_node );
|
|
|
|
|
|
|
|
|
|
if ( mml_type == NoNode )
|
|
|
|
|
{
|
|
|
|
|
*ok = true;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QDomNamedNodeMap dom_attr = dom_node.attributes();
|
|
|
|
|
QwtMmlAttributeMap mml_attr;
|
|
|
|
|
for ( int i = 0; i < dom_attr.length(); ++i )
|
|
|
|
|
{
|
|
|
|
|
QDomNode attr_node = dom_attr.item( i );
|
|
|
|
|
Q_ASSERT( !attr_node.nodeName().isNull() );
|
|
|
|
|
Q_ASSERT( !attr_node.nodeValue().isNull() );
|
|
|
|
|
mml_attr[attr_node.nodeName()] = attr_node.nodeValue();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString mml_value;
|
|
|
|
|
if ( mml_type == TextNode )
|
|
|
|
|
mml_value = dom_node.nodeValue();
|
|
|
|
|
QwtMmlNode *mml_node = createNode( mml_type, mml_attr, mml_value, errorMsg );
|
|
|
|
|
if ( mml_node == 0 )
|
|
|
|
|
{
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// create the node's children according to the child_spec
|
|
|
|
|
|
|
|
|
|
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( mml_type );
|
|
|
|
|
QDomNodeList dom_child_list = dom_node.childNodes();
|
|
|
|
|
int child_cnt = dom_child_list.count();
|
|
|
|
|
QwtMmlNode *mml_child = 0;
|
|
|
|
|
|
|
|
|
|
QString separator_list;
|
|
|
|
|
if ( mml_type == MfencedNode )
|
|
|
|
|
separator_list = mml_node->explicitAttribute( "separators", "," );
|
|
|
|
|
|
|
|
|
|
switch ( spec->child_spec )
|
|
|
|
|
{
|
|
|
|
|
case QwtMmlNodeSpec::ChildIgnore:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case QwtMmlNodeSpec::ImplicitMrow:
|
|
|
|
|
|
|
|
|
|
if ( child_cnt > 0 )
|
|
|
|
|
{
|
|
|
|
|
mml_child = createImplicitMrowNode( dom_node, ok, errorMsg );
|
|
|
|
|
if ( !*ok )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
delete mml_child;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
// exact ammount of children specified - check...
|
|
|
|
|
if ( spec->child_spec != child_cnt )
|
|
|
|
|
{
|
|
|
|
|
if ( errorMsg != 0 )
|
|
|
|
|
*errorMsg = QString( "element " )
|
|
|
|
|
+ spec->tag
|
|
|
|
|
+ " requires exactly "
|
|
|
|
|
+ QString::number( spec->child_spec )
|
|
|
|
|
+ " arguments, got "
|
|
|
|
|
+ QString::number( child_cnt );
|
|
|
|
|
delete mml_node;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ...and continue just as in ChildAny
|
|
|
|
|
|
|
|
|
|
case QwtMmlNodeSpec::ChildAny:
|
|
|
|
|
if ( mml_type == MfencedNode )
|
|
|
|
|
insertOperator( mml_node, mml_node->explicitAttribute( "open", "(" ) );
|
|
|
|
|
|
|
|
|
|
for ( int i = 0; i < child_cnt; ++i )
|
|
|
|
|
{
|
|
|
|
|
QDomNode dom_child = dom_child_list.item( i );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg );
|
|
|
|
|
if ( !*ok )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( mml_type == MtableNode && mml_child->nodeType() != MtrNode )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *mtr_node = createNode( MtrNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
|
|
|
insertChild( mml_node, mtr_node, 0 );
|
|
|
|
|
if ( !insertChild( mtr_node, mml_child, errorMsg ) )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
delete mml_child;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ( mml_type == MtrNode && mml_child->nodeType() != MtdNode )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *mtd_node = createNode( MtdNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
|
|
|
insertChild( mml_node, mtd_node, 0 );
|
|
|
|
|
if ( !insertChild( mtd_node, mml_child, errorMsg ) )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
delete mml_child;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
delete mml_child;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( i < child_cnt - 1 && mml_type == MfencedNode && !separator_list.isEmpty() )
|
|
|
|
|
{
|
|
|
|
|
QChar separator;
|
|
|
|
|
if ( i >= ( int )separator_list.length() )
|
|
|
|
|
separator = separator_list.at( separator_list.length() - 1 );
|
|
|
|
|
else
|
|
|
|
|
separator = separator_list[i];
|
|
|
|
|
insertOperator( mml_node, QString( separator ) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( mml_type == MfencedNode )
|
|
|
|
|
insertOperator( mml_node, mml_node->explicitAttribute( "close", ")" ) );
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*ok = true;
|
|
|
|
|
return mml_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlDocument::createImplicitMrowNode( const QDomNode &dom_node, bool *ok,
|
|
|
|
|
QString *errorMsg )
|
|
|
|
|
{
|
|
|
|
|
QDomNodeList dom_child_list = dom_node.childNodes();
|
|
|
|
|
int child_cnt = dom_child_list.count();
|
|
|
|
|
|
|
|
|
|
if ( child_cnt == 0 )
|
|
|
|
|
{
|
|
|
|
|
*ok = true;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( child_cnt == 1 )
|
|
|
|
|
return domToMml( dom_child_list.item( 0 ), ok, errorMsg );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *mml_node = createNode( MrowNode, QwtMmlAttributeMap(),
|
|
|
|
|
QString::null, errorMsg );
|
|
|
|
|
Q_ASSERT( mml_node != 0 ); // there is no reason in heaven or hell for this to fail
|
|
|
|
|
|
|
|
|
|
for ( int i = 0; i < child_cnt; ++i )
|
|
|
|
|
{
|
|
|
|
|
QDomNode dom_child = dom_child_list.item( i );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg );
|
|
|
|
|
if ( !*ok )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
|
|
|
{
|
|
|
|
|
delete mml_node;
|
|
|
|
|
delete mml_child;
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mml_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlDocument::paint( QPainter *p, const QPoint &pos ) const
|
|
|
|
|
{
|
|
|
|
|
if ( m_root_node == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* p->save();
|
|
|
|
|
p->setPen(Qt::blue);
|
|
|
|
|
p->drawLine(pos.x() - 5, pos.y(), pos.x() + 5, pos.y());
|
|
|
|
|
p->drawLine(pos.x(), pos.y() - 5, pos.x(), pos.y() + 5);
|
|
|
|
|
p->restore(); */
|
|
|
|
|
|
|
|
|
|
QRect mr = m_root_node->myRect();
|
|
|
|
|
m_root_node->setRelOrigin( pos - mr.topLeft() );
|
|
|
|
|
m_root_node->paint( p );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize QwtMmlDocument::size() const
|
|
|
|
|
{
|
|
|
|
|
if ( m_root_node == 0 )
|
|
|
|
|
return QSize( 0, 0 );
|
|
|
|
|
return m_root_node->deviceRect().size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
// QwtMmlNode
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QwtMmlNode::QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
{
|
|
|
|
|
m_parent = 0;
|
|
|
|
|
m_first_child = 0;
|
|
|
|
|
m_next_sibling = 0;
|
|
|
|
|
m_previous_sibling = 0;
|
|
|
|
|
|
|
|
|
|
m_node_type = type;
|
|
|
|
|
m_document = document;
|
|
|
|
|
m_attribute_map = attribute_map;
|
|
|
|
|
|
|
|
|
|
m_my_rect = m_parent_rect = QRect( 0, 0, 0, 0 );
|
|
|
|
|
m_rel_origin = QPoint( 0, 0 );
|
|
|
|
|
m_stretched = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode::~QwtMmlNode()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *n = firstChild();
|
|
|
|
|
while ( n != 0 )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *tmp = n->nextSibling();
|
|
|
|
|
delete n;
|
|
|
|
|
n = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QString rectToStr( const QRect &rect )
|
|
|
|
|
{
|
|
|
|
|
return QString( "[(%1, %2), %3x%4]" )
|
|
|
|
|
.arg( rect.x() )
|
|
|
|
|
.arg( rect.y() )
|
|
|
|
|
.arg( rect.width() )
|
|
|
|
|
.arg( rect.height() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlNode::toStr() const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( nodeType() );
|
|
|
|
|
Q_ASSERT( spec != 0 );
|
|
|
|
|
|
|
|
|
|
return QString( "%1 %2 mr=%3 pr=%4 dr=%5 ro=(%7, %8) str=%9" )
|
|
|
|
|
.arg( spec->type_str )
|
|
|
|
|
.arg( ( quintptr )this, 0, 16 )
|
|
|
|
|
.arg( rectToStr( myRect() ) )
|
|
|
|
|
.arg( rectToStr( parentRect() ) )
|
|
|
|
|
.arg( rectToStr( deviceRect() ) )
|
|
|
|
|
.arg( m_rel_origin.x() )
|
|
|
|
|
.arg( m_rel_origin.y() )
|
|
|
|
|
.arg( ( int )isStretched() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::interpretSpacing( const QString &value, bool *ok ) const
|
|
|
|
|
{
|
|
|
|
|
return ::interpretSpacing( value, em(), ex(), ok );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::basePos() const
|
|
|
|
|
{
|
|
|
|
|
QFontMetrics fm( font() );
|
|
|
|
|
return fm.strikeOutPos();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::underlinePos() const
|
|
|
|
|
{
|
|
|
|
|
QFontMetrics fm( font() );
|
|
|
|
|
return basePos() + fm.underlinePos();
|
|
|
|
|
}
|
|
|
|
|
int QwtMmlNode::overlinePos() const
|
|
|
|
|
{
|
|
|
|
|
QFontMetrics fm( font() );
|
|
|
|
|
return basePos() - fm.overlinePos();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlNode::lastSibling() const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNode *n = this;
|
|
|
|
|
while ( !n->isLastSibling() )
|
|
|
|
|
n = n->nextSibling();
|
|
|
|
|
return const_cast<QwtMmlNode*>( n );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlNode::firstSibling() const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNode *n = this;
|
|
|
|
|
while ( !n->isFirstSibling() )
|
|
|
|
|
n = n->previousSibling();
|
|
|
|
|
return const_cast<QwtMmlNode*>( n );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::em() const
|
|
|
|
|
{
|
|
|
|
|
return QFontMetrics( font() ).boundingRect( 'm' ).width();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::ex() const
|
|
|
|
|
{
|
|
|
|
|
return QFontMetrics( font() ).boundingRect( 'x' ).height();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlNode::scriptlevel( const QwtMmlNode * ) const
|
|
|
|
|
{
|
|
|
|
|
int parent_sl;
|
|
|
|
|
const QwtMmlNode *p = parent();
|
|
|
|
|
if ( p == 0 )
|
|
|
|
|
parent_sl = 0;
|
|
|
|
|
else
|
|
|
|
|
parent_sl = p->scriptlevel( this );
|
|
|
|
|
|
|
|
|
|
QString expl_sl_str = explicitAttribute( "scriptlevel" );
|
|
|
|
|
if ( expl_sl_str.isNull() )
|
|
|
|
|
return parent_sl;
|
|
|
|
|
|
|
|
|
|
if ( expl_sl_str.startsWith( "+" ) || expl_sl_str.startsWith( "-" ) )
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
int expl_sl = expl_sl_str.toInt( &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
return parent_sl + expl_sl;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "QwtMmlNode::scriptlevel(): bad value " + expl_sl_str;
|
|
|
|
|
return parent_sl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int expl_sl = expl_sl_str.toInt( &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return expl_sl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( expl_sl_str == "+" )
|
|
|
|
|
return parent_sl + 1;
|
|
|
|
|
else if ( expl_sl_str == "-" )
|
|
|
|
|
return parent_sl - 1;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "QwtMmlNode::scriptlevel(): could not parse value: \"" + expl_sl_str + "\"";
|
|
|
|
|
return parent_sl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPoint QwtMmlNode::devicePoint( const QPoint &p ) const
|
|
|
|
|
{
|
|
|
|
|
QRect mr = myRect();
|
|
|
|
|
QRect dr = deviceRect();
|
|
|
|
|
|
|
|
|
|
if ( isStretched() )
|
|
|
|
|
return dr.topLeft() + QPoint( ( p.x() - mr.left() ) * dr.width() / mr.width(),
|
|
|
|
|
( p.y() - mr.top() ) * dr.height() / mr.height() );
|
|
|
|
|
else
|
|
|
|
|
return dr.topLeft() + p - mr.topLeft();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlNode::inheritAttributeFromMrow( const QString &name,
|
|
|
|
|
const QString &def ) const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNode *p = this;
|
|
|
|
|
for ( ; p != 0; p = p->parent() )
|
|
|
|
|
{
|
|
|
|
|
if ( p == this || p->nodeType() == MstyleNode )
|
|
|
|
|
{
|
|
|
|
|
QString value = p->explicitAttribute( name );
|
|
|
|
|
if ( !value.isNull() )
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return def;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QColor QwtMmlNode::color() const
|
|
|
|
|
{
|
|
|
|
|
// If we are child of <merror> return red
|
|
|
|
|
const QwtMmlNode *p = this;
|
|
|
|
|
for ( ; p != 0; p = p->parent() )
|
|
|
|
|
{
|
|
|
|
|
if ( p->nodeType() == MerrorNode )
|
|
|
|
|
return QColor( "red" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString value_str = inheritAttributeFromMrow( "mathcolor" );
|
|
|
|
|
if ( value_str.isNull() )
|
|
|
|
|
value_str = inheritAttributeFromMrow( "color" );
|
|
|
|
|
if ( value_str.isNull() )
|
|
|
|
|
return QColor();
|
|
|
|
|
|
|
|
|
|
return QColor( value_str );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QColor QwtMmlNode::background() const
|
|
|
|
|
{
|
|
|
|
|
QString value_str = inheritAttributeFromMrow( "mathbackground" );
|
|
|
|
|
if ( value_str.isNull() )
|
|
|
|
|
value_str = inheritAttributeFromMrow( "background" );
|
|
|
|
|
if ( value_str.isNull() )
|
|
|
|
|
return QColor();
|
|
|
|
|
|
|
|
|
|
return QColor( value_str );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void updateFontAttr( QwtMmlAttributeMap &font_attr, const QwtMmlNode *n,
|
|
|
|
|
const QString &name, const QString &preferred_name = QString::null )
|
|
|
|
|
{
|
|
|
|
|
if ( font_attr.contains( preferred_name ) || font_attr.contains( name ) )
|
|
|
|
|
return;
|
|
|
|
|
QString value = n->explicitAttribute( name );
|
|
|
|
|
if ( !value.isNull() )
|
|
|
|
|
font_attr[name] = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QwtMmlAttributeMap collectFontAttributes( const QwtMmlNode *node )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlAttributeMap font_attr;
|
|
|
|
|
|
|
|
|
|
for ( const QwtMmlNode *n = node; n != 0; n = n->parent() )
|
|
|
|
|
{
|
|
|
|
|
if ( n == node || n->nodeType() == QwtMml::MstyleNode )
|
|
|
|
|
{
|
|
|
|
|
updateFontAttr( font_attr, n, "mathvariant" );
|
|
|
|
|
updateFontAttr( font_attr, n, "mathsize" );
|
|
|
|
|
|
|
|
|
|
// depreciated attributes
|
|
|
|
|
updateFontAttr( font_attr, n, "fontsize", "mathsize" );
|
|
|
|
|
updateFontAttr( font_attr, n, "fontweight", "mathvariant" );
|
|
|
|
|
updateFontAttr( font_attr, n, "fontstyle", "mathvariant" );
|
|
|
|
|
updateFontAttr( font_attr, n, "fontfamily", "mathvariant" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return font_attr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QFont QwtMmlNode::font() const
|
|
|
|
|
{
|
|
|
|
|
QFont fn( document()->fontName( QwtMathMLDocument::NormalFont ),
|
|
|
|
|
document()->baseFontPointSize() );
|
|
|
|
|
|
|
|
|
|
int ps = fn.pointSize();
|
|
|
|
|
int sl = scriptlevel();
|
|
|
|
|
if ( sl >= 0 )
|
|
|
|
|
{
|
|
|
|
|
for ( int i = 0; i < sl; ++i )
|
|
|
|
|
ps = ( int )( ps * g_script_size_multiplier );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for ( int i = 0; i > sl; --i )
|
|
|
|
|
ps = ( int )( ps / g_script_size_multiplier );
|
|
|
|
|
}
|
|
|
|
|
if ( ps < g_min_font_point_size )
|
|
|
|
|
ps = g_min_font_point_size;
|
|
|
|
|
fn.setPointSize( ps );
|
|
|
|
|
|
|
|
|
|
int em = QFontMetrics( fn ).boundingRect( 'm' ).width();
|
|
|
|
|
int ex = QFontMetrics( fn ).boundingRect( 'x' ).height();
|
|
|
|
|
|
|
|
|
|
QwtMmlAttributeMap font_attr = collectFontAttributes( this );
|
|
|
|
|
|
|
|
|
|
if ( font_attr.contains( "mathvariant" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["mathvariant"];
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
uint mv = interpretMathVariant( value, &ok );
|
|
|
|
|
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
if ( mv & ScriptMV )
|
|
|
|
|
fn.setFamily( document()->fontName( QwtMathMLDocument::ScriptFont ) );
|
|
|
|
|
|
|
|
|
|
if ( mv & FrakturMV )
|
|
|
|
|
fn.setFamily( document()->fontName( QwtMathMLDocument::FrakturFont ) );
|
|
|
|
|
|
|
|
|
|
if ( mv & SansSerifMV )
|
|
|
|
|
fn.setFamily( document()->fontName( QwtMathMLDocument::SansSerifFont ) );
|
|
|
|
|
|
|
|
|
|
if ( mv & MonospaceMV )
|
|
|
|
|
fn.setFamily( document()->fontName( QwtMathMLDocument::MonospaceFont ) );
|
|
|
|
|
|
|
|
|
|
if ( mv & DoubleStruckMV )
|
|
|
|
|
fn.setFamily( document()->fontName( QwtMathMLDocument::DoublestruckFont ) );
|
|
|
|
|
|
|
|
|
|
if ( mv & BoldMV )
|
|
|
|
|
fn.setBold( true );
|
|
|
|
|
|
|
|
|
|
if ( mv & ItalicMV )
|
|
|
|
|
fn.setItalic( true );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( font_attr.contains( "mathsize" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["mathsize"];
|
|
|
|
|
fn = interpretMathSize( value, fn, em, ex, 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn = interpretDepreciatedFontAttr( font_attr, fn, em, ex );
|
|
|
|
|
|
|
|
|
|
if ( nodeType() == MiNode
|
|
|
|
|
&& !font_attr.contains( "mathvariant" )
|
|
|
|
|
&& !font_attr.contains( "fontstyle" ) )
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlMiNode *mi_node = ( const QwtMmlMiNode* ) this;
|
|
|
|
|
if ( mi_node->text().length() == 1 )
|
|
|
|
|
fn.setItalic( true );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( nodeType() == MoNode )
|
|
|
|
|
{
|
|
|
|
|
fn.setItalic( false );
|
|
|
|
|
fn.setBold( false );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlNode::explicitAttribute( const QString &name, const QString &def ) const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlAttributeMap::const_iterator it = m_attribute_map.find( name );
|
|
|
|
|
if ( it != m_attribute_map.end() )
|
|
|
|
|
return *it;
|
|
|
|
|
return def;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlNode::parentRect() const
|
|
|
|
|
{
|
|
|
|
|
if ( isStretched() )
|
|
|
|
|
return m_parent_rect;
|
|
|
|
|
|
|
|
|
|
QRect mr = myRect();
|
|
|
|
|
QPoint ro = relOrigin();
|
|
|
|
|
|
|
|
|
|
return QRect( ro + mr.topLeft(), mr.size() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::stretchTo( const QRect &rect )
|
|
|
|
|
{
|
|
|
|
|
m_parent_rect = rect;
|
|
|
|
|
m_stretched = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::setRelOrigin( const QPoint &rel_origin )
|
|
|
|
|
{
|
|
|
|
|
m_rel_origin = rel_origin + QPoint( -myRect().left(), 0 );
|
|
|
|
|
m_stretched = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::updateMyRect()
|
|
|
|
|
{
|
|
|
|
|
m_my_rect = symbolRect();
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
m_my_rect |= child->parentRect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::layout()
|
|
|
|
|
{
|
|
|
|
|
m_parent_rect = QRect( 0, 0, 0, 0 );
|
|
|
|
|
m_stretched = false;
|
|
|
|
|
m_rel_origin = QPoint( 0, 0 );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
child->layout();
|
|
|
|
|
|
|
|
|
|
layoutSymbol();
|
|
|
|
|
|
|
|
|
|
updateMyRect();
|
|
|
|
|
|
|
|
|
|
if ( parent() == 0 )
|
|
|
|
|
m_rel_origin = QPoint( 0, 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlNode::deviceRect() const
|
|
|
|
|
{
|
|
|
|
|
if ( parent() == 0 )
|
|
|
|
|
return QRect( relOrigin() + myRect().topLeft(), myRect().size() );
|
|
|
|
|
|
|
|
|
|
/* if (!isStretched()) {
|
|
|
|
|
QRect pdr = parent()->deviceRect();
|
|
|
|
|
QRect pmr = parent()->myRect();
|
|
|
|
|
QRect pr = parentRect();
|
|
|
|
|
QRect mr = myRect();
|
|
|
|
|
return QRect(pdr.left() + pr.left() - pmr.left(),
|
|
|
|
|
pdr.top() + pr.top() - pmr.top(),
|
|
|
|
|
mr.width(), mr.height());
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
QRect pdr = parent()->deviceRect();
|
|
|
|
|
QRect pr = parentRect();
|
|
|
|
|
QRect pmr = parent()->myRect();
|
|
|
|
|
|
|
|
|
|
float scale_w = 0;
|
|
|
|
|
if ( pmr.width() != 0 )
|
|
|
|
|
scale_w = ( float )pdr.width() / pmr.width();
|
|
|
|
|
float scale_h = 0;
|
|
|
|
|
if ( pmr.height() != 0 )
|
|
|
|
|
scale_h = ( float )pdr.height() / pmr.height();
|
|
|
|
|
|
|
|
|
|
return QRect( pdr.left() + ROUND( ( pr.left() - pmr.left() ) * scale_w ),
|
|
|
|
|
pdr.top() + ROUND( ( pr.top() - pmr.top() ) * scale_h ),
|
|
|
|
|
ROUND( ( pr.width() * scale_w ) ),
|
|
|
|
|
ROUND( ( pr.height() * scale_h ) ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
// default behaves like an mrow
|
|
|
|
|
|
|
|
|
|
// now lay them out in a neat row, aligning their origins to my origin
|
|
|
|
|
int w = 0;
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
{
|
|
|
|
|
child->setRelOrigin( QPoint( w, 0 ) );
|
|
|
|
|
w += child->parentRect().width() + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::paint( QPainter *p )
|
|
|
|
|
{
|
|
|
|
|
if ( !myRect().isValid() )
|
|
|
|
|
return;
|
|
|
|
|
p->save();
|
|
|
|
|
|
|
|
|
|
QColor fg = color();
|
|
|
|
|
QColor bg = background();
|
|
|
|
|
if ( bg.isValid() )
|
|
|
|
|
p->fillRect( myRect(), bg );
|
|
|
|
|
if ( fg.isValid() )
|
|
|
|
|
p->setPen( QPen( color(), 0 ) );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
child->paint( p );
|
|
|
|
|
|
|
|
|
|
paintSymbol( p );
|
|
|
|
|
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::paintSymbol( QPainter *p ) const
|
|
|
|
|
{
|
|
|
|
|
if ( g_draw_frames && myRect().isValid() )
|
|
|
|
|
{
|
|
|
|
|
p->save();
|
|
|
|
|
p->setPen( QPen( Qt::red, 0 ) );
|
|
|
|
|
p->drawRect( m_my_rect );
|
|
|
|
|
QPen pen = p->pen();
|
|
|
|
|
pen.setStyle( Qt::DotLine );
|
|
|
|
|
p->setPen( pen );
|
|
|
|
|
p->drawLine( myRect().left(), 0, myRect().right(), 0 );
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlNode::stretch()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
child->stretch();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlTokenNode::text() const
|
|
|
|
|
{
|
|
|
|
|
QString result;
|
|
|
|
|
|
|
|
|
|
const QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
{
|
|
|
|
|
if ( child->nodeType() != TextNode ) continue;
|
|
|
|
|
if ( !result.isEmpty() )
|
|
|
|
|
result += ' ';
|
|
|
|
|
result += static_cast<const QwtMmlTextNode *>( child )->text();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlMfracNode::numerator() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *node = firstChild();
|
|
|
|
|
Q_ASSERT( node != 0 );
|
|
|
|
|
return node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlMfracNode::denominator() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *node = numerator()->nextSibling();
|
|
|
|
|
Q_ASSERT( node != 0 );
|
|
|
|
|
return node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlMfracNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
int num_width = numerator()->myRect().width();
|
|
|
|
|
int denom_width = denominator()->myRect().width();
|
|
|
|
|
int my_width = qMax( num_width, denom_width ) + 4;
|
|
|
|
|
|
|
|
|
|
return QRect( -my_width / 2, 0, my_width, 1 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMfracNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *num = numerator();
|
|
|
|
|
QwtMmlNode *denom = denominator();
|
|
|
|
|
|
|
|
|
|
QRect num_rect = num->myRect();
|
|
|
|
|
QRect denom_rect = denom->myRect();
|
|
|
|
|
|
|
|
|
|
int spacing = ( int )( g_mfrac_spacing * ( num_rect.height() + denom_rect.height() ) );
|
|
|
|
|
|
|
|
|
|
num->setRelOrigin( QPoint( -num_rect.width() / 2, - spacing - num_rect.bottom() ) );
|
|
|
|
|
denom->setRelOrigin( QPoint( -denom_rect.width() / 2, spacing - denom_rect.top() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool zeroLineThickness( const QString &s )
|
|
|
|
|
{
|
|
|
|
|
if ( s.length() == 0 || !s[0].isDigit() )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
for ( int i = 0; i < s.length(); ++i )
|
|
|
|
|
{
|
|
|
|
|
QChar c = s.at( i );
|
|
|
|
|
if ( c.isDigit() && c != '0' )
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMfracNode::paintSymbol( QPainter *p ) const
|
|
|
|
|
{
|
|
|
|
|
QString linethickness_str = inheritAttributeFromMrow( "linethickness", "1" );
|
|
|
|
|
|
|
|
|
|
/* InterpretSpacing returns an int, which might be 0 even if the thickness
|
|
|
|
|
is > 0, though very very small. That's ok, because the painter then paints
|
|
|
|
|
a line of thickness 1. However, we have to run this check if the line
|
|
|
|
|
thickness really is zero */
|
|
|
|
|
if ( !zeroLineThickness( linethickness_str ) )
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
int linethickness = interpretSpacing( linethickness_str, &ok );
|
|
|
|
|
if ( !ok )
|
|
|
|
|
linethickness = 1;
|
|
|
|
|
|
|
|
|
|
p->save();
|
|
|
|
|
QPen pen = p->pen();
|
|
|
|
|
pen.setWidth( linethickness );
|
|
|
|
|
p->setPen( pen );
|
|
|
|
|
QSize s = myRect().size();
|
|
|
|
|
p->drawLine( -s.width() / 2, 0, s.width() / 2, 0 );
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlRootBaseNode::base() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *node = firstChild();
|
|
|
|
|
// Q_ASSERT(node != 0);
|
|
|
|
|
return node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlRootBaseNode::index() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
if ( b == 0 )
|
|
|
|
|
return 0;
|
|
|
|
|
return b->nextSibling();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlRootBaseNode::scriptlevel( const QwtMmlNode *child ) const
|
|
|
|
|
{
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *i = index();
|
|
|
|
|
if ( child != 0 && child == i )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlRootBaseNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
QRect base_rect;
|
|
|
|
|
if ( b == 0 )
|
|
|
|
|
base_rect = QRect( 0, 0, 1, 1 );
|
|
|
|
|
else
|
|
|
|
|
base_rect = base()->myRect();
|
|
|
|
|
|
|
|
|
|
int margin = ( int )( g_mroot_base_margin * base_rect.height() );
|
|
|
|
|
int tw = tailWidth();
|
|
|
|
|
|
|
|
|
|
return QRect( -tw, base_rect.top() - margin, tw,
|
|
|
|
|
base_rect.height() + 2 * margin );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlRootBaseNode::tailWidth() const
|
|
|
|
|
{
|
|
|
|
|
QFontMetrics fm( font() );
|
|
|
|
|
return fm.boundingRect( g_radical_char ).width();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlRootBaseNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
QSize base_size;
|
|
|
|
|
if ( b != 0 )
|
|
|
|
|
{
|
|
|
|
|
b->setRelOrigin( QPoint( 0, 0 ) );
|
|
|
|
|
base_size = base()->myRect().size();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
base_size = QSize( 1, 1 );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *i = index();
|
|
|
|
|
if ( i != 0 )
|
|
|
|
|
{
|
|
|
|
|
int tw = tailWidth();
|
|
|
|
|
|
|
|
|
|
QRect i_rect = i->myRect();
|
|
|
|
|
i->setRelOrigin( QPoint( -tw / 2 - i_rect.width(),
|
|
|
|
|
-i_rect.bottom() - 4 ) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlRootBaseNode::paintSymbol( QPainter *p ) const
|
|
|
|
|
{
|
|
|
|
|
QFont fn = font();
|
|
|
|
|
|
|
|
|
|
p->save();
|
|
|
|
|
|
|
|
|
|
QRect sr = symbolRect();
|
|
|
|
|
|
|
|
|
|
QRect r = sr;
|
|
|
|
|
r.moveTopLeft( devicePoint( sr.topLeft() ) );
|
|
|
|
|
p->setViewport( r );
|
|
|
|
|
p->setWindow( QFontMetrics( fn ).boundingRect( g_radical_char ) );
|
|
|
|
|
p->setFont( font() );
|
|
|
|
|
p->drawText( 0, 0, QString( g_radical_char ) );
|
|
|
|
|
|
|
|
|
|
p->restore();
|
|
|
|
|
|
|
|
|
|
p->drawLine( sr.right(), sr.top(), myRect().right(), sr.top() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlTextNode::QwtMmlTextNode( const QString &text, QwtMmlDocument *document )
|
|
|
|
|
: QwtMmlNode( TextNode, document, QwtMmlAttributeMap() )
|
|
|
|
|
{
|
|
|
|
|
m_text = text;
|
|
|
|
|
// Trim whitespace from ends, but keep nbsp and thinsp
|
|
|
|
|
m_text.remove( QRegExp( "^[^\\S\\x00a0\\x2009]+" ) );
|
|
|
|
|
m_text.remove( QRegExp( "[^\\S\\x00a0\\x2009]+$" ) );
|
|
|
|
|
|
|
|
|
|
if ( m_text == QString( QChar( 0x62, 0x20 ) ) // ⁢
|
|
|
|
|
|| m_text == QString( QChar( 0x63, 0x20 ) ) // ⁣
|
|
|
|
|
|| m_text == QString( QChar( 0x61, 0x20 ) ) ) // ⁡
|
|
|
|
|
m_text = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlTextNode::toStr() const
|
|
|
|
|
{
|
|
|
|
|
return QwtMmlNode::toStr() + ", text=\"" + m_text + "\"";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlTextNode::paintSymbol( QPainter *p ) const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode::paintSymbol( p );
|
|
|
|
|
|
|
|
|
|
QFont fn = font();
|
|
|
|
|
|
|
|
|
|
QFontInfo fi( fn );
|
|
|
|
|
// qWarning("MmlTextNode::paintSymbol(): requested: %s, used: %s, size=%d, italic=%d, bold=%d, text=\"%s\" sl=%d",
|
|
|
|
|
// fn.family().latin1(), fi.family().latin1(), fi.pointSize(), (int)fi.italic(), (int)fi.bold(), m_text.latin1(), scriptlevel());
|
|
|
|
|
|
|
|
|
|
QFontMetrics fm( fn );
|
|
|
|
|
|
|
|
|
|
p->save();
|
|
|
|
|
p->setFont( fn );
|
|
|
|
|
|
|
|
|
|
QPoint dPos = devicePoint( relOrigin() );
|
|
|
|
|
p->drawText( dPos.x(), dPos.y() + fm.strikeOutPos(), m_text );
|
|
|
|
|
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlTextNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
QFontMetrics fm( font() );
|
|
|
|
|
|
|
|
|
|
QRect br = fm.tightBoundingRect( m_text );
|
|
|
|
|
br.translate( 0, fm.strikeOutPos() );
|
|
|
|
|
|
|
|
|
|
return br;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlSubsupBaseNode::base() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = firstChild();
|
|
|
|
|
Q_ASSERT( b != 0 );
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlSubsupBaseNode::sscript() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *s = base()->nextSibling();
|
|
|
|
|
Q_ASSERT( s != 0 );
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlSubsupBaseNode::scriptlevel( const QwtMmlNode *child ) const
|
|
|
|
|
{
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *s = sscript();
|
|
|
|
|
if ( child != 0 && child == s )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMsupNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
QwtMmlNode *s = sscript();
|
|
|
|
|
|
|
|
|
|
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
|
|
|
s->setRelOrigin( QPoint( 0, b->myRect().top() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMsubNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
QwtMmlNode *s = sscript();
|
|
|
|
|
|
|
|
|
|
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
|
|
|
s->setRelOrigin( QPoint( 0, b->myRect().bottom() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlMsubsupNode::base() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = firstChild();
|
|
|
|
|
Q_ASSERT( b != 0 );
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlMsubsupNode::subscript() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *sub = base()->nextSibling();
|
|
|
|
|
Q_ASSERT( sub != 0 );
|
|
|
|
|
return sub;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *QwtMmlMsubsupNode::superscript() const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *sup = subscript()->nextSibling();
|
|
|
|
|
Q_ASSERT( sup != 0 );
|
|
|
|
|
return sup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMsubsupNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *b = base();
|
|
|
|
|
QwtMmlNode *sub = subscript();
|
|
|
|
|
QwtMmlNode *sup = superscript();
|
|
|
|
|
|
|
|
|
|
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
|
|
|
sub->setRelOrigin( QPoint( 0, b->myRect().bottom() ) );
|
|
|
|
|
sup->setRelOrigin( QPoint( 0, b->myRect().top() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMsubsupNode::scriptlevel( const QwtMmlNode *child ) const
|
|
|
|
|
{
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *sub = subscript();
|
|
|
|
|
QwtMmlNode *sup = superscript();
|
|
|
|
|
|
|
|
|
|
if ( child != 0 && ( child == sup || child == sub ) )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlMoNode::toStr() const
|
|
|
|
|
{
|
|
|
|
|
return QwtMmlNode::toStr() + QString( " form=%1" ).arg( ( int )form() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMoNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
if ( child == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
child->setRelOrigin( QPoint( 0, 0 ) );
|
|
|
|
|
|
|
|
|
|
if ( m_oper_spec == 0 )
|
|
|
|
|
m_oper_spec = mmlFindOperSpec( text(), form() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlMoNode::QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
|
|
|
: QwtMmlTokenNode( MoNode, document, attribute_map )
|
|
|
|
|
{
|
|
|
|
|
m_oper_spec = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QwtMmlMoNode::dictionaryAttribute( const QString &name ) const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNode *p = this;
|
|
|
|
|
for ( ; p != 0; p = p->parent() )
|
|
|
|
|
{
|
|
|
|
|
if ( p == this || p->nodeType() == MstyleNode )
|
|
|
|
|
{
|
|
|
|
|
QString expl_attr = p->explicitAttribute( name );
|
|
|
|
|
if ( !expl_attr.isNull() )
|
|
|
|
|
return expl_attr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mmlDictAttribute( name, m_oper_spec );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMml::FormType QwtMmlMoNode::form() const
|
|
|
|
|
{
|
|
|
|
|
QString value_str = inheritAttributeFromMrow( "form" );
|
|
|
|
|
if ( !value_str.isNull() )
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
FormType value = interpretForm( value_str, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return value;
|
|
|
|
|
else
|
|
|
|
|
qWarning( "Could not convert %s to form", value_str.toLatin1().data() );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Default heuristic.
|
|
|
|
|
if ( firstSibling() == ( QwtMmlNode* )this && lastSibling() != ( QwtMmlNode* )this )
|
|
|
|
|
return PrefixForm;
|
|
|
|
|
else if ( lastSibling() == ( QwtMmlNode* )this && firstSibling() != ( QwtMmlNode* )this )
|
|
|
|
|
return PostfixForm;
|
|
|
|
|
else return InfixForm;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMoNode::stretch()
|
|
|
|
|
{
|
|
|
|
|
if ( parent() == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( m_oper_spec == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( m_oper_spec->stretch_dir == QwtMmlOperSpec::HStretch
|
|
|
|
|
&& parent()->nodeType() == MrowNode
|
|
|
|
|
&& ( nextSibling() != 0 || previousSibling() != 0 ) )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QRect pmr = parent()->myRect();
|
|
|
|
|
QRect pr = parentRect();
|
|
|
|
|
|
|
|
|
|
switch ( m_oper_spec->stretch_dir )
|
|
|
|
|
{
|
|
|
|
|
case QwtMmlOperSpec::VStretch:
|
|
|
|
|
stretchTo( QRect( pr.left(), pmr.top(), pr.width(), pmr.height() ) );
|
|
|
|
|
break;
|
|
|
|
|
case QwtMmlOperSpec::HStretch:
|
|
|
|
|
stretchTo( QRect( pmr.left(), pr.top(), pmr.width(), pr.height() ) );
|
|
|
|
|
break;
|
|
|
|
|
case QwtMmlOperSpec::HVStretch:
|
|
|
|
|
stretchTo( pmr );
|
|
|
|
|
break;
|
|
|
|
|
case QwtMmlOperSpec::NoStretch:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMoNode::lspace() const
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( m_oper_spec != 0 );
|
|
|
|
|
if ( parent() == 0
|
|
|
|
|
|| ( parent()->nodeType() != MrowNode
|
|
|
|
|
&& parent()->nodeType() != MfencedNode
|
|
|
|
|
&& parent()->nodeType() != UnknownNode )
|
|
|
|
|
|| ( previousSibling() == 0 && nextSibling() == 0 ) )
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
return interpretSpacing( dictionaryAttribute( "lspace" ), 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMoNode::rspace() const
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( m_oper_spec != 0 );
|
|
|
|
|
if ( parent() == 0
|
|
|
|
|
|| ( parent()->nodeType() != MrowNode
|
|
|
|
|
&& parent()->nodeType() != MfencedNode
|
|
|
|
|
&& parent()->nodeType() != UnknownNode )
|
|
|
|
|
|| ( previousSibling() == 0 && nextSibling() == 0 ) )
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
return interpretSpacing( dictionaryAttribute( "rspace" ), 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlMoNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNode *child = firstChild();
|
|
|
|
|
|
|
|
|
|
if ( child == 0 )
|
|
|
|
|
return QRect( 0, 0, 0, 0 );
|
|
|
|
|
|
|
|
|
|
QRect cmr = child->myRect();
|
|
|
|
|
|
|
|
|
|
return QRect( -lspace(), cmr.top(),
|
|
|
|
|
cmr.width() + lspace() + rspace(), cmr.height() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMtableNode::rowspacing() const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "rowspacing" );
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return ex();
|
|
|
|
|
bool ok;
|
|
|
|
|
int r = interpretSpacing( value, &ok );
|
|
|
|
|
|
|
|
|
|
if ( ok )
|
|
|
|
|
return r;
|
|
|
|
|
else
|
|
|
|
|
return ex();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMtableNode::columnspacing() const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "columnspacing" );
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return ( int )( 0.8 * em() );
|
|
|
|
|
bool ok;
|
|
|
|
|
int r = interpretSpacing( value, &ok );
|
|
|
|
|
|
|
|
|
|
if ( ok )
|
|
|
|
|
return r;
|
|
|
|
|
else
|
|
|
|
|
return ( int )( 0.8 * em() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint QwtMmlMtableNode::CellSizeData::colWidthSum() const
|
|
|
|
|
{
|
|
|
|
|
uint w = 0;
|
|
|
|
|
for ( int i = 0; i < col_widths.count(); ++i )
|
|
|
|
|
w += col_widths[i];
|
|
|
|
|
return w;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint QwtMmlMtableNode::CellSizeData::rowHeightSum() const
|
|
|
|
|
{
|
|
|
|
|
uint h = 0;
|
|
|
|
|
for ( int i = 0; i < row_heights.count(); ++i )
|
|
|
|
|
h += row_heights[i];
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMtableNode::CellSizeData::init( const QwtMmlNode *first_row )
|
|
|
|
|
{
|
|
|
|
|
col_widths.clear();
|
|
|
|
|
row_heights.clear();
|
|
|
|
|
|
|
|
|
|
const QwtMmlNode *mtr = first_row;
|
|
|
|
|
for ( ; mtr != 0; mtr = mtr->nextSibling() )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Q_ASSERT( mtr->nodeType() == MtrNode );
|
|
|
|
|
|
|
|
|
|
int col_cnt = 0;
|
|
|
|
|
const QwtMmlNode *mtd = mtr->firstChild();
|
|
|
|
|
for ( ; mtd != 0; mtd = mtd->nextSibling(), ++col_cnt )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Q_ASSERT( mtd->nodeType() == MtdNode );
|
|
|
|
|
|
|
|
|
|
QRect mtdmr = mtd->myRect();
|
|
|
|
|
|
|
|
|
|
if ( col_cnt == col_widths.count() )
|
|
|
|
|
col_widths.append( mtdmr.width() );
|
|
|
|
|
else
|
|
|
|
|
col_widths[col_cnt] = qMax( col_widths[col_cnt], mtdmr.width() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
row_heights.append( mtr->myRect().height() );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMtableNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
// Obtain natural widths of columns
|
|
|
|
|
m_cell_size_data.init( firstChild() );
|
|
|
|
|
|
|
|
|
|
int col_spc = columnspacing();
|
|
|
|
|
int row_spc = rowspacing();
|
|
|
|
|
int frame_spc_hor = framespacing_hor();
|
|
|
|
|
QString columnwidth_attr = explicitAttribute( "columnwidth", "auto" );
|
|
|
|
|
|
|
|
|
|
// Is table width set by user? If so, set col_width_sum and never ever change it.
|
|
|
|
|
int col_width_sum = m_cell_size_data.colWidthSum();
|
|
|
|
|
bool width_set_by_user = false;
|
|
|
|
|
QString width_str = explicitAttribute( "width", "auto" );
|
|
|
|
|
if ( width_str != "auto" )
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
|
|
int w = interpretSpacing( width_str, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
col_width_sum = w
|
|
|
|
|
- col_spc * ( m_cell_size_data.numCols() - 1 )
|
|
|
|
|
- frame_spc_hor * 2;
|
|
|
|
|
width_set_by_user = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Find out what kind of columns we are dealing with and set the widths of
|
|
|
|
|
// statically sized columns.
|
|
|
|
|
int fixed_width_sum = 0; // sum of widths of statically sized set columns
|
|
|
|
|
int auto_width_sum = 0; // sum of natural widths of auto sized columns
|
|
|
|
|
int relative_width_sum = 0; // sum of natural widths of relatively sized columns
|
|
|
|
|
double relative_fraction_sum = 0; // total fraction of width taken by relatively
|
|
|
|
|
// sized columns
|
|
|
|
|
int i;
|
|
|
|
|
for ( i = 0; i < m_cell_size_data.numCols(); ++i )
|
|
|
|
|
{
|
|
|
|
|
QString value = interpretListAttr( columnwidth_attr, i, "auto" );
|
|
|
|
|
|
|
|
|
|
// Is it an auto sized column?
|
|
|
|
|
if ( value == "auto" || value == "fit" )
|
|
|
|
|
{
|
|
|
|
|
auto_width_sum += m_cell_size_data.col_widths[i];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Is it a statically sized column?
|
|
|
|
|
bool ok;
|
|
|
|
|
int w = interpretSpacing( value, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
// Yup, sets its width to the user specified value
|
|
|
|
|
m_cell_size_data.col_widths[i] = w;
|
|
|
|
|
fixed_width_sum += w;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Is it a relatively sized column?
|
|
|
|
|
if ( value.endsWith( "%" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 1 );
|
|
|
|
|
double factor = value.toFloat( &ok );
|
|
|
|
|
if ( ok && !value.isEmpty() )
|
|
|
|
|
{
|
|
|
|
|
factor /= 100.0;
|
|
|
|
|
relative_width_sum += m_cell_size_data.col_widths[i];
|
|
|
|
|
relative_fraction_sum += factor;
|
|
|
|
|
if ( !width_set_by_user )
|
|
|
|
|
{
|
|
|
|
|
// If the table width was not set by the user, we are free to increase
|
|
|
|
|
// it so that the width of this column will be >= than its natural width
|
|
|
|
|
int min_col_width_sum = ROUND( m_cell_size_data.col_widths[i] / factor );
|
|
|
|
|
if ( min_col_width_sum > col_width_sum )
|
|
|
|
|
col_width_sum = min_col_width_sum;
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
qWarning( "MmlMtableNode::layoutSymbol(): could not parse value %s%%", value.toLatin1().data() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Relatively sized column, but we failed to parse the factor. Treat is like an auto
|
|
|
|
|
// column.
|
|
|
|
|
auto_width_sum += m_cell_size_data.col_widths[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Work out how much space remains for the auto olumns, after allocating
|
|
|
|
|
// the statically sized and the relatively sized columns.
|
|
|
|
|
int required_auto_width_sum = col_width_sum
|
|
|
|
|
- ROUND( relative_fraction_sum * col_width_sum )
|
|
|
|
|
- fixed_width_sum;
|
|
|
|
|
|
|
|
|
|
if ( !width_set_by_user && required_auto_width_sum < auto_width_sum )
|
|
|
|
|
{
|
|
|
|
|
if ( relative_fraction_sum < 1 )
|
|
|
|
|
col_width_sum = ROUND( ( fixed_width_sum + auto_width_sum ) / ( 1 - relative_fraction_sum ) );
|
|
|
|
|
else
|
|
|
|
|
col_width_sum = fixed_width_sum + auto_width_sum + relative_width_sum;
|
|
|
|
|
required_auto_width_sum = auto_width_sum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ratio by which we have to shring/grow all auto sized columns to make it all fit
|
|
|
|
|
double auto_width_scale = 1;
|
|
|
|
|
if ( auto_width_sum > 0 )
|
|
|
|
|
auto_width_scale = ( float )required_auto_width_sum / auto_width_sum;
|
|
|
|
|
|
|
|
|
|
// Set correct sizes for the auto sized and the relatively sized columns.
|
|
|
|
|
for ( i = 0; i < m_cell_size_data.numCols(); ++i )
|
|
|
|
|
{
|
|
|
|
|
QString value = interpretListAttr( columnwidth_attr, i, "auto" );
|
|
|
|
|
|
|
|
|
|
// Is it a relatively sized column?
|
|
|
|
|
if ( value.endsWith( "%" ) )
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
int w = interpretPercentSpacing( value, col_width_sum, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
m_cell_size_data.col_widths[i] = w;
|
|
|
|
|
else
|
|
|
|
|
// We're treating parsing errors here as auto sized columns
|
|
|
|
|
m_cell_size_data.col_widths[i]
|
|
|
|
|
= ROUND( auto_width_scale * m_cell_size_data.col_widths[i] );
|
|
|
|
|
}
|
|
|
|
|
// Is it an auto sized column?
|
|
|
|
|
else if ( value == "auto" )
|
|
|
|
|
{
|
|
|
|
|
m_cell_size_data.col_widths[i]
|
|
|
|
|
= ROUND( auto_width_scale * m_cell_size_data.col_widths[i] );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString s;
|
|
|
|
|
QList<int> &col_widths = m_cell_size_data.col_widths;
|
|
|
|
|
for ( i = 0; i < col_widths.count(); ++i )
|
|
|
|
|
{
|
|
|
|
|
s += QString( "[w=%1 %2%%]" )
|
|
|
|
|
.arg( col_widths[i] )
|
|
|
|
|
.arg( 100 * col_widths[i] / m_cell_size_data.colWidthSum() );
|
|
|
|
|
}
|
|
|
|
|
// qWarning(s);
|
|
|
|
|
|
|
|
|
|
m_content_width = m_cell_size_data.colWidthSum()
|
|
|
|
|
+ col_spc * ( m_cell_size_data.numCols() - 1 );
|
|
|
|
|
m_content_height = m_cell_size_data.rowHeightSum()
|
|
|
|
|
+ row_spc * ( m_cell_size_data.numRows() - 1 );
|
|
|
|
|
|
|
|
|
|
int bottom = -m_content_height / 2;
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling() )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( child->nodeType() == MtrNode );
|
|
|
|
|
QwtMmlMtrNode *row = ( QwtMmlMtrNode* ) child;
|
|
|
|
|
|
|
|
|
|
row->layoutCells( m_cell_size_data.col_widths, col_spc );
|
|
|
|
|
QRect rmr = row->myRect();
|
|
|
|
|
row->setRelOrigin( QPoint( 0, bottom - rmr.top() ) );
|
|
|
|
|
bottom += rmr.height() + row_spc;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlMtableNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
int frame_spc_hor = framespacing_hor();
|
|
|
|
|
int frame_spc_ver = framespacing_ver();
|
|
|
|
|
|
|
|
|
|
return QRect( -frame_spc_hor,
|
|
|
|
|
-m_content_height / 2 - frame_spc_ver,
|
|
|
|
|
m_content_width + 2 * frame_spc_hor,
|
|
|
|
|
m_content_height + 2 * frame_spc_ver );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMml::FrameType QwtMmlMtableNode::frame() const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "frame", "none" );
|
|
|
|
|
return interpretFrameType( value, 0, 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMml::FrameType QwtMmlMtableNode::columnlines( int idx ) const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "columnlines", "none" );
|
|
|
|
|
return interpretFrameType( value, idx, 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMml::FrameType QwtMmlMtableNode::rowlines( int idx ) const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "rowlines", "none" );
|
|
|
|
|
return interpretFrameType( value, idx, 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMtableNode::paintSymbol( QPainter *p ) const
|
|
|
|
|
{
|
|
|
|
|
FrameType f = frame();
|
|
|
|
|
if ( f != FrameNone )
|
|
|
|
|
{
|
|
|
|
|
p->save();
|
|
|
|
|
|
|
|
|
|
QPen pen = p->pen();
|
|
|
|
|
if ( f == FrameDashed )
|
|
|
|
|
pen.setStyle( Qt::DashLine );
|
|
|
|
|
else
|
|
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
|
|
p->setPen( pen );
|
|
|
|
|
p->drawRect( myRect() );
|
|
|
|
|
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p->save();
|
|
|
|
|
|
|
|
|
|
int col_spc = columnspacing();
|
|
|
|
|
int row_spc = rowspacing();
|
|
|
|
|
|
|
|
|
|
QPen pen = p->pen();
|
|
|
|
|
int col_offset = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for ( i = 0; i < m_cell_size_data.numCols() - 1; ++i )
|
|
|
|
|
{
|
|
|
|
|
FrameType f = columnlines( i );
|
|
|
|
|
col_offset += m_cell_size_data.col_widths[i];
|
|
|
|
|
|
|
|
|
|
if ( f != FrameNone )
|
|
|
|
|
{
|
|
|
|
|
if ( f == FrameDashed )
|
|
|
|
|
pen.setStyle( Qt::DashLine );
|
|
|
|
|
else if ( f == FrameSolid )
|
|
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
|
|
|
|
|
|
|
p->setPen( pen );
|
|
|
|
|
int x = col_offset + col_spc / 2;
|
|
|
|
|
p->drawLine( x, -m_content_height / 2, x, m_content_height / 2 );
|
|
|
|
|
}
|
|
|
|
|
col_offset += col_spc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int row_offset = 0;
|
|
|
|
|
for ( i = 0; i < m_cell_size_data.numRows() - 1; ++i )
|
|
|
|
|
{
|
|
|
|
|
FrameType f = rowlines( i );
|
|
|
|
|
row_offset += m_cell_size_data.row_heights[i];
|
|
|
|
|
|
|
|
|
|
if ( f != FrameNone )
|
|
|
|
|
{
|
|
|
|
|
if ( f == FrameDashed )
|
|
|
|
|
pen.setStyle( Qt::DashLine );
|
|
|
|
|
else if ( f == FrameSolid )
|
|
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
|
|
|
|
|
|
|
p->setPen( pen );
|
|
|
|
|
int y = row_offset + row_spc / 2 - m_content_height / 2;
|
|
|
|
|
p->drawLine( 0, y, m_content_width, y );
|
|
|
|
|
}
|
|
|
|
|
row_offset += row_spc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p->restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMtableNode::framespacing_ver() const
|
|
|
|
|
{
|
|
|
|
|
if ( frame() == FrameNone )
|
|
|
|
|
return ( int )( 0.2 * em() );
|
|
|
|
|
|
|
|
|
|
QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" );
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return fs.m_ver;
|
|
|
|
|
else
|
|
|
|
|
return ( int )( 0.5 * ex() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMtableNode::framespacing_hor() const
|
|
|
|
|
{
|
|
|
|
|
if ( frame() == FrameNone )
|
|
|
|
|
return ( int )( 0.2 * em() );
|
|
|
|
|
|
|
|
|
|
QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" );
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return fs.m_hor;
|
|
|
|
|
else
|
|
|
|
|
return ( int )( 0.4 * em() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMtrNode::layoutCells( const QList<int> &col_widths,
|
|
|
|
|
int col_spc )
|
|
|
|
|
{
|
|
|
|
|
QRect mr = myRect();
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
int col_offset = 0;
|
|
|
|
|
uint colnum = 0;
|
|
|
|
|
for ( ; child != 0; child = child->nextSibling(), ++colnum )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( child->nodeType() == MtdNode );
|
|
|
|
|
QwtMmlMtdNode *mtd = ( QwtMmlMtdNode* ) child;
|
|
|
|
|
|
|
|
|
|
QRect r = QRect( 0, mr.top(), col_widths[colnum], mr.height() );
|
|
|
|
|
mtd->setMyRect( r );
|
|
|
|
|
mtd->setRelOrigin( QPoint( col_offset, 0 ) );
|
|
|
|
|
col_offset += col_widths[colnum] + col_spc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateMyRect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMtdNode::scriptlevel( const QwtMmlNode *child ) const
|
|
|
|
|
{
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
if ( child != 0 && child == firstChild() )
|
|
|
|
|
return sl + m_scriptlevel_adjust;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMtdNode::setMyRect( const QRect &rect )
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode::setMyRect( rect );
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
if ( child == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( rect.width() < child->myRect().width() )
|
|
|
|
|
{
|
|
|
|
|
while ( rect.width() < child->myRect().width()
|
|
|
|
|
&& child->font().pointSize() > g_min_font_point_size )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d",
|
|
|
|
|
// rect.width(), child->myRect().width(), m_scriptlevel_adjust);
|
|
|
|
|
|
|
|
|
|
++m_scriptlevel_adjust;
|
|
|
|
|
child->layout();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d",
|
|
|
|
|
// rect.width(), child->myRect().width(), m_scriptlevel_adjust);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRect mr = myRect();
|
|
|
|
|
QRect cmr = child->myRect();
|
|
|
|
|
|
|
|
|
|
QPoint child_rel_origin;
|
|
|
|
|
|
|
|
|
|
switch ( columnalign() )
|
|
|
|
|
{
|
|
|
|
|
case ColAlignLeft:
|
|
|
|
|
child_rel_origin.setX( 0 );
|
|
|
|
|
break;
|
|
|
|
|
case ColAlignCenter:
|
|
|
|
|
child_rel_origin.setX( mr.left() + ( mr.width() - cmr.width() ) / 2 );
|
|
|
|
|
break;
|
|
|
|
|
case ColAlignRight:
|
|
|
|
|
child_rel_origin.setX( mr.right() - cmr.width() );
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch ( rowalign() )
|
|
|
|
|
{
|
|
|
|
|
case RowAlignTop:
|
|
|
|
|
child_rel_origin.setY( mr.top() - cmr.top() );
|
|
|
|
|
break;
|
|
|
|
|
case RowAlignCenter:
|
|
|
|
|
case RowAlignBaseline:
|
|
|
|
|
child_rel_origin.setY( mr.top() - cmr.top() + ( mr.height() - cmr.height() ) / 2 );
|
|
|
|
|
break;
|
|
|
|
|
case RowAlignBottom:
|
|
|
|
|
child_rel_origin.setY( mr.bottom() - cmr.bottom() );
|
|
|
|
|
break;
|
|
|
|
|
case RowAlignAxis:
|
|
|
|
|
child_rel_origin.setY( 0 );
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
child->setRelOrigin( child_rel_origin );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint QwtMmlMtdNode::colNum()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *syb = previousSibling();
|
|
|
|
|
|
|
|
|
|
uint i = 0;
|
|
|
|
|
for ( ; syb != 0; syb = syb->previousSibling() )
|
|
|
|
|
++i;
|
|
|
|
|
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint QwtMmlMtdNode::rowNum()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *row = parent()->previousSibling();
|
|
|
|
|
|
|
|
|
|
uint i = 0;
|
|
|
|
|
for ( ; row != 0; row = row->previousSibling() )
|
|
|
|
|
++i;
|
|
|
|
|
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlMtdNode::ColAlign QwtMmlMtdNode::columnalign()
|
|
|
|
|
{
|
|
|
|
|
QString val = explicitAttribute( "columnalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretColAlign( val, 0, 0 );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *node = parent(); // <mtr>
|
|
|
|
|
if ( node == 0 )
|
|
|
|
|
return ColAlignCenter;
|
|
|
|
|
|
|
|
|
|
uint colnum = colNum();
|
|
|
|
|
val = node->explicitAttribute( "columnalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretColAlign( val, colnum, 0 );
|
|
|
|
|
|
|
|
|
|
node = node->parent(); // <mtable>
|
|
|
|
|
if ( node == 0 )
|
|
|
|
|
return ColAlignCenter;
|
|
|
|
|
|
|
|
|
|
val = node->explicitAttribute( "columnalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretColAlign( val, colnum, 0 );
|
|
|
|
|
|
|
|
|
|
return ColAlignCenter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QwtMmlMtdNode::RowAlign QwtMmlMtdNode::rowalign()
|
|
|
|
|
{
|
|
|
|
|
QString val = explicitAttribute( "rowalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretRowAlign( val, 0, 0 );
|
|
|
|
|
|
|
|
|
|
QwtMmlNode *node = parent(); // <mtr>
|
|
|
|
|
if ( node == 0 )
|
|
|
|
|
return RowAlignAxis;
|
|
|
|
|
|
|
|
|
|
uint rownum = rowNum();
|
|
|
|
|
val = node->explicitAttribute( "rowalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretRowAlign( val, rownum, 0 );
|
|
|
|
|
|
|
|
|
|
node = node->parent(); // <mtable>
|
|
|
|
|
if ( node == 0 )
|
|
|
|
|
return RowAlignAxis;
|
|
|
|
|
|
|
|
|
|
val = node->explicitAttribute( "rowalign" );
|
|
|
|
|
if ( !val.isNull() )
|
|
|
|
|
return interpretRowAlign( val, rownum, 0 );
|
|
|
|
|
|
|
|
|
|
return RowAlignAxis;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMoverNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *over = base->nextSibling();
|
|
|
|
|
Q_ASSERT( over != 0 );
|
|
|
|
|
|
|
|
|
|
QRect base_rect = base->myRect();
|
|
|
|
|
QRect over_rect = over->myRect();
|
|
|
|
|
|
|
|
|
|
int spacing = ( int )( g_mfrac_spacing * ( over_rect.height()
|
|
|
|
|
+ base_rect.height() ) );
|
|
|
|
|
|
|
|
|
|
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
|
|
|
over->setRelOrigin( QPoint( -over_rect.width() / 2,
|
|
|
|
|
base_rect.top() - spacing - over_rect.bottom() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMoverNode::scriptlevel( const QwtMmlNode *node ) const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *over = base->nextSibling();
|
|
|
|
|
Q_ASSERT( over != 0 );
|
|
|
|
|
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
if ( node != 0 && node == over )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMunderNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *under = base->nextSibling();
|
|
|
|
|
Q_ASSERT( under != 0 );
|
|
|
|
|
|
|
|
|
|
QRect base_rect = base->myRect();
|
|
|
|
|
QRect under_rect = under->myRect();
|
|
|
|
|
|
|
|
|
|
int spacing = ( int )( g_mfrac_spacing * ( under_rect.height() + base_rect.height() ) );
|
|
|
|
|
|
|
|
|
|
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
|
|
|
under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMunderNode::scriptlevel( const QwtMmlNode *node ) const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *under = base->nextSibling();
|
|
|
|
|
Q_ASSERT( under != 0 );
|
|
|
|
|
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
if ( node != 0 && node == under )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMunderoverNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *under = base->nextSibling();
|
|
|
|
|
Q_ASSERT( under != 0 );
|
|
|
|
|
QwtMmlNode *over = under->nextSibling();
|
|
|
|
|
Q_ASSERT( over != 0 );
|
|
|
|
|
|
|
|
|
|
QRect base_rect = base->myRect();
|
|
|
|
|
QRect under_rect = under->myRect();
|
|
|
|
|
QRect over_rect = over->myRect();
|
|
|
|
|
|
|
|
|
|
int spacing = ( int )( g_mfrac_spacing * ( base_rect.height()
|
|
|
|
|
+ under_rect.height()
|
|
|
|
|
+ over_rect.height() ) );
|
|
|
|
|
|
|
|
|
|
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
|
|
|
under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) );
|
|
|
|
|
over->setRelOrigin( QPoint( -over_rect.width() / 2, base_rect.top() - spacing - under_rect.bottom() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMunderoverNode::scriptlevel( const QwtMmlNode *node ) const
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *base = firstChild();
|
|
|
|
|
Q_ASSERT( base != 0 );
|
|
|
|
|
QwtMmlNode *under = base->nextSibling();
|
|
|
|
|
Q_ASSERT( under != 0 );
|
|
|
|
|
QwtMmlNode *over = under->nextSibling();
|
|
|
|
|
Q_ASSERT( over != 0 );
|
|
|
|
|
|
|
|
|
|
int sl = QwtMmlNode::scriptlevel();
|
|
|
|
|
if ( node != 0 && ( node == under || node == over ) )
|
|
|
|
|
return sl + 1;
|
|
|
|
|
else
|
|
|
|
|
return sl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMpaddedNode::interpretSpacing( QString value, int base_value, bool *ok ) const
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
value.replace( ' ', "" );
|
|
|
|
|
|
|
|
|
|
QString sign, factor_str, pseudo_unit;
|
|
|
|
|
bool percent = false;
|
|
|
|
|
|
|
|
|
|
// extract the sign
|
|
|
|
|
int idx = 0;
|
|
|
|
|
if ( idx < value.length() && ( value.at( idx ) == '+' || value.at( idx ) == '-' ) )
|
|
|
|
|
sign = value.at( idx++ );
|
|
|
|
|
|
|
|
|
|
// extract the factor
|
|
|
|
|
while ( idx < value.length() && ( value.at( idx ).isDigit() || value.at( idx ) == '.' ) )
|
|
|
|
|
factor_str.append( value.at( idx++ ) );
|
|
|
|
|
|
|
|
|
|
// extract the % sign
|
|
|
|
|
if ( idx < value.length() && value.at( idx ) == '%' )
|
|
|
|
|
{
|
|
|
|
|
percent = true;
|
|
|
|
|
++idx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// extract the pseudo-unit
|
|
|
|
|
pseudo_unit = value.mid( idx );
|
|
|
|
|
|
|
|
|
|
bool float_ok;
|
|
|
|
|
double factor = factor_str.toFloat( &float_ok );
|
|
|
|
|
if ( !float_ok || factor < 0 )
|
|
|
|
|
{
|
|
|
|
|
qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( percent )
|
|
|
|
|
factor /= 100.0;
|
|
|
|
|
|
|
|
|
|
QRect cr;
|
|
|
|
|
if ( firstChild() == 0 )
|
|
|
|
|
cr = QRect( 0, 0, 0, 0 );
|
|
|
|
|
else
|
|
|
|
|
cr = firstChild()->myRect();
|
|
|
|
|
|
|
|
|
|
int unit_size;
|
|
|
|
|
|
|
|
|
|
if ( pseudo_unit.isEmpty() )
|
|
|
|
|
unit_size = base_value;
|
|
|
|
|
else if ( pseudo_unit == "width" )
|
|
|
|
|
unit_size = cr.width();
|
|
|
|
|
else if ( pseudo_unit == "height" )
|
|
|
|
|
unit_size = -cr.top();
|
|
|
|
|
else if ( pseudo_unit == "depth" )
|
|
|
|
|
unit_size = cr.bottom();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bool unit_ok;
|
|
|
|
|
unit_size = QwtMmlNode::interpretSpacing( "1" + pseudo_unit, &unit_ok );
|
|
|
|
|
if ( !unit_ok )
|
|
|
|
|
{
|
|
|
|
|
qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( sign.isNull() )
|
|
|
|
|
return ( int )( factor * unit_size );
|
|
|
|
|
else if ( sign == "+" )
|
|
|
|
|
return base_value + ( int )( factor * unit_size );
|
|
|
|
|
else // sign == "-"
|
|
|
|
|
return base_value - ( int )( factor * unit_size );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMpaddedNode::lspace() const
|
|
|
|
|
{
|
|
|
|
|
QString value = explicitAttribute( "lspace" );
|
|
|
|
|
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int lspace = interpretSpacing( value, 0, &ok );
|
|
|
|
|
|
|
|
|
|
if ( ok )
|
|
|
|
|
return lspace;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMpaddedNode::width() const
|
|
|
|
|
{
|
|
|
|
|
int child_width = 0;
|
|
|
|
|
if ( firstChild() != 0 )
|
|
|
|
|
child_width = firstChild()->myRect().width();
|
|
|
|
|
|
|
|
|
|
QString value = explicitAttribute( "width" );
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return child_width;
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int w = interpretSpacing( value, child_width, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return w;
|
|
|
|
|
|
|
|
|
|
return child_width;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMpaddedNode::height() const
|
|
|
|
|
{
|
|
|
|
|
QRect cr;
|
|
|
|
|
if ( firstChild() == 0 )
|
|
|
|
|
cr = QRect( 0, 0, 0, 0 );
|
|
|
|
|
else
|
|
|
|
|
cr = firstChild()->myRect();
|
|
|
|
|
|
|
|
|
|
QString value = explicitAttribute( "height" );
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return -cr.top();
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int h = interpretSpacing( value, -cr.top(), &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return h;
|
|
|
|
|
|
|
|
|
|
return -cr.top();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QwtMmlMpaddedNode::depth() const
|
|
|
|
|
{
|
|
|
|
|
QRect cr;
|
|
|
|
|
if ( firstChild() == 0 )
|
|
|
|
|
cr = QRect( 0, 0, 0, 0 );
|
|
|
|
|
else
|
|
|
|
|
cr = firstChild()->myRect();
|
|
|
|
|
|
|
|
|
|
QString value = explicitAttribute( "depth" );
|
|
|
|
|
if ( value.isNull() )
|
|
|
|
|
return cr.bottom();
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int h = interpretSpacing( value, cr.bottom(), &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
return h;
|
|
|
|
|
|
|
|
|
|
return cr.bottom();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QwtMmlMpaddedNode::layoutSymbol()
|
|
|
|
|
{
|
|
|
|
|
QwtMmlNode *child = firstChild();
|
|
|
|
|
if ( child == 0 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
child->setRelOrigin( QPoint( 0, 0 ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QRect QwtMmlMpaddedNode::symbolRect() const
|
|
|
|
|
{
|
|
|
|
|
return QRect( -lspace(), -height(), lspace() + width(), height() + depth() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
// Static helper functions
|
|
|
|
|
// *******************************************************************
|
|
|
|
|
|
|
|
|
|
static QString entityDeclarations()
|
|
|
|
|
{
|
|
|
|
|
QString result = "<!DOCTYPE math [\n";
|
|
|
|
|
|
|
|
|
|
const QwtMmlEntitySpec *ent = g_xml_entity_data;
|
|
|
|
|
for ( ; ent->name != 0; ++ent )
|
|
|
|
|
{
|
|
|
|
|
result += "\t<!ENTITY " + QString( ent->name ) + " \"" + ent->value + "\">\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result += "]>\n";
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int interpretSpacing( QString value, int em, int ex, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( value == "thin" )
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
if ( value == "medium" )
|
|
|
|
|
return 2;
|
|
|
|
|
|
|
|
|
|
if ( value == "thick" )
|
|
|
|
|
return 3;
|
|
|
|
|
|
|
|
|
|
struct HSpacingValue
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
float factor;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const HSpacingValue g_h_spacing_data[] =
|
|
|
|
|
{
|
|
|
|
|
{ "veryverythinmathspace", ( float ) 0.0555556 },
|
|
|
|
|
{ "verythinmathspace", ( float ) 0.111111 },
|
|
|
|
|
{ "thinmathspace", ( float ) 0.166667 },
|
|
|
|
|
{ "mediummathspace", ( float ) 0.222222 },
|
|
|
|
|
{ "thickmathspace", ( float ) 0.277778 },
|
|
|
|
|
{ "verythickmathspace", ( float ) 0.333333 },
|
|
|
|
|
{ "veryverythickmathspace", ( float ) 0.388889 },
|
|
|
|
|
{ 0, ( float ) 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const HSpacingValue *v = g_h_spacing_data;
|
|
|
|
|
for ( ; v->name != 0; ++v )
|
|
|
|
|
{
|
|
|
|
|
if ( value == v->name )
|
|
|
|
|
return ( int )( em * v->factor );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "em" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
return ( int )( em * factor );
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%sem\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "ex" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
return ( int )( ex * factor );
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%sex\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "cm" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( qApp->desktop() != 0 );
|
|
|
|
|
QDesktopWidget *dw = qApp->desktop();
|
|
|
|
|
Q_ASSERT( dw->width() != 0 );
|
|
|
|
|
Q_ASSERT( dw->widthMM() != 0 );
|
|
|
|
|
return ( int )( factor * 10 * dw->width() / dw->widthMM() );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%scm\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "mm" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( qApp->desktop() != 0 );
|
|
|
|
|
QDesktopWidget *dw = qApp->desktop();
|
|
|
|
|
Q_ASSERT( dw->width() != 0 );
|
|
|
|
|
Q_ASSERT( dw->widthMM() != 0 );
|
|
|
|
|
return ( int )( factor * dw->width() / dw->widthMM() );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%smm\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "in" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT( qApp->desktop() != 0 );
|
|
|
|
|
QDesktopWidget *dw = qApp->desktop();
|
|
|
|
|
Q_ASSERT( dw->width() != 0 );
|
|
|
|
|
Q_ASSERT( dw->widthMM() != 0 );
|
|
|
|
|
return ( int )( factor * 10 * dw->width() / ( 2.54 * dw->widthMM() ) );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%sin\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value.endsWith( "px" ) )
|
|
|
|
|
{
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
int i = ( int ) value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && i >= 0 )
|
|
|
|
|
return i;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%spx\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool float_ok;
|
|
|
|
|
int i = ( int )value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && i >= 0 )
|
|
|
|
|
return i;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int interpretPercentSpacing( QString value, int base, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( !value.endsWith( "%" ) )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value.truncate( value.length() - 1 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
float factor = value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && factor >= 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
return ( int )( base * factor / 100.0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretPercentSpacing(): could not parse \"%s%%\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int interpretPointSize( QString value, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( !value.endsWith( "pt" ) )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value.truncate( value.length() - 2 );
|
|
|
|
|
bool float_ok;
|
|
|
|
|
int pt_size = ( int ) value.toFloat( &float_ok );
|
|
|
|
|
if ( float_ok && pt_size > 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
return pt_size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretPointSize(): could not parse \"%spt\"", value.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type )
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNodeSpec *spec = g_node_spec_data;
|
|
|
|
|
for ( ; spec->type != QwtMml::NoNode; ++spec )
|
|
|
|
|
{
|
|
|
|
|
if ( type == spec->type ) return spec;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag )
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNodeSpec *spec = g_node_spec_data;
|
|
|
|
|
for ( ; spec->type != QwtMml::NoNode; ++spec )
|
|
|
|
|
{
|
|
|
|
|
if ( tag == spec->tag ) return spec;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool mmlCheckChildType( QwtMml::NodeType parent_type, QwtMml::NodeType child_type,
|
|
|
|
|
QString *error_str )
|
|
|
|
|
{
|
|
|
|
|
if ( parent_type == QwtMml::UnknownNode || child_type == QwtMml::UnknownNode )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
const QwtMmlNodeSpec *child_spec = mmlFindNodeSpec( child_type );
|
|
|
|
|
const QwtMmlNodeSpec *parent_spec = mmlFindNodeSpec( parent_type );
|
|
|
|
|
|
|
|
|
|
Q_ASSERT( parent_spec != 0 );
|
|
|
|
|
Q_ASSERT( child_spec != 0 );
|
|
|
|
|
|
|
|
|
|
QString allowed_child_types( parent_spec->child_types );
|
|
|
|
|
// null list means any child type is valid
|
|
|
|
|
if ( allowed_child_types.isNull() )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
QString child_type_str = QString( " " ) + child_spec->type_str + " ";
|
|
|
|
|
if ( !allowed_child_types.contains( child_type_str ) )
|
|
|
|
|
{
|
|
|
|
|
if ( error_str != 0 )
|
|
|
|
|
*error_str = QString( "illegal child " )
|
|
|
|
|
+ child_spec->type_str
|
|
|
|
|
+ " for parent "
|
|
|
|
|
+ parent_spec->type_str;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool mmlCheckAttributes( QwtMml::NodeType child_type, const QwtMmlAttributeMap &attr,
|
|
|
|
|
QString *error_str )
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( child_type );
|
|
|
|
|
Q_ASSERT( spec != 0 );
|
|
|
|
|
|
|
|
|
|
QString allowed_attr( spec->attributes );
|
|
|
|
|
// empty list means any attr is valid
|
|
|
|
|
if ( allowed_attr.isEmpty() )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
QwtMmlAttributeMap::const_iterator it = attr.begin(), end = attr.end();
|
|
|
|
|
for ( ; it != end; ++it )
|
|
|
|
|
{
|
|
|
|
|
QString name = it.key();
|
|
|
|
|
|
|
|
|
|
if ( name.indexOf( ':' ) != -1 )
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QString padded_name = " " + name + " ";
|
|
|
|
|
if ( !allowed_attr.contains( padded_name ) )
|
|
|
|
|
{
|
|
|
|
|
if ( error_str != 0 )
|
|
|
|
|
*error_str = QString( "illegal attribute " )
|
|
|
|
|
+ name
|
|
|
|
|
+ " in "
|
|
|
|
|
+ spec->type_str;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int attributeIndex( const QString &name )
|
|
|
|
|
{
|
|
|
|
|
for ( unsigned i = 0; i < g_oper_spec_rows; ++i )
|
|
|
|
|
{
|
|
|
|
|
if ( name == g_oper_spec_names[i] )
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QString decodeEntityValue( QString literal )
|
|
|
|
|
{
|
|
|
|
|
QString result;
|
|
|
|
|
|
|
|
|
|
while ( !literal.isEmpty() )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if ( !literal.startsWith( "&#" ) )
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
literal = literal.right( literal.length() - 2 );
|
|
|
|
|
|
|
|
|
|
int i = literal.indexOf( ';' );
|
|
|
|
|
if ( i == -1 )
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString char_code = literal.left( i );
|
|
|
|
|
literal = literal.right( literal.length() - i - 1 );
|
|
|
|
|
|
|
|
|
|
if ( char_code.isEmpty() )
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( char_code.at( 0 ) == 'x' )
|
|
|
|
|
{
|
|
|
|
|
char_code = char_code.right( char_code.length() - 1 );
|
|
|
|
|
bool ok;
|
|
|
|
|
unsigned c = char_code.toUInt( &ok, 16 );
|
|
|
|
|
if ( !ok )
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
result += QChar( c );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bool ok;
|
|
|
|
|
unsigned c = char_code.toUInt( &ok, 10 );
|
|
|
|
|
if ( !ok )
|
|
|
|
|
{
|
|
|
|
|
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
result += QChar( c );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const QwtMmlEntitySpec *searchEntitySpecData( const QString &value, const QwtMmlEntitySpec *from = 0 )
|
|
|
|
|
{
|
|
|
|
|
const QwtMmlEntitySpec *ent = from;
|
|
|
|
|
if ( ent == 0 )
|
|
|
|
|
ent = g_xml_entity_data;
|
|
|
|
|
for ( ; ent->name != 0; ++ent )
|
|
|
|
|
{
|
|
|
|
|
QString ent_value = decodeEntityValue( ent->value );
|
|
|
|
|
if ( value == ent_value )
|
|
|
|
|
return ent;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct OperSpecSearchResult
|
|
|
|
|
{
|
|
|
|
|
OperSpecSearchResult() { prefix_form = infix_form = postfix_form = 0; }
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *prefix_form,
|
|
|
|
|
*infix_form,
|
|
|
|
|
*postfix_form;
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *&getForm( QwtMml::FormType f );
|
|
|
|
|
bool haveForm( QwtMml::FormType f )
|
|
|
|
|
{ return getForm( f ) != 0; }
|
|
|
|
|
void addForm( const QwtMmlOperSpec *spec )
|
|
|
|
|
{ getForm( spec->form ) = spec; }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *&OperSpecSearchResult::getForm( QwtMml::FormType f )
|
|
|
|
|
{
|
|
|
|
|
switch ( f )
|
|
|
|
|
{
|
|
|
|
|
case QwtMml::PrefixForm:
|
|
|
|
|
return prefix_form;
|
|
|
|
|
case QwtMml::InfixForm:
|
|
|
|
|
return infix_form;
|
|
|
|
|
case QwtMml::PostfixForm:
|
|
|
|
|
return postfix_form;
|
|
|
|
|
}
|
|
|
|
|
return postfix_form; // just to avoid warning
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Searches g_oper_spec_data and returns any instance of operator name. There may
|
|
|
|
|
be more instances, but since the list is sorted, they will be next to each other.
|
|
|
|
|
*/
|
|
|
|
|
static const QwtMmlOperSpec *searchOperSpecData( const QString &name )
|
|
|
|
|
{
|
|
|
|
|
const char *name_latin1 = name.toLatin1().data();
|
|
|
|
|
|
|
|
|
|
// binary search
|
|
|
|
|
// establish invariant g_oper_spec_data[begin].name < name < g_oper_spec_data[end].name
|
|
|
|
|
|
|
|
|
|
int cmp = qstrcmp( name_latin1, g_oper_spec_data[0].name );
|
|
|
|
|
if ( cmp < 0 )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if ( cmp == 0 )
|
|
|
|
|
return g_oper_spec_data;
|
|
|
|
|
|
|
|
|
|
uint begin = 0;
|
|
|
|
|
uint end = g_oper_spec_count;
|
|
|
|
|
|
|
|
|
|
// invariant holds
|
|
|
|
|
while ( end - begin > 1 )
|
|
|
|
|
{
|
|
|
|
|
uint mid = ( begin + end ) / 2;
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *spec = g_oper_spec_data + mid;
|
|
|
|
|
int cmp = qstrcmp( name_latin1, spec->name );
|
|
|
|
|
if ( cmp < 0 )
|
|
|
|
|
end = mid;
|
|
|
|
|
else if ( cmp > 0 )
|
|
|
|
|
begin = mid;
|
|
|
|
|
else
|
|
|
|
|
return spec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
This searches g_oper_spec_data until at least one name in name_list is found with FormType form,
|
|
|
|
|
or until name_list is exhausted. The idea here is that if we don't find the operator in the
|
|
|
|
|
specified form, we still want to use some other available form of that operator.
|
|
|
|
|
*/
|
|
|
|
|
static OperSpecSearchResult _mmlFindOperSpec( const QStringList &name_list, QwtMml::FormType form )
|
|
|
|
|
{
|
|
|
|
|
OperSpecSearchResult result;
|
|
|
|
|
|
|
|
|
|
QStringList::const_iterator it = name_list.begin();
|
|
|
|
|
for ( ; it != name_list.end(); ++it )
|
|
|
|
|
{
|
|
|
|
|
const QString &name = *it;
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *spec = searchOperSpecData( name );
|
|
|
|
|
|
|
|
|
|
if ( spec == 0 )
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
const char *name_latin1 = name.toLatin1().data();
|
|
|
|
|
|
|
|
|
|
// backtrack to the first instance of name
|
|
|
|
|
while ( spec > g_oper_spec_data && qstrcmp( ( spec - 1 )->name, name_latin1 ) == 0 )
|
|
|
|
|
--spec;
|
|
|
|
|
|
|
|
|
|
// iterate over instances of name until the instances are exhausted or until we
|
|
|
|
|
// find an instance in the specified form.
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
result.addForm( spec++ );
|
|
|
|
|
if ( result.haveForm( form ) )
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
while ( qstrcmp( spec->name, name_latin1 ) == 0 );
|
|
|
|
|
|
|
|
|
|
if ( result.haveForm( form ) )
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
text is a string between <mo> and </mo>. It can be a character ('+'), an
|
|
|
|
|
entity reference ("∞") or a character reference ("∞"). Our
|
|
|
|
|
job is to find an operator spec in the operator dictionary (g_oper_spec_data)
|
|
|
|
|
that matches text. Things are further complicated by the fact, that many
|
|
|
|
|
operators come in several forms (prefix, infix, postfix).
|
|
|
|
|
|
|
|
|
|
If available, this function returns an operator spec matching text in the specified
|
|
|
|
|
form. If such operator is not available, returns an operator spec that matches
|
|
|
|
|
text, but of some other form in the preference order specified by the MathML spec.
|
|
|
|
|
If that's not available either, returns the default operator spec.
|
|
|
|
|
*/
|
|
|
|
|
static const QwtMmlOperSpec *mmlFindOperSpec( const QString &text, QwtMml::FormType form )
|
|
|
|
|
{
|
|
|
|
|
QStringList name_list;
|
|
|
|
|
name_list.append( text );
|
|
|
|
|
|
|
|
|
|
// First, just try to find text in the operator dictionary.
|
|
|
|
|
OperSpecSearchResult result = _mmlFindOperSpec( name_list, form );
|
|
|
|
|
|
|
|
|
|
if ( !result.haveForm( form ) )
|
|
|
|
|
{
|
|
|
|
|
// Try to find other names for the operator represented by text.
|
|
|
|
|
|
|
|
|
|
const QwtMmlEntitySpec *ent = 0;
|
|
|
|
|
for ( ;; )
|
|
|
|
|
{
|
|
|
|
|
ent = searchEntitySpecData( text, ent );
|
|
|
|
|
if ( ent == 0 )
|
|
|
|
|
break;
|
|
|
|
|
name_list.append( '&' + QString( ent->name ) + ';' );
|
|
|
|
|
++ent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result = _mmlFindOperSpec( name_list, form );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QwtMmlOperSpec *spec = result.getForm( form );
|
|
|
|
|
if ( spec != 0 )
|
|
|
|
|
return spec;
|
|
|
|
|
|
|
|
|
|
spec = result.getForm( QwtMml::InfixForm );
|
|
|
|
|
if ( spec != 0 )
|
|
|
|
|
return spec;
|
|
|
|
|
|
|
|
|
|
spec = result.getForm( QwtMml::PostfixForm );
|
|
|
|
|
if ( spec != 0 )
|
|
|
|
|
return spec;
|
|
|
|
|
|
|
|
|
|
spec = result.getForm( QwtMml::PrefixForm );
|
|
|
|
|
if ( spec != 0 )
|
|
|
|
|
return spec;
|
|
|
|
|
|
|
|
|
|
return &g_oper_spec_defaults;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec )
|
|
|
|
|
{
|
|
|
|
|
int i = attributeIndex( name );
|
|
|
|
|
if ( i == -1 )
|
|
|
|
|
return QString::null;
|
|
|
|
|
else
|
|
|
|
|
return spec->attributes[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint interpretMathVariant( const QString &value, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
struct MathVariantValue
|
|
|
|
|
{
|
|
|
|
|
const char *value;
|
|
|
|
|
uint mv;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const MathVariantValue g_mv_data[] =
|
|
|
|
|
{
|
|
|
|
|
{ "normal", QwtMml::NormalMV },
|
|
|
|
|
{ "bold", QwtMml::BoldMV },
|
|
|
|
|
{ "italic", QwtMml::ItalicMV },
|
|
|
|
|
{ "bold-italic", QwtMml::BoldMV | QwtMml::ItalicMV },
|
|
|
|
|
{ "double-struck", QwtMml::DoubleStruckMV },
|
|
|
|
|
{ "bold-fraktur", QwtMml::BoldMV | QwtMml::FrakturMV },
|
|
|
|
|
{ "script", QwtMml::ScriptMV },
|
|
|
|
|
{ "bold-script", QwtMml::BoldMV | QwtMml::ScriptMV },
|
|
|
|
|
{ "fraktur", QwtMml::FrakturMV },
|
|
|
|
|
{ "sans-serif", QwtMml::SansSerifMV },
|
|
|
|
|
{ "bold-sans-serif", QwtMml::BoldMV | QwtMml::SansSerifMV },
|
|
|
|
|
{ "sans-serif-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV },
|
|
|
|
|
{ "sans-serif-bold-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV | QwtMml::BoldMV },
|
|
|
|
|
{ "monospace", QwtMml::MonospaceMV },
|
|
|
|
|
{ 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const MathVariantValue *v = g_mv_data;
|
|
|
|
|
for ( ; v->value != 0; ++v )
|
|
|
|
|
{
|
|
|
|
|
if ( value == v->value )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
return v->mv;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretMathVariant(): could not parse value: \"%s\"", value.toLatin1().data() );
|
|
|
|
|
|
|
|
|
|
return QwtMml::NormalMV;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QwtMml::FormType interpretForm( const QString &value, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( value == "prefix" )
|
|
|
|
|
return QwtMml::PrefixForm;
|
|
|
|
|
if ( value == "infix" )
|
|
|
|
|
return QwtMml::InfixForm;
|
|
|
|
|
if ( value == "postfix" )
|
|
|
|
|
return QwtMml::PostfixForm;
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretForm(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return QwtMml::InfixForm;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
QString value = interpretListAttr( value_list, colnum, "center" );
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( value == "left" )
|
|
|
|
|
return QwtMml::ColAlignLeft;
|
|
|
|
|
if ( value == "right" )
|
|
|
|
|
return QwtMml::ColAlignRight;
|
|
|
|
|
if ( value == "center" )
|
|
|
|
|
return QwtMml::ColAlignCenter;
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretColAlign(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return QwtMml::ColAlignCenter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
QString value = interpretListAttr( value_list, rownum, "axis" );
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( value == "top" )
|
|
|
|
|
return QwtMml::RowAlignTop;
|
|
|
|
|
if ( value == "center" )
|
|
|
|
|
return QwtMml::RowAlignCenter;
|
|
|
|
|
if ( value == "bottom" )
|
|
|
|
|
return QwtMml::RowAlignBottom;
|
|
|
|
|
if ( value == "baseline" )
|
|
|
|
|
return QwtMml::RowAlignBaseline;
|
|
|
|
|
if ( value == "axis" )
|
|
|
|
|
return QwtMml::RowAlignAxis;
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretRowAlign(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return QwtMml::RowAlignAxis;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QString interpretListAttr( const QString &value_list, int idx, const QString &def )
|
|
|
|
|
{
|
|
|
|
|
QStringList l = value_list.split( ' ' );
|
|
|
|
|
|
|
|
|
|
if ( l.count() == 0 )
|
|
|
|
|
return def;
|
|
|
|
|
|
|
|
|
|
if ( l.count() <= idx )
|
|
|
|
|
return l[l.count() - 1];
|
|
|
|
|
else
|
|
|
|
|
return l[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
QString value = interpretListAttr( value_list, idx, "none" );
|
|
|
|
|
|
|
|
|
|
if ( value == "none" )
|
|
|
|
|
return QwtMml::FrameNone;
|
|
|
|
|
if ( value == "solid" )
|
|
|
|
|
return QwtMml::FrameSolid;
|
|
|
|
|
if ( value == "dashed" )
|
|
|
|
|
return QwtMml::FrameDashed;
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
|
|
|
|
|
qWarning( "interpretFrameType(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return QwtMml::FrameNone;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
QwtMml::FrameSpacing fs;
|
|
|
|
|
|
|
|
|
|
QStringList l = value_list.split( ' ' );
|
|
|
|
|
if ( l.count() != 2 )
|
|
|
|
|
{
|
|
|
|
|
qWarning( "interpretFrameSpacing: could not parse value \"%s\"", value_list.toLatin1().data() );
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
return QwtMml::FrameSpacing( ( int )( 0.4 * em ), ( int )( 0.5 * ex ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool hor_ok, ver_ok;
|
|
|
|
|
fs.m_hor = interpretSpacing( l[0], em, ex, &hor_ok );
|
|
|
|
|
fs.m_ver = interpretSpacing( l[1], em, ex, &ver_ok );
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = hor_ok && ver_ok;
|
|
|
|
|
|
|
|
|
|
return fs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex )
|
|
|
|
|
{
|
|
|
|
|
if ( font_attr.contains( "fontsize" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["fontsize"];
|
|
|
|
|
|
|
|
|
|
for ( ;; )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
int ptsize = interpretPointSize( value, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
fn.setPointSize( ptsize );
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ptsize = interpretPercentSpacing( value, fn.pointSize(), &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
fn.setPointSize( ptsize );
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int size = interpretSpacing( value, em, ex, &ok );
|
|
|
|
|
if ( ok )
|
|
|
|
|
{
|
|
|
|
|
fn.setPixelSize( size );
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( font_attr.contains( "fontweight" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["fontweight"];
|
|
|
|
|
if ( value == "normal" )
|
|
|
|
|
fn.setBold( false );
|
|
|
|
|
else if ( value == "bold" )
|
|
|
|
|
fn.setBold( true );
|
|
|
|
|
else
|
|
|
|
|
qWarning( "interpretDepreciatedFontAttr(): could not parse fontweight \"%s\"", value.toLatin1().data() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( font_attr.contains( "fontstyle" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["fontstyle"];
|
|
|
|
|
if ( value == "normal" )
|
|
|
|
|
fn.setItalic( false );
|
|
|
|
|
else if ( value == "italic" )
|
|
|
|
|
fn.setItalic( true );
|
|
|
|
|
else
|
|
|
|
|
qWarning( "interpretDepreciatedFontAttr(): could not parse fontstyle \"%s\"", value.toLatin1().data() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( font_attr.contains( "fontfamily" ) )
|
|
|
|
|
{
|
|
|
|
|
QString value = font_attr["fontfamily"];
|
|
|
|
|
fn.setFamily( value );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok )
|
|
|
|
|
{
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = true;
|
|
|
|
|
|
|
|
|
|
if ( value == "small" )
|
|
|
|
|
{
|
|
|
|
|
fn.setPointSize( ( int )( fn.pointSize() * 0.7 ) );
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( value == "normal" )
|
|
|
|
|
return fn;
|
|
|
|
|
|
|
|
|
|
if ( value == "big" )
|
|
|
|
|
{
|
|
|
|
|
fn.setPointSize( ( int )( fn.pointSize() * 1.5 ) );
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool size_ok;
|
|
|
|
|
|
|
|
|
|
int ptsize = interpretPointSize( value, &size_ok );
|
|
|
|
|
if ( size_ok )
|
|
|
|
|
{
|
|
|
|
|
fn.setPointSize( ptsize );
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int size = interpretSpacing( value, em, ex, &size_ok );
|
|
|
|
|
if ( size_ok )
|
|
|
|
|
{
|
|
|
|
|
fn.setPixelSize( size );
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( ok != 0 )
|
|
|
|
|
*ok = false;
|
|
|
|
|
qWarning( "interpretMathSize(): could not parse mathsize \"%s\"", value.toLatin1().data() );
|
|
|
|
|
return fn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\class QwtMathMLDocument
|
|
|
|
|
|
|
|
|
|
\brief The QwtMathMLDocument class renders mathematical formulas written in MathML 2.0.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Constructs an empty MML document.
|
|
|
|
|
*/
|
|
|
|
|
QwtMathMLDocument::QwtMathMLDocument()
|
|
|
|
|
{
|
|
|
|
|
m_doc = new QwtMmlDocument;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Destroys the MML document.
|
|
|
|
|
*/
|
|
|
|
|
QwtMathMLDocument::~QwtMathMLDocument()
|
|
|
|
|
{
|
|
|
|
|
delete m_doc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Clears the contents of this MML document.
|
|
|
|
|
*/
|
|
|
|
|
void QwtMathMLDocument::clear()
|
|
|
|
|
{
|
|
|
|
|
m_doc->clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Sets the MathML expression to be rendered. The expression is given
|
|
|
|
|
in the string \a text. If the expression is successfully parsed,
|
|
|
|
|
this method returns true; otherwise it returns false. If an error
|
|
|
|
|
occured \a errorMsg is set to a diagnostic message, while \a
|
|
|
|
|
errorLine and \a errorColumn contain the location of the error.
|
|
|
|
|
Any of \a errorMsg, \a errorLine and \a errorColumn may be 0,
|
|
|
|
|
in which case they are not set.
|
|
|
|
|
|
|
|
|
|
\a text should contain MathML 2.0 presentation markup elements enclosed
|
|
|
|
|
in a <math> element.
|
|
|
|
|
*/
|
|
|
|
|
bool QwtMathMLDocument::setContent( QString text, QString *errorMsg,
|
|
|
|
|
int *errorLine, int *errorColumn )
|
|
|
|
|
{
|
|
|
|
|
return m_doc->setContent( text, errorMsg, errorLine, errorColumn );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Renders this MML document with the painter \a p at position \a pos.
|
|
|
|
|
*/
|
|
|
|
|
void QwtMathMLDocument::paint( QPainter *p, const QPoint &pos ) const
|
|
|
|
|
{
|
|
|
|
|
m_doc->paint( p, pos );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Returns the size of this MML document, as rendered, in pixels.
|
|
|
|
|
*/
|
|
|
|
|
QSize QwtMathMLDocument::size() const
|
|
|
|
|
{
|
|
|
|
|
return m_doc->size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Returns the name of the font used to render the font \a type.
|
|
|
|
|
|
|
|
|
|
\sa setFontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont
|
|
|
|
|
*/
|
|
|
|
|
QString QwtMathMLDocument::fontName( QwtMathMLDocument::MmlFont type ) const
|
|
|
|
|
{
|
|
|
|
|
return m_doc->fontName( type );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Sets the name of the font used to render the font \a type to \a name.
|
|
|
|
|
|
|
|
|
|
\sa fontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont
|
|
|
|
|
*/
|
|
|
|
|
void QwtMathMLDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name )
|
|
|
|
|
{
|
|
|
|
|
m_doc->setFontName( type, name );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Returns the point size of the font used to render expressions
|
|
|
|
|
whose scriptlevel is 0.
|
|
|
|
|
|
|
|
|
|
\sa setBaseFontPointSize() fontName() setFontName()
|
|
|
|
|
*/
|
|
|
|
|
int QwtMathMLDocument::baseFontPointSize() const
|
|
|
|
|
{
|
|
|
|
|
return m_doc->baseFontPointSize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Sets the point \a size of the font used to render expressions
|
|
|
|
|
whose scriptlevel is 0.
|
|
|
|
|
|
|
|
|
|
\sa baseFontPointSize() fontName() setFontName()
|
|
|
|
|
*/
|
|
|
|
|
void QwtMathMLDocument::setBaseFontPointSize( int size )
|
|
|
|
|
{
|
|
|
|
|
m_doc->setBaseFontPointSize( size );
|
|
|
|
|
}
|