From 4ffbe71b5d6c9c0bc8fcf5dd12e0ec71dae33255 Mon Sep 17 00:00:00 2001 From: "shaver%netscape.com" Date: Tue, 21 Sep 1999 02:12:01 +0000 Subject: [PATCH] initial and long-awaited import of MathML for Roger Sidje and his crew git-svn-id: svn://10.0.0.236/trunk@48481 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/mathml/Makefile.in | 34 + mozilla/layout/mathml/base/Makefile.in | 34 + mozilla/layout/mathml/base/makefile.win | 27 + mozilla/layout/mathml/base/src/Makefile.in | 76 + mozilla/layout/mathml/base/src/makefile.win | 94 + .../layout/mathml/base/src/nsIMathMLFrame.h | 88 + .../layout/mathml/base/src/nsMathMLChar.cpp | 134 + mozilla/layout/mathml/base/src/nsMathMLChar.h | 91 + .../base/src/nsMathMLContainerFrame.cpp | 418 +++ .../mathml/base/src/nsMathMLContainerFrame.h | 143 + .../layout/mathml/base/src/nsMathMLParts.h | 46 + .../mathml/base/src/nsMathMLmfencedFrame.cpp | 93 + .../mathml/base/src/nsMathMLmfencedFrame.h | 57 + .../mathml/base/src/nsMathMLmfracFrame.cpp | 253 ++ .../mathml/base/src/nsMathMLmfracFrame.h | 158 + .../mathml/base/src/nsMathMLmiFrame.cpp | 148 + .../layout/mathml/base/src/nsMathMLmiFrame.h | 69 + .../base/src/nsMathMLmmultiscriptsFrame.cpp | 240 ++ .../base/src/nsMathMLmmultiscriptsFrame.h | 62 + .../mathml/base/src/nsMathMLmoFrame.cpp | 348 +++ .../layout/mathml/base/src/nsMathMLmoFrame.h | 69 + .../mathml/base/src/nsMathMLmoverFrame.cpp | 154 + .../mathml/base/src/nsMathMLmoverFrame.h | 63 + .../mathml/base/src/nsMathMLmpaddedFrame.cpp | 82 + .../mathml/base/src/nsMathMLmpaddedFrame.h | 51 + .../mathml/base/src/nsMathMLmphantomFrame.cpp | 79 + .../mathml/base/src/nsMathMLmphantomFrame.h | 50 + .../mathml/base/src/nsMathMLmrootFrame.cpp | 82 + .../mathml/base/src/nsMathMLmrootFrame.h | 63 + .../mathml/base/src/nsMathMLmrowFrame.cpp | 82 + .../mathml/base/src/nsMathMLmrowFrame.h | 64 + .../mathml/base/src/nsMathMLmstyleFrame.cpp | 156 + .../mathml/base/src/nsMathMLmstyleFrame.h | 84 + .../mathml/base/src/nsMathMLmsubFrame.cpp | 165 ++ .../mathml/base/src/nsMathMLmsubFrame.h | 62 + .../mathml/base/src/nsMathMLmsubsupFrame.cpp | 174 ++ .../mathml/base/src/nsMathMLmsubsupFrame.h | 62 + .../mathml/base/src/nsMathMLmsupFrame.cpp | 152 + .../mathml/base/src/nsMathMLmsupFrame.h | 62 + .../mathml/base/src/nsMathMLmtdFrame.cpp | 90 + .../layout/mathml/base/src/nsMathMLmtdFrame.h | 50 + .../mathml/base/src/nsMathMLmunderFrame.cpp | 165 ++ .../mathml/base/src/nsMathMLmunderFrame.h | 62 + .../base/src/nsMathMLmunderoverFrame.cpp | 166 ++ .../mathml/base/src/nsMathMLmunderoverFrame.h | 63 + mozilla/layout/mathml/content/Makefile.in | 34 + mozilla/layout/mathml/content/makefile.win | 27 + mozilla/layout/mathml/content/src/Makefile.in | 65 + .../layout/mathml/content/src/makefile.win | 62 + .../mathml/content/src/nsMathMLAtomList.h | 175 ++ .../mathml/content/src/nsMathMLAtoms.cpp | 70 + .../layout/mathml/content/src/nsMathMLAtoms.h | 60 + .../mathml/content/src/nsMathMLOperatorList.h | 727 +++++ .../mathml/content/src/nsMathMLOperators.cpp | 283 ++ .../mathml/content/src/nsMathMLOperators.h | 105 + mozilla/layout/mathml/doc/Notes.txt | 89 + mozilla/layout/mathml/doc/operator.txt | 526 ++++ mozilla/layout/mathml/makefile.win | 27 + .../layout/mathml/tests/all-presentation.xml | 138 + mozilla/layout/mathml/tests/core.xml | 193 ++ mozilla/layout/mathml/tests/mathml.css | 166 ++ mozilla/layout/mathml/tests/mathml.dtd | 1555 ++++++++++ mozilla/layout/mathml/tests/simple.xml | 38 + mozilla/layout/mathml/tests/stretchy.xml | 146 + mozilla/layout/mathml/tests/symbol.html | 43 + mozilla/layout/mathml/tests/various.xml | 480 ++++ mozilla/layout/mathml/tools/byalpha.txt | 2547 +++++++++++++++++ mozilla/layout/mathml/tools/bycodes.txt | 2523 ++++++++++++++++ mozilla/layout/mathml/tools/gendtd.pl | 761 +++++ mozilla/layout/mathml/tools/operator.pl | 774 +++++ 70 files changed, 16579 insertions(+) create mode 100644 mozilla/layout/mathml/Makefile.in create mode 100644 mozilla/layout/mathml/base/Makefile.in create mode 100644 mozilla/layout/mathml/base/makefile.win create mode 100644 mozilla/layout/mathml/base/src/Makefile.in create mode 100644 mozilla/layout/mathml/base/src/makefile.win create mode 100644 mozilla/layout/mathml/base/src/nsIMathMLFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLChar.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLChar.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLContainerFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLContainerFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLParts.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmfracFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmfracFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmiFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmiFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmoFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmoFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmoverFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmoverFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmrootFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmrootFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmrowFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmrowFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsubFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsubFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsupFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmsupFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmtdFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmtdFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmunderFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmunderFrame.h create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.cpp create mode 100644 mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.h create mode 100644 mozilla/layout/mathml/content/Makefile.in create mode 100644 mozilla/layout/mathml/content/makefile.win create mode 100644 mozilla/layout/mathml/content/src/Makefile.in create mode 100644 mozilla/layout/mathml/content/src/makefile.win create mode 100644 mozilla/layout/mathml/content/src/nsMathMLAtomList.h create mode 100644 mozilla/layout/mathml/content/src/nsMathMLAtoms.cpp create mode 100644 mozilla/layout/mathml/content/src/nsMathMLAtoms.h create mode 100644 mozilla/layout/mathml/content/src/nsMathMLOperatorList.h create mode 100644 mozilla/layout/mathml/content/src/nsMathMLOperators.cpp create mode 100644 mozilla/layout/mathml/content/src/nsMathMLOperators.h create mode 100644 mozilla/layout/mathml/doc/Notes.txt create mode 100644 mozilla/layout/mathml/doc/operator.txt create mode 100644 mozilla/layout/mathml/makefile.win create mode 100644 mozilla/layout/mathml/tests/all-presentation.xml create mode 100644 mozilla/layout/mathml/tests/core.xml create mode 100644 mozilla/layout/mathml/tests/mathml.css create mode 100644 mozilla/layout/mathml/tests/mathml.dtd create mode 100644 mozilla/layout/mathml/tests/simple.xml create mode 100644 mozilla/layout/mathml/tests/stretchy.xml create mode 100644 mozilla/layout/mathml/tests/symbol.html create mode 100644 mozilla/layout/mathml/tests/various.xml create mode 100644 mozilla/layout/mathml/tools/byalpha.txt create mode 100644 mozilla/layout/mathml/tools/bycodes.txt create mode 100644 mozilla/layout/mathml/tools/gendtd.pl create mode 100644 mozilla/layout/mathml/tools/operator.pl diff --git a/mozilla/layout/mathml/Makefile.in b/mozilla/layout/mathml/Makefile.in new file mode 100644 index 00000000000..65e2b2ee0d1 --- /dev/null +++ b/mozilla/layout/mathml/Makefile.in @@ -0,0 +1,34 @@ +#!gmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH = ../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +DIRS = content base + +include $(topsrcdir)/config/config.mk + +include $(topsrcdir)/config/rules.mk diff --git a/mozilla/layout/mathml/base/Makefile.in b/mozilla/layout/mathml/base/Makefile.in new file mode 100644 index 00000000000..dc2bc7f3e58 --- /dev/null +++ b/mozilla/layout/mathml/base/Makefile.in @@ -0,0 +1,34 @@ +#!gmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +DIRS = src + +include $(topsrcdir)/config/config.mk + +include $(topsrcdir)/config/rules.mk diff --git a/mozilla/layout/mathml/base/makefile.win b/mozilla/layout/mathml/base/makefile.win new file mode 100644 index 00000000000..e8b0f52fff1 --- /dev/null +++ b/mozilla/layout/mathml/base/makefile.win @@ -0,0 +1,27 @@ +#!nmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH=..\..\.. + +DIRS=src + +include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/layout/mathml/base/src/Makefile.in b/mozilla/layout/mathml/base/src/Makefile.in new file mode 100644 index 00000000000..dacdeb4e277 --- /dev/null +++ b/mozilla/layout/mathml/base/src/Makefile.in @@ -0,0 +1,76 @@ +#!gmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH=../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +LIBRARY_NAME = raptormathmlbase_s + +LOCAL_INCLUDES = \ + -I$(srcdir)/../../../base/src \ + -I$(srcdir)/../../../html/style/src \ + -I$(srcdir)/../../../html/base/src \ + -I$(srcdir)/../../../html/content/src \ + -I$(srcdir)/../../../html/table/src \ + -I$(srcdir)/../../content/src \ + $(NULL) + +CPPSRCS = nsMathMLChar.cpp \ + nsMathMLContainerFrame.cpp \ + nsMathMLmrowFrame.cpp \ + nsMathMLmphantomFrame.cpp \ + nsMathMLmfencedFrame.cpp \ + nsMathMLmrowFrame.cpp \ + nsMathMLmfracFrame.cpp \ + nsMathMLmsupFrame.cpp \ + nsMathMLmsubFrame.cpp \ + nsMathMLmsubsupFrame.cpp \ + nsMathMLmmultiscriptsFrame.cpp \ + nsMathMLmiFrame.cpp \ + nsMathMLmtdFrame.cpp \ + nsMathMLmoFrame.cpp \ + nsMathMLmunderFrame.cpp \ + nsMathMLmoverFrame.cpp \ + nsMathMLmunderoverFrame.cpp \ + nsMathMLmpaddedFrame.cpp \ + nsMathMLmstyleFrame.cpp \ + $(NULL) + +include $(topsrcdir)/config/config.mk + +DEFINES += + +MODULE=layout + +MKSHLIB := + +# we don't want the shared lib, but we want to force the creation of a static lib. +# do we still want this? - DJF +override NO_SHARED_LIB=1 +override NO_STATIC_LIB= + +include $(topsrcdir)/config/rules.mk + diff --git a/mozilla/layout/mathml/base/src/makefile.win b/mozilla/layout/mathml/base/src/makefile.win new file mode 100644 index 00000000000..d9208ba8434 --- /dev/null +++ b/mozilla/layout/mathml/base/src/makefile.win @@ -0,0 +1,94 @@ +#!nmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH=..\..\..\.. + +LIBRARY_NAME=raptormathmlbase_s +MODULE=raptor +REQUIRES=xpcom raptor pref + +DEFINES= -DWIN32_LEAN_AND_MEAN + +CPPSRCS= nsMathMLChar.cpp \ + nsMathMLContainerFrame.cpp \ + nsMathMLmrowFrame.obj \ + nsMathMLmphantomFrame.cpp \ + nsMathMLmfencedFrame.cpp \ + nsMathMLmfracFrame.cpp \ + nsMathMLmsubFrame.cpp \ + nsMathMLmiFrame.cpp \ + nsMathMLmsubsupFrame.cpp \ + nsMathMLmmultiscriptsFrame.cpp \ + nsMathMLmsupFrame.cpp \ + nsMathMLmtdFrame.cpp \ + nsMathMLmoFrame.cpp \ + nsMathMLmunderFrame.cpp \ + nsMathMLmoverFrame.cpp \ + nsMathMLmunderoverFrame.cpp \ + nsMathMLmpaddedFrame.cpp \ + nsMathMLmstyleFrame.cpp \ + $(NULL) + +CPP_OBJS= .\$(OBJDIR)\nsMathMLChar.obj \ + .\$(OBJDIR)\nsMathMLContainerFrame.obj \ + .\$(OBJDIR)\nsMathMLmrowFrame.obj \ + .\$(OBJDIR)\nsMathMLmphantomFrame.obj \ + .\$(OBJDIR)\nsMathMLmfencedFrame.obj \ + .\$(OBJDIR)\nsMathMLmfracFrame.obj \ + .\$(OBJDIR)\nsMathMLmsubFrame.obj \ + .\$(OBJDIR)\nsMathMLmiFrame.obj \ + .\$(OBJDIR)\nsMathMLmsubsupFrame.obj \ + .\$(OBJDIR)\nsMathMLmmultiscriptsFrame.obj \ + .\$(OBJDIR)\nsMathMLmsupFrame.obj \ + .\$(OBJDIR)\nsMathMLmtdFrame.obj \ + .\$(OBJDIR)\nsMathMLmoFrame.obj \ + .\$(OBJDIR)\nsMathMLmunderFrame.obj \ + .\$(OBJDIR)\nsMathMLmoverFrame.obj \ + .\$(OBJDIR)\nsMathMLmunderoverFrame.obj \ + .\$(OBJDIR)\nsMathMLmpaddedFrame.obj \ + .\$(OBJDIR)\nsMathMLmstyleFrame.obj \ + $(NULL) + +EXPORTS = \ + $(NULL) + +LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\js \ + -I..\..\..\html\style\src \ + -I..\..\..\html\base\src \ + -I..\..\..\html\content\src \ + -I..\..\..\html\table\src \ + -I$(PUBLIC)\dom \ + -I..\..\content\src \ + -I$(PUBLIC)\netlib -I..\..\..\base\src -I$(PUBLIC)\pref + +LCFLAGS = \ + $(LCFLAGS) \ + $(DEFINES) \ + $(NULL) + +include <$(DEPTH)\config\rules.mak> + +libs:: $(LIBRARY) + $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib + +clobber:: + rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/mathml/base/src/nsIMathMLFrame.h b/mozilla/layout/mathml/base/src/nsIMathMLFrame.h new file mode 100644 index 00000000000..a9c001524ea --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsIMathMLFrame.h @@ -0,0 +1,88 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#ifndef nsIMathMLFrame_h___ +#define nsIMathMLFrame_h___ + +// IID for the nsIMathMLFrame interface (the IID was taken from IIDS.h) +#define NS_IMATHMLFRAME_IID \ +{ 0xa6cf90f6, 0x15b3, 0x11d2, \ + { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } + +static NS_DEFINE_IID(kIMathMLFrameIID, NS_IMATHMLFRAME_IID); + +class nsIMathMLFrame : public nsISupports { +public: + static const nsIID& GetIID() { static nsIID iid = NS_IMATHMLFRAME_IID; return iid; } + + + /* SUPPORT FOR STRETCHY ELEMENTS: */ + /*====================================================================*/ + + /* method used to ask a stretchy MathML frame to stretch + * itself depending on its context + */ + + NS_IMETHOD + Stretch(nsIPresContext& aPresContext, + nsStretchDirection aStretchDirection, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize) = 0; + + + /* SUPPORT FOR SCRIPTING ELEMENTS: */ + /*====================================================================*/ + + /* GetPresentationData : + /* returns the scriptlevel and displaystyle of the frame */ + NS_IMETHOD + GetPresentationData(PRInt32* aScriptLevel, + PRBool* aDisplayStyle) = 0; + + /* UpdatePresentationData : + /* Increment the scriptlevel of the frame, and set its displaystyle. + * Note that is the only tag which allows to set + * + * Therefore has its peculiar version of this method. + */ + NS_IMETHOD + UpdatePresentationData(PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) = 0; + + + /* UpdatePresentationDataFromChildAt : + /* Increments the scriplevel and set the display level on the whole tree. + * For child frames at: aIndex, aIndex+1, aIndex+2, etc, this method set + * their mDisplayStyle to aDisplayStyle and increment their mScriptLevel + * with aScriptLevelIncrement. The increment is propagated down to the + * subtrees of each of these child frames. Note that is the only + * tag which allows + * to reset or increment the scriptlevel in a manual way. Therefore + * has its own peculiar version of this method. + */ + NS_IMETHOD + UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) = 0; +}; + +#endif /* nsIMathMLFrame_h___ */ + diff --git a/mozilla/layout/mathml/base/src/nsMathMLChar.cpp b/mozilla/layout/mathml/base/src/nsMathMLChar.cpp new file mode 100644 index 00000000000..02af002fcb6 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLChar.cpp @@ -0,0 +1,134 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsString.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLChar.h" +#include "nsMathMLOperators.h" + +// +// nsMathMLChar implementation +// + + +// aDesiredStretchSize is an IN/OUT parameter. +NS_IMETHODIMP +nsMathMLChar::Stretch(nsIPresContext& aPresContext, + nsIStyleContext* aStyleContext, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize) +{ + // get the value of 'em'; + const nsStyleFont* aFont = + (const nsStyleFont*)aStyleContext->GetStyleData(eStyleStruct_Font); + nscoord em = NSToCoordRound(float(aFont->mFont.size)); + + mOffset.x = nscoord(mLeftSpace * em); + mOffset.y = 0; + + // do the stretching + if (NS_MATHML_OPERATOR_IS_STRETCHY(mFlags)) { + if (mDirection == NS_STRETCH_DIRECTION_VERTICAL) { + mOffset.y = aContainerSize.ascent - aDesiredStretchSize.ascent; + + // vertical stretching... for a boundary symbol + aDesiredStretchSize.descent = aContainerSize.descent; + aDesiredStretchSize.ascent = aContainerSize.ascent; + aDesiredStretchSize.height = aDesiredStretchSize.ascent + + aDesiredStretchSize.descent; + + } + else if (mDirection == NS_STRETCH_DIRECTION_HORIZONTAL) { + // horizontal stretching... for an accent + aDesiredStretchSize.width = aContainerSize.width; + } + } + + // adjust the spacing + aDesiredStretchSize.width += nscoord((mLeftSpace+mRightSpace)*em); + + return NS_OK; +} + +NS_IMETHODIMP +nsMathMLChar::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + nsIStyleContext* aStyleContext, + const nsRect& aRect) +{ + nsresult rv = NS_OK; + const nsStyleColor* color = + (const nsStyleColor*)aStyleContext->GetStyleData(eStyleStruct_Color); + const nsStyleFont* font = + (const nsStyleFont*)aStyleContext->GetStyleData(eStyleStruct_Font); + + // Set color and font + aRenderingContext.SetColor(color->mColor); + aRenderingContext.SetFont(font->mFont); + + // Display the char + const PRUnichar* aString = mData.GetUnicode(); + PRUint32 aLength = mLength; + aRenderingContext.DrawString(aString, aLength, mOffset.x, mOffset.y); + +// DEBUG +// Draw a border around the char +//aRenderingContext.SetColor(NS_RGB(255,0,0)); +//aRenderingContext.DrawRect(aRect); + + return rv; +} + +#if 0 +// Each stretchy symbol can have its improved Stretch() and +// Paint() methods that override the default ones. + +void +nsMathMLChar::StretchIntegral() +{ +} + +void +nsMathMLChar::PaintIntegral() +{ +} + +... + +#endif + + diff --git a/mozilla/layout/mathml/base/src/nsMathMLChar.h b/mozilla/layout/mathml/base/src/nsMathMLChar.h new file mode 100644 index 00000000000..3efb94ca947 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLChar.h @@ -0,0 +1,91 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#ifndef nsMathMLChar_h___ +#define nsMathMLChar_h___ + +#include "nsMathMLOperators.h" + +class nsMathMLChar +{ +public: + NS_IMETHOD Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + nsIStyleContext* aStyleContext, + const nsRect& aRect); + + // This is the method called to ask the char to stretch itself. + // aDesiredStretchSize is an IN/OUT parameter. + // On input - it contains our current size. + // On output - the same size or the new size, including padding that we want. + NS_IMETHOD Stretch(nsIPresContext& aPresContext, + nsIStyleContext* aStyleContext, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize); + + void Init(nsIFrame* aFrame, + const PRInt32 aLength, + const nsString& aData, + const nsOperatorFlags aFlags, + const float aLeftSpace, + const float aRightSpace, + const nsStretchDirection aDirection) + { + mFrame = aFrame; + mLength = aLength; + mData = aData; + mFlags = aFlags; + mLeftSpace = aLeftSpace; + mRightSpace = aRightSpace; + mDirection = aDirection; + } + + void SetLength(const PRInt32 aLength) + { + mLength = aLength; + } + + PRInt32 GetLength() + { + return mLength; + } + + // constructor and destructor + nsMathMLChar() + { + } + + ~nsMathMLChar() + { + } + +protected: + PRInt32 mLength; + nsString mData; + nsOperatorFlags mFlags; + float mLeftSpace; + float mRightSpace; + nsStretchDirection mDirection; + nsPoint mOffset; + nsIFrame* mFrame; // up-pointer to the frame that contains us. +}; + +#endif /* nsMathMLChar_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.cpp new file mode 100644 index 00000000000..9f15d884f55 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.cpp @@ -0,0 +1,418 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsITextContent.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLChar.h" +#include "nsMathMLContainerFrame.h" + +// +// nsMathMLContainerFrame implementation +// + +// TODO: Proper management of ignorable whitespace +// and handling of non-math related frames. +// * Should math markups only enclose other math markups? +// Why bother... we can leave them in, as hinted in the newsgroup. +// +// * Space doesn't count. Handling space is more complicated than it seems. +// We have to clean inside and outside: +// a + b +// ^ ^ ^ ^ ^ ^ ^ ^ +// *Outside* currently handled using IsOnlyWhitespace(). +// For whitespace only frames, their rect is set zero. +// +// *Inside* not currently handled... so the user must do a +// What to do?! +// - Add a nsTextFrame::CompressWhitespace() *if* it is MathML content?! +// - via CSS property? Support for "none/compress"? (white-space: normal | pre | nowrap) + + +// nsISupports +// ============================================================================= + +NS_IMETHODIMP +nsMathMLContainerFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr) +{ + if (NULL == aInstancePtr) { + return NS_ERROR_NULL_POINTER; + } + *aInstancePtr = nsnull; + if (aIID.Equals(kIMathMLFrameIID)) { + *aInstancePtr = (void*)(nsIMathMLFrame*)this; + NS_ADDREF_THIS(); // not effectual, frames are not Refcounted + return NS_OK; + } + return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr); +} + +NS_IMETHODIMP_(nsrefcnt) +nsMathMLContainerFrame::AddRef(void) +{ + return NS_OK; +} + +NS_IMETHODIMP_(nsrefcnt) +nsMathMLContainerFrame::Release(void) +{ + return NS_OK; +} + +/* /////////////// + * MathML specific - Whitespace management ... + * WHITESPACE: don't forget that whitespace doesn't count in MathML! + * empty frames shouldn't be created in MathML, oh well that's another story. + * ============================================================================= + */ + +PRBool +nsMathMLContainerFrame::IsOnlyWhitespace(nsIFrame* aFrame) +{ + NS_PRECONDITION(aFrame, "null arg"); + PRBool rv = PR_FALSE; + + // by empty frame we mean a leaf frame whose text content is empty... + nsCOMPtr aContent; + aFrame->GetContent(getter_AddRefs(aContent)); + PRInt32 numKids; + aContent->ChildCount(numKids); + if (0 == numKids) { + nsCOMPtr tc(do_QueryInterface(aContent)); + if (tc.get()) tc->IsOnlyWhitespace(&rv); + } + return rv; +} + +void +nsMathMLContainerFrame::ReflowEmptyChild(nsIFrame* aFrame) +{ +// nsHTMLReflowMetrics emptySize(nsnull); +// nsHTMLReflowState emptyReflowState(aPresContext, aReflowState, aFrame, nsSize(0,0)); +// nsresult rv = ReflowChild(aFrame, aPresContext, emptySize, emptyReflowState, aStatus); + + // 0-size the frame + aFrame->SetRect(nsRect(0,0,0,0)); + + // 0-size the view + nsIView* view = nsnull; + aFrame->GetView(&view); + if (view) { + nsCOMPtr vm; + view->GetViewManager(*getter_AddRefs(vm)); + vm->ResizeView(view, 0,0); + } +} + +/* ///////////// + * nsIMathMLFrame - support methods for stretchy elements and scripting + * elements (nested frames within msub, msup, msubsup, munder, mover, + * munderover, mmultiscripts, mfrac, mroot, mtable). + * ============================================================================= + */ + +NS_IMETHODIMP +nsMathMLContainerFrame::Stretch(nsIPresContext& aPresContext, + nsStretchDirection aStretchDirection, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize) +{ + return NS_OK; // the Stretch() is only implemented by and its nsMathMLChar +} + +NS_IMETHODIMP +nsMathMLContainerFrame::GetPresentationData(PRInt32* aScriptLevel, + PRBool* aDisplayStyle) +{ + NS_PRECONDITION(aScriptLevel && aDisplayStyle, "null arg"); + *aScriptLevel = mScriptLevel; + *aDisplayStyle = mDisplayStyle; + return NS_OK; +} + +NS_IMETHODIMP +nsMathMLContainerFrame::UpdatePresentationData(PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) +{ + mScriptLevel += aScriptLevelIncrement; + mDisplayStyle = aDisplayStyle; + return NS_OK; +} + +NS_IMETHODIMP +nsMathMLContainerFrame::UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) +{ + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) { + if (!IsOnlyWhitespace(childFrame)) { + if (0 >= aIndex--) { + nsIMathMLFrame* aMathMLFrame = nsnull; + nsresult rv = childFrame->QueryInterface(nsIMathMLFrame::GetIID(), (void**)&aMathMLFrame); + if (NS_SUCCEEDED(rv) && nsnull != aMathMLFrame) { + // update + aMathMLFrame->UpdatePresentationData(aScriptLevelIncrement, aDisplayStyle); + // propagate down the subtrees + aMathMLFrame->UpdatePresentationDataFromChildAt(0, aScriptLevelIncrement, aDisplayStyle); + } + } + } + childFrame->GetNextSibling(&childFrame); + } + return NS_OK; +} + +/* ////////////////// + * Frame construction + * ============================================================================= + */ + +NS_IMETHODIMP +nsMathMLContainerFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv; + // first, let the base class do its Init() + rv = nsHTMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + // now, if our parent implements the nsIMathMLFrame interface, we inherit + // its scriptlevel and displaystyle. If the parent later wishes to increment + // with other values, it will do so in its SetInitialChildList() method. + + mScriptLevel = 0; + mDisplayStyle = PR_TRUE; + + nsIMathMLFrame* aMathMLFrame = nsnull; + nsresult res = aParent->QueryInterface(nsIMathMLFrame::GetIID(), (void**)&aMathMLFrame); + if (NS_SUCCEEDED(res) && nsnull != aMathMLFrame) { + PRInt32 aScriptLevel = 0; + PRBool aDisplayStyle = PR_TRUE; + aMathMLFrame->GetPresentationData(&aScriptLevel, &aDisplayStyle); + UpdatePresentationData(aScriptLevel, aDisplayStyle); + } + return rv; +} + +NS_IMETHODIMP +nsMathMLContainerFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + nsRect rect; + + aStatus = NS_FRAME_NOT_COMPLETE; + aDesiredSize.width = aDesiredSize.height = aDesiredSize.ascent = aDesiredSize.descent = 0; + + ////////////////// + // Reflow Children + + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) { + + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + // At this stage, the origin points of the children have no use, so we will use the + // origins as placeholders to store the child's ascent and descent. Before return, + // we should set the origins so as to overwrite what we are storing there now. + childFrame->SetRect(nsRect(childDesiredSize.descent, childDesiredSize.ascent, + childDesiredSize.width, childDesiredSize.height)); + + aDesiredSize.width += childDesiredSize.width; + if (aDesiredSize.ascent < childDesiredSize.ascent) { + aDesiredSize.ascent = childDesiredSize.ascent; + } + if (aDesiredSize.descent < childDesiredSize.descent) { + aDesiredSize.descent = childDesiredSize.descent; + } + } + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + ///////////// + // Ask stretchy children to stretch themselves + + nsStretchDirection stretchDir = NS_STRETCH_DIRECTION_VERTICAL; + nsCharMetrics parentSize, childSize; + parentSize.descent = aDesiredSize.descent; parentSize.width = aDesiredSize.width; + parentSize.ascent = aDesiredSize.ascent; parentSize.height = aDesiredSize.height; + aDesiredSize.width = aDesiredSize.height = aDesiredSize.ascent = aDesiredSize.descent = 0; + + childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) { + + // retrieve the metrics that was stored at the previous pass + childFrame->GetRect(rect); + childSize.descent = rect.x; childSize.width = rect.width; + childSize.ascent = rect.y; childSize.height = rect.height; + + ////////// + // Stretch ... + // Only directed at frames that implement the nsIMathMLFrame interface + nsIMathMLFrame* aMathMLFrame; + rv = childFrame->QueryInterface(nsIMathMLFrame::GetIID(), (void**)&aMathMLFrame); + if (NS_SUCCEEDED(rv) && nsnull != aMathMLFrame) { + aMathMLFrame->Stretch(aPresContext, stretchDir, parentSize, childSize); + // store the updated metrics + childFrame->SetRect(nsRect(childSize.descent, childSize.ascent, + childSize.width, childSize.height)); + } + + aDesiredSize.width += childSize.width; + if (aDesiredSize.ascent < childSize.ascent) { + aDesiredSize.ascent = childSize.ascent; + } + if (aDesiredSize.descent < childSize.descent) { + aDesiredSize.descent = childSize.descent; + } + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + ///////////// + // Place Children now by re-adjusting the origins to align the baselines + + nsPoint offset(0,0); + childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) { + childFrame->GetRect(rect); + offset.y = aDesiredSize.ascent - rect.y; + childFrame->MoveTo(offset.x,offset.y); + offset.x += rect.width; + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} + +// This method is an implementation of nsIFrame::ReResolveStyleContext +// It is used for switching the font to a subscript/superscript font in +// msub, msup, msubsup, munder, mover, munderover, mmultiscripts + +NS_IMETHODIMP +nsMathMLContainerFrame::ReResolveStyleContext(nsIPresContext* aPresContext, + nsIStyleContext* aParentContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange) +{ + // re calculate our own style context + PRInt32 ourChange = aParentChange; + nsresult rv = nsFrame::ReResolveStyleContext(aPresContext, aParentContext, + ourChange, aChangeList, &ourChange); + if (NS_FAILED(rv)) { + return rv; + } + if (aLocalChange) { + *aLocalChange = ourChange; + } + + // re-resolve children + + nsIFrame* child = mFrames.FirstChild(); + while (nsnull != child && NS_SUCCEEDED(rv)) { + + if (!IsOnlyWhitespace(child)) { + + // default is to inherit the parent style + nsIStyleContext* aStyleContext = mStyleContext; + nsIStyleContext* newStyleContext = mStyleContext; + + // see if the child frame implements the nsIMathMLFrame interface + nsIMathMLFrame* aMathMLFrame; + rv = child->QueryInterface(nsIMathMLFrame::GetIID(), (void**)&aMathMLFrame); + if (NS_SUCCEEDED(rv) && nsnull != aMathMLFrame) { + + // get the scriptlevel of the child + PRInt32 childLevel; + PRBool childDisplayStyle; + aMathMLFrame->GetPresentationData(&childLevel, &childDisplayStyle); + + // iteration to get a pseudo style context for the script level font + nsAutoString fontSize; + PRInt32 gap = childLevel - mScriptLevel; + fontSize = (0 < gap)? ":-moz-math-font-size-smaller" : ":-moz-math-font-size-larger"; + nsCOMPtr fontAtom(getter_AddRefs(NS_NewAtom(fontSize))); + if (0 > gap) gap = -gap; // absolute value + while (0 < gap) { + aPresContext->ResolvePseudoStyleContextFor(mContent, fontAtom, aStyleContext, + PR_FALSE, &newStyleContext); + aStyleContext = newStyleContext; + gap--; + } + } + + PRInt32 childChange; + rv = child->ReResolveStyleContext(aPresContext, newStyleContext, + ourChange, aChangeList, &childChange); + } + child->GetNextSibling(&child); + } + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.h b/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.h new file mode 100644 index 00000000000..340d713bbb7 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLContainerFrame.h @@ -0,0 +1,143 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLContainerFrame_h___ +#define nsMathMLContainerFrame_h___ + +#include "nsCOMPtr.h" +#include "nsIViewManager.h" +#include "nsHTMLContainerFrame.h" +#include "nsMathMLOperators.h" +#include "nsIMathMLFrame.h" + +/* + * Base class for MathML container frames. It acts like an inferred + * mrow. By default, this frame uses its Reflow() method to lay its + * children horizontally and ensure that their baselines are aligned. + * + * This frame is a *math-aware frame* in the sense that given the + * markup base arguments, the method ReResolveStyleContext() + * can be used to render the 'base' in normal-font, and the 'arguments' + * in small-font. This is a common functionality to tags like msub, msup, + * msubsup, mover, munder, munderover, mmultiscripts. All are derived + * from this base class. They use SetInitialChildList() to trigger + * ReResolveStyleContext() for the very first time as soon as all their + * children are known. However, each of these tags has its own Reflow() + * method to lay its children as appropriate, thus overriding the default + * Reflow() method in this base class. + * + * Other tags like mi that do not have 'arguments' can be derived from + * this base class as well. The class caters for empty arguments. + * Notice that mi implements its own ReResolveStyleContext() method + * to switch to a normal-font (rather than italics) if its text content + * is not a single character (as per the MathML REC). + * + * In general therefore, to derive other tags from this base class, + * ReResolveStyleContext() must be coded to produce the desired stylistic + * effects. For example, mfrac has its own ReResolveStyleContext() method + * to set both the numerator and denominator to a small font size, whereas + * mrow does not have its own implementation of ReResolveStyleContext(), + * and instead uses the one in the base class nsHTMLContainerFrame. + * + * The advantage provided by the default ReResolveStyleContext() herein is + * that MathML tags that need scriptstyle switching can be derived from this + * base class with minimum footprint. For the few tags that need different + * style switching or that do not need style switching at all, you *should* + * override the default ReResolveStyleContext() method provided in this base. + * Do not use this nsMathMLContainerFrame::ReResolveStyleContext for a + * base arguments not needing 'arguments' in small font size. + * Instead, you should use nsHTMLContainerFrame::ReResolveStyleContext or + * provide your own. + * + * ReResolveStyleContext() implements nsIFrame::ReResolveStyleContext(). + * See the documentation in nsIFrame.h for additional information on the + * frame API. + */ + +class nsMathMLContainerFrame : public nsHTMLContainerFrame, public nsIMathMLFrame { +public: + + // nsIMathMLFrame methods + + NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); + NS_IMETHOD_(nsrefcnt) AddRef(void); + NS_IMETHOD_(nsrefcnt) Release(void); + + NS_IMETHOD Stretch(nsIPresContext& aPresContext, + nsStretchDirection aStretchDirection, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize); + NS_IMETHOD + GetPresentationData(PRInt32* aScriptLevel, + PRBool* aDisplayStyle); + + NS_IMETHOD + UpdatePresentationData(PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle); + + NS_IMETHOD + UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle); + + // nsHTMLContainerFrame methods + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + ReResolveStyleContext(nsIPresContext* aPresContext, + nsIStyleContext* aParentContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange); + + // helper methods for processing empty MathML frames (with whitespace only) + + static PRBool + IsOnlyWhitespace(nsIFrame* aFrame); + + static void + ReflowEmptyChild(nsIFrame* aFrame); + +protected: + + PRInt32 mScriptLevel; // Only relevant to nested frames within: msub, msup, msubsup, + // munder, mover, munderover, mmultiscripts, mfrac, mroot, mtable. + + PRBool mDisplayStyle; // displaystyle="false" is intended to slightly alter how the + // rendering in done in inline mode. + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLContainerFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLParts.h b/mozilla/layout/mathml/base/src/nsMathMLParts.h new file mode 100644 index 00000000000..9d03dcddbcf --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLParts.h @@ -0,0 +1,46 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#ifndef nsMathMLParts_h___ +#define nsMathMLParts_h___ + +#include "nscore.h" +#include "nsISupports.h" + +// Factory methods for creating MathML objects +extern nsresult NS_NewMathMLmrowFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmiFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmoFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmphantomFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmpaddedFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmfencedFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmfracFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmsubFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmsupFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmsubsupFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmunderFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmoverFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmunderoverFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmmultiscriptsFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmstyleFrame ( nsIFrame** aNewFrame ); +extern nsresult NS_NewMathMLmtdFrame ( nsIFrame** aNewFrame ); + +#endif /* nsMathMLParts_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.cpp new file mode 100644 index 00000000000..3bbef3e395d --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.cpp @@ -0,0 +1,93 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmfencedFrame.h" + +// +// -- surround content with a pair of fences +// + +nsresult +NS_NewMathMLmfencedFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmfencedFrame* it = new nsMathMLmfencedFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmfencedFrame::nsMathMLmfencedFrame() +{ +} + +nsMathMLmfencedFrame::~nsMathMLmfencedFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmfencedFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + // Write me... + return rv; +} + +/* +NS_METHOD +nsMathMLmfencedFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + return NS_OK; +} +*/ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.h new file mode 100644 index 00000000000..19f14153a16 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmfencedFrame.h @@ -0,0 +1,57 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmfencedFrame_h___ +#define nsMathMLmfencedFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- surround content with a pair of fences +// + +class nsMathMLmfencedFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmfencedFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + +/* + NS_IMETHOD Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer); +*/ +protected: + nsMathMLmfencedFrame(); + virtual ~nsMathMLmfencedFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmfencedFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.cpp new file mode 100644 index 00000000000..c5078646460 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.cpp @@ -0,0 +1,253 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmfracFrame.h" + +// +// -- form a fraction from two subexpressions - implementation +// + +nsresult +NS_NewMathMLmfracFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmfracFrame* it = new nsMathMLmfracFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmfracFrame::nsMathMLmfracFrame() +{ +} + +nsMathMLmfracFrame::~nsMathMLmfracFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmfracFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = NS_OK; + + rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + if (NS_FAILED(rv)) { + return rv; + } + + nscoord aLineThickness = DEFAULT_FRACTION_LINE_THICKNESS; + nsAutoString value; + + // see if the linethickness attribute is there + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::linethickness, value)) + { + if (value == "thin") + aLineThickness = THIN_FRACTION_LINE_THICKNESS; + else if (value == "medium") + aLineThickness = MEDIUM_FRACTION_LINE_THICKNESS; + else if (value == "thick") + aLineThickness = THICK_FRACTION_LINE_THICKNESS; + else { + PRInt32 aErrorCode; + PRInt32 aMultiplier = value.ToInteger(&aErrorCode); + if (NS_SUCCEEDED(aErrorCode)) + aLineThickness = aMultiplier * DEFAULT_FRACTION_LINE_THICKNESS; + else { + // XXX TODO: try to see if it is a h/v-unit like 1ex, 2px, 1em + // see also nsUnitConversion.h + } + } + } + +// mLineThickness = (aLineThickness > MAX_FRACTION_LINE_THICKNESS) ? +// MAX_FRACTION_LINE_THICKNESS : aLineThickness; + + mLineThickness = aLineThickness; + mLineOrigin.x = 0; + mLineOrigin.y = 0; + + // TODO: other attributes like displaystyle... + return rv; +} + +NS_IMETHODIMP +nsMathMLmfracFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + nsresult rv = NS_OK; + + if (NS_FRAME_PAINT_LAYER_FOREGROUND != aWhichLayer) { + return rv; + } + + ///////////// + // paint the numerator and denominator + rv = nsMathMLContainerFrame::Paint(aPresContext, aRenderingContext, + aDirtyRect, aWhichLayer); + //////////// + // paint the fraction line + if (NS_SUCCEEDED(rv) && 0 < mLineThickness) { + float p2t; + aPresContext.GetScaledPixelsToTwips(&p2t); + nscoord thickness = NSIntPixelsToTwips(mLineThickness, p2t); +/* +// line looking like
+ const nsStyleColor* color; + nscolor colors[2]; + color = nsStyleUtil::FindNonTransparentBackground(mStyleContext); + NS_Get3DColors(colors, color->mBackgroundColor); + aRenderingContext.SetColor(colors[0]); +*/ +// solid line with the current text color + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + aRenderingContext.SetColor(color->mColor); + +// draw the line + aRenderingContext.FillRect(mLineOrigin.x, mLineOrigin.y, mRect.width, thickness); + } + + return rv; +} + +NS_IMETHODIMP +nsMathMLmfracFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[2]; + nsIFrame* child[2]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + childFrame->SetRect(nsRect(0,0,0,0)); + } + else if (2 > count) { + + nsHTMLReflowState childReflowState(aPresContext, aReflowState, childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + // Get the line and center the fraction bar with the line. + nscoord strikeOffset, strikeThickness; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetStrikeout(strikeOffset, strikeThickness); + + // Take care of mLineThickness + float p2t; + nscoord Thickspace, halfThickspace; + aPresContext.GetScaledPixelsToTwips(&p2t); + if (mLineThickness <= 1) { + Thickspace = 0; + halfThickspace = 0; + } + else { + Thickspace = NSIntPixelsToTwips(mLineThickness-1, p2t); + halfThickspace = Thickspace/2; // distance from the middle of the axis + } + + aDesiredSize.width = PR_MAX(rect[0].width, rect[1].width); + aDesiredSize.ascent = rect[0].height + strikeOffset + halfThickspace; + aDesiredSize.descent = rect[1].height - strikeOffset + halfThickspace; + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + rect[0].x = (aDesiredSize.width - rect[0].width) / 2; // center w.r.t largest width + rect[1].x = (aDesiredSize.width - rect[1].width) / 2; + rect[0].y = 0; + rect[1].y = aDesiredSize.height - rect[1].height; + + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + SetLineOrigin(nsPoint(0,rect[0].height)); // position the fraction bar + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} + diff --git a/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.h new file mode 100644 index 00000000000..9d8aca8de51 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmfracFrame.h @@ -0,0 +1,158 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmfracFrame_h___ +#define nsMathMLmfracFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- form a fraction from two subexpressions +// + +/* +The MathML REC describes: + +The element is used for fractions. It can also be used to mark up +fraction-like objects such as binomial coefficients and Legendre symbols. +The syntax for is: + numerator denominator + +Attributes of : + Name values default + linethickness number [ v-unit ] | thin | medium | thick 1 + +E.g., +linethickness=2 actually means that linethickness=2*DEFAULT_THICKNESS +(DEFAULT_THICKNESS is not specified by MathML, see below.) + +The linethickness attribute indicates the thickness of the horizontal +"fraction bar", or "rule", typically used to render fractions. A fraction +with linethickness="0" renders without the bar, and might be used within +binomial coefficients. A linethickness greater than one might be used with +nested fractions. These cases are shown below: + +In general, the value of linethickness can be a number, as a multiplier +of the default thickness of the fraction bar (the default thickness is +not specified by MathML), or a number with a unit of vertical length (see +Section 2.3.3), or one of the keywords medium (same as 1), thin (thinner +than 1, otherwise up to the renderer), or thick (thicker than 1, otherwise +up to the renderer). + +The element sets displaystyle to "false", or if it was already +false increments scriptlevel by 1, within numerator and denominator. +These attributes are inherited by every element from its rendering +environment, but can be set explicitly only on the +element. (See Section 3.3.4.) +*/ + +/* +TODO: +- Take care of displaystyle=true|false and inheritered + Before reflow, should change the font-size of the children with scriptlevel<=2 + How to do it? From the DOM interface? + From direct CSS manipulation? In nsCSSStyleRule, there is + nsCSSFont* ourFont; + if (NS_OK == aDeclaration->GetData(kCSSFontSID, (nsCSSStruct**)&ourFont)) + +- CalcLength(..) in nsCSSStyleRule.cpp is where CSS units are implemented. +How to use that for linethickness and, in general, how to factor the use +of units in the MathML world? +ID Description +em ems (font-relative unit traditionally used for horizontal lengths) +ex exs (font-relative unit traditionally used for vertical lengths) +px pixels, or pixel size of a "typical computer display" +in inches (1 inch = 2.54 centimeters) +cm centimeters +mm millimeters +pt points (1 point = 1/72 inch) +pc picas (1 pica = 12 points) +% percentage of default value +*/ + +// default fraction line thickness in pixels +#define DEFAULT_FRACTION_LINE_THICKNESS 1 + +#define THIN_FRACTION_LINE_THICKNESS 1 +#define MEDIUM_FRACTION_LINE_THICKNESS 2 +#define THICK_FRACTION_LINE_THICKNESS 4 + +// use an upper bound just in case someone set a too high value? why bother? +// #define MAX_FRACTION_LINE_THICKNESS 5 + +class nsMathMLmfracFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmfracFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(0, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + + void + SetLineThickness(const nscoord aLineThickness) { + mLineThickness = aLineThickness; + } + + void + SetLineOrigin(const nsPoint& aOrigin) { + mLineOrigin = aOrigin; + } + +protected: + nsMathMLmfracFrame(); + virtual ~nsMathMLmfracFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } + + nsPoint mLineOrigin; + nscoord mLineThickness; +}; + +#endif /* nsMathMLmfracFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmiFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmiFrame.cpp new file mode 100644 index 00000000000..1fc6c459abd --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmiFrame.cpp @@ -0,0 +1,148 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the The Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsStyleChangeList.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsIDOMText.h" +#include "nsITextContent.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmiFrame.h" + +// +// -- identifier - implementation +// + +nsresult +NS_NewMathMLmiFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmiFrame* it = new nsMathMLmiFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmiFrame::nsMathMLmiFrame() +{ +} + +nsMathMLmiFrame::~nsMathMLmiFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmiFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = NS_OK; + rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + return rv; +} + +// if our content is not a single character, we turn the font style to normal. +// XXX TrimWhitespace / CompressWhitespace? +NS_IMETHODIMP +nsMathMLmiFrame::ReResolveStyleContext(nsIPresContext* aPresContext, + nsIStyleContext* aParentContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange) +{ + // our content can include comment-nodes, attribute-nodes, text-nodes... + // we use to DOM to make sure that we are only looking at text-nodes... + PRInt32 aLength = 0; + PRInt32 numKids; + mContent->ChildCount(numKids); + // nsAutoString aData; + for (PRInt32 kid=0; kid kidContent; + mContent->ChildAt(kid, *getter_AddRefs(kidContent)); + if (kidContent.get()) { + nsCOMPtr kidText(do_QueryInterface(kidContent)); + if (kidText.get()) { + PRUint32 kidLength; + kidText->GetLength(&kidLength); + aLength += kidLength; + // nsAutoString kidData; + // kidText->GetData(kidData); + // aData += kidData; + } + } + } + + // re calculate our own style context + PRInt32 ourChange = aParentChange; + nsresult rv = nsFrame::ReResolveStyleContext(aPresContext, aParentContext, + ourChange, aChangeList, &ourChange); + if (NS_FAILED(rv)) { + return rv; + } + if (aLocalChange) { + *aLocalChange = ourChange; + } + + // get a pseudo style context for the normal style font + nsCOMPtr fontAtom(getter_AddRefs(NS_NewAtom(":-moz-math-font-style-normal"))); + nsIStyleContext* newStyleContext; + aPresContext->ResolvePseudoStyleContextFor(mContent, fontAtom, mStyleContext, + PR_FALSE, &newStyleContext); + // re-resolve children + PRInt32 childChange; + nsIFrame* child = mFrames.FirstChild(); + while (nsnull != child && NS_SUCCEEDED(rv)) { + if (!IsOnlyWhitespace(child)) { + rv = child->ReResolveStyleContext(aPresContext, + (1 == aLength)? mStyleContext : newStyleContext, + ourChange, aChangeList, &childChange); + } + child->GetNextSibling(&child); + } + return rv; +} + diff --git a/mozilla/layout/mathml/base/src/nsMathMLmiFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmiFrame.h new file mode 100644 index 00000000000..57321aa04f9 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmiFrame.h @@ -0,0 +1,69 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmiFrame_h___ +#define nsMathMLmiFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- identifier +// + +class nsMathMLmiFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmiFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + ReResolveStyleContext(nsIPresContext* aPresContext, + nsIStyleContext* aParentContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmiFrame(); + virtual ~nsMathMLmiFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmiFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.cpp new file mode 100644 index 00000000000..38f32ae4853 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.cpp @@ -0,0 +1,240 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmmultiscriptsFrame.h" + +// +// -- attach prescripts and tensor indices to a base - implementation +// + +nsresult +NS_NewMathMLmmultiscriptsFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmmultiscriptsFrame* it = new nsMathMLmmultiscriptsFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmmultiscriptsFrame::nsMathMLmmultiscriptsFrame() +{ +} + +nsMathMLmmultiscriptsFrame::~nsMathMLmmultiscriptsFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmmultiscriptsFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nsIFrame* mprescriptsFrame = nsnull; // frame of , if there. + PRBool isSubscript = PR_FALSE; + nscoord ascent, descent, width, height; + nscoord subsupWidth, subHeight, supHeight, subDescent, supAscent; + nscoord count = 0; + + nsIFrame* baseFrame = nsnull; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else { + nsCOMPtr childContent; + nsCOMPtr childTag; + childFrame->GetContent(getter_AddRefs(childContent)); + childContent->GetTag(*getter_AddRefs(childTag)); + + if (childTag == nsMathMLAtoms::mprescripts) { +// NS_ASSERTION(mprescriptsFrame == nsnull,"duplicate "); +//printf("mprescripts Found ...\n"); // should ignore? + mprescriptsFrame = childFrame; + } + else if (childTag == nsMathMLAtoms::none) { + childDesiredSize.height = 0; + childDesiredSize.width = 0; + childDesiredSize.ascent = 0; + childDesiredSize.descent = 0; + } + else { +//printf("child count: %d...\n", count); + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + if (0 == count) { + baseFrame = childFrame; + ascent = childDesiredSize.ascent; + descent = childDesiredSize.descent; + height = childDesiredSize.height; + subsupWidth = childDesiredSize.width; + subHeight = supHeight = height; + supAscent = ascent; + subDescent = descent; + } + else { + if (isSubscript) { + subDescent = PR_MAX(subDescent, childDesiredSize.descent); + subHeight = PR_MAX(subHeight, childDesiredSize.height); + width = childDesiredSize.width; + } + else { + supAscent = PR_MAX(supAscent, childDesiredSize.ascent); + supHeight = PR_MAX(supHeight, childDesiredSize.height); + width = PR_MAX(width, childDesiredSize.width); + subsupWidth += width; + } + } + + // At this stage, the origin points of the children have no use, so we will use the + // origins to store the child's ascent and descent. At the next pass, we should + // set the origins so as to overwrite what we are storing there now + childFrame->SetRect(nsRect(childDesiredSize.descent, childDesiredSize.ascent, + childDesiredSize.width, childDesiredSize.height)); + isSubscript = !isSubscript; + count++; + } + } + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + // Get the subscript and superscript offsets + nscoord subscriptOffset, superscriptOffset, leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetSubscriptOffset(subscriptOffset); + fm->GetSuperscriptOffset(superscriptOffset); + fm->GetLeading(leading); + + subHeight = PR_MAX(height, subHeight) + subscriptOffset + leading; + supHeight = PR_MAX(height, supHeight) + superscriptOffset; + + aDesiredSize.descent = subHeight - ascent; + aDesiredSize.ascent = supHeight - descent; + aDesiredSize.height = aDesiredSize.descent + aDesiredSize.ascent; + aDesiredSize.width = subsupWidth; + + // Place prescripts, followed by base, and then postscripts. + // The list of frames is in the order: {base} {postscripts} {prescripts} + // We go over the list in a circular manner, starting at + + nscoord offset = 0; + nsIFrame* child[2]; + nsRect rect[2]; + + count = 0; + childFrame = mprescriptsFrame; + do { + if (nsnull == childFrame) { // end of prescripts, +//printf("Placing the base ...\n"); + childFrame = baseFrame; // place the base + childFrame->GetRect(rect[0]); + rect[0].x = offset; + rect[0].y = aDesiredSize.height - subHeight; + childFrame->SetRect(rect[0]); + offset += rect[0].width; + } + else if (mprescriptsFrame != childFrame) { + ////////////// + // WHITESPACE: whitespace doesn't count. Iteration over non empty frames + if (!IsOnlyWhitespace(childFrame)) { + child[count++] = childFrame; + if (2 == count) { // place a sub-sup pair + count = 0; +//printf("Placing the sub-sup pair...\n"); + + child[0]->GetRect(rect[0]); + child[1]->GetRect(rect[1]); + rect[0].y = aDesiredSize.height - (subDescent + rect[0].y); + rect[1].y = supAscent - rect[1].y; + + width = PR_MAX(rect[0].width, rect[1].width); + rect[0].x = offset + (width - rect[0].width) / 2; // centering + rect[1].x = offset + (width - rect[1].width) / 2; + + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + offset += width; + } + } + } + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } while (mprescriptsFrame != childFrame); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.h new file mode 100644 index 00000000000..cea4898c107 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmmultiscriptsFrame.h @@ -0,0 +1,62 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmmultiscriptsFrame_h___ +#define nsMathMLmmultiscriptsFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach prescripts and tensor indices to a base +// + +class nsMathMLmmultiscriptsFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmmultiscriptsFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmmultiscriptsFrame(); + virtual ~nsMathMLmmultiscriptsFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmmultiscriptsFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmoFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmoFrame.cpp new file mode 100644 index 00000000000..6069c2647f4 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmoFrame.cpp @@ -0,0 +1,348 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsIDOMText.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLChar.h" +#include "nsMathMLOperators.h" +#include "nsMathMLmoFrame.h" + +// +// -- operator, fence, or separator - implementation +// + +// TODO: +// * Handle embellished operators +// See the section "Exception for embellished operators" +// in http://www.w3.org/TR/REC-MathML/chap3_2.html +// +// * For a markup content, if "content" is not found in +// the operator dictionary, the REC sets default attributes : +// fence = false +// separator = false +// lspace = .27777em +// rspace = .27777em +// stretchy = false +// symmetric = true +// maxsize = infinity +// minsize = 1 +// largeop = false +// movablelimits = false +// accent = false +// +// We only have to handle *lspace* and *rspace*, perhaps via a CSS padding rule +// in mathml.css, and override the rule if the content is found? +// + +// * The spacing is wrong in certain situations, e.g.// + +// +// The REC tells more about lspace and rspace attributes: +// +// The values for lspace and rspace given here range from 0 to 6/18 em in +// units of 1/18 em. For the invisible operators whose content is +// "⁢" or "⁡", it is suggested that MathML +// renderers choose spacing in a context-sensitive way (which is an exception to +// the static values given in the following table). For , +// the total spacing (lspace + rspace) in expressions such as "sin x" +// (where the right operand doesn't start with a fence) should be greater +// than 0; for , the total spacing should be greater +// than 0 when both operands (or the nearest tokens on either side, if on +// the baseline) are identifiers displayed in a non-slanted font (i.e., under +// the suggested rules, when both operands are multi-character identifiers). + + +nsresult +NS_NewMathMLmoFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmoFrame* it = new nsMathMLmoFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmoFrame::nsMathMLmoFrame() +{ +} + +nsMathMLmoFrame::~nsMathMLmoFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmoFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = NS_OK; + rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + if (NS_FAILED(rv)) { + return rv; + } + + // candidly assume we are an operator until proven false -- see Stretch() + mOperator = PR_TRUE; + + // record that the MathChar doesn't know anything yet + mMathMLChar.SetLength(-1); + +// mMathMLChar.Init(this, -1, 0, 0, 0.0f, 0.0f, 0); + + return rv; +} + +NS_IMETHODIMP +nsMathMLmoFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + nsresult rv = NS_OK; + + if (NS_FRAME_PAINT_LAYER_FOREGROUND != aWhichLayer) + return rv; + + if (mOperator && 0 < mMathMLChar.GetLength()) { +//printf("Doing the painting with mMathMLChar\n"); + rv = mMathMLChar.Paint(aPresContext, + aRenderingContext, + mStyleContext, + nsRect(0,0,mRect.width,mRect.height)); + } + else { // let the base class worry about the painting +//printf("Doing the painting with nsMathMLContainerFrame\n"); + rv = nsMathMLContainerFrame::Paint(aPresContext, + aRenderingContext, + aDirtyRect, + aWhichLayer); + } + return rv; +} + + +#if 0 +void DEBUG_PrintString(const nsString aString) { +#if 0 + PRUnichar* pc = (PRUnichar*)(const PRUnichar*)aString.GetUnicode(); + while (*pc) { + if (*pc < 0x00FF) + printf("%c", char(*pc++)); + else + printf("[%04x]", *pc++); + } +#endif + + PRInt32 i; + for (i = 0; i aLength) { // this means it is the very first time we have been here. + // we will not be going over all this again when the + // window is repainted (resize, scroll). + + // if we exit prematurely from now on, we are surely not an operator + mOperator = PR_FALSE; + + // get the text that we enclose. XXX TrimWhitespace? + + nsAutoString aData; +// PRInt32 aLength = 0; + + // kids can be comment-nodes, attribute-nodes, text-nodes... + // we use to DOM to ensure that we only look at text-nodes... + PRInt32 numKids; + mContent->ChildCount(numKids); + for (PRInt32 kid=0; kid kidContent; + mContent->ChildAt(kid, *getter_AddRefs(kidContent)); + if (kidContent.get()) { + nsCOMPtr kidText(do_QueryInterface(kidContent)); + if (kidText.get()) { + // PRUint32 kidLength; + // kidText->GetLength(&kidLength); + // aLength += kidLength; + nsAutoString kidData; + kidText->GetData(kidData); + aData += kidData; + } + } + } + + // Look at our position from our parent (frames are singly-linked together). + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + // Here is the situation: we may have empty frames between us: + // [space*] [prev] [space*] [this] [space*] [next] + // We want to skip them... + // The problem looks like a regexp, we ask a little flag to help us. + + PRInt32 state = 0; + nsIFrame* prev = nsnull; + nsIFrame* next = nsnull; + nsIFrame* aFrame; + + mParent->FirstChild(nsnull, &aFrame); + while (nsnull != aFrame) { + if (aFrame == this) { // we start looking for next + state++; + } + else if (!IsOnlyWhitespace(aFrame)) { + if (0 == state) { // we are still looking for prev + prev = aFrame; + } + else if (1 == state) { // we got next + next = aFrame; + break; // we can exit the while loop + } + } + rv = aFrame->GetNextSibling(&aFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next sibbling"); + } + + // set our form flag depending on our position + nsOperatorFlags aForm = NS_MATHML_OPERATOR_FORM_INFIX; + if (nsnull == prev && nsnull != next) + aForm = NS_MATHML_OPERATOR_FORM_PREFIX; + else if (nsnull != prev && nsnull == next) + aForm = NS_MATHML_OPERATOR_FORM_POSTFIX; + + // Now that we know the text, we can lookup the operator dictionary to see if + // it was right to assume that this is an operator + // XXX aData.CompressWhitespace() ? + nsOperatorFlags aFlags; + float aLeftSpace, aRightSpace; + mOperator = nsMathMLOperators::LookupOperator(aData, aForm, + &aFlags, &aLeftSpace, &aRightSpace); + + // If it doesn't exist in the the dictionary, stop now + if (!mOperator) + return NS_OK; + + // XXX If we don't want extra space when we are a script +// if (mScriptLevel > 0) { +// aLeftSpace = aRightSpace = 0; +// } + +// XXX Factor all this in nsMathMLAttributes.cpp + + // Now see if there are user-defined attributes that override the dictionary. + // XXX If an attribute can be forced to be true when it is false in the + // dictionary, then the following code has to change... + + // For each attribute disabled by the user, turn off its bit flag. + // movablelimits|separator|largeop|accent|fence|stretchy|form + + nsAutoString kfalse("false"); + nsAutoString value; + if (NS_MATHML_OPERATOR_IS_STRETCHY(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::stretchy, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_STRETCHY; + } + if (NS_MATHML_OPERATOR_IS_FENCE(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::fence, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_FENCE; + } + if (NS_MATHML_OPERATOR_IS_ACCENT(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::accent, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_ACCENT; + } + if (NS_MATHML_OPERATOR_IS_LARGEOP(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::largeop, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_LARGEOP; + } + if (NS_MATHML_OPERATOR_IS_SEPARATOR(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::separator, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_SEPARATOR; + } + if (NS_MATHML_OPERATOR_IS_MOVABLELIMITS(aFlags)) { + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::movablelimits, value) && value == kfalse) + aFlags &= ~NS_MATHML_OPERATOR_MOVABLELIMITS; + } + + // TODO: add also lspace and rspace, minsize, maxsize later ... + + // cache all what we have learnt about this operator + mMathMLChar.Init(this, aData.Length(), aData, aFlags, + aLeftSpace, aRightSpace, aStretchDirection); + } + + // let the MathMLChar stretch itself... + mMathMLChar.Stretch(aPresContext, mStyleContext, + aContainerSize, aDesiredStretchSize); + return rv; +} + + diff --git a/mozilla/layout/mathml/base/src/nsMathMLmoFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmoFrame.h new file mode 100644 index 00000000000..a9857e74211 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmoFrame.h @@ -0,0 +1,69 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmoFrame_h___ +#define nsMathMLmoFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" +#include "nsMathMLChar.h" + +// +// -- operator, fence, or separator +// + +class nsMathMLmoFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmoFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer); + + // This method is called by the parent frame to ask + // to stretch itself. + NS_IMETHOD + Stretch(nsIPresContext& aPresContext, + nsStretchDirection aStretchDirection, + nsCharMetrics& aContainerSize, + nsCharMetrics& aDesiredStretchSize); + +protected: + nsMathMLmoFrame(); + virtual ~nsMathMLmoFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } + + PRBool mOperator; // True if we are listed in the operator dictionary. + nsMathMLChar mMathMLChar; // Here is the MathChar that will deal with the operator. +}; + +#endif /* nsMathMLmoFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.cpp new file mode 100644 index 00000000000..f1d486ef2a8 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.cpp @@ -0,0 +1,154 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmoverFrame.h" + +// +// -- attach an overscript to a base - implementation +// + +nsresult +NS_NewMathMLmoverFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmoverFrame* it = new nsMathMLmoverFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmoverFrame::nsMathMLmoverFrame() +{ +} + +nsMathMLmoverFrame::~nsMathMLmoverFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmoverFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[2]; + nsIFrame* child[2]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (2 > count) { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + if (0 == count) { + aDesiredSize.ascent = childDesiredSize.ascent; + aDesiredSize.descent = childDesiredSize.descent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + aDesiredSize.ascent += rect[1].height; + aDesiredSize.width = PR_MAX(rect[0].width, rect[1].width); + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + rect[0].x = (aDesiredSize.width - rect[0].width) / 2; // center w.r.t largest width + rect[1].x = (aDesiredSize.width - rect[1].width) / 2; + rect[1].y = 0; + rect[0].y = rect[1].height; + +//ignore the leading (line spacing) that is attached to the text + nscoord leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetLeading(leading); + + aDesiredSize.height -= leading; + aDesiredSize.ascent -= leading; + rect[0].y -= leading; +// + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.h new file mode 100644 index 00000000000..6321f959476 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmoverFrame.h @@ -0,0 +1,63 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmoverFrame_h___ +#define nsMathMLmoverFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach an overscript to a base +// + +class nsMathMLmoverFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmoverFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmoverFrame(); + virtual ~nsMathMLmoverFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + + +#endif /* nsMathMLmoverFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.cpp new file mode 100644 index 00000000000..26e02dc4f30 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.cpp @@ -0,0 +1,82 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmpaddedFrame.h" + +// +// -- adjust space around content - implementation +// + +nsresult +NS_NewMathMLmpaddedFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmpaddedFrame* it = new nsMathMLmpaddedFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmpaddedFrame::nsMathMLmpaddedFrame() +{ +} + +nsMathMLmpaddedFrame::~nsMathMLmpaddedFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmpaddedFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + // TODO: process the attributes + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.h new file mode 100644 index 00000000000..0430a5de0be --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmpaddedFrame.h @@ -0,0 +1,51 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmpaddedFrame_h___ +#define nsMathMLmpaddedFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- adjust space around content +// + +class nsMathMLmpaddedFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmpaddedFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + +protected: + nsMathMLmpaddedFrame(); + virtual ~nsMathMLmpaddedFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmpaddedFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.cpp new file mode 100644 index 00000000000..85f9d9ef80b --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.cpp @@ -0,0 +1,79 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmphantomFrame.h" + +// +// -- make content invisible but preserve its size +// + +nsresult +NS_NewMathMLmphantomFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmphantomFrame* it = new nsMathMLmphantomFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmphantomFrame::nsMathMLmphantomFrame() +{ +} + +nsMathMLmphantomFrame::~nsMathMLmphantomFrame() +{ +} + +NS_METHOD +nsMathMLmphantomFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + // do nothing, this is not a bug. + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.h new file mode 100644 index 00000000000..f723f4ec1a8 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmphantomFrame.h @@ -0,0 +1,50 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmphantomFrame_h___ +#define nsMathMLmphantomFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- make content invisible but preserve its size +// + +class nsMathMLmphantomFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmphantomFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer); + +protected: + nsMathMLmphantomFrame(); + virtual ~nsMathMLmphantomFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmphantomFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.cpp new file mode 100644 index 00000000000..baa8d4a88e3 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.cpp @@ -0,0 +1,82 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmrootFrame.h" + +// +// and -- form a radical +// + +nsresult +NS_NewMathMLmrootFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmrootFrame* it = new nsMathMLmrootFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmrootFrame::nsMathMLmrootFrame() +{ +} + +nsMathMLmrootFrame::~nsMathMLmrootFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmrootFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + // XXX Attributes? + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.h new file mode 100644 index 00000000000..c1d9afd6749 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmrootFrame.h @@ -0,0 +1,63 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmrootFrame_h___ +#define nsMathMLmrootFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// and -- form a radical +// + +class nsMathMLmrootFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmrootFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(0, 2, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmrootFrame(); + virtual ~nsMathMLmrootFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmrootFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.cpp new file mode 100644 index 00000000000..5f2c4d47533 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.cpp @@ -0,0 +1,82 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmrowFrame.h" + +// +// -- horizontally group any number of subexpressions - implementation +// + +nsresult +NS_NewMathMLmrowFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmrowFrame* it = new nsMathMLmrowFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmrowFrame::nsMathMLmrowFrame() +{ +} + +nsMathMLmrowFrame::~nsMathMLmrowFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmrowFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + // XXX Attributes? + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.h new file mode 100644 index 00000000000..8ac1ff70a08 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmrowFrame.h @@ -0,0 +1,64 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmrowFrame_h___ +#define nsMathMLmrowFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- horizontally group any number of subexpressions +// + +class nsMathMLmrowFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmrowFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + // We override the nsMathMLContainerFrame::ReResolveStyleContext() method + // because this container base arguments does not need its + // 'arguments' in a smaller font size that the 'base'. + NS_IMETHOD + ReResolveStyleContext(nsIPresContext* aPresContext, + nsIStyleContext* aParentContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange) + { + return nsHTMLContainerFrame::ReResolveStyleContext(aPresContext, aParentContext, aParentChange, aChangeList, aLocalChange); + } + +protected: + nsMathMLmrowFrame(); + virtual ~nsMathMLmrowFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmrowFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.cpp new file mode 100644 index 00000000000..30a6b7a1b49 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.cpp @@ -0,0 +1,156 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmstyleFrame.h" + +// +// -- style change +// + +nsresult +NS_NewMathMLmstyleFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmstyleFrame* it = new nsMathMLmstyleFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmstyleFrame::nsMathMLmstyleFrame() +{ +} + +nsMathMLmstyleFrame::~nsMathMLmstyleFrame() +{ +} + +// mstyle needs special care for its scriptlevel and displaystyle attributes +NS_IMETHODIMP +nsMathMLmstyleFrame::Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + mFlags = 0; + + // see if the displaystyle attribute is there + nsAutoString value; + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::displaystyle, value)) { + if (value == "true") { + mDisplayStyle = PR_TRUE; + mFlags |= NS_MATHML_MSTYLE_DISPLAYSTYLE; + } + else if (value == "false") { + mDisplayStyle = PR_FALSE; + mFlags |= NS_MATHML_MSTYLE_DISPLAYSTYLE; + } + } + + // see if the scriptlevel attribute is there + if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, + nsMathMLAtoms::scriptlevel, value)) { + PRInt32 aErrorCode, aUserValue; + aUserValue = value.ToInteger(&aErrorCode); + if (NS_SUCCEEDED(aErrorCode)) { + if (value[0] != '+' && value[0] != '-') { // record that it is an explicit value + mFlags |= NS_MATHML_MSTYLE_SCRIPTLEVEL_EXPLICIT; + mScriptLevel = aUserValue; // explicit value... + } + else { + mScriptLevel += aUserValue; // incremental value... + } + } + } + + +// TODO: +// Examine all other attributes and update the style context to be +// inherited by all children. + + return rv; +} + +NS_IMETHODIMP +nsMathMLmstyleFrame::UpdatePresentationData(PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) +{ + // The scriptlevel and displaystyle attributes of mstyle take precedence. + // Update only if attributes are not there + if (!(NS_MATHML_MSTYLE_HAS_DISPLAYSTYLE(mFlags))) { + mDisplayStyle = aDisplayStyle; + } + if (!(NS_MATHML_MSTYLE_HAS_SCRIPTLEVEL_EXPLICIT(mFlags))) { + mScriptLevel += aScriptLevelIncrement; + } + return NS_OK; +} + +NS_IMETHODIMP +nsMathMLmstyleFrame::UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle) +{ + // mstyle is special... + // Since UpdatePresentationDataFromChildAt() can be called by a parent frame, + // wee need to ensure that the attributes of mstyle take precedence + if (NS_MATHML_MSTYLE_HAS_DISPLAYSTYLE(mFlags)) { + aDisplayStyle = mDisplayStyle; + } + if (NS_MATHML_MSTYLE_HAS_SCRIPTLEVEL_EXPLICIT(mFlags)) { + aScriptLevelIncrement = 0; + } + if (0 == aScriptLevelIncrement && aDisplayStyle == mDisplayStyle) + return NS_OK; + + // let the base class worry about the update + return nsMathMLContainerFrame::UpdatePresentationDataFromChildAt(aIndex, + aScriptLevelIncrement, aDisplayStyle); +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.h new file mode 100644 index 00000000000..85aad8f4da8 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmstyleFrame.h @@ -0,0 +1,84 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmstyleFrame_h___ +#define nsMathMLmstyleFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- style change +// + +#define NS_MATHML_MSTYLE_SCRIPTLEVEL_EXPLICIT (1) +#define NS_MATHML_MSTYLE_DISPLAYSTYLE (1<<1) + +#define NS_MATHML_MSTYLE_HAS_SCRIPTLEVEL_EXPLICIT(_flags) \ + (NS_MATHML_MSTYLE_SCRIPTLEVEL_EXPLICIT == ((_flags) & NS_MATHML_MSTYLE_SCRIPTLEVEL_EXPLICIT)) + +#define NS_MATHML_MSTYLE_HAS_DISPLAYSTYLE(_flags) \ + (NS_MATHML_MSTYLE_DISPLAYSTYLE == ((_flags) & NS_MATHML_MSTYLE_DISPLAYSTYLE)) + + +class nsMathMLmstyleFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmstyleFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Init(nsIPresContext& aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + UpdatePresentationData(PRInt32 aScriptLevel, + PRBool aDisplayStyle); + + NS_IMETHOD + UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmstyleFrame(); + virtual ~nsMathMLmstyleFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } + + PRInt32 mInnerScriptLevelIncrement; + PRInt32 mFlags; +}; + +#endif /* nsMathMLmstyleFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.cpp new file mode 100644 index 00000000000..de1c124e0fc --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.cpp @@ -0,0 +1,165 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmsubFrame.h" + +// +// -- attach a subscript to a base - implementation +// + +nsresult +NS_NewMathMLmsubFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmsubFrame* it = new nsMathMLmsubFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmsubFrame::nsMathMLmsubFrame() +{ +} + +nsMathMLmsubFrame::~nsMathMLmsubFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmsubFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[2]; + nsIFrame* child[2]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (2 > count) { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + if (0 == count) { + aDesiredSize.ascent = childDesiredSize.ascent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + // Get the subscript offset + nscoord subscriptOffset, leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetSubscriptOffset(subscriptOffset); + fm->GetLeading(leading); + +// XXX temporary hack pending bug http://bugzilla.mozilla.org/show_bug.cgi?id=9640 +//#if 0 +nscoord fmAscent, xHeight; +fm->GetMaxAscent(fmAscent); +fm->GetXHeight(xHeight); +subscriptOffset = PR_MAX(subscriptOffset,fmAscent-(xHeight*4)/5); +//#endif + +//for (int i=0; i<100; i++) { +//printf("Ascent:%d xHeight:%d subscriptOffset:%d leading: %d ", +//fmAscent, xHeight, subscriptOffset, leading); +//} + + subscriptOffset += leading; + + // logic derived after examining the boxes on three cases: h0==h1, h0>h1, h0

SetRect(rect[0]); + child[1]->SetRect(rect[1]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.h new file mode 100644 index 00000000000..4067f2f7253 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsubFrame.h @@ -0,0 +1,62 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmsubFrame_h___ +#define nsMathMLmsubFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach a subscript to a base +// + +class nsMathMLmsubFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmsubFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmsubFrame(); + virtual ~nsMathMLmsubFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmsubFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.cpp new file mode 100644 index 00000000000..2017fc69272 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.cpp @@ -0,0 +1,174 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmsubsupFrame.h" + +// +// -- attach a subscript-superscript pair to a base - implementation +// + +nsresult +NS_NewMathMLmsubsupFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmsubsupFrame* it = new nsMathMLmsubsupFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmsubsupFrame::nsMathMLmsubsupFrame() +{ +} + +nsMathMLmsubsupFrame::~nsMathMLmsubsupFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmsubsupFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord ascent, descent; + nscoord count = 0; + nsRect rect[3]; + nsIFrame* child[3]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (3 > count) { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + if (0 == count) { + ascent = childDesiredSize.ascent; + descent = childDesiredSize.descent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + // Get the subscript and superscript offsets + nscoord subscriptOffset, superscriptOffset, leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetSubscriptOffset(subscriptOffset); + fm->GetSuperscriptOffset(superscriptOffset); + fm->GetLeading(leading); + +//#if 0 +// XXX temporary hack pending bug http://bugzilla.mozilla.org/show_bug.cgi?id=9640 +nscoord fmAscent, xHeight; +fm->GetMaxAscent(fmAscent); +fm->GetXHeight(xHeight); +subscriptOffset = PR_MAX(subscriptOffset,fmAscent-(xHeight*4)/5); +//#endif + + subscriptOffset += leading; + superscriptOffset += leading; + + // logic of superimposing a box with sub and the same box with sup + + rect[0].x = 0; + rect[1].x = rect[0].width; + rect[2].x = rect[0].width; + + nscoord subHeight = rect[0].height + rect[1].height - subscriptOffset; + nscoord supHeight = rect[0].height + rect[2].height - superscriptOffset; + + aDesiredSize.descent = subHeight - ascent; + aDesiredSize.ascent = supHeight - descent; + aDesiredSize.height = aDesiredSize.descent + aDesiredSize.ascent; + aDesiredSize.width = rect[0].width + PR_MAX(rect[1].width, rect[2].width); + + rect[2].y = 0; + rect[1].y = aDesiredSize.height - rect[1].height; + rect[0].y = aDesiredSize.height - subHeight; + + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + child[2]->SetRect(rect[2]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.h new file mode 100644 index 00000000000..417b74e5497 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsubsupFrame.h @@ -0,0 +1,62 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmsubsupFrame_h___ +#define nsMathMLmsubsupFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach a subscript-superscript pair to a base +// + +class nsMathMLmsubsupFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmsubsupFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmsubsupFrame(); + virtual ~nsMathMLmsubsupFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmsubsupFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.cpp new file mode 100644 index 00000000000..3003cb8fa5d --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.cpp @@ -0,0 +1,152 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmsupFrame.h" + +// +// -- attach a superscript to a base - implementation +// + +nsresult +NS_NewMathMLmsupFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmsupFrame* it = new nsMathMLmsupFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmsupFrame::nsMathMLmsupFrame() +{ +} + +nsMathMLmsupFrame::~nsMathMLmsupFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmsupFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[2]; + nsIFrame* child[2]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (2 > count) { + + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + if (0 == count) { + aDesiredSize.descent = childDesiredSize.descent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + // Get the superscript offset + nscoord superscriptOffset, leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetSuperscriptOffset(superscriptOffset); + fm->GetLeading(leading); + + superscriptOffset += leading; + + aDesiredSize.height = rect[0].height + rect[1].height - superscriptOffset; + aDesiredSize.width = rect[0].width + rect[1].width; + rect[0].x = 0; + rect[1].x = rect[0].width; + rect[1].y = 0; + rect[0].y = aDesiredSize.height - rect[0].height; + aDesiredSize.ascent = aDesiredSize.height - aDesiredSize.descent; + + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.h new file mode 100644 index 00000000000..a5f7a059f61 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmsupFrame.h @@ -0,0 +1,62 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitions under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmsupFrame_h___ +#define nsMathMLmsupFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach a superscript to a base +// + +class nsMathMLmsupFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmsupFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmsupFrame(); + virtual ~nsMathMLmsupFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmsupFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.cpp new file mode 100644 index 00000000000..ce79b560def --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.cpp @@ -0,0 +1,90 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsAreaFrame.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmtdFrame.h" + +// +// -- table or matrix - implementation +// + +nsresult +NS_NewMathMLmtdFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmtdFrame* it = new nsMathMLmtdFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } +// XXX RBS - what about mFlags ? +// it->SetFlags(NS_AREA_WRAP_SIZE); ? + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmtdFrame::nsMathMLmtdFrame() +{ +} + +nsMathMLmtdFrame::~nsMathMLmtdFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmtdFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) + +{ + nsresult rv = NS_OK; + + // Let the base class do the reflow + rv = nsAreaFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); + + // more about and later + // ... + + return rv; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.h new file mode 100644 index 00000000000..b249d82bf2d --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmtdFrame.h @@ -0,0 +1,50 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmtdFrame_h___ +#define nsMathMLmtdFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- table or matrix +// + +class nsMathMLmtdFrame : public nsAreaFrame { +public: + friend nsresult NS_NewMathMLmtdFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + +protected: + nsMathMLmtdFrame(); + virtual ~nsMathMLmtdFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmtdFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.cpp new file mode 100644 index 00000000000..4a19c73fca8 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.cpp @@ -0,0 +1,165 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmunderFrame.h" + +// +// -- attach an underscript to a base - implementation +// + +nsresult +NS_NewMathMLmunderFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmunderFrame* it = new nsMathMLmunderFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmunderFrame::nsMathMLmunderFrame() +{ +} + +nsMathMLmunderFrame::~nsMathMLmunderFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmunderFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[2]; + nsIFrame* child[2]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (2 > count) { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + + if (0 == count) { + aDesiredSize.ascent = childDesiredSize.ascent; + aDesiredSize.descent = childDesiredSize.descent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + +#if 0 + // Get the underline offset and align the top of the under-element with it + nscoord underOffset, underThickness; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetUnderline(underOffset, underThickness); +#endif + + aDesiredSize.descent += rect[1].height; + aDesiredSize.width = PR_MAX(rect[0].width, rect[1].width); + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + rect[0].x = (aDesiredSize.width - rect[0].width) / 2; // center w.r.t largest width + rect[1].x = (aDesiredSize.width - rect[1].width) / 2; + rect[0].y = 0; + rect[1].y = aDesiredSize.height - rect[1].height; + +//ignore the leading (line spacing) that is attached to the text + nscoord leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetLeading(leading); + + aDesiredSize.height -= leading; + aDesiredSize.descent -= leading; + rect[1].y -= leading; +// + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.h new file mode 100644 index 00000000000..55305af5ec6 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmunderFrame.h @@ -0,0 +1,62 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmunderFrame_h___ +#define nsMathMLmunderFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach an underscript to a base +// + +class nsMathMLmunderFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmunderFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmunderFrame(); + virtual ~nsMathMLmunderFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + +#endif /* nsMathMLmunderFrame_h___ */ diff --git a/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.cpp new file mode 100644 index 00000000000..2b38aa4eb25 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.cpp @@ -0,0 +1,166 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLAtoms.h" +#include "nsMathMLParts.h" +#include "nsMathMLmunderoverFrame.h" + +// +// -- attach an underscript-overscript pair to a base - implementation +// + +nsresult +NS_NewMathMLmunderoverFrame(nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmunderoverFrame* it = new nsMathMLmunderoverFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmunderoverFrame::nsMathMLmunderoverFrame() +{ +} + +nsMathMLmunderoverFrame::~nsMathMLmunderoverFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmunderoverFrame::Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + nsresult rv = NS_OK; + nsReflowStatus childStatus; + nsHTMLReflowMetrics childDesiredSize(aDesiredSize.maxElementSize); + nsSize availSize(aReflowState.mComputedWidth, aReflowState.mComputedHeight); + + aDesiredSize.width = 0; + + ////////////////// + // Reflow Children + + nscoord count = 0; + nsRect rect[3]; + nsIFrame* child[3]; + nsIFrame* childFrame = mFrames.FirstChild(); + while (nsnull != childFrame) + { + ////////////// + // WHITESPACE: don't forget that whitespace doesn't count in MathML! + if (IsOnlyWhitespace(childFrame)) { + ReflowEmptyChild(childFrame); + } + else if (3 > count) { + nsHTMLReflowState childReflowState(aPresContext, aReflowState, + childFrame, availSize); + rv = ReflowChild(childFrame, aPresContext, childDesiredSize, + childReflowState, childStatus); + NS_ASSERTION(NS_FRAME_IS_COMPLETE(childStatus), "bad status"); + + if (NS_FAILED(rv)) { + return rv; + } + + child[count] = childFrame; + rect[count].width = childDesiredSize.width; + rect[count].height = childDesiredSize.height; + + if (aDesiredSize.width < childDesiredSize.width) { + aDesiredSize.width = childDesiredSize.width; + } + if (0 == count) { + aDesiredSize.ascent = childDesiredSize.ascent; + aDesiredSize.descent = childDesiredSize.descent; + } + count++; + } +// else { invalid markup... } + + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(NS_SUCCEEDED(rv),"failed to get next child"); + } + + ////////////////// + // Place Children + + aDesiredSize.ascent += rect[1].height; + aDesiredSize.descent += rect[2].height; + aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; + + rect[0].x = (aDesiredSize.width - rect[0].width) / 2; // center w.r.t largest width + rect[1].x = (aDesiredSize.width - rect[1].width) / 2; + rect[2].x = (aDesiredSize.width - rect[2].width) / 2; + rect[0].y = rect[1].height; + rect[1].y = aDesiredSize.height - rect[1].height; + rect[2].y = 0; + +//ignore the leading (line spacing) that is attached to the text + nscoord leading; + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext.GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + fm->GetLeading(leading); + + aDesiredSize.height -= 2*leading; + aDesiredSize.ascent -= leading; + aDesiredSize.descent -= leading; + rect[0].y -= leading; + rect[1].y -= 2*leading; +// + child[0]->SetRect(rect[0]); + child[1]->SetRect(rect[1]); + child[2]->SetRect(rect[2]); + + if (nsnull != aDesiredSize.maxElementSize) { + aDesiredSize.maxElementSize->width = aDesiredSize.width; + aDesiredSize.maxElementSize->height = aDesiredSize.height; + } + aStatus = NS_FRAME_COMPLETE; + return NS_OK; +} diff --git a/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.h b/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.h new file mode 100644 index 00000000000..ff1a914d193 --- /dev/null +++ b/mozilla/layout/mathml/base/src/nsMathMLmunderoverFrame.h @@ -0,0 +1,63 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * David J. Fiddes + */ + +#ifndef nsMathMLmunderoverFrame_h___ +#define nsMathMLmunderoverFrame_h___ + +#include "nsCOMPtr.h" +#include "nsMathMLContainerFrame.h" + +// +// -- attach an underscript-overscript pair to a base +// + +class nsMathMLmunderoverFrame : public nsMathMLContainerFrame { +public: + friend nsresult NS_NewMathMLmunderoverFrame(nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext& aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + NS_IMETHOD + SetInitialChildList(nsIPresContext& aPresContext, + nsIAtom* aListName, + nsIFrame* aChildList) + { + nsresult rv; + rv = nsMathMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); + UpdatePresentationDataFromChildAt(1, 1, PR_FALSE); + ReResolveStyleContext(&aPresContext, mStyleContext, NS_STYLE_HINT_REFLOW, nsnull, nsnull); + return rv; + } + +protected: + nsMathMLmunderoverFrame(); + virtual ~nsMathMLmunderoverFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; + + +#endif /* nsMathMLmunderoverFrame_h___ */ diff --git a/mozilla/layout/mathml/content/Makefile.in b/mozilla/layout/mathml/content/Makefile.in new file mode 100644 index 00000000000..dc2bc7f3e58 --- /dev/null +++ b/mozilla/layout/mathml/content/Makefile.in @@ -0,0 +1,34 @@ +#!gmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +DIRS = src + +include $(topsrcdir)/config/config.mk + +include $(topsrcdir)/config/rules.mk diff --git a/mozilla/layout/mathml/content/makefile.win b/mozilla/layout/mathml/content/makefile.win new file mode 100644 index 00000000000..e8b0f52fff1 --- /dev/null +++ b/mozilla/layout/mathml/content/makefile.win @@ -0,0 +1,27 @@ +#!nmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH=..\..\.. + +DIRS=src + +include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/layout/mathml/content/src/Makefile.in b/mozilla/layout/mathml/content/src/Makefile.in new file mode 100644 index 00000000000..9d74d95b0a6 --- /dev/null +++ b/mozilla/layout/mathml/content/src/Makefile.in @@ -0,0 +1,65 @@ +#!gmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# Roger B. Sidje +# + +DEPTH=../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +include $(topsrcdir)/config/config.mk + +LIBRARY_NAME = raptormathmlcontent_s + +DEFINES += -D_IMPL_NS_HTML + +INCLUDES += \ + -I$(srcdir)/../../../base/src \ + -I$(DIST)/public/raptor \ + $(NULL) + +CPPSRCS = \ + nsMathMLAtoms.cpp \ + nsMathMLOperators.cpp \ + $(NULL) + + +EXPORTS = \ + nsMathMLOperators.h \ + nsMathMLOperatorList.h \ + $(NULL) + +EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) + +MODULE=layout + +REQUIRES = xpcom raptor dom + +MKSHLIB := + +# we don't want the shared lib, but we want to force the creation of a static lib. +override NO_SHARED_LIB=1 +override NO_STATIC_LIB= + +include $(topsrcdir)/config/rules.mk diff --git a/mozilla/layout/mathml/content/src/makefile.win b/mozilla/layout/mathml/content/src/makefile.win new file mode 100644 index 00000000000..ed0b0ec62ba --- /dev/null +++ b/mozilla/layout/mathml/content/src/makefile.win @@ -0,0 +1,62 @@ +#!nmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# Roger B. Sidje +# + +DEPTH=..\..\..\.. + +LIBRARY_NAME=raptormathmlcontent_s +MODULE=raptor +REQUIRES=xpcom raptor pref + +DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN + +EXPORTS = nsMathMLOperators.h \ + nsMathMLOperatorList.h \ + $(NULL) + +CPPSRCS= \ + nsMathMLAtoms.cpp \ + nsMathMLOperators.cpp \ + $(NULL) + +CPP_OBJS= \ + .\$(OBJDIR)\nsMathMLAtoms.obj \ + .\$(OBJDIR)\nsMathMLOperators.obj \ + $(NULL) + +LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\js \ + -I..\..\..\html\style\src -I..\..\..\html\base\src -I$(PUBLIC)\dom \ + -I..\..\..\html\document\src \ + -I$(PUBLIC)\netlib -I..\..\..\base\src -I$(PUBLIC)\pref + +LCFLAGS = \ + $(LCFLAGS) \ + $(DEFINES) \ + $(NULL) + +include <$(DEPTH)\config\rules.mak> + +libs:: $(LIBRARY) + $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib + +clobber:: + rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/mathml/content/src/nsMathMLAtomList.h b/mozilla/layout/mathml/content/src/nsMathMLAtomList.h new file mode 100644 index 00000000000..00b413365ca --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLAtomList.h @@ -0,0 +1,175 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * (Following the model of the Gecko team) + */ + +/****** + + This file contains the list of all MathML nsIAtoms and their values + + It is designed to be used as inline input to nsMathMLAtoms.cpp *only* + through the magic of C preprocessing. + + All entires must be enclosed in the macro MATHML_ATOM which will have cruel + and unusual things done to it + + It is recommended (but not strictly necessary) to keep all entries + in alphabetical order + + The first argument to MATHML_ATOM is the C++ identifier of the atom + The second argument is the string value of the atom + + ******/ + +MATHML_ATOM(abs, "abs") +MATHML_ATOM(accent, "accent") +MATHML_ATOM(and, "and") +MATHML_ATOM(annotation, "annotation") +MATHML_ATOM(apply, "apply") +MATHML_ATOM(arccos, "arccos") +MATHML_ATOM(arcsin, "arcsin") +MATHML_ATOM(arctan, "arctan") +MATHML_ATOM(bvar, "bvar") +MATHML_ATOM(ci, "ci") +MATHML_ATOM(cn, "cn") +MATHML_ATOM(compose, "compose") +MATHML_ATOM(condition, "condition") +MATHML_ATOM(conjugate, "conjugate") +MATHML_ATOM(cos, "cos") +MATHML_ATOM(cosh, "cosh") +MATHML_ATOM(cot, "cot") +MATHML_ATOM(coth, "coth") +MATHML_ATOM(csc, "csc") +MATHML_ATOM(csch, "csch") +MATHML_ATOM(declare, "declare") +MATHML_ATOM(degree, "degree") +MATHML_ATOM(determinant, "determinant") +MATHML_ATOM(diff, "diff") +MATHML_ATOM(displaystyle, "displaystyle") +MATHML_ATOM(divide, "divide") +MATHML_ATOM(eq, "eq") +MATHML_ATOM(exists, "exists") +MATHML_ATOM(exp, "exp") +MATHML_ATOM(factorial, "factorial") +MATHML_ATOM(fence, "fence") +MATHML_ATOM(fn, "fn") +MATHML_ATOM(forall, "forall") +MATHML_ATOM(form, "form") +MATHML_ATOM(geq, "geq") +MATHML_ATOM(gt, "gt") +MATHML_ATOM(ident, "ident") +MATHML_ATOM(implies, "implies") +MATHML_ATOM(in, "in") +MATHML_ATOM(_int, "int") +MATHML_ATOM(intersect, "intersect") +MATHML_ATOM(interval, "interval") +MATHML_ATOM(inverse, "inverse") +MATHML_ATOM(lambda, "lambda") +MATHML_ATOM(largeop, "largeop") +MATHML_ATOM(leq, "leq") +MATHML_ATOM(limit, "limit") +MATHML_ATOM(linethickness, "linethickness") +MATHML_ATOM(list, "list") +MATHML_ATOM(ln, "ln") +MATHML_ATOM(log, "log") +MATHML_ATOM(logbase, "logbase") +MATHML_ATOM(lowlimit, "lowlimit") +MATHML_ATOM(lt, "lt") +MATHML_ATOM(maction, "maction") +MATHML_ATOM(maligngroup, "maligngroup") +MATHML_ATOM(malignmark, "malignmark") +MATHML_ATOM(math, "math") +MATHML_ATOM(matrix, "matrix") +MATHML_ATOM(matrixrow, "matrixrow") +MATHML_ATOM(max, "max") +MATHML_ATOM(mean, "mean") +MATHML_ATOM(median, "median") +MATHML_ATOM(merror, "merror") +MATHML_ATOM(mfenced, "mfenced") +MATHML_ATOM(mfrac, "mfrac") +MATHML_ATOM(mi, "mi") +MATHML_ATOM(min, "min") +MATHML_ATOM(minus, "minus") +MATHML_ATOM(mmultiscripts, "mmultiscripts") +MATHML_ATOM(mn, "mn") +MATHML_ATOM(mo, "mo") +MATHML_ATOM(mode, "mode") +MATHML_ATOM(moment, "moment") +MATHML_ATOM(movablelimits, "movablelimits") +MATHML_ATOM(mover, "mover") +MATHML_ATOM(mpadded, "mpadded") +MATHML_ATOM(mphantom, "mphantom") +MATHML_ATOM(mprescripts, "mprescripts") +MATHML_ATOM(mroot, "mroot") +MATHML_ATOM(mrow, "mrow") +MATHML_ATOM(ms, "ms") +MATHML_ATOM(mspace, "mspace") +MATHML_ATOM(msqrt, "msqrt") +MATHML_ATOM(mstyle, "mstyle") +MATHML_ATOM(msub, "msub") +MATHML_ATOM(msubsup, "msubsup") +MATHML_ATOM(msup, "msup") +MATHML_ATOM(mtable, "mtable") +MATHML_ATOM(mtd, "mtd") +MATHML_ATOM(mtext, "mtext") +MATHML_ATOM(mtr, "mtr") +MATHML_ATOM(munder, "munder") +MATHML_ATOM(munderover, "munderover") +MATHML_ATOM(neq, "neq") +MATHML_ATOM(none, "none") +MATHML_ATOM(not, "not") +MATHML_ATOM(notin, "notin") +MATHML_ATOM(notprsubset, "notprsubset") +MATHML_ATOM(notsubset, "notsubset") +MATHML_ATOM(or, "or") +MATHML_ATOM(partialdiff, "partialdiff") +MATHML_ATOM(plus, "plus") +MATHML_ATOM(power, "power") +MATHML_ATOM(product, "product") +MATHML_ATOM(prsubset, "prsubset") +MATHML_ATOM(quotient, "quotient") +MATHML_ATOM(reln, "reln") +MATHML_ATOM(rem, "rem") +MATHML_ATOM(root, "root") +MATHML_ATOM(scriptlevel, "scriptlevel") +MATHML_ATOM(sdev, "sdev") +MATHML_ATOM(sec, "sec") +MATHML_ATOM(sech, "sech") +MATHML_ATOM(select, "select") +MATHML_ATOM(semantics, "semantics") +MATHML_ATOM(sep, "sep") +MATHML_ATOM(separator, "separator") +MATHML_ATOM(set, "set") +MATHML_ATOM(setdiff, "setdiff") +MATHML_ATOM(sin, "sin") +MATHML_ATOM(sinh, "sinh") +MATHML_ATOM(stretchy, "stretchy") +MATHML_ATOM(subset, "subset") +MATHML_ATOM(sum, "sum") +MATHML_ATOM(tan, "tan") +MATHML_ATOM(tanh, "tanh") +MATHML_ATOM(tendsto, "tendsto") +MATHML_ATOM(times, "times") +MATHML_ATOM(transpose, "transpose") +MATHML_ATOM(_union, "union") +MATHML_ATOM(uplimit, "uplimit") +MATHML_ATOM(var, "var") +MATHML_ATOM(vector, "vector") +MATHML_ATOM(xor, "xor") diff --git a/mozilla/layout/mathml/content/src/nsMathMLAtoms.cpp b/mozilla/layout/mathml/content/src/nsMathMLAtoms.cpp new file mode 100644 index 00000000000..33debc8074b --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLAtoms.cpp @@ -0,0 +1,70 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * (Following the model of the Gecko team) + */ + +#include "nsString.h" +#include "nsINameSpaceManager.h" +#include "nsMathMLAtoms.h" + +static const char kMathMLNameSpace[] = "http://www.w3.org/Math/MathML"; + +PRInt32 nsMathMLAtoms::nameSpaceID; + +// define storage for all atoms +#define MATHML_ATOM(_name, _value) nsIAtom* nsMathMLAtoms::_name; +#include "nsMathMLAtomList.h" +#undef MATHML_ATOM + + +static nsrefcnt gRefCnt; +static nsINameSpaceManager* gNameSpaceManager; + +void nsMathMLAtoms::AddRefAtoms() { + + if (gRefCnt == 0) { + /* MathML Atoms registers the MathML name space ID because it's a convenient + place to do this, if you don't want a permanent, "well-known" ID. + */ + if (NS_SUCCEEDED(NS_NewNameSpaceManager(&gNameSpaceManager))) +// gNameSpaceManager->CreateRootNameSpace(namespace); + gNameSpaceManager->RegisterNameSpace(kMathMLNameSpace, nameSpaceID); + else + NS_ASSERTION(0, "failed to create MathML atoms namespace manager"); + + // now register the atoms +#define MATHML_ATOM(_name, _value) _name = NS_NewAtom(_value); +#include "nsMathMLAtomList.h" +#undef MATHML_ATOM + } + ++gRefCnt; +} + +void nsMathMLAtoms::ReleaseAtoms() { + + NS_PRECONDITION(gRefCnt != 0, "bad release of MathML atoms"); + if (--gRefCnt == 0) { +#define MATHML_ATOM(_name, _value) NS_RELEASE(_name); +#include "nsMathMLAtomList.h" +#undef MATHML_ATOM + + NS_IF_RELEASE(gNameSpaceManager); + } +} diff --git a/mozilla/layout/mathml/content/src/nsMathMLAtoms.h b/mozilla/layout/mathml/content/src/nsMathMLAtoms.h new file mode 100644 index 00000000000..029b324f253 --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLAtoms.h @@ -0,0 +1,60 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + * (Following the model of the Gecko team) + */ + +#ifndef nsMathMLAtoms_h___ +#define nsMathMLAtoms_h___ + +#include "prtypes.h" +#include "nsIAtom.h" + +class nsINameSpaceManager; + +/** + * This class wraps up the creation and destruction of the standard + * set of MathML atoms used during normal MathML handling. This object + * is created when the first MathML content object is created, and + * destroyed when the last such content object is destroyed. + */ +class nsMathMLAtoms { +public: + + static void AddRefAtoms(); + static void ReleaseAtoms(); + + // MathML namespace ID, good for the life of the nsMathMLAtoms object + static PRInt32 nameSpaceID; + + /* Declare all atoms + + The atom names and values are stored in nsMathMLAtomList.h and + are brought to you by the magic of C preprocessing + + Add new atoms to nsMathMLAtomList and all support logic will be auto-generated + after a clobber-build within this directory + */ +#define MATHML_ATOM(_name, _value) static nsIAtom* _name; +#include "nsMathMLAtomList.h" +#undef MATHML_ATOM + +}; + +#endif /* nsMathMLAtoms_h___ */ diff --git a/mozilla/layout/mathml/content/src/nsMathMLOperatorList.h b/mozilla/layout/mathml/content/src/nsMathMLOperatorList.h new file mode 100644 index 00000000000..aae9c28f650 --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLOperatorList.h @@ -0,0 +1,727 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +/* MathML Operator Dictionary - Auto-generated by operator.pl. Do not edit! */ + +/* FORMAT +MATHML_OPERATOR(_rank, + _operator,= string value of the operator + _flags, = bitwise: movablelimits|separator|largeop|accent|fence|stretchy|form + _lspace, = leftspace in em + _rspace) = rightspace in em +*/ + +#ifdef WANT_MATHML_OPERATOR_COUNT +#define NS_MATHML_OPERATOR_COUNT 343 +#else +#ifdef WANT_MATHML_OPERATOR_UNICHAR +//Unicode(s),\0// group symbol form +0x0028,0x0000, // 0 ( prefix +0x0029,0x0000, // 0 ) postfix +0x005B,0x0000, // 0 [ prefix +0x005D,0x0000, // 0 ] postfix +0x007B,0x0000, // 0 { prefix +0x007D,0x0000, // 0 } postfix +0x201D,0x0000, // 0 ” postfix +0x2019,0x0000, // 0 ’ postfix +0x3008,0x0000, // 0 ⟨ prefix +0xF603,0x0000, // 0 &LeftBracketingBar; prefix +0x2308,0x0000, // 0 ⌈ prefix +0x301A,0x0000, // 0 ⟦ prefix +0xF605,0x0000, // 0 &LeftDoubleBracketingBar; prefix +0x230A,0x0000, // 0 ⌊ prefix +0x201C,0x0000, // 0 “ prefix +0x2018,0x0000, // 0 ‘ prefix +0x3009,0x0000, // 0 ⟩ postfix +0xF604,0x0000, // 0 &RightBracketingBar; postfix +0x2309,0x0000, // 0 ⌉ postfix +0x301B,0x0000, // 0 ⟧ postfix +0xF606,0x0000, // 0 &RightDoubleBracketingBar; postfix +0x230B,0x0000, // 0 ⌋ postfix +0xE850,0x0000, // 0 &LeftSkeleton; prefix +0xE851,0x0000, // 0 &RightSkeleton; postfix +0xE89C,0x0000, // 1 ⁣ infix +0x002C,0x0000, // 2 , infix +0xE859,0x0000, // 3 ─ infix +0xE85A,0x0000, // 3 | infix +0x003B,0x0000, // 4 ; infix +0x003B,0x0000, // 4 ; postfix +0x003A,0x003D,0x0000, // 5 := infix +0xE85B,0x0000, // 5 ≔ infix +0x2235,0x0000, // 6 ∵ infix +0x2234,0x0000, // 6 ∴ infix +0xE85C,0x0000, // 7 ❘ infix +0x002F,0x002F,0x0000, // 8 // infix +0x2237,0x0000, // 9 ∷ infix +0x0026,0x0000, // 10 & prefix +0x0026,0x0000, // 10 & postfix +0x002A,0x003D,0x0000, // 11 *= infix +0x002D,0x003D,0x0000, // 11 -= infix +0x002B,0x003D,0x0000, // 11 += infix +0x002F,0x003D,0x0000, // 11 /= infix +0x002D,0x003E,0x0000, // 12 -> infix +0x003A,0x0000, // 13 : infix +0x002E,0x002E,0x0000, // 14 .. postfix +0x002E,0x002E,0x002E,0x0000, // 14 ... postfix +0x220B,0x0000, // 15 ∋ infix +0xE30F,0x0000, // 16 ⫤ infix +0x22A8,0x0000, // 16 ⊨ infix +0x22A4,0x0000, // 16 ⊤ infix +0x22A3,0x0000, // 16 ⊣ infix +0x22A2,0x0000, // 16 ⊢ infix +0x21D2,0x0000, // 17 ⇒ infix +0xF524,0x0000, // 17 ⥰ infix +0x007C,0x0000, // 18 | infix +0x007C,0x007C,0x0000, // 18 || infix +0xE375,0x0000, // 18 ⩔ infix +0x0026,0x0026,0x0000, // 19 && infix +0xE374,0x0000, // 19 ⩓ infix +0x0026,0x0000, // 20 & infix +0x0021,0x0000, // 21 ! prefix +0xE3AC,0x0000, // 21 ⫬ prefix +0x2203,0x0000, // 22 ∃ prefix +0x2200,0x0000, // 22 ∀ prefix +0x2204,0x0000, // 22 ∄ prefix +0x2208,0x0000, // 23 ∈ infix +0x2209,0x0000, // 23 ∉ infix +0x220C,0x0000, // 23 ∌ infix +0xE604,0x0000, // 23 ⊏̸ infix +0x22E2,0x0000, // 23 ⋢ infix +0xE615,0x0000, // 23 ⊐̸ infix +0x22E3,0x0000, // 23 ⋣ infix +0x2284,0x0000, // 23 ⊂⃒ infix +0x2288,0x0000, // 23 ⊈ infix +0x2285,0x0000, // 23 ⊃⃒ infix +0x2289,0x0000, // 23 ⊉ infix +0x220B,0x0000, // 23 ∋ infix +0x228F,0x0000, // 23 ⊏ infix +0x2291,0x0000, // 23 ⊑ infix +0x2290,0x0000, // 23 ⊐ infix +0x2292,0x0000, // 23 ⊒ infix +0x22D0,0x0000, // 23 ⋐ infix +0x2286,0x0000, // 23 ⊆ infix +0x2283,0x0000, // 23 ⊃ infix +0x2287,0x0000, // 23 ⊇ infix +0x21D0,0x0000, // 24 ⇐ infix +0x21D4,0x0000, // 24 ⇔ infix +0x21D2,0x0000, // 24 ⇒ infix +0xF50B,0x0000, // 24 ⥐ infix +0xF50E,0x0000, // 24 ⥞ infix +0x21BD,0x0000, // 24 ↽ infix +0xF50C,0x0000, // 24 ⥖ infix +0xF50F,0x0000, // 24 ⥟ infix +0x21C1,0x0000, // 24 ⇁ infix +0xF50D,0x0000, // 24 ⥗ infix +0x2190,0x0000, // 24 ← infix +0x21E4,0x0000, // 24 ⇤ infix +0x21C6,0x0000, // 24 ⇆ infix +0x2194,0x0000, // 24 ↔ infix +0xF505,0x0000, // 24 ⥎ infix +0x21A4,0x0000, // 24 ↤ infix +0xF509,0x0000, // 24 ⥚ infix +0x21BC,0x0000, // 24 ↼ infix +0xF507,0x0000, // 24 ⥒ infix +0x2199,0x0000, // 24 ↙ infix +0x2198,0x0000, // 24 ↘ infix +0x2192,0x0000, // 24 → infix +0x21E5,0x0000, // 24 ⇥ infix +0x21C4,0x0000, // 24 ⇄ infix +0x21A6,0x0000, // 24 ↦ infix +0xF50A,0x0000, // 24 ⥛ infix +0x21C0,0x0000, // 24 ⇀ infix +0xF508,0x0000, // 24 ⥓ infix +0xE233,0x0000, // 24 ← infix +0xE232,0x0000, // 24 → infix +0x2196,0x0000, // 24 ↖ infix +0x2197,0x0000, // 24 ↗ infix +0x003D,0x0000, // 25 = infix +0x003C,0x0000, // 25 < infix +0x003E,0x0000, // 25 > infix +0x0021,0x003D,0x0000, // 25 != infix +0x003D,0x003D,0x0000, // 25 == infix +0x003C,0x003D,0x0000, // 25 <= infix +0x003E,0x003D,0x0000, // 25 >= infix +0x2261,0x0000, // 25 ≡ infix +0x224D,0x0000, // 25 ≍ infix +0x2250,0x0000, // 25 ≐ infix +0x2225,0x0000, // 25 ∥ infix +0xF431,0x0000, // 25 ⩵ infix +0x2242,0x0000, // 25 ≂ infix +0x21CC,0x0000, // 25 ⇌ infix +0x2265,0x0000, // 25 ≥ infix +0x22DB,0x0000, // 25 ⋛ infix +0x2267,0x0000, // 25 ≧ infix +0xE2F7,0x0000, // 25 ⪢ infix +0x2277,0x0000, // 25 ≷ infix +0xE2F6,0x0000, // 25 ⩾ infix +0x2273,0x0000, // 25 ≳ infix +0x224E,0x0000, // 25 ≎ infix +0x224F,0x0000, // 25 ≏ infix +0x22B2,0x0000, // 25 ⊲ infix +0xF410,0x0000, // 25 ⧏ infix +0x22B4,0x0000, // 25 ⊴ infix +0x2264,0x0000, // 25 ≤ infix +0x22DA,0x0000, // 25 ⋚ infix +0x2266,0x0000, // 25 ≦ infix +0x2276,0x0000, // 25 ≶ infix +0xE2FB,0x0000, // 25 ⪡ infix +0xE2FA,0x0000, // 25 ⩽ infix +0x2272,0x0000, // 25 ≲ infix +0x226B,0x0000, // 25 ≫ infix +0x226A,0x0000, // 25 ≪ infix +0x2262,0x0000, // 25 ≢ infix +0x226D,0x0000, // 25 ≭ infix +0x2226,0x0000, // 25 ∦ infix +0x2260,0x0000, // 25 ≠ infix +0xE84E,0x0000, // 25 ≂̸ infix +0x226F,0x0000, // 25 ≯ infix +0xE2A6,0x0000, // 25 ≱ infix +0x2270,0x0000, // 25 ≧̸ infix +0xE2CC,0x0000, // 25 ≫̸ infix +0x2279,0x0000, // 25 ≹ infix +0x2271,0x0000, // 25 ⩾̸ infix +0x2275,0x0000, // 25 ≵ infix +0xE616,0x0000, // 25 ≎̸ infix +0xE84D,0x0000, // 25 ≏̸ infix +0x22EA,0x0000, // 25 ⋪ infix +0xF412,0x0000, // 25 ⧏̸ infix +0x22EC,0x0000, // 25 ⋬ infix +0x226E,0x0000, // 25 ≮ infix +0xE2A7,0x0000, // 25 ≰ infix +0x2278,0x0000, // 25 ≸ infix +0xE2CB,0x0000, // 25 ≪̸ infix +0x2270,0x0000, // 25 ⩽̸ infix +0x2274,0x0000, // 25 ≴ infix +0xF428,0x0000, // 25 ⪢̸ infix +0xF423,0x0000, // 25 ⪡̸ infix +0x2280,0x0000, // 25 ⊀ infix +0xE5DC,0x0000, // 25 ⪯̸ infix +0x22E0,0x0000, // 25 ⋠ infix +0x22EB,0x0000, // 25 ⋫ infix +0xF413,0x0000, // 25 ⧐̸ infix +0x22ED,0x0000, // 25 ⋭ infix +0x2281,0x0000, // 25 ⊁ infix +0xE5F1,0x0000, // 25 ⪰̸ infix +0x22E1,0x0000, // 25 ⋡ infix +0xE837,0x0000, // 25 ≿̸ infix +0x2241,0x0000, // 25 ≁ infix +0x2244,0x0000, // 25 ≄ infix +0x2247,0x0000, // 25 ≇ infix +0x2249,0x0000, // 25 ≉ infix +0x2224,0x0000, // 25 ∤ infix +0x227A,0x0000, // 25 ≺ infix +0xE2FE,0x0000, // 25 ⪯ infix +0x227C,0x0000, // 25 ≼ infix +0x227E,0x0000, // 25 ≾ infix +0x2237,0x0000, // 25 ∷ infix +0x221D,0x0000, // 25 ∝ infix +0x21CB,0x0000, // 25 ⇋ infix +0x22B3,0x0000, // 25 ⊳ infix +0xF411,0x0000, // 25 ⧐ infix +0x22B5,0x0000, // 25 ⊵ infix +0x227B,0x0000, // 25 ≻ infix +0x227D,0x0000, // 25 ⪰ infix +0x227D,0x0000, // 25 ≽ infix +0x227F,0x0000, // 25 ≿ infix +0x223C,0x0000, // 25 ∼ infix +0x2243,0x0000, // 25 ≃ infix +0x2245,0x0000, // 25 ≅ infix +0x2248,0x0000, // 25 ≈ infix +0x22A5,0x0000, // 25 ⊥ infix +0x2223,0x0000, // 25 ∣ infix +0x2294,0x0000, // 26 ⊔ infix +0x22C3,0x0000, // 26 ⋃ infix +0x228E,0x0000, // 26 ⊎ infix +0x002D,0x0000, // 27 - infix +0x002B,0x0000, // 27 + infix +0x22C2,0x0000, // 27 ⋂ infix +0x2213,0x0000, // 27 ∓ infix +0x00B1,0x0000, // 27 ± infix +0x2293,0x0000, // 27 ⊓ infix +0x22C1,0x0000, // 28 ⋁ prefix +0x2296,0x0000, // 28 ⊖ prefix +0x2295,0x0000, // 28 ⊕ prefix +0x2211,0x0000, // 28 ∑ prefix +0x22C3,0x0000, // 28 ⋃ prefix +0x228E,0x0000, // 28 ⊎ prefix +0x006C,0x0069,0x006D,0x0000, // 28 lim prefix +0x006D,0x0061,0x0078,0x0000, // 28 max prefix +0x006D,0x0069,0x006E,0x0000, // 28 min prefix +0x2296,0x0000, // 29 ⊖ infix +0x2295,0x0000, // 29 ⊕ infix +0x2232,0x0000, // 30 ∲ prefix +0x222E,0x0000, // 30 ∮ prefix +0x2233,0x0000, // 30 ∳ prefix +0x222F,0x0000, // 30 ∯ prefix +0x222B,0x0000, // 30 ∫ prefix +0x22D3,0x0000, // 31 ⋓ infix +0x22D2,0x0000, // 32 ⋒ infix +0x2240,0x0000, // 33 ≀ infix +0x22C0,0x0000, // 34 ⋀ prefix +0x2297,0x0000, // 34 ⊗ prefix +0x2210,0x0000, // 34 ∐ prefix +0x220F,0x0000, // 34 ∏ prefix +0x22C2,0x0000, // 34 ⋂ prefix +0x2210,0x0000, // 35 ∐ infix +0x22C6,0x0000, // 36 ⋆ infix +0x2299,0x0000, // 37 ⊙ prefix +0x002A,0x0000, // 38 * infix +0xE89E,0x0000, // 38 ⁢ infix +0x00B7,0x0000, // 39 · infix +0x2297,0x0000, // 40 ⊗ infix +0x22C1,0x0000, // 41 ⋁ infix +0x22C0,0x0000, // 42 ⋀ infix +0x22C4,0x0000, // 43 ⋄ infix +0x2216,0x0000, // 44 ∖ infix +0x002F,0x0000, // 45 / infix +0x002D,0x0000, // 46 - prefix +0x002B,0x0000, // 46 + prefix +0x2213,0x0000, // 46 ∓ prefix +0x00B1,0x0000, // 46 ± prefix +0x002E,0x0000, // 47 . infix +0xE619,0x0000, // 48 ⨯ infix +0x002A,0x002A,0x0000, // 49 ** infix +0x2299,0x0000, // 50 ⊙ infix +0x2218,0x0000, // 51 ∘ infix +0x25A1,0x0000, // 52 □ prefix +0x2207,0x0000, // 53 ∇ prefix +0x2202,0x0000, // 53 ∂ prefix +0xF74B,0x0000, // 54 ⅅ prefix +0xF74C,0x0000, // 54 ⅆ prefix +0x221A,0x0000, // 55 √ prefix +0x21D3,0x0000, // 56 ⇓ infix +0xE200,0x0000, // 56 ⟸ infix +0xE202,0x0000, // 56 ⟺ infix +0xE204,0x0000, // 56 ⟹ infix +0x21D1,0x0000, // 56 ⇑ infix +0x21D5,0x0000, // 56 ⇕ infix +0x2193,0x0000, // 56 ↓ infix +0xF504,0x0000, // 56 ⤓ infix +0xE216,0x0000, // 56 ⇵ infix +0x21A7,0x0000, // 56 ↧ infix +0xF519,0x0000, // 56 ⥡ infix +0x21C3,0x0000, // 56 ⇃ infix +0xF517,0x0000, // 56 ⥙ infix +0xF515,0x0000, // 56 ⥑ infix +0xF518,0x0000, // 56 ⥠ infix +0x21BF,0x0000, // 56 ↿ infix +0xF516,0x0000, // 56 ⥘ infix +0xE201,0x0000, // 56 ⟵ infix +0xE203,0x0000, // 56 ⟷ infix +0xE205,0x0000, // 56 ⟶ infix +0xE217,0x0000, // 56 ⥯ infix +0xF514,0x0000, // 56 ⥝ infix +0x21C2,0x0000, // 56 ⇂ infix +0xF512,0x0000, // 56 ⥕ infix +0xF510,0x0000, // 56 ⥏ infix +0xF513,0x0000, // 56 ⥜ infix +0x21BE,0x0000, // 56 ↾ infix +0xF511,0x0000, // 56 ⥔ infix +0xE87F,0x0000, // 56 ↓ infix +0xE880,0x0000, // 56 ↑ infix +0x2191,0x0000, // 56 ↑ infix +0xF503,0x0000, // 56 ⤒ infix +0x21C5,0x0000, // 56 ⇅ infix +0x2195,0x0000, // 56 ↕ infix +0xE218,0x0000, // 56 ⥮ infix +0x21A5,0x0000, // 56 ↥ infix +0x005E,0x0000, // 57 ^ infix +0x003C,0x003E,0x0000, // 58 <> infix +0x0027,0x0000, // 59 ' postfix +0x0021,0x0000, // 60 ! postfix +0x0021,0x0021,0x0000, // 60 !! postfix +0x007E,0x0000, // 61 ~ infix +0x0040,0x0000, // 62 @ infix +0x002D,0x002D,0x0000, // 63 -- postfix +0x002D,0x002D,0x0000, // 63 -- prefix +0x002B,0x002B,0x0000, // 63 ++ postfix +0x002B,0x002B,0x0000, // 63 ++ prefix +0xE8A0,0x0000, // 64 ⁡ infix +0x003F,0x0000, // 65 ? infix +0x005F,0x0000, // 66 _ infix +0x02D8,0x0000, // 67 ˘ postfix +0x00B8,0x0000, // 67 ¸ postfix +0x0060,0x0000, // 67 ` postfix +0x02D9,0x0000, // 67 ˙ postfix +0x02DD,0x0000, // 67 ˝ postfix +0x00B4,0x0000, // 67 ´ postfix +0x02DC,0x0000, // 67 ˜ postfix +0x00A8,0x0000, // 67 ¨ postfix +0x0311,0x0000, // 67 ̑ postfix +0x02C7,0x0000, // 67 ˇ postfix +0x0302,0x0000, // 67 ^ postfix +0x00AF,0x0000, // 67 ‾ postfix +0xF612,0x0000, // 67 ⏞ postfix +0xF614,0x0000, // 67 ⎴ postfix +0xF610,0x0000, // 67 ⏜ postfix +0x20DB,0x0000, // 67 ⃛ postfix +0x0332,0x0000, // 67 _ postfix +0xF613,0x0000, // 67 ⏟ postfix +0xF615,0x0000, // 67 ⎵ postfix +0xF611,0x0000, // 67 ⏝ postfix + +#else +MATHML_OPERATOR(0,"(",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 0028 prefix +MATHML_OPERATOR(1,")",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 0029 postfix +MATHML_OPERATOR(2,"[",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 005B prefix +MATHML_OPERATOR(3,"]",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 005D postfix +MATHML_OPERATOR(4,"{",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 007B prefix +MATHML_OPERATOR(5,"}",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 007D postfix +MATHML_OPERATOR(6,"”",(3|(1<<3)),0.0f,0.0f) // 201D postfix +MATHML_OPERATOR(7,"’",(3|(1<<3)),0.0f,0.0f) // 2019 postfix +MATHML_OPERATOR(8,"⟨",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 3008 prefix +MATHML_OPERATOR(9,"&LeftBracketingBar;",(2|(1<<2)|(1<<3)),0.0f,0.0f) // F603 prefix +MATHML_OPERATOR(10,"⌈",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 2308 prefix +MATHML_OPERATOR(11,"⟦",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 301A prefix +MATHML_OPERATOR(12,"&LeftDoubleBracketingBar;",(2|(1<<2)|(1<<3)),0.0f,0.0f) // F605 prefix +MATHML_OPERATOR(13,"⌊",(2|(1<<2)|(1<<3)),0.0f,0.0f) // 230A prefix +MATHML_OPERATOR(14,"“",(2|(1<<3)),0.0f,0.0f) // 201C prefix +MATHML_OPERATOR(15,"‘",(2|(1<<3)),0.0f,0.0f) // 2018 prefix +MATHML_OPERATOR(16,"⟩",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 3009 postfix +MATHML_OPERATOR(17,"&RightBracketingBar;",(3|(1<<2)|(1<<3)),0.0f,0.0f) // F604 postfix +MATHML_OPERATOR(18,"⌉",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 2309 postfix +MATHML_OPERATOR(19,"⟧",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 301B postfix +MATHML_OPERATOR(20,"&RightDoubleBracketingBar;",(3|(1<<2)|(1<<3)),0.0f,0.0f) // F606 postfix +MATHML_OPERATOR(21,"⌋",(3|(1<<2)|(1<<3)),0.0f,0.0f) // 230B postfix +MATHML_OPERATOR(22,"&LeftSkeleton;",(2|(1<<3)),0.0f,0.0f) // E850 prefix +MATHML_OPERATOR(23,"&RightSkeleton;",(3|(1<<3)),0.0f,0.0f) // E851 postfix +MATHML_OPERATOR(24,"⁣",(1|(1<<6)),0.0f,0.0f) // E89C infix +MATHML_OPERATOR(25,",",(1|(1<<6)),0.0f,.33333f) // 002C infix +MATHML_OPERATOR(26,"─",(1|(1<<2)),0.0f,0.0f) // E859 infix +MATHML_OPERATOR(27,"|",(1|(1<<2)),0.0f,0.0f) // E85A infix +MATHML_OPERATOR(28,";",(1|(1<<6)),0.0f,.27777f) // 003B infix +MATHML_OPERATOR(29,";",(3|(1<<6)),0.0f,0.0f) // 003B postfix +MATHML_OPERATOR(30,":=",1,.27777f,.27777f) // 003A 003D infix +MATHML_OPERATOR(31,"≔",1,.27777f,.27777f) // E85B infix +MATHML_OPERATOR(32,"∵",1,.27777f,.27777f) // 2235 infix +MATHML_OPERATOR(33,"∴",1,.27777f,.27777f) // 2234 infix +MATHML_OPERATOR(34,"❘",(1|(1<<2)),.27777f,.27777f) // E85C infix +MATHML_OPERATOR(35,"//",1,.27777f,.27777f) // 002F 002F infix +MATHML_OPERATOR(36,"∷",1,.27777f,.27777f) // 2237 infix +MATHML_OPERATOR(37,"&",2,0.0f,.27777f) // 0026 prefix +MATHML_OPERATOR(38,"&",3,.27777f,0.0f) // 0026 postfix +MATHML_OPERATOR(39,"*=",1,.27777f,.27777f) // 002A 003D infix +MATHML_OPERATOR(40,"-=",1,.27777f,.27777f) // 002D 003D infix +MATHML_OPERATOR(41,"+=",1,.27777f,.27777f) // 002B 003D infix +MATHML_OPERATOR(42,"/=",1,.27777f,.27777f) // 002F 003D infix +MATHML_OPERATOR(43,"->",1,.27777f,.27777f) // 002D 003E infix +MATHML_OPERATOR(44,":",1,.27777f,.27777f) // 003A infix +MATHML_OPERATOR(45,"..",3,.22222f,0.0f) // 002E 002E postfix +MATHML_OPERATOR(46,"...",3,.22222f,0.0f) // 002E 002E 002E postfix +MATHML_OPERATOR(47,"∋",1,.27777f,.27777f) // 220B infix +MATHML_OPERATOR(48,"⫤",1,.27777f,.27777f) // E30F infix +MATHML_OPERATOR(49,"⊨",1,.27777f,.27777f) // 22A8 infix +MATHML_OPERATOR(50,"⊤",1,.27777f,.27777f) // 22A4 infix +MATHML_OPERATOR(51,"⊣",1,.27777f,.27777f) // 22A3 infix +MATHML_OPERATOR(52,"⊢",1,.27777f,.27777f) // 22A2 infix +MATHML_OPERATOR(53,"⇒",(1|(1<<2)),.27777f,.27777f) // 21D2 infix +MATHML_OPERATOR(54,"⥰",1,.27777f,.27777f) // F524 infix +MATHML_OPERATOR(55,"|",(1|(1<<2)),.27777f,.27777f) // 007C infix +MATHML_OPERATOR(56,"||",1,.22222f,.22222f) // 007C 007C infix +MATHML_OPERATOR(57,"⩔",(1|(1<<2)),.22222f,.22222f) // E375 infix +MATHML_OPERATOR(58,"&&",1,.27777f,.27777f) // 0026 0026 infix +MATHML_OPERATOR(59,"⩓",(1|(1<<2)),.22222f,.22222f) // E374 infix +MATHML_OPERATOR(60,"&",1,.27777f,.27777f) // 0026 infix +MATHML_OPERATOR(61,"!",2,0.0f,.27777f) // 0021 prefix +MATHML_OPERATOR(62,"⫬",2,0.0f,.27777f) // E3AC prefix +MATHML_OPERATOR(63,"∃",2,0.0f,.27777f) // 2203 prefix +MATHML_OPERATOR(64,"∀",2,0.0f,.27777f) // 2200 prefix +MATHML_OPERATOR(65,"∄",2,0.0f,.27777f) // 2204 prefix +MATHML_OPERATOR(66,"∈",1,.27777f,.27777f) // 2208 infix +MATHML_OPERATOR(67,"∉",1,.27777f,.27777f) // 2209 infix +MATHML_OPERATOR(68,"∌",1,.27777f,.27777f) // 220C infix +MATHML_OPERATOR(69,"⊏̸",1,.27777f,.27777f) // E604 infix +MATHML_OPERATOR(70,"⋢",1,.27777f,.27777f) // 22E2 infix +MATHML_OPERATOR(71,"⊐̸",1,.27777f,.27777f) // E615 infix +MATHML_OPERATOR(72,"⋣",1,.27777f,.27777f) // 22E3 infix +MATHML_OPERATOR(73,"⊂⃒",1,.27777f,.27777f) // 2284 infix +MATHML_OPERATOR(74,"⊈",1,.27777f,.27777f) // 2288 infix +MATHML_OPERATOR(75,"⊃⃒",1,.27777f,.27777f) // 2285 infix +MATHML_OPERATOR(76,"⊉",1,.27777f,.27777f) // 2289 infix +MATHML_OPERATOR(77,"∋",1,.27777f,.27777f) // 220B infix +MATHML_OPERATOR(78,"⊏",1,.27777f,.27777f) // 228F infix +MATHML_OPERATOR(79,"⊑",1,.27777f,.27777f) // 2291 infix +MATHML_OPERATOR(80,"⊐",1,.27777f,.27777f) // 2290 infix +MATHML_OPERATOR(81,"⊒",1,.27777f,.27777f) // 2292 infix +MATHML_OPERATOR(82,"⋐",1,.27777f,.27777f) // 22D0 infix +MATHML_OPERATOR(83,"⊆",1,.27777f,.27777f) // 2286 infix +MATHML_OPERATOR(84,"⊃",1,.27777f,.27777f) // 2283 infix +MATHML_OPERATOR(85,"⊇",1,.27777f,.27777f) // 2287 infix +MATHML_OPERATOR(86,"⇐",(1|(1<<2)),.27777f,.27777f) // 21D0 infix +MATHML_OPERATOR(87,"⇔",(1|(1<<2)),.27777f,.27777f) // 21D4 infix +MATHML_OPERATOR(88,"⇒",(1|(1<<2)),.27777f,.27777f) // 21D2 infix +MATHML_OPERATOR(89,"⥐",(1|(1<<2)),.27777f,.27777f) // F50B infix +MATHML_OPERATOR(90,"⥞",(1|(1<<2)),.27777f,.27777f) // F50E infix +MATHML_OPERATOR(91,"↽",(1|(1<<2)),.27777f,.27777f) // 21BD infix +MATHML_OPERATOR(92,"⥖",(1|(1<<2)),.27777f,.27777f) // F50C infix +MATHML_OPERATOR(93,"⥟",(1|(1<<2)),.27777f,.27777f) // F50F infix +MATHML_OPERATOR(94,"⇁",(1|(1<<2)),.27777f,.27777f) // 21C1 infix +MATHML_OPERATOR(95,"⥗",(1|(1<<2)),.27777f,.27777f) // F50D infix +MATHML_OPERATOR(96,"←",(1|(1<<2)),.27777f,.27777f) // 2190 infix +MATHML_OPERATOR(97,"⇤",(1|(1<<2)),.27777f,.27777f) // 21E4 infix +MATHML_OPERATOR(98,"⇆",(1|(1<<2)),.27777f,.27777f) // 21C6 infix +MATHML_OPERATOR(99,"↔",(1|(1<<2)),.27777f,.27777f) // 2194 infix +MATHML_OPERATOR(100,"⥎",(1|(1<<2)),.27777f,.27777f) // F505 infix +MATHML_OPERATOR(101,"↤",(1|(1<<2)),.27777f,.27777f) // 21A4 infix +MATHML_OPERATOR(102,"⥚",(1|(1<<2)),.27777f,.27777f) // F509 infix +MATHML_OPERATOR(103,"↼",(1|(1<<2)),.27777f,.27777f) // 21BC infix +MATHML_OPERATOR(104,"⥒",(1|(1<<2)),.27777f,.27777f) // F507 infix +MATHML_OPERATOR(105,"↙",(1|(1<<2)),.27777f,.27777f) // 2199 infix +MATHML_OPERATOR(106,"↘",(1|(1<<2)),.27777f,.27777f) // 2198 infix +MATHML_OPERATOR(107,"→",(1|(1<<2)),.27777f,.27777f) // 2192 infix +MATHML_OPERATOR(108,"⇥",(1|(1<<2)),.27777f,.27777f) // 21E5 infix +MATHML_OPERATOR(109,"⇄",(1|(1<<2)),.27777f,.27777f) // 21C4 infix +MATHML_OPERATOR(110,"↦",(1|(1<<2)),.27777f,.27777f) // 21A6 infix +MATHML_OPERATOR(111,"⥛",(1|(1<<2)),.27777f,.27777f) // F50A infix +MATHML_OPERATOR(112,"⇀",(1|(1<<2)),.27777f,.27777f) // 21C0 infix +MATHML_OPERATOR(113,"⥓",(1|(1<<2)),.27777f,.27777f) // F508 infix +MATHML_OPERATOR(114,"←",1,.27777f,.27777f) // E233 infix +MATHML_OPERATOR(115,"→",1,.27777f,.27777f) // E232 infix +MATHML_OPERATOR(116,"↖",(1|(1<<2)),.27777f,.27777f) // 2196 infix +MATHML_OPERATOR(117,"↗",(1|(1<<2)),.27777f,.27777f) // 2197 infix +MATHML_OPERATOR(118,"=",1,.27777f,.27777f) // 003D infix +MATHML_OPERATOR(119,"<",1,.27777f,.27777f) // 003C infix +MATHML_OPERATOR(120,">",1,.27777f,.27777f) // 003E infix +MATHML_OPERATOR(121,"!=",1,.27777f,.27777f) // 0021 003D infix +MATHML_OPERATOR(122,"==",1,.27777f,.27777f) // 003D 003D infix +MATHML_OPERATOR(123,"<=",1,.27777f,.27777f) // 003C 003D infix +MATHML_OPERATOR(124,">=",1,.27777f,.27777f) // 003E 003D infix +MATHML_OPERATOR(125,"≡",1,.27777f,.27777f) // 2261 infix +MATHML_OPERATOR(126,"≍",1,.27777f,.27777f) // 224D infix +MATHML_OPERATOR(127,"≐",1,.27777f,.27777f) // 2250 infix +MATHML_OPERATOR(128,"∥",1,.27777f,.27777f) // 2225 infix +MATHML_OPERATOR(129,"⩵",1,.27777f,.27777f) // F431 infix +MATHML_OPERATOR(130,"≂",1,.27777f,.27777f) // 2242 infix +MATHML_OPERATOR(131,"⇌",(1|(1<<2)),.27777f,.27777f) // 21CC infix +MATHML_OPERATOR(132,"≥",1,.27777f,.27777f) // 2265 infix +MATHML_OPERATOR(133,"⋛",1,.27777f,.27777f) // 22DB infix +MATHML_OPERATOR(134,"≧",1,.27777f,.27777f) // 2267 infix +MATHML_OPERATOR(135,"⪢",1,.27777f,.27777f) // E2F7 infix +MATHML_OPERATOR(136,"≷",1,.27777f,.27777f) // 2277 infix +MATHML_OPERATOR(137,"⩾",1,.27777f,.27777f) // E2F6 infix +MATHML_OPERATOR(138,"≳",1,.27777f,.27777f) // 2273 infix +MATHML_OPERATOR(139,"≎",1,.27777f,.27777f) // 224E infix +MATHML_OPERATOR(140,"≏",1,.27777f,.27777f) // 224F infix +MATHML_OPERATOR(141,"⊲",1,.27777f,.27777f) // 22B2 infix +MATHML_OPERATOR(142,"⧏",1,.27777f,.27777f) // F410 infix +MATHML_OPERATOR(143,"⊴",1,.27777f,.27777f) // 22B4 infix +MATHML_OPERATOR(144,"≤",1,.27777f,.27777f) // 2264 infix +MATHML_OPERATOR(145,"⋚",1,.27777f,.27777f) // 22DA infix +MATHML_OPERATOR(146,"≦",1,.27777f,.27777f) // 2266 infix +MATHML_OPERATOR(147,"≶",1,.27777f,.27777f) // 2276 infix +MATHML_OPERATOR(148,"⪡",1,.27777f,.27777f) // E2FB infix +MATHML_OPERATOR(149,"⩽",1,.27777f,.27777f) // E2FA infix +MATHML_OPERATOR(150,"≲",1,.27777f,.27777f) // 2272 infix +MATHML_OPERATOR(151,"≫",1,.27777f,.27777f) // 226B infix +MATHML_OPERATOR(152,"≪",1,.27777f,.27777f) // 226A infix +MATHML_OPERATOR(153,"≢",1,.27777f,.27777f) // 2262 infix +MATHML_OPERATOR(154,"≭",1,.27777f,.27777f) // 226D infix +MATHML_OPERATOR(155,"∦",1,.27777f,.27777f) // 2226 infix +MATHML_OPERATOR(156,"≠",1,.27777f,.27777f) // 2260 infix +MATHML_OPERATOR(157,"≂̸",1,.27777f,.27777f) // E84E infix +MATHML_OPERATOR(158,"≯",1,.27777f,.27777f) // 226F infix +MATHML_OPERATOR(159,"≱",1,.27777f,.27777f) // E2A6 infix +MATHML_OPERATOR(160,"≧̸",1,.27777f,.27777f) // 2270 infix +MATHML_OPERATOR(161,"≫̸",1,.27777f,.27777f) // E2CC infix +MATHML_OPERATOR(162,"≹",1,.27777f,.27777f) // 2279 infix +MATHML_OPERATOR(163,"⩾̸",1,.27777f,.27777f) // 2271 infix +MATHML_OPERATOR(164,"≵",1,.27777f,.27777f) // 2275 infix +MATHML_OPERATOR(165,"≎̸",1,.27777f,.27777f) // E616 infix +MATHML_OPERATOR(166,"≏̸",1,.27777f,.27777f) // E84D infix +MATHML_OPERATOR(167,"⋪",1,.27777f,.27777f) // 22EA infix +MATHML_OPERATOR(168,"⧏̸",1,.27777f,.27777f) // F412 infix +MATHML_OPERATOR(169,"⋬",1,.27777f,.27777f) // 22EC infix +MATHML_OPERATOR(170,"≮",1,.27777f,.27777f) // 226E infix +MATHML_OPERATOR(171,"≰",1,.27777f,.27777f) // E2A7 infix +MATHML_OPERATOR(172,"≸",1,.27777f,.27777f) // 2278 infix +MATHML_OPERATOR(173,"≪̸",1,.27777f,.27777f) // E2CB infix +MATHML_OPERATOR(174,"⩽̸",1,.27777f,.27777f) // 2270 infix +MATHML_OPERATOR(175,"≴",1,.27777f,.27777f) // 2274 infix +MATHML_OPERATOR(176,"⪢̸",1,.27777f,.27777f) // F428 infix +MATHML_OPERATOR(177,"⪡̸",1,.27777f,.27777f) // F423 infix +MATHML_OPERATOR(178,"⊀",1,.27777f,.27777f) // 2280 infix +MATHML_OPERATOR(179,"⪯̸",1,.27777f,.27777f) // E5DC infix +MATHML_OPERATOR(180,"⋠",1,.27777f,.27777f) // 22E0 infix +MATHML_OPERATOR(181,"⋫",1,.27777f,.27777f) // 22EB infix +MATHML_OPERATOR(182,"⧐̸",1,.27777f,.27777f) // F413 infix +MATHML_OPERATOR(183,"⋭",1,.27777f,.27777f) // 22ED infix +MATHML_OPERATOR(184,"⊁",1,.27777f,.27777f) // 2281 infix +MATHML_OPERATOR(185,"⪰̸",1,.27777f,.27777f) // E5F1 infix +MATHML_OPERATOR(186,"⋡",1,.27777f,.27777f) // 22E1 infix +MATHML_OPERATOR(187,"≿̸",1,.27777f,.27777f) // E837 infix +MATHML_OPERATOR(188,"≁",1,.27777f,.27777f) // 2241 infix +MATHML_OPERATOR(189,"≄",1,.27777f,.27777f) // 2244 infix +MATHML_OPERATOR(190,"≇",1,.27777f,.27777f) // 2247 infix +MATHML_OPERATOR(191,"≉",1,.27777f,.27777f) // 2249 infix +MATHML_OPERATOR(192,"∤",1,.27777f,.27777f) // 2224 infix +MATHML_OPERATOR(193,"≺",1,.27777f,.27777f) // 227A infix +MATHML_OPERATOR(194,"⪯",1,.27777f,.27777f) // E2FE infix +MATHML_OPERATOR(195,"≼",1,.27777f,.27777f) // 227C infix +MATHML_OPERATOR(196,"≾",1,.27777f,.27777f) // 227E infix +MATHML_OPERATOR(197,"∷",1,.27777f,.27777f) // 2237 infix +MATHML_OPERATOR(198,"∝",1,.27777f,.27777f) // 221D infix +MATHML_OPERATOR(199,"⇋",(1|(1<<2)),.27777f,.27777f) // 21CB infix +MATHML_OPERATOR(200,"⊳",1,.27777f,.27777f) // 22B3 infix +MATHML_OPERATOR(201,"⧐",1,.27777f,.27777f) // F411 infix +MATHML_OPERATOR(202,"⊵",1,.27777f,.27777f) // 22B5 infix +MATHML_OPERATOR(203,"≻",1,.27777f,.27777f) // 227B infix +MATHML_OPERATOR(204,"⪰",1,.27777f,.27777f) // 227D infix +MATHML_OPERATOR(205,"≽",1,.27777f,.27777f) // 227D infix +MATHML_OPERATOR(206,"≿",1,.27777f,.27777f) // 227F infix +MATHML_OPERATOR(207,"∼",1,.27777f,.27777f) // 223C infix +MATHML_OPERATOR(208,"≃",1,.27777f,.27777f) // 2243 infix +MATHML_OPERATOR(209,"≅",1,.27777f,.27777f) // 2245 infix +MATHML_OPERATOR(210,"≈",1,.27777f,.27777f) // 2248 infix +MATHML_OPERATOR(211,"⊥",1,.27777f,.27777f) // 22A5 infix +MATHML_OPERATOR(212,"∣",1,.27777f,.27777f) // 2223 infix +MATHML_OPERATOR(213,"⊔",(1|(1<<2)),.22222f,.22222f) // 2294 infix +MATHML_OPERATOR(214,"⋃",(1|(1<<2)),.22222f,.22222f) // 22C3 infix +MATHML_OPERATOR(215,"⊎",(1|(1<<2)),.22222f,.22222f) // 228E infix +MATHML_OPERATOR(216,"-",1,.22222f,.22222f) // 002D infix +MATHML_OPERATOR(217,"+",1,.22222f,.22222f) // 002B infix +MATHML_OPERATOR(218,"⋂",(1|(1<<2)),.22222f,.22222f) // 22C2 infix +MATHML_OPERATOR(219,"∓",1,.22222f,.22222f) // 2213 infix +MATHML_OPERATOR(220,"±",1,.22222f,.22222f) // 00B1 infix +MATHML_OPERATOR(221,"⊓",(1|(1<<2)),.22222f,.22222f) // 2293 infix +MATHML_OPERATOR(222,"⋁",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 22C1 prefix +MATHML_OPERATOR(223,"⊖",(2|(1<<5)),0.0f,.16666f) // 2296 prefix +MATHML_OPERATOR(224,"⊕",(2|(1<<5)),0.0f,.16666f) // 2295 prefix +MATHML_OPERATOR(225,"∑",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 2211 prefix +MATHML_OPERATOR(226,"⋃",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 22C3 prefix +MATHML_OPERATOR(227,"⊎",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 228E prefix +MATHML_OPERATOR(228,"lim",2,0.0f,.16666f) // 006C 0069 006D prefix +MATHML_OPERATOR(229,"max",2,0.0f,.16666f) // 006D 0061 0078 prefix +MATHML_OPERATOR(230,"min",2,0.0f,.16666f) // 006D 0069 006E prefix +MATHML_OPERATOR(231,"⊖",1,.16666f,.16666f) // 2296 infix +MATHML_OPERATOR(232,"⊕",1,.16666f,.16666f) // 2295 infix +MATHML_OPERATOR(233,"∲",(2|(1<<2)|(1<<5)),0.0f,0.0f) // 2232 prefix +MATHML_OPERATOR(234,"∮",(2|(1<<2)|(1<<5)),0.0f,0.0f) // 222E prefix +MATHML_OPERATOR(235,"∳",(2|(1<<2)|(1<<5)),0.0f,0.0f) // 2233 prefix +MATHML_OPERATOR(236,"∯",(2|(1<<2)|(1<<5)),0.0f,0.0f) // 222F prefix +MATHML_OPERATOR(237,"∫",(2|(1<<2)|(1<<5)),0.0f,0.0f) // 222B prefix +MATHML_OPERATOR(238,"⋓",1,.16666f,.16666f) // 22D3 infix +MATHML_OPERATOR(239,"⋒",1,.16666f,.16666f) // 22D2 infix +MATHML_OPERATOR(240,"≀",1,.16666f,.16666f) // 2240 infix +MATHML_OPERATOR(241,"⋀",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 22C0 prefix +MATHML_OPERATOR(242,"⊗",(2|(1<<5)),0.0f,.16666f) // 2297 prefix +MATHML_OPERATOR(243,"∐",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 2210 prefix +MATHML_OPERATOR(244,"∏",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 220F prefix +MATHML_OPERATOR(245,"⋂",(2|(1<<2)|(1<<5)),0.0f,.16666f) // 22C2 prefix +MATHML_OPERATOR(246,"∐",1,.16666f,.16666f) // 2210 infix +MATHML_OPERATOR(247,"⋆",1,.16666f,.16666f) // 22C6 infix +MATHML_OPERATOR(248,"⊙",(2|(1<<5)),0.0f,.16666f) // 2299 prefix +MATHML_OPERATOR(249,"*",1,.16666f,.16666f) // 002A infix +MATHML_OPERATOR(250,"⁢",1,0.0f,0.0f) // E89E infix +MATHML_OPERATOR(251,"·",1,.16666f,.16666f) // 00B7 infix +MATHML_OPERATOR(252,"⊗",1,.16666f,.16666f) // 2297 infix +MATHML_OPERATOR(253,"⋁",1,.16666f,.16666f) // 22C1 infix +MATHML_OPERATOR(254,"⋀",1,.16666f,.16666f) // 22C0 infix +MATHML_OPERATOR(255,"⋄",1,.16666f,.16666f) // 22C4 infix +MATHML_OPERATOR(256,"∖",(1|(1<<2)),.16666f,.16666f) // 2216 infix +MATHML_OPERATOR(257,"/",(1|(1<<2)),.16666f,.16666f) // 002F infix +MATHML_OPERATOR(258,"-",2,0.0f,.05555f) // 002D prefix +MATHML_OPERATOR(259,"+",2,0.0f,.05555f) // 002B prefix +MATHML_OPERATOR(260,"∓",2,0.0f,.05555f) // 2213 prefix +MATHML_OPERATOR(261,"±",2,0.0f,.05555f) // 00B1 prefix +MATHML_OPERATOR(262,".",1,0.0f,0.0f) // 002E infix +MATHML_OPERATOR(263,"⨯",1,.11111f,.11111f) // E619 infix +MATHML_OPERATOR(264,"**",1,.11111f,.11111f) // 002A 002A infix +MATHML_OPERATOR(265,"⊙",1,.11111f,.11111f) // 2299 infix +MATHML_OPERATOR(266,"∘",1,.11111f,.11111f) // 2218 infix +MATHML_OPERATOR(267,"□",2,0.0f,.11111f) // 25A1 prefix +MATHML_OPERATOR(268,"∇",2,0.0f,.11111f) // 2207 prefix +MATHML_OPERATOR(269,"∂",2,0.0f,.11111f) // 2202 prefix +MATHML_OPERATOR(270,"ⅅ",2,0.0f,.11111f) // F74B prefix +MATHML_OPERATOR(271,"ⅆ",2,0.0f,.11111f) // F74C prefix +MATHML_OPERATOR(272,"√",(2|(1<<2)),0.0f,.11111f) // 221A prefix +MATHML_OPERATOR(273,"⇓",(1|(1<<2)),.11111f,.11111f) // 21D3 infix +MATHML_OPERATOR(274,"⟸",(1|(1<<2)),.11111f,.11111f) // E200 infix +MATHML_OPERATOR(275,"⟺",(1|(1<<2)),.11111f,.11111f) // E202 infix +MATHML_OPERATOR(276,"⟹",(1|(1<<2)),.11111f,.11111f) // E204 infix +MATHML_OPERATOR(277,"⇑",(1|(1<<2)),.11111f,.11111f) // 21D1 infix +MATHML_OPERATOR(278,"⇕",(1|(1<<2)),.11111f,.11111f) // 21D5 infix +MATHML_OPERATOR(279,"↓",(1|(1<<2)),.11111f,.11111f) // 2193 infix +MATHML_OPERATOR(280,"⤓",(1|(1<<2)),.11111f,.11111f) // F504 infix +MATHML_OPERATOR(281,"⇵",(1|(1<<2)),.11111f,.11111f) // E216 infix +MATHML_OPERATOR(282,"↧",(1|(1<<2)),.11111f,.11111f) // 21A7 infix +MATHML_OPERATOR(283,"⥡",(1|(1<<2)),.11111f,.11111f) // F519 infix +MATHML_OPERATOR(284,"⇃",(1|(1<<2)),.11111f,.11111f) // 21C3 infix +MATHML_OPERATOR(285,"⥙",(1|(1<<2)),.11111f,.11111f) // F517 infix +MATHML_OPERATOR(286,"⥑",(1|(1<<2)),.11111f,.11111f) // F515 infix +MATHML_OPERATOR(287,"⥠",(1|(1<<2)),.11111f,.11111f) // F518 infix +MATHML_OPERATOR(288,"↿",(1|(1<<2)),.11111f,.11111f) // 21BF infix +MATHML_OPERATOR(289,"⥘",(1|(1<<2)),.11111f,.11111f) // F516 infix +MATHML_OPERATOR(290,"⟵",(1|(1<<2)),.11111f,.11111f) // E201 infix +MATHML_OPERATOR(291,"⟷",(1|(1<<2)),.11111f,.11111f) // E203 infix +MATHML_OPERATOR(292,"⟶",(1|(1<<2)),.11111f,.11111f) // E205 infix +MATHML_OPERATOR(293,"⥯",(1|(1<<2)),.11111f,.11111f) // E217 infix +MATHML_OPERATOR(294,"⥝",(1|(1<<2)),.11111f,.11111f) // F514 infix +MATHML_OPERATOR(295,"⇂",(1|(1<<2)),.11111f,.11111f) // 21C2 infix +MATHML_OPERATOR(296,"⥕",(1|(1<<2)),.11111f,.11111f) // F512 infix +MATHML_OPERATOR(297,"⥏",(1|(1<<2)),.11111f,.11111f) // F510 infix +MATHML_OPERATOR(298,"⥜",(1|(1<<2)),.11111f,.11111f) // F513 infix +MATHML_OPERATOR(299,"↾",(1|(1<<2)),.11111f,.11111f) // 21BE infix +MATHML_OPERATOR(300,"⥔",(1|(1<<2)),.11111f,.11111f) // F511 infix +MATHML_OPERATOR(301,"↓",1,.11111f,.11111f) // E87F infix +MATHML_OPERATOR(302,"↑",1,.11111f,.11111f) // E880 infix +MATHML_OPERATOR(303,"↑",(1|(1<<2)),.11111f,.11111f) // 2191 infix +MATHML_OPERATOR(304,"⤒",(1|(1<<2)),.11111f,.11111f) // F503 infix +MATHML_OPERATOR(305,"⇅",(1|(1<<2)),.11111f,.11111f) // 21C5 infix +MATHML_OPERATOR(306,"↕",(1|(1<<2)),.11111f,.11111f) // 2195 infix +MATHML_OPERATOR(307,"⥮",(1|(1<<2)),.11111f,.11111f) // E218 infix +MATHML_OPERATOR(308,"↥",(1|(1<<2)),.11111f,.11111f) // 21A5 infix +MATHML_OPERATOR(309,"^",1,.11111f,.11111f) // 005E infix +MATHML_OPERATOR(310,"<>",1,.11111f,.11111f) // 003C 003E infix +MATHML_OPERATOR(311,"'",3,.11111f,0.0f) // 0027 postfix +MATHML_OPERATOR(312,"!",3,.11111f,0.0f) // 0021 postfix +MATHML_OPERATOR(313,"!!",3,.11111f,0.0f) // 0021 0021 postfix +MATHML_OPERATOR(314,"~",1,.11111f,.11111f) // 007E infix +MATHML_OPERATOR(315,"@",1,.11111f,.11111f) // 0040 infix +MATHML_OPERATOR(316,"--",3,.11111f,0.0f) // 002D 002D postfix +MATHML_OPERATOR(317,"--",2,0.0f,.11111f) // 002D 002D prefix +MATHML_OPERATOR(318,"++",3,.11111f,0.0f) // 002B 002B postfix +MATHML_OPERATOR(319,"++",2,0.0f,.11111f) // 002B 002B prefix +MATHML_OPERATOR(320,"⁡",1,0.0f,0.0f) // E8A0 infix +MATHML_OPERATOR(321,"?",1,.11111f,.11111f) // 003F infix +MATHML_OPERATOR(322,"_",1,.11111f,.11111f) // 005F infix +MATHML_OPERATOR(323,"˘",(3|(1<<4)),0.0f,0.0f) // 02D8 postfix +MATHML_OPERATOR(324,"¸",(3|(1<<4)),0.0f,0.0f) // 00B8 postfix +MATHML_OPERATOR(325,"`",(3|(1<<4)),0.0f,0.0f) // 0060 postfix +MATHML_OPERATOR(326,"˙",(3|(1<<4)),0.0f,0.0f) // 02D9 postfix +MATHML_OPERATOR(327,"˝",(3|(1<<4)),0.0f,0.0f) // 02DD postfix +MATHML_OPERATOR(328,"´",(3|(1<<4)),0.0f,0.0f) // 00B4 postfix +MATHML_OPERATOR(329,"˜",(3|(1<<2)|(1<<4)),0.0f,0.0f) // 02DC postfix +MATHML_OPERATOR(330,"¨",(3|(1<<4)),0.0f,0.0f) // 00A8 postfix +MATHML_OPERATOR(331,"̑",(3|(1<<4)),0.0f,0.0f) // 0311 postfix +MATHML_OPERATOR(332,"ˇ",(3|(1<<2)|(1<<4)),0.0f,0.0f) // 02C7 postfix +MATHML_OPERATOR(333,"^",(3|(1<<2)|(1<<4)),0.0f,0.0f) // 0302 postfix +MATHML_OPERATOR(334,"‾",(3|(1<<2)|(1<<4)),0.0f,0.0f) // 00AF postfix +MATHML_OPERATOR(335,"⏞",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F612 postfix +MATHML_OPERATOR(336,"⎴",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F614 postfix +MATHML_OPERATOR(337,"⏜",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F610 postfix +MATHML_OPERATOR(338,"⃛",(3|(1<<4)),0.0f,0.0f) // 20DB postfix +MATHML_OPERATOR(339,"_",(3|(1<<2)|(1<<4)),0.0f,0.0f) // 0332 postfix +MATHML_OPERATOR(340,"⏟",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F613 postfix +MATHML_OPERATOR(341,"⎵",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F615 postfix +MATHML_OPERATOR(342,"⏝",(3|(1<<2)|(1<<4)),0.0f,0.0f) // F611 postfix + +#endif +#endif diff --git a/mozilla/layout/mathml/content/src/nsMathMLOperators.cpp b/mozilla/layout/mathml/content/src/nsMathMLOperators.cpp new file mode 100644 index 00000000000..f2eab38977e --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLOperators.cpp @@ -0,0 +1,283 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#include "nsString.h" +#include "nsAVLTree.h" + +#include "nsMathMLOperators.h" + + +// get the actual value generated for NS_MATHML_OPERATOR_COUNT +#define WANT_MATHML_OPERATOR_COUNT +#include "nsMathMLOperatorList.h" +#undef WANT_MATHML_OPERATOR_COUNT + + +// define a zero-separated linear array of all MathML Operators in Unicode +#define WANT_MATHML_OPERATOR_UNICHAR +const PRUnichar kMathMLOperator[] = { +#include "nsMathMLOperatorList.h" +}; +#undef WANT_MATHML_OPERATOR_UNICHAR + + +// operator dictionary entry +struct OperatorNode { + OperatorNode(void) + : mStr(), + mFlags(0), + mLeftSpace(0.0f), + mRightSpace(0.0f) + { + nsStr::Initialize(mStr, eTwoByte); // with MathML, we are two-byte by default + } + + OperatorNode(const nsStr& aStringValue, const nsOperatorFlags aFlags) + : mStr(), + mFlags(aFlags), + mLeftSpace(0.0f), + mRightSpace(0.0f) + { // point to the incomming buffer + // note that the incomming buffer may really be 2 byte + nsStr::Initialize(mStr, aStringValue.mStr, aStringValue.mCapacity, + aStringValue.mLength, aStringValue.mCharSize, PR_FALSE); + } + + void + Init(const nsOperatorFlags aFlags, + const float aLeftSpace, + const float aRightSpace) + { + mFlags = aFlags; + mLeftSpace = aLeftSpace; + mRightSpace = aRightSpace; + }; + + // member data + nsString mStr; + nsOperatorFlags mFlags; + float mLeftSpace; // unit is em + float mRightSpace; // unit is em +}; + +// index comparitor: based on the string of the operator and its form bits +class OperatorComparitor: public nsAVLNodeComparitor { +public: + virtual ~OperatorComparitor(void) {} + virtual PRInt32 operator()(void* anItem1,void* anItem2) { + OperatorNode* one = (OperatorNode*)anItem1; + OperatorNode* two = (OperatorNode*)anItem2; + + PRInt32 rv; + rv = one->mStr.Compare(two->mStr, PR_FALSE); + if (rv == 0) { + nsOperatorFlags form1 = NS_MATHML_OPERATOR_GET_FORM(one->mFlags); + nsOperatorFlags form2 = NS_MATHML_OPERATOR_GET_FORM(two->mFlags); + if (form1 < form2) rv = -1; + else if (form1 > form2) rv = 1; + } + return rv; + } +}; + + +static PRInt32 gTableRefCount; +static OperatorNode* gOperatorArray; +static nsAVLTree* gOperatorTree; +static OperatorComparitor* gComparitor; + + +void +nsMathMLOperators::AddRefTable(void) +{ + if (0 == gTableRefCount++) { + if (! gOperatorArray) { + gOperatorArray = new OperatorNode[NS_MATHML_OPERATOR_COUNT]; + gComparitor = new OperatorComparitor(); + if (gComparitor) { + gOperatorTree = new nsAVLTree(*gComparitor, nsnull); + } + if (gOperatorArray && gOperatorTree) { +#define MATHML_OPERATOR(_i,_operator,_flags,_lspace,_rspace) \ +gOperatorArray[_i].Init(nsOperatorFlags(_flags),float(_lspace),float(_rspace)); +#include "nsMathMLOperatorList.h" +#undef MATHML_OPERATOR + const PRUnichar* cp = &kMathMLOperator[0]; + PRInt32 i = -1; + while (++i < PRInt32(NS_MATHML_OPERATOR_COUNT)) { + gOperatorArray[i].mStr = *cp++; + while (*cp) { gOperatorArray[i].mStr.Append(*cp++); } + cp++; // skip null separator + gOperatorTree->AddItem(&(gOperatorArray[i])); + } + } + } + } +} + +void +nsMathMLOperators::ReleaseTable(void) +{ + if (0 == --gTableRefCount) { + if (gOperatorArray) { + delete[] gOperatorArray; + gOperatorArray = nsnull; + } + if (gOperatorTree) { + delete gOperatorTree; + gOperatorTree = nsnull; + } + if (gComparitor) { + delete gComparitor; + gComparitor = nsnull; + } + } +} + + +PRBool +nsMathMLOperators::LookupOperator(const nsStr& aOperator, + const nsOperatorFlags aForm, + nsOperatorFlags* aFlags, + float* aLeftSpace, + float* aRightSpace) +{ + NS_ASSERTION(gOperatorTree, "no lookup table, needs addref"); + if (gOperatorTree) { + OperatorNode node(aOperator, aForm); + OperatorNode* found = (OperatorNode*)gOperatorTree->FindItem(&node); + if (found) { + NS_ASSERTION(found->mStr.Equals(aOperator), "bad tree"); + *aFlags = found->mFlags; + *aLeftSpace = found->mLeftSpace; + *aRightSpace = found->mRightSpace; + return PR_TRUE; + } + } + return PR_FALSE; +} + + +#if 0 +// DEBUG +// BEGIN TEST CODE: +// code used to test the dictionary +//#include + +void DEBUG_PrintString(const nsString aString) +{ + for (PRInt32 i = 0; i" +}; + +// define an array of all the flags +#define MATHML_OPERATOR(_i,_operator,_flags,_lspace,_rspace) nsOperatorFlags(_flags), +const nsOperatorFlags kMathMLOperatorFlags[] = { +#include "nsMathMLOperatorList.h" +}; +#undef MATHML_OPERATOR + +int +TestOperators() { + AddRefTable(); + + int rv = 0; + + // First make sure we can find all of the operators that are supposed to + // be in the table. + extern const PRUnichar kMathMLOperator[]; + + PRBool found; + + nsOperatorFlags flags, form; + float lspace, rspace; + + printf("\nChecking the operator dictionary...\n"); + + nsAutoString aOperator; + nsStr::Initialize(aOperator, eTwoByte); + + int i = 0; + const PRUnichar* cp = &kMathMLOperator[0]; + while (i < NS_MATHML_OPERATOR_COUNT) { + + aOperator = *cp++; + while (*cp) { aOperator.Append(*cp++); } + cp++; // skip null separator + + form = NS_MATHML_OPERATOR_GET_FORM(kMathMLOperatorFlags[i]); + found = nsMathMLOperators::LookupOperator(aOperator, form, + &flags, &lspace, &rspace); + + if (!found) { + printf("bug: can't find operator="); DEBUG_PrintString(aOperator); + rv = -1; + } + if (flags != kMathMLOperatorFlags[i]) { + printf("bug: operator="); DEBUG_PrintString(aOperator); + printf(" .... flags are wrong\n"); + getchar(); + rv = -1; + } + i++; + + if (i<10) { + DEBUG_PrintString(aOperator); + printf(" tested. Press return to continue..."); + getchar(); + } + + } + + // Now make sure we don't find some garbage + for (int j = 0; j < (int) (sizeof(kJunkOperator) / sizeof(const char*)); j++) { + const char* name = kJunkOperator[j]; + found = nsMathMLOperators::LookupOperator(nsCAutoString(name), form, + &flags, &lspace, &rspace); + if (found) { + printf("bug: found '%s'\n", name ? name : "(null)"); + rv = -1; + } + } + + printf("%d operators.",i); + printf((rv == 0)? " All tests passed!\n" : " ERROR *** Corrupted Dictionary\n"); + + ReleaseTable(); + return rv; +} +// END TEST CODE +#endif + diff --git a/mozilla/layout/mathml/content/src/nsMathMLOperators.h b/mozilla/layout/mathml/content/src/nsMathMLOperators.h new file mode 100644 index 00000000000..147d6af07d2 --- /dev/null +++ b/mozilla/layout/mathml/content/src/nsMathMLOperators.h @@ -0,0 +1,105 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#ifndef nsMathMLOperators_h___ +#define nsMathMLOperators_h___ + +#include "nslayout.h" +#include "nsCoord.h" + +typedef PRUint32 nsOperatorFlags; + +typedef PRUint32 nsStretchDirection; + +#define NS_STRETCH_DIRECTION_HORIZONTAL 0 +#define NS_STRETCH_DIRECTION_VERTICAL 1 + +// Structure used for a char's size and alignment information. +struct nsCharMetrics { +// nscoord leading; + nscoord width, height; + nscoord ascent, descent; +}; + +// define the bits used in the operator dictionary + +#define NS_MATHML_OPERATOR_FORM 0x3 // the last two bits tell us the form +#define NS_MATHML_OPERATOR_FORM_INFIX 1 +#define NS_MATHML_OPERATOR_FORM_PREFIX 2 +#define NS_MATHML_OPERATOR_FORM_POSTFIX 3 +#define NS_MATHML_OPERATOR_STRETCHY (1 << 2) +#define NS_MATHML_OPERATOR_FENCE (1 << 3) +#define NS_MATHML_OPERATOR_ACCENT (1 << 4) +#define NS_MATHML_OPERATOR_LARGEOP (1 << 5) +#define NS_MATHML_OPERATOR_SEPARATOR (1 << 6) +#define NS_MATHML_OPERATOR_MOVABLELIMITS (1 << 7) + +// Macros that retrieve those bits + +#define NS_MATHML_OPERATOR_GET_FORM(_flags) \ + ((_flags) & NS_MATHML_OPERATOR_FORM) + +#define NS_MATHML_OPERATOR_FORM_IS_INFIX(_flags) \ + (NS_MATHML_OPERATOR_FORM_INFIX == ((_flags) & NS_MATHML_OPERATOR_FORM_INFIX)) + +#define NS_MATHML_OPERATOR_FORM_IS_PREFIX(_flags) \ + (NS_MATHML_OPERATOR_FORM_PREFIX == ((_flags) & NS_MATHML_OPERATOR_FORM_PREFIX)) + +#define NS_MATHML_OPERATOR_FORM_IS_POSTFIX(_flags) \ + (NS_MATHML_OPERATOR_FORM_POSTFIX == ((_flags) & NS_MATHML_OPERATOR_FORM_POSTFIX )) + +#define NS_MATHML_OPERATOR_IS_STRETCHY(_flags) \ + (NS_MATHML_OPERATOR_STRETCHY == ((_flags) & NS_MATHML_OPERATOR_STRETCHY)) + +#define NS_MATHML_OPERATOR_IS_FENCE(_flags) \ + (NS_MATHML_OPERATOR_FENCE == ((_flags) & NS_MATHML_OPERATOR_FENCE)) + +#define NS_MATHML_OPERATOR_IS_ACCENT(_flags) \ + (NS_MATHML_OPERATOR_ACCENT == ((_flags) & NS_MATHML_OPERATOR_ACCENT)) + +#define NS_MATHML_OPERATOR_IS_LARGEOP(_flags) \ + (NS_MATHML_OPERATOR_LARGEOP == ((_flags) & NS_MATHML_OPERATOR_LARGEOP)) + +#define NS_MATHML_OPERATOR_IS_SEPARATOR(_flags) \ + (NS_MATHML_OPERATOR_SEPARATOR == ((_flags) & NS_MATHML_OPERATOR_SEPARATOR)) + +#define NS_MATHML_OPERATOR_IS_MOVABLELIMITS(_flags) \ + (NS_MATHML_OPERATOR_MOVABLELIMITS == ((_flags) & NS_MATHML_OPERATOR_MOVABLELIMITS)) + + +class nsMathMLOperators { +public: + static void AddRefTable(void); + static void ReleaseTable(void); + + // Given the string value of an operator and its form (last two bits of flags), + // this method returns true if the operator is found in the operator dictionary. + // Attributes of the operator are returned in the output parameters. + + static PRBool LookupOperator(const nsStr& aOperator, + const nsOperatorFlags aForm, + nsOperatorFlags* aFlags, + float* aLeftSpace, + float* aRightSpace); + +}; + +#endif /* nsMathMLOperators_h___ */ diff --git a/mozilla/layout/mathml/doc/Notes.txt b/mozilla/layout/mathml/doc/Notes.txt new file mode 100644 index 00000000000..1c2ddc00f32 --- /dev/null +++ b/mozilla/layout/mathml/doc/Notes.txt @@ -0,0 +1,89 @@ +/* ********************************************************************** */ +/* Implementation of the MathML W3C REC http://www.w3.org/TR/REC-MathML */ +/* Section 3. Presentation Markup + 3.2 Token Elements + 3.2.1 Attributes common to token elements +C- 3.2.2 -- identifier +C 3.2.3 -- number +C- 3.2.4 -- operator, fence, or separator +CSS 3.2.5 -- text + 3.2.6 -- space +CSS 3.2.7 -- string literal + 3.3 General Layout Schemata +C 3.3.1 -- horizontally group any number of subexpressions +C 3.3.2 -- form a fraction from two subexpressions + 3.3.3 and -- form a radical + 3.3.4 -- style change +CSS 3.3.5 -- enclose a syntax error message from a preprocessor + 3.3.6 -- adjust space around content +C 3.3.7 -- make content invisible but preserve its size + 3.3.8 -- surround content with a pair of fences + 3.4 Script and Limit Schemata +C 3.4.1 -- attach a subscript to a base +C 3.4.2 -- attach a superscript to a base +C 3.4.3 -- attach a subscript-superscript pair to a base +C 3.4.4 -- attach an underscript to a base +C 3.4.5 -- attach an overscript to a base +C 3.4.6 -- attach an underscript-overscript pair to a base +C 3.4.7 -- attach prescripts and tensor indices to a base + 3.5 Tables and Matrices +CH 3.5.1 -- table or matrix +CH 3.5.2 -- row in a table or matrix +CH 3.5.3 -- one entry in a table or matrix + 3.5.4 and -- alignment markers + 3.6 Enlivening Expressions + 3.6.1 -- bind actions to a subexpression + +Table of argument requirements +------------------------------ + tag number of children +------------------------------ + 0 or more + 2 (numerator denominator) + 1 + 2 (base index) + 1 + 1 + 1 + 1 + 0 or more + 2 (base subscript) + 2 (base superscript) + 3 (base subscript superscript) + 2 (base underscript) + 2 (base overscript) + 3 (base underscript overscript) + 1 or more + (base ( subscript superscript ) * [ ( presubscript + presuperscript ) * ]) + 0 or more rows (s, inferred if necessary) + 0 or more table elements (s, inferred if necessary) + 1 + 1 or more (argument roles depend on actiontype attribute) +*/ + +/* NOTES: +Since frames are not refCounted, don't use nsCOMPtr with them +*/ + + + +#if 0 +// NOTES ---- +// border and padding -- study nsHTMLButtonControlFrame.cpp ... + +// Text size infos + nsCOMPtr fm; + const nsStyleFont* aFont = + (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); + aPresContext->GetMetricsFor(aFont->mFont, getter_AddRefs(fm)); + + nsAutoString text; + + fm->GetHeight([height]); + renderingContext->SetFont(fm); + renderingContext->GetWidth( text, [width] ); + fm->GetMaxAscent( [baseline] ); + fm->GetMaxDescent( [depth] ); + +#endif diff --git a/mozilla/layout/mathml/doc/operator.txt b/mozilla/layout/mathml/doc/operator.txt new file mode 100644 index 00000000000..2c7446312c7 --- /dev/null +++ b/mozilla/layout/mathml/doc/operator.txt @@ -0,0 +1,526 @@ + Up: Table of Contents REC-MathML-19980407; revised 19990707 + ------------------------------------------------------------------------ + +Operator Dictionary + +The following table gives the suggested dictionary of rendering properties +for operators, fences, separators, and accents in MathML, all of which are +represented by elements. For brevity, all such elements will be called +simply "operators" in this Appendix. + +Format of operator dictionary entries + +The operators are divided into groups, which are separated by blank lines +in the listing below. The grouping, and the order of the groups, is +significant for the proper grouping of subexpressions using (Section +3.3.1); the rule described there is especially relevant to the automatic +generation of MathML by conversion from other formats for displayed math, +such as TeX, which don't always specify how subexpressions nest. + +The format of the table entries is: the element content between double +quotes (start and end tags not shown), followed by the attribute list in +XML format, starting with the form attribute, followed by the default +rendering attributes which should be used for elements with the given +content and form attribute. + +Any attribute not listed for some entry has its default value, which is +given in parentheses in the table of attributes in Section 3.2.4. + +Note that the characters "&" and "<" are represented in the following table +entries by the entity references "&" and "<" respectively, as would +be necessary if they appeared in the content of an actual element (or +any other MathML or XML element). + +For example, the first entry, + +"(" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" + +could be expressed as an element by: + + ( + +(note the lack of double quotes around the content, and the whitespace +added around the content for readability, which is optional in MathML). + +This entry means that, for MathML renderers which use this suggested +operator dictionary, giving the element ( alone, +or simply ( in a position for which form="prefix" would be +inferred (see below), is equivalent to giving the element with all +attributes as shown above. + +Indexing of operator dictionary + +Note that the dictionary is indexed not just by the element content, but by +the element content and form attribute value, together. Operators with more +than one possible form have more than one entry. The MathML specification +describes how the renderer chooses ("infers") which form to use when no +form attribute is given; see "Default value of form attribute" in Section +3.2.4. + +Having made that choice, or with the form attribute explicitly specified in +the element's start tag, the MathML renderer uses the remaining +attributes from the dictionary entry for the appropriate single form of +that operator, ignoring the entries for the other possible forms. + +Choice of entity names + +Extended characters in MathML (and in the operator dictionary below) are +represented by XML-style entity references using the syntax +"&character-name;"; the complete list of characters and character names is +given in Chapter 6. Many characters can be referred to by more than one +name; often, memorable names composed of full words have been provided in +MathML, as well as one or more names used in other standards, such as +Unicode. The characters in the operators in this dictionary are generally +listed under their full-word names when these exist. For example, the +integral operator is named below by the one-character sequence +"∫", but could equally well be named "∫". The choice of name +for a given character in MathML has no effect on its rendering. + +It is intended that every entity named below appears somewhere in Chapter +6. If this is not true, it is an error in this specification. If such an +error exists, Chapter 6 should be taken as definitive, rather than this +appendix. + +Notes on lspace and rspace attributes + +The values for lspace and rspace given here range from 0 to 6/18 em in +units of 1/18 em. For the invisible operators whose content is +"⁢" or "⁡", it is suggested that MathML +renderers choose spacing in a context-sensitive way (which is an exception +to the static values given in the following table). For +, the total spacing (lspace + rspace) in +expressions such as "sin x" (where the right operand doesn't start with a +fence) should be greater than 0; for , the total +spacing should be greater than 0 when both operands (or the nearest tokens +on either side, if on the baseline) are identifiers displayed in a +non-slanted font (i.e., under the suggested rules, when both operands are +multi-character identifiers). + +Some renderers may wish to use no spacing for most operators appearing in +scripts (i.e. when scriptlevel is greater than 0; see Section 3.3.4), as is +the case in TeX. + ------------------------------------------------------------------------ + +Operator dictionary entries + +"(" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +")" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"[" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"]" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"{" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"}" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"”" form="postfix" fence="true" lspace="0em" rspace="0em" +"’" form="postfix" fence="true" lspace="0em" rspace="0em" +"⟨" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"&LeftBracketingBar;" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⌈" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⟦" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"&LeftDoubleBracketingBar;" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⌊" form="prefix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"“" form="prefix" fence="true" lspace="0em" rspace="0em" +"‘" form="prefix" fence="true" lspace="0em" rspace="0em" +"⟩" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"&RightBracketingBar;" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⌉" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⟧" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"&RightDoubleBracketingBar;" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"⌋" form="postfix" fence="true" stretchy="true" lspace="0em" rspace="0em" +"&LeftSkeleton;" form="prefix" fence="true" lspace="0em" rspace="0em" +"&RightSkeleton;" form="postfix" fence="true" lspace="0em" rspace="0em" + +"⁣" form="infix" separator="true" lspace="0em" rspace="0em" + +"," form="infix" separator="true" lspace="0em" rspace=".33333em" + +"─" form="infix" stretchy="true" minsize="0" lspace="0em" rspace="0em" +"|" form="infix" stretchy="true" minsize="0" lspace="0em" rspace="0em" + +";" form="infix" separator="true" lspace="0em" rspace=".27777em" +";" form="postfix" separator="true" lspace="0em" rspace="0em" + +":=" form="infix" lspace=".27777em" rspace=".27777em" +"≔" form="infix" lspace=".27777em" rspace=".27777em" + +"∵" form="infix" lspace=".27777em" rspace=".27777em" +"∴" form="infix" lspace=".27777em" rspace=".27777em" + +"❘" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + +"//" form="infix" lspace=".27777em" rspace=".27777em" + +"∷" form="infix" lspace=".27777em" rspace=".27777em" + +"&" form="prefix" lspace="0em" rspace=".27777em" +"&" form="postfix" lspace=".27777em" rspace="0em" + +"*=" form="infix" lspace=".27777em" rspace=".27777em" +"-=" form="infix" lspace=".27777em" rspace=".27777em" +"+=" form="infix" lspace=".27777em" rspace=".27777em" +"/=" form="infix" lspace=".27777em" rspace=".27777em" + +"->" form="infix" lspace=".27777em" rspace=".27777em" + +":" form="infix" lspace=".27777em" rspace=".27777em" + +".." form="postfix" lspace=".22222em" rspace="0em" +"..." form="postfix" lspace=".22222em" rspace="0em" + +"∋" form="infix" lspace=".27777em" rspace=".27777em" + +"⫤" form="infix" lspace=".27777em" rspace=".27777em" +"⊨" form="infix" lspace=".27777em" rspace=".27777em" +"⊤" form="infix" lspace=".27777em" rspace=".27777em" +"⊣" form="infix" lspace=".27777em" rspace=".27777em" +"⊢" form="infix" lspace=".27777em" rspace=".27777em" + +"⇒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥰" form="infix" lspace=".27777em" rspace=".27777em" + +"|" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"||" form="infix" lspace=".22222em" rspace=".22222em" +"⩔" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + +"&&" form="infix" lspace=".27777em" rspace=".27777em" +"⩓" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + +"&" form="infix" lspace=".27777em" rspace=".27777em" + +"!" form="prefix" lspace="0em" rspace=".27777em" +"⫬" form="prefix" lspace="0em" rspace=".27777em" + +"∃" form="prefix" lspace="0em" rspace=".27777em" +"∀" form="prefix" lspace="0em" rspace=".27777em" +"∄" form="prefix" lspace="0em" rspace=".27777em" + +"∈" form="infix" lspace=".27777em" rspace=".27777em" +"∉" form="infix" lspace=".27777em" rspace=".27777em" +"∌" form="infix" lspace=".27777em" rspace=".27777em" +"⊏̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋢" form="infix" lspace=".27777em" rspace=".27777em" +"⊐̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋣" form="infix" lspace=".27777em" rspace=".27777em" +"⊂⃒" form="infix" lspace=".27777em" rspace=".27777em" +"⊈" form="infix" lspace=".27777em" rspace=".27777em" +"⊃⃒" form="infix" lspace=".27777em" rspace=".27777em" +"⊉" form="infix" lspace=".27777em" rspace=".27777em" +"∋" form="infix" lspace=".27777em" rspace=".27777em" +"⊏" form="infix" lspace=".27777em" rspace=".27777em" +"⊑" form="infix" lspace=".27777em" rspace=".27777em" +"⊐" form="infix" lspace=".27777em" rspace=".27777em" +"⊒" form="infix" lspace=".27777em" rspace=".27777em" +"⋐" form="infix" lspace=".27777em" rspace=".27777em" +"⊆" form="infix" lspace=".27777em" rspace=".27777em" +"⊃" form="infix" lspace=".27777em" rspace=".27777em" +"⊇" form="infix" lspace=".27777em" rspace=".27777em" + +"⇐" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇔" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥐" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥞" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↽" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥖" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥟" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇁" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥗" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"←" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇤" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇆" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↔" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥎" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↤" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥚" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↼" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↙" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↘" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"→" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇥" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇄" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↦" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥛" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⇀" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⥓" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"←" form="infix" lspace=".27777em" rspace=".27777em" +"→" form="infix" lspace=".27777em" rspace=".27777em" +"↖" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"↗" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + +"=" form="infix" lspace=".27777em" rspace=".27777em" +"<" form="infix" lspace=".27777em" rspace=".27777em" +">" form="infix" lspace=".27777em" rspace=".27777em" +"!=" form="infix" lspace=".27777em" rspace=".27777em" +"==" form="infix" lspace=".27777em" rspace=".27777em" +"<=" form="infix" lspace=".27777em" rspace=".27777em" +">=" form="infix" lspace=".27777em" rspace=".27777em" +"≡" form="infix" lspace=".27777em" rspace=".27777em" +"≍" form="infix" lspace=".27777em" rspace=".27777em" +"≐" form="infix" lspace=".27777em" rspace=".27777em" +"∥" form="infix" lspace=".27777em" rspace=".27777em" +"⩵" form="infix" lspace=".27777em" rspace=".27777em" +"≂" form="infix" lspace=".27777em" rspace=".27777em" +"⇌" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"≥" form="infix" lspace=".27777em" rspace=".27777em" +"⋛" form="infix" lspace=".27777em" rspace=".27777em" +"≧" form="infix" lspace=".27777em" rspace=".27777em" +"⪢" form="infix" lspace=".27777em" rspace=".27777em" +"≷" form="infix" lspace=".27777em" rspace=".27777em" +"⩾" form="infix" lspace=".27777em" rspace=".27777em" +"≳" form="infix" lspace=".27777em" rspace=".27777em" +"≎" form="infix" lspace=".27777em" rspace=".27777em" +"≏" form="infix" lspace=".27777em" rspace=".27777em" +"⊲" form="infix" lspace=".27777em" rspace=".27777em" +"⧏" form="infix" lspace=".27777em" rspace=".27777em" +"⊴" form="infix" lspace=".27777em" rspace=".27777em" +"≤" form="infix" lspace=".27777em" rspace=".27777em" +"⋚" form="infix" lspace=".27777em" rspace=".27777em" +"≦" form="infix" lspace=".27777em" rspace=".27777em" +"≶" form="infix" lspace=".27777em" rspace=".27777em" +"⪡" form="infix" lspace=".27777em" rspace=".27777em" +"⩽" form="infix" lspace=".27777em" rspace=".27777em" +"≲" form="infix" lspace=".27777em" rspace=".27777em" +"≫" form="infix" lspace=".27777em" rspace=".27777em" +"≪" form="infix" lspace=".27777em" rspace=".27777em" +"≢" form="infix" lspace=".27777em" rspace=".27777em" +"≭" form="infix" lspace=".27777em" rspace=".27777em" +"∦" form="infix" lspace=".27777em" rspace=".27777em" +"≠" form="infix" lspace=".27777em" rspace=".27777em" +"≂̸" form="infix" lspace=".27777em" rspace=".27777em" +"≯" form="infix" lspace=".27777em" rspace=".27777em" +"≱" form="infix" lspace=".27777em" rspace=".27777em" +"≧̸" form="infix" lspace=".27777em" rspace=".27777em" +"≫̸" form="infix" lspace=".27777em" rspace=".27777em" +"≹" form="infix" lspace=".27777em" rspace=".27777em" +"⩾̸" form="infix" lspace=".27777em" rspace=".27777em" +"≵" form="infix" lspace=".27777em" rspace=".27777em" +"≎̸" form="infix" lspace=".27777em" rspace=".27777em" +"≏̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋪" form="infix" lspace=".27777em" rspace=".27777em" +"⧏̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋬" form="infix" lspace=".27777em" rspace=".27777em" +"≮" form="infix" lspace=".27777em" rspace=".27777em" +"≰" form="infix" lspace=".27777em" rspace=".27777em" +"&NotLessFullEqual;" form="infix" lspace=".27777em" rspace=".27777em" +"≸" form="infix" lspace=".27777em" rspace=".27777em" +"≪̸" form="infix" lspace=".27777em" rspace=".27777em" +"⩽̸" form="infix" lspace=".27777em" rspace=".27777em" +"≴" form="infix" lspace=".27777em" rspace=".27777em" +"⪢̸" form="infix" lspace=".27777em" rspace=".27777em" +"⪡̸" form="infix" lspace=".27777em" rspace=".27777em" +"⊀" form="infix" lspace=".27777em" rspace=".27777em" +"⪯̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋠" form="infix" lspace=".27777em" rspace=".27777em" +"&NotPrecedesTilde;" form="infix" lspace=".27777em" rspace=".27777em" +"⋫" form="infix" lspace=".27777em" rspace=".27777em" +"⧐̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋭" form="infix" lspace=".27777em" rspace=".27777em" +"⊁" form="infix" lspace=".27777em" rspace=".27777em" +"⪰̸" form="infix" lspace=".27777em" rspace=".27777em" +"⋡" form="infix" lspace=".27777em" rspace=".27777em" +"≿̸" form="infix" lspace=".27777em" rspace=".27777em" +"≁" form="infix" lspace=".27777em" rspace=".27777em" +"≄" form="infix" lspace=".27777em" rspace=".27777em" +"≇" form="infix" lspace=".27777em" rspace=".27777em" +"≉" form="infix" lspace=".27777em" rspace=".27777em" +"∤" form="infix" lspace=".27777em" rspace=".27777em" +"≺" form="infix" lspace=".27777em" rspace=".27777em" +"⪯" form="infix" lspace=".27777em" rspace=".27777em" +"≼" form="infix" lspace=".27777em" rspace=".27777em" +"≾" form="infix" lspace=".27777em" rspace=".27777em" +"∷" form="infix" lspace=".27777em" rspace=".27777em" +"∝" form="infix" lspace=".27777em" rspace=".27777em" +"⇋" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" +"⊳" form="infix" lspace=".27777em" rspace=".27777em" +"⧐" form="infix" lspace=".27777em" rspace=".27777em" +"⊵" form="infix" lspace=".27777em" rspace=".27777em" +"≻" form="infix" lspace=".27777em" rspace=".27777em" +"⪰" form="infix" lspace=".27777em" rspace=".27777em" +"≽" form="infix" lspace=".27777em" rspace=".27777em" +"≿" form="infix" lspace=".27777em" rspace=".27777em" +"∼" form="infix" lspace=".27777em" rspace=".27777em" +"≃" form="infix" lspace=".27777em" rspace=".27777em" +"≅" form="infix" lspace=".27777em" rspace=".27777em" +"≈" form="infix" lspace=".27777em" rspace=".27777em" +"⊥" form="infix" lspace=".27777em" rspace=".27777em" +"∣" form="infix" lspace=".27777em" rspace=".27777em" + +"⊔" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" +"⋃" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" +"⊎" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + +"-" form="infix" lspace=".22222em" rspace=".22222em" +"+" form="infix" lspace=".22222em" rspace=".22222em" +"⋂" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" +"∓" form="infix" lspace=".22222em" rspace=".22222em" +"±" form="infix" lspace=".22222em" rspace=".22222em" +"⊓" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + +"⋁" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"⊖" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" +"⊕" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" +"∑" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"⋃" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"⊎" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"lim" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" +"max" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" +"min" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" + +"⊖" form="infix" lspace=".16666em" rspace=".16666em" +"⊕" form="infix" lspace=".16666em" rspace=".16666em" + +"∲" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" +"∮" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" +"∳" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" +"∯" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" +"∫" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + +"⋓" form="infix" lspace=".16666em" rspace=".16666em" + +"⋒" form="infix" lspace=".16666em" rspace=".16666em" + +"≀" form="infix" lspace=".16666em" rspace=".16666em" + +"⋀" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"⊗" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" +"∐" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"∏" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" +"⋂" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + +"∐" form="infix" lspace=".16666em" rspace=".16666em" + +"⋆" form="infix" lspace=".16666em" rspace=".16666em" + +"⊙" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" + +"*" form="infix" lspace=".16666em" rspace=".16666em" +"⁢" form="infix" lspace="0em" rspace="0em" + +"·" form="infix" lspace=".16666em" rspace=".16666em" + +"⊗" form="infix" lspace=".16666em" rspace=".16666em" + +"⋁" form="infix" lspace=".16666em" rspace=".16666em" + +"⋀" form="infix" lspace=".16666em" rspace=".16666em" + +"⋄" form="infix" lspace=".16666em" rspace=".16666em" + +"∖" form="infix" stretchy="true" lspace=".16666em" rspace=".16666em" + +"/" form="infix" stretchy="true" lspace=".16666em" rspace=".16666em" + +"-" form="prefix" lspace="0em" rspace=".05555em" +"+" form="prefix" lspace="0em" rspace=".05555em" +"∓" form="prefix" lspace="0em" rspace=".05555em" +"±" form="prefix" lspace="0em" rspace=".05555em" + +"." form="infix" lspace="0em" rspace="0em" + +"⨯" form="infix" lspace=".11111em" rspace=".11111em" + +"**" form="infix" lspace=".11111em" rspace=".11111em" + +"⊙" form="infix" lspace=".11111em" rspace=".11111em" + +"∘" form="infix" lspace=".11111em" rspace=".11111em" + +"□" form="prefix" lspace="0em" rspace=".11111em" + +"∇" form="prefix" lspace="0em" rspace=".11111em" +"∂" form="prefix" lspace="0em" rspace=".11111em" + +"ⅅ" form="prefix" lspace="0em" rspace=".11111em" +"ⅆ" form="prefix" lspace="0em" rspace=".11111em" + +"√" form="prefix" stretchy="true" lspace="0em" rspace=".11111em" + +"⇓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟸" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟺" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟹" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⤓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇵" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↧" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥡" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇃" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥙" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥠" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↿" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥘" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟵" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟷" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⟶" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥯" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥝" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇂" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥏" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥜" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↾" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥔" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↓" form="infix" lspace=".11111em" rspace=".11111em" +"↑" form="infix" lspace=".11111em" rspace=".11111em" +"↑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⤒" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⇅" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"⥮" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" +"↥" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + +"^" form="infix" lspace=".11111em" rspace=".11111em" + +"<>" form="infix" lspace=".11111em" rspace=".11111em" + +"'" form="postfix" lspace=".11111em" rspace="0em" + +"!" form="postfix" lspace=".11111em" rspace="0em" +"!!" form="postfix" lspace=".11111em" rspace="0em" + +"~" form="infix" lspace=".11111em" rspace=".11111em" + +"@" form="infix" lspace=".11111em" rspace=".11111em" + +"--" form="postfix" lspace=".11111em" rspace="0em" +"--" form="prefix" lspace="0em" rspace=".11111em" +"++" form="postfix" lspace=".11111em" rspace="0em" +"++" form="prefix" lspace="0em" rspace=".11111em" + +"⁡" form="infix" lspace="0em" rspace="0em" + +"?" form="infix" lspace=".11111em" rspace=".11111em" + +"_" form="infix" lspace=".11111em" rspace=".11111em" + +"˘" form="postfix" accent="true" lspace="0em" rspace="0em" +"¸" form="postfix" accent="true" lspace="0em" rspace="0em" +"`" form="postfix" accent="true" lspace="0em" rspace="0em" +"˙" form="postfix" accent="true" lspace="0em" rspace="0em" +"˝" form="postfix" accent="true" lspace="0em" rspace="0em" +"&DiacriticalLeftArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"&DiacriticalLeftRightArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"&DiacriticalLeftRightVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"&DiacriticalLeftVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"´" form="postfix" accent="true" lspace="0em" rspace="0em" +"&DiacriticalRightArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"&DiacriticalRightVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"˜" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"¨" form="postfix" accent="true" lspace="0em" rspace="0em" +"̑" form="postfix" accent="true" lspace="0em" rspace="0em" +"ˇ" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"^" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"‾" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⏞" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⎴" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⏜" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⃛" form="postfix" accent="true" lspace="0em" rspace="0em" +"_" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⏟" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⎵" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +"⏝" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + + ------------------------------------------------------------------------ +Up: Table of Contents diff --git a/mozilla/layout/mathml/makefile.win b/mozilla/layout/mathml/makefile.win new file mode 100644 index 00000000000..5ad5c7b6a71 --- /dev/null +++ b/mozilla/layout/mathml/makefile.win @@ -0,0 +1,27 @@ +#!nmake +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is Heriot-Watt +# University, Edinburgh. Portions created by Heriot-Watt University +# are Copyright (C) 1999 Heriot-Watt University. All Rights Reserved. +# +# Contributor(s): +# David J. Fiddes +# + +DEPTH=..\.. + +DIRS = base content + +include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/layout/mathml/tests/all-presentation.xml b/mozilla/layout/mathml/tests/all-presentation.xml new file mode 100644 index 00000000000..b7164aace3c --- /dev/null +++ b/mozilla/layout/mathml/tests/all-presentation.xml @@ -0,0 +1,138 @@ + + + + + + + +Testing tensor indices <mmultiscripts>: + + +Ri1j2k3; + +This with <none/>, + + +Aqpi; + +A bit of calculus + + +abf(x)dx + + +xF(x,y) ++ yF(x,y) +; + +Here is the alphabet with invisible +portions wrapped by <mphantom> in between: + + +a b c d e f g +h i j k l m n +o p q r s +t u v w x y z. + +Testing MathML <msub>: + + +ab; + + +ai; + + +AIk; + + +Testing MathML <msup>: + + +db + + +2ax + + +22x + + +(12)yax +. + +Testing MathML <munder>, <mover>, and <munderover>: + + + abcdun + abcdov +abcdunderover +. + + +Testing MathML <msubsup>: + + +apq +ab+cx +. + + +Testing MathML <mrow>: + + + + +d(ab) +; + + + + +x2 + +4*x + + pq + = 0, + +with this <mfrac> hanging here + + + +d*T(i + jn) ++ py*qpx*bx ++ a ++ cd + + +in the middle of a lot of running text to try to explain what this means to those who care +to read. + +Testing MathML merror, mtext, + + +This is a text in mtext +This is a text in merror + + + diff --git a/mozilla/layout/mathml/tests/core.xml b/mozilla/layout/mathml/tests/core.xml new file mode 100644 index 00000000000..3a9ba5f9004 --- /dev/null +++ b/mozilla/layout/mathml/tests/core.xml @@ -0,0 +1,193 @@ + + + + + +Testing MathML msub: + + + + a + b + + + + + + + a + i + + + +Testing MathML msup: + + + + d + b + + + + + 2 + + a + x + + + + + + + 2 + 2 + + x + + + + + 2 + + y + + a + x + + + + +Testing MathML mrow: + + + + + + d + + ( + + a + b + + ) + + + + + + + + + + x + 2 + + + + + 4 + * + x + + + + 4 + / + + p + q + + + = + 0 + + + +and then piling fractions with a user-defined line thickness... + + + + + alpha + a + + + beta + b + + + + + + + +, with this mfrac hanging here + + +d*b(x + yz) + + py*qpx*bx + a + cd + + +in the middle of a lot of running text to try to explain what this means to those who care +to read. + + + diff --git a/mozilla/layout/mathml/tests/mathml.css b/mozilla/layout/mathml/tests/mathml.css new file mode 100644 index 00000000000..0f981754ef8 --- /dev/null +++ b/mozilla/layout/mathml/tests/mathml.css @@ -0,0 +1,166 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +p : +{ +display: block; +} + +math, math[mode="inline"] { + display: inline; +/* font-family: Arial; */ + font-style: normal; +/* font-weight: bold; */ + font-size: 14pt; +} + +math[mode="display"] { + display: block; + text-align: center; +/* font-family: Arial; */ + font-style: normal; +/* font-weight: bold; */ +/* font-size: 12pt; */ +} + +/* +mmultiscripts { + background-color: yellow; +} +*/ + +mtext { + color: purple; + border: 1px solid purple; +} + +ms { + color: blue; +} + +ms:before { + content: open-quote; +} + +ms:after { + content: close-quote; +} + +/* +mspace { +} +*/ + +/* +mrow { + border: 1px solid black; + font-style: italic; +} +*/ + +/* +mphantom { +} +*/ + +mfrac { + background-color: blue; +/* font-size: smaller */ +/* border: 1px solid black; */ +} + +msub, msup { +/* background-color: yellow; */ +/* border: 1px solid black; */ +/* font-size: small; */ +} + +/* +mn { +} +*/ + +mi { + color: red; + font-style: italic; +/* border: 1px solid blue; */ +} + +mo { + font-style: normal; + border: 1px solid black; + background-color: blue; +} + +merror { + display: block; + font-family: sans-serif; + font-weight: bold; + white-space: pre; + margin: 1em; + padding: 1em; + border-width: thin; + border-style: inset; + border-color: red; + font-size: 14pt; + background-color: lightyellow; +} + + +mtable { +/* display: inline-table; */ + display: table; +/* border-style: outset; */ +/* border-color: #c0c0c0; */ + border-spacing: 0; + margin-top: 0; + margin-bottom: 0; + background: transparent; +} + +/* must never set padding in td, th */ +mtd { + vertical-align: inherit; + background-color: inherit; + text-align: center; +/* border-style: inset; */ + border-color: #c0c0c0; + display: table-cell; +} + +mtr { + display: table-row; + vertical-align: inherit; + background-color: inherit; +valign: baseline; +} + +:-moz-math-font-style-normal { + font-style: normal; +} + +:-moz-math-font-size-smaller { + font-size: smaller; +} + +:-moz-math-font-size-larger { + font-size: larger; +} diff --git a/mozilla/layout/mathml/tests/mathml.dtd b/mozilla/layout/mathml/tests/mathml.dtd new file mode 100644 index 00000000000..10ec710aec8 --- /dev/null +++ b/mozilla/layout/mathml/tests/mathml.dtd @@ -0,0 +1,1555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mozilla/layout/mathml/tests/simple.xml b/mozilla/layout/mathml/tests/simple.xml new file mode 100644 index 00000000000..f64f234071b --- /dev/null +++ b/mozilla/layout/mathml/tests/simple.xml @@ -0,0 +1,38 @@ + + + + + + + + + x + = + y + + + + a + b + + + diff --git a/mozilla/layout/mathml/tests/stretchy.xml b/mozilla/layout/mathml/tests/stretchy.xml new file mode 100644 index 00000000000..00c378a93fc --- /dev/null +++ b/mozilla/layout/mathml/tests/stretchy.xml @@ -0,0 +1,146 @@ + + + + + + + Testing stretchy parentheses - NOT YET IMPLEMENTED + + + x + + + + ( + + a + b + + ) + + + + in binomial formulas + + + + ( + + n + p + + ) + + + = + + + ( + + n-1 + p + + ) + + + + + ( + + n-1 + p-1 + ) + + + +; + + + + + ( + a + + + b + ) + + n + + + = + + + a + n + + + + + + + + ( + + n + 1 + + ) + + + a + n-1 + + b + + + + + ... + + + + + + ( + + n + p + + ) + + + a + n-p + + + b + p + + + + + + ... + + + + + b + n + + + + diff --git a/mozilla/layout/mathml/tests/symbol.html b/mozilla/layout/mathml/tests/symbol.html new file mode 100644 index 00000000000..1a680f5944b --- /dev/null +++ b/mozilla/layout/mathml/tests/symbol.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + +
                
                
 !#%&()+,./
0123456789:;<=>?
ΑΒΧΕΦΓΗΙϑΚΛΜΝΟ
ΠΘΡΣΤΥςΞΨΖ[]_
αβχδεφγηιϕκλμνο
πθρστυϖωξψζ{|} 
                
                
ϒƒ
°±×÷
¬
  
diff --git a/mozilla/layout/mathml/tests/various.xml b/mozilla/layout/mathml/tests/various.xml new file mode 100644 index 00000000000..ffdbf19ebb1 --- /dev/null +++ b/mozilla/layout/mathml/tests/various.xml @@ -0,0 +1,480 @@ + + + + + + + + + + + R + i1 + j2 + + k3 + + + + + A + qp + + i + + + + + + a + b + + + f + ( + x + ) + d + x + + + + + + + + + + x + + + + + F + ( + x + , + y + ) + + + + + + + + + + y + + + + + F + ( + x + , + y + ) + + + + + a + b c + + d e f g + h i j k + + l m + n o + + p q r s + + t u v w + x y z + + + + a + b + + + + + a + i + + + + + + + A + A + + + + A + + A + + A + A + + + + + + + d + b + + + + + 2 + + a + x + + + + + + + 2 + 2 + + x + + + + + + + ( + + 1 + 2 + + ) + + + y + + a + x + + + + + + + abcd + un + + + + abcd + ov + + + abcd + under + over + + + + + + a + p + q + + + + + a + + a + + + b + + x + + + + + + + d + + ( + + a + b + + ) + + + + + + + + + d + * + + T + + ( + + + i + + + j + + n + + ) + + + + + + p + y + + * + q + + + + p + x + + * + + b + x + + + + + + a + + + c + + d + + + + + +This is a text in ms + + + + + + + x + 2 + + + + + 4 + * + x + + + + + p + q + + + = + 0 + + + +This is a text in mtext +This is a text in merror + + + + a + 0 + + + + + + 1 + + + + + a + 1 + + + + + + 1 + + + + + a + 2 + + + + + + 1 + + + + a + 3 + + + + + + + + + + + +; + + + + c + + i+j + + + + + ai + * + bj + + + +

+ + + + e + + i + π + + + + + 1 + = + 0 + + ; + + + + G + = + + + F + d2 + + + m1 + m2 + + + + +; + + +t+=dt + + +

+ + + + + x + = + a + * + b + + + + ( + + + aa + + + b + + + xy + z + + + ) + + + + + + x + z + + + + dy + + z + + + + + + + + + x + + z + + + + diff --git a/mozilla/layout/mathml/tools/byalpha.txt b/mozilla/layout/mathml/tools/byalpha.txt new file mode 100644 index 00000000000..2f994bbc6ea --- /dev/null +++ b/mozilla/layout/mathml/tools/byalpha.txt @@ -0,0 +1,2547 @@ + Up: Chapter 6 Next: By codes REC-MathML-19980407; revised 19990707 + ------------------------------------------------------------------------ + +Printing MathML Character Entities alphabetically + +Based on ISO 9573-13 extended with aliases + + ------------------------------------------------------------------------ + +A A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Aacgr isogrk2 902 0386 =capital Alpha, accent, Greek +aacgr isogrk2 940 03AC =small alpha, accent, Greek +Aacute isolat1 193 00C1 =capital A, acute accent +aacute isolat1 225 00E1 =small a, acute accent +Abreve isolat2 258 0102 =capital A, breve +abreve isolat2 259 0103 =small a, breve +ac isoamsb 57863 E207 most positive +acd isotech 58278 E3A6 ac current +acE isoamsb 58000 E290 most positive, two lines below +Acirc isolat1 194 00C2 =capital A, circumflex accent + +acirc isolat1 226 00E2 =small a, circumflex accent +acute isodia 180 00B4 =acute accent +Acy isocyr1 1040 0410 =capital A, Cyrillic +acy isocyr1 1072 0430 =small a, Cyrillic +AElig isolat1 198 00C6 =capital AE diphthong (ligature) +aelig isolat1 230 00E6 =small ae diphthong (ligature) +af mmlextra 59552 E8A0 short form of ⁡ +Afr isomfrk 58720 E560 /frak A, upper case a +afr isomfrk 58752 E580 /frak a, lower case a +Agr isogrk1 913 0391 =capital Alpha, Greek + +agr isogrk1 945 03B1 =small alpha, Greek +Agrave isolat1 192 00C0 =capital A, grave accent +agrave isolat1 224 00E0 =small a, grave accent +aleph isotech 8501 2135 /aleph aleph, Hebrew +alpha isogrk3 945 03B1 /alpha small alpha, Greek +Amacr isolat2 256 0100 =capital A, macron +amacr isolat2 257 0101 =small a, macron +amalg isoamsb 57937 E251 /amalg B: amalgamation or coproduct +amp isonum 38 0026 =ampersand +And isotech 58228 E374 dbl logical and + +and isotech 8743 2227 /wedge /land B: logical and +andand isotech 58222 E36E two logical and +andd isotech 58260 E394 and, horizontal dash +andslope isotech 58634 E50A sloping large and +andv isotech 58257 E391 and with middle stem +ang isoamso 8736 2220 /angle - angle +ange isoamso 58070 E2D6 angle, equal +angle mmlalias 8736 2220 alias ISOAMSO ang +angmsd isoamso 8737 2221 /measuredangle - angle-measured +angmsdaa isoamso 58073 E2D9 angle-measured, arrow, up, right + +angmsdab isoamso 58074 E2DA angle-measured, arrow, up, left +angmsdac isoamso 58075 E2DB angle-measured, arrow, down, right +angmsdad isoamso 58076 E2DC angle-measured, arrow, down, left +angmsdae isoamso 58077 E2DD angle-measured, arrow, right, up +angmsdaf isoamso 58078 E2DE angle-measured, arrow, left, up +angmsdag isoamso 58079 E2DF angle-measured, arrow, right, down +angmsdah isoamso 58080 E2E0 angle-measured, arrow, left, down +angrt isotech 8735 221F right (90 degree) angle +angrtvb isoamso 58392 E418 right angle-measured +angrtvbd isoamso 58081 E2E1 right angle-measured, dot + +angsph isotech 8738 2222 /sphericalangle angle-spherical +angst isotech 8491 212B Angstrom capital A, ring +angzarr isoamsa 57928 E248 angle with down zig-zag arrow +Aogon isolat2 260 0104 =capital A, ogonek +aogon isolat2 261 0105 =small a, ogonek +Aopf isomopf 58624 E500 /Bbb A, open face A +ap isotech 8776 2248 /approx R: approximate +apacir isotech 58252 E38C approximate, circumflex accent +apE isoamsr 8778 224A approximately equal or equal to +ape isoamsr 8778 224A /approxeq R: approximate, equals + +apid isoamsr 8779 224B approximately identical to +apos isonum 39 0027 =apostrophe +ApplyFunction mmlextra 59552 E8A0 character showing function application in presentation tagging +approx mmlalias 8776 2248 alias ISOTECH ap +approxeq mmlalias 8778 224A alias ISOAMSR ape +Aring isolat1 197 00C5 =capital A, ring +aring isolat1 229 00E5 =small a, ring +Ascr isomscr 58656 E520 /scr A, script letter A +ascr isomscr 58688 E540 /scr a, script letter a +Assign mmlextra 59483 E85B assignment operator + +ast isonum 42 002A /ast B: =asterisk +asymp isoamsr 8781 224D /asymp R: asymptotically equal to +Atilde isolat1 195 00C3 =capital A, tilde +atilde isolat1 227 00E3 =small a, tilde +Auml isolat1 196 00C4 =capital A, dieresis or umlaut mark +auml isolat1 228 00E4 =small a, dieresis or umlaut mark +awconint isotech 8755 2233 contour integral, anti-clockwise +awint isotech 58267 E39B anti clock-wise integration + + ------------------------------------------------------------------------ + +B A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +b.Delta isogrk4 59143 E707 capital delta, Greek +b.Gamma isogrk4 59139 E703 capital gamma, Greek +b.Gammad isogrk4 59141 E705 capital digamma, Greek +b.Lambda isogrk4 59156 E714 capital lambda, Greek +b.Omega isogrk4 59179 E72B capital Omega, Greek +b.Phi isogrk4 59173 E725 capital Phi, Greek +b.Pi isogrk4 59162 E71A capital pi, Greek +b.Psi isogrk4 59177 E729 capital Psi, Greek +b.Sigma isogrk4 59167 E71F capital sigma, Greek +b.Theta isogrk4 59150 E70E capital theta, Greek + +b.Upsilon isogrk4 59171 E723 capital upsilon, Greek +b.Xi isogrk4 59160 E718 capital xi, Greek +b.alpha isogrk4 59136 E700 small alpha, Greek +b.beta isogrk4 59137 E701 small beta, Greek +b.chi isogrk4 59175 E727 small chi, Greek +b.delta isogrk4 59142 E706 small delta, Greek +b.epsi isogrk4 59144 E708 small epsilon, Greek +b.epsiv isogrk4 59146 E709 varepsilion +b.eta isogrk4 59148 E70C small eta, Greek +b.gamma isogrk4 59138 E702 small gamma, Greek + +b.gammad isogrk4 59140 E704 digamma, Greek +b.iota isogrk4 59152 E710 small iota, Greek +b.kappa isogrk4 59153 E711 small kappa, Greek +b.kappav isogrk4 59154 E712 var kappa, Greek +b.lambda isogrk4 59155 E713 small lambda, Greek +b.mu isogrk4 59157 E715 small mu, Greek +b.nu isogrk4 59158 E716 small nu, Greek +b.omega isogrk4 59178 E72A small omega, Greek +b.phis isogrk4 59172 E724 straight phi, Greek +b.phiv isogrk4 59174 E726 varphi + +b.pi isogrk4 59161 E719 small pi, Greek +b.piv isogrk4 59163 E71B varpi +b.psi isogrk4 59176 E728 small psi, Greek +b.rho isogrk4 59164 E71C small rho, Greek +b.rhov isogrk4 59165 E71D varrho +b.sigma isogrk4 59166 E71E small sigma, Greek +b.sigmav isogrk4 59168 E720 varsigma +b.tau isogrk4 59169 E721 small tau, Greek +b.thetas isogrk4 59149 E70D straight theta, Greek +b.thetav isogrk4 59151 E70F var theta, Greek + +b.upsi isogrk4 59170 E722 small upsilon, Greek +b.xi isogrk4 59159 E717 small xi, Greek +b.zeta isogrk4 59145 E70B small zeta, Greek +backcong mmlalias 8780 224C alias ISOAMSR bcong +backepsilon mmlalias 59392 E800 alias ISOAMSR bepsi +backprime mmlalias 8245 2035 alias ISOAMSO bprime +backsim mmlalias 8765 223D alias ISOAMSR bsim +backsimeq mmlalias 8909 22CD alias ISOAMSR bsime +Backslash mmlalias 8726 2216 alias ISOAMSB setmn +BadBreak mmlextra 59540 E894 if a linebreak is needed, try to avoid breaking here + +Barv isoamsr 58129 E311 vert, dbl bar (over) +barvee isoamsb 8893 22BD bar, vee +Barwed isoamsb 8966 2306 /doublebarwedge B: log and, dbl bar above +barwed isoamsb 8892 22BC /barwedge B: logical and, bar above +barwedge mmlalias 8892 22BC alias ISOAMSB barwed +bbrk isoamso 58094 E2EE bottom square bracket +bbrktbrk isoamso 58393 E419 bottom above top square bracket +bcong isoamsr 8780 224C /backcong R: reverse congruent +Bcy isocyr1 1041 0411 =capital BE, Cyrillic +bcy isocyr1 1073 0431 =small be, Cyrillic + +becaus isotech 8757 2235 /because R: because +Because mmlalias 8757 2235 alias ISOTECH becaus +because mmlalias 8757 2235 alias ISOTECH becaus +bemptyv isoamso 58394 E41A reversed circle, slash +bepsi isoamsr 59392 E800 /backepsilon R: such that +bernou isotech 8492 212C Bernoulli function (script capital B) +beta isogrk3 946 03B2 /beta small beta, Greek +beth isoamso 8502 2136 /beth - beth, Hebrew +between mmlalias 8812 226C alias ISOAMSR twixt +Bfr isomfrk 58721 E561 /frak B, upper case b + +bfr isomfrk 58753 E581 /frak b, lower case b +Bgr isogrk1 914 0392 =capital Beta, Greek +bgr isogrk1 946 03B2 =small beta, Greek +bigcap mmlalias 8898 22C2 alias ISOAMSB xcap +bigcirc mmlalias 9711 25EF alias ISOAMSB xcirc +bigcup mmlalias 8899 22C3 alias ISOAMSB xcup +bigodot mmlalias 8857 2299 alias ISOAMSB xodot +bigoplus mmlalias 8853 2295 alias ISOAMSB xoplus +bigotimes mmlalias 8855 2297 alias ISOAMSB xotime +bigsqcup mmlalias 8852 2294 alias ISOAMSB xsqcup + +bigstar mmlalias 9733 2605 ISOPUB starf +bigtriangledown mmlalias 9661 25BD alias ISOAMSB xdtri +bigtriangleup mmlalias 9651 25B3 alias ISOAMSB xutri +biguplus mmlalias 8846 228E alias ISOAMSB xuplus +bigvee mmlalias 8897 22C1 alias ISOAMSB xvee +bigwedge mmlalias 8896 22C0 alias ISOAMSB xwedge +bkarow mmlalias 58373 E405 alias ISOAMSA rbarr +blacklozenge mmlalias 59403 E80B alias ISOPUB lozf +blacksquare mmlalias 9642 25AA ISOTECH squarf +blacktriangle mmlalias 9652 25B4 alias ISOPUB utrif + +blacktriangledown mmlalias 9662 25BE alias ISOPUB dtrif +blacktriangleleft mmlalias 9666 25C2 alias ISOPUB ltrif +blacktriangleright mmlalias 9656 25B8 alias ISOPUB rtrif +blank isopub 9251 2423 =significant blank symbol +blk12 isopub 9618 2592 =50% shaded block +blk14 isopub 9617 2591 =25% shaded block +blk34 isopub 9619 2593 =75% shaded block +block isopub 9608 2588 =full block +bne isotech 58248 E388 reverse not equal +bnequiv isotech 58247 E387 reverse not equivalent + +bNot isotech 58285 E3AD reverse not with two horizontal strokes +bnot isotech 8976 2310 reverse not +Bopf isomopf 58625 E501 /Bbb B, open face B +bot mmlalias 8869 22A5 alias ISOTECH bottom +bottom isotech 8869 22A5 /bot bottom +bowtie isoamsr 8904 22C8 /bowtie R: +boxbox isoamso 58086 E2E6 two joined squares +boxDL isobox 9559 2557 lower left quadrant +boxDl isobox 9558 2556 lower left quadrant +boxdL isobox 9557 2555 lower left quadrant + +boxdl isobox 9488 2510 lower left quadrant +boxDR isobox 9556 2554 lower right quadrant +boxDr isobox 9555 2553 lower right quadrant +boxdR isobox 9554 2552 lower right quadrant +boxdr isobox 9484 250C lower right quadrant +boxH isobox 9552 2550 horizontal line +boxh isobox 9472 2500 horizontal line +boxHD isobox 9574 2566 lower left and right quadrants +boxHd isobox 9572 2564 lower left and right quadrants +boxhD isobox 9573 2565 lower left and right quadrants + +boxhd isobox 9516 252C lower left and right quadrants +boxHU isobox 9577 2569 upper left and right quadrants +boxHu isobox 9575 2567 upper left and right quadrants +boxhU isobox 9576 2568 upper left and right quadrants +boxhu isobox 9524 2534 upper left and right quadrants +boxminus mmlalias 8863 229F alias ISOAMSB minusb +boxplus mmlalias 8862 229E alias ISOAMSB plusb +boxtimes mmlalias 8864 22A0 alias ISOAMSB timesb +boxUL isobox 9565 255D upper left quadrant +boxUl isobox 9564 255C upper left quadrant + +boxuL isobox 9563 255B upper left quadrant +boxul isobox 9496 2518 upper left quadrant +boxUR isobox 9562 255A upper right quadrant +boxUr isobox 9561 2559 upper right quadrant +boxuR isobox 9560 2558 upper right quadrant +boxur isobox 9492 2514 upper right quadrant +boxV isobox 9553 2551 vertical line +boxv isobox 9474 2502 vertical line +boxVH isobox 9580 256C all four quadrants +boxVh isobox 9579 256B all four quadrants + +boxvH isobox 9578 256A all four quadrants +boxvh isobox 9532 253C all four quadrants +boxVL isobox 9571 2563 upper and lower left quadrants +boxVl isobox 9570 2562 upper and lower left quadrants +boxvL isobox 9569 2561 upper and lower left quadrants +boxvl isobox 9508 2524 upper and lower left quadrants +boxVR isobox 9568 2560 upper and lower right quadrants +boxVr isobox 9567 255F upper and lower right quadrants +boxvR isobox 9566 255E upper and lower right quadrants +boxvr isobox 9500 251C upper and lower right quadrants + +bprime isoamso 8245 2035 /backprime - reverse prime +Breve mmlalias 728 02D8 alias ISODIA breve +breve isodia 728 02D8 =breve +brvbar isonum 166 00A6 =broken (vertical) bar +Bscr isomscr 8492 212C /scr B, script letter B +bscr isomscr 58689 E541 /scr b, script letter b +bsemi isoamso 58093 E2ED reverse semi-colon +bsim isoamsr 8765 223D /backsim R: reverse similar +bsime isoamsr 8909 22CD /backsimeq R: reverse similar, eq +bsol isonum 92 005C /backslash =reverse solidus + +bsolb isoamsb 57984 E280 reverse solidus in square +bsolhsub isoamsr 58189 E34D reverse solidus, subset +bull isopub 8226 2022 /bullet B: =round bullet, filled +bullet mmlalias 8226 2022 alias ISOPUB bull +bump isoamsr 8782 224E /Bumpeq R: bumpy equals +bumpE isoamsr 58134 E316 bump, equals +bumpe isoamsr 8783 224F /bumpeq R: bumpy equals, equals +Bumpeq mmlalias 8782 224E alias ISOAMSR bump +bumpeq mmlalias 8783 224F alias ISOAMSR bumpe + + ------------------------------------------------------------------------ + +C A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Cacute isolat2 262 0106 =capital C, acute accent +cacute isolat2 263 0107 =small c, acute accent +Cap isoamsb 8914 22D2 /Cap /doublecap B: dbl intersection +cap isotech 8745 2229 /cap B: intersection +capand isoamsb 57985 E281 intersection, and +capbrcup isoamsb 57969 E271 intersection, bar, union +capcap isoamsb 57971 E273 intersection, intersection, joined +capcup isoamsb 57967 E26F intersection above union +capdot isoamsb 57953 E261 intersection, with dot +CapitalDifferentialD mmlextra 63307 F74B D for use in differentials, e.g., within integrals + +caps isoamsb 57973 E275 intersection, serifs +caret isopub 8257 2041 =caret (insertion mark) +caron isodia 711 02C7 =caron +ccaps isoamsb 57977 E279 closed intersection, serifs +Ccaron isolat2 268 010C =capital C, caron +ccaron isolat2 269 010D =small c, caron +Ccedil isolat1 199 00C7 =capital C, cedilla +ccedil isolat1 231 00E7 =small c, cedilla +Ccirc isolat2 264 0108 =capital C, circumflex accent +ccirc isolat2 265 0109 =small c, circumflex accent + +Cconint isotech 8752 2230 triple contour integral operator +ccups isoamsb 57976 E278 closed union, serifs +ccupssm isoamsb 57978 E27A closed union, serifs, smash product +Cdot isolat2 266 010A =capital C, dot above +cdot isolat2 267 010B =small c, dot above +cedil isodia 184 00B8 =cedilla +Cedilla mmlalias 184 00B8 alias ISODIA cedil +cemptyv isoamso 58088 E2E8 circle, slash, small circle above +cent isonum 162 00A2 =cent sign +CenterDot mmlalias 183 00B7 alias ISONUM middot + +centerdot mmlalias 183 00B7 alias ISONUM middot +Cfr isomfrk 58722 E562 /frak C, upper case c +cfr isomfrk 58754 E582 /frak c, lower case c +CHcy isocyr1 1063 0427 =capital CHE, Cyrillic +chcy isocyr1 1095 0447 =small che, Cyrillic +check isopub 10003 2713 /checkmark =tick, check mark +checkmark mmlalias 10003 2713 alias ISOPUB check +chi isogrk3 967 03C7 /chi small chi, Greek +cir isopub 9675 25CB /circ B: =circle, open +circ isodia 94 005E circumflex accent + +circeq mmlalias 8791 2257 alias ISOAMSR cire +circlearrowleft mmlalias 8634 21BA alias ISOAMSA olarr +circlearrowright mmlalias 8635 21BB alias ISOAMSA orarr +circledast mmlalias 8859 229B alias ISOAMSB oast +circledcirc mmlalias 8858 229A alias ISOAMSB ocir +circleddash mmlalias 8861 229D alias ISOAMSB odash +CircleDot mmlalias 8857 2299 alias ISOAMSB odot +circledR mmlalias 174 00AE alias ISONUM reg +circledS mmlalias 9416 24C8 alias ISOAMSO oS +CircleMinus mmlalias 8854 2296 alias ISOAMSB ominus + +CirclePlus mmlalias 8853 2295 alias ISOAMSB oplus +CircleTimes mmlalias 8855 2297 alias ISOAMSB otimes +cirE isoamso 58395 E41B circle, two horizontal stroked to the right +cire isoamsr 8791 2257 /circeq R: circle, equals +cirfnint isotech 58261 E395 circulation function +cirmid isoamsa 57936 E250 circle, mid below +cirscir isoamso 58396 E41C circle, small circle to the right +ClockwiseContourIntegral mmlalias 8754 2232 alias ISOTECH cwconint +CloseCurlyDoubleQuote mmlalias 8221 201D alias ISONUM rdquo +CloseCurlyQuote mmlalias 8217 2019 alias ISONUM rsquo + +clubs isopub 9827 2663 /clubsuit =club suit symbol +clubsuit mmlalias 9827 2663 ISOPUB clubs +Colon isoamsr 8759 2237 /Colon, two colons +colon isonum 58 003A /colon P: +Colone isoamsr 58126 E30E double colon, equals +colone isoamsr 8788 2254 /coloneq R: colon, equals +coloneq mmlalias 8788 2254 alias ISOAMSR colone +comma isonum 44 002C P: =comma +commat isonum 64 0040 =commercial at +comp isoamso 8705 2201 /complement - complement sign + +compfn isotech 8728 2218 /circ B: composite function (small circle) +complement mmlalias 8705 2201 alias ISOAMSO comp +cong isotech 8773 2245 /cong R: congruent with +congdot isoamsr 58132 E314 congruent, dot +Congruent mmlalias 8801 2261 alias ISOTECH equiv +Conint isotech 8751 222F double contour integral operator +conint isotech 8750 222E /oint L: contour integral operator +ContourIntegral mmlalias 8750 222E alias ISOTECH conint +Copf isomopf 8450 2102 /Bbb C, open face C +coprod isoamsb 8720 2210 /coprod L: coproduct operator + +Coproduct mmlalias 8720 2210 alias ISOAMSB coprod +copy isonum 169 00A9 =copyright sign +copysr isopub 8471 2117 =sound recording copyright sign +CounterClockwiseContourIntegral mmlalias 8755 2233 alias ISOTECH awconint +Cross mmlextra 58905 E619 cross or vector product +cross isopub 10007 2717 =ballot cross +Cscr isomscr 58658 E522 /scr C, script letter C +cscr isomscr 58690 E542 /scr c, script letter c +csub isoamsr 58193 E351 subset, closed +csube isoamsr 58195 E353 subset, closed, equals + +csup isoamsr 58194 E352 superset, closed +csupe isoamsr 58196 E354 superset, closed, equals +ctdot isotech 8943 22EF /cdots, three dots, centered +cudarrl isoamsa 57918 E23E left, curved, down arrow +cudarrr isoamsa 58368 E400 right, curved, down arrow +cuepr isoamsr 8926 22DE /curlyeqprec R: curly eq, precedes +cuesc isoamsr 8927 22DF /curlyeqsucc R: curly eq, succeeds +cularr isoamsa 8630 21B6 /curvearrowleft A: left curved arrow +cularrp isoamsa 57930 E24A curved left arrow with plus +Cup isoamsb 8915 22D3 /Cup /doublecup B: dbl union + +cup isotech 8746 222A /cup B: union or logical sum +cupbrcap isoamsb 57968 E270 union, bar, intersection +CupCap mmlalias 8781 224D alias ISOAMSR asymp +cupcap isoamsb 57966 E26E union above intersection +cupcup isoamsb 57970 E272 union, union, joined +cupdot isoamsb 8845 228D union, with dot +cupor isoamsb 57986 E282 union, or +cups isoamsb 57972 E274 union, serifs +curarr isoamsa 8631 21B7 /curvearrowright A: rt curved arrow +curarrm isoamsa 57929 E249 curved right arrow with minus + +curlyeqprec mmlalias 8926 22DE alias ISOAMSR cuepr +curlyeqsucc mmlalias 8927 22DF alias ISOAMSR cuesc +curlyvee mmlalias 8910 22CE alias ISOAMSB cuvee +curlywedge mmlalias 8911 22CF alias ISOAMSB cuwed +curren isonum 164 00A4 =general currency sign +curvearrowleft mmlalias 8630 21B6 alias ISOAMSA cularr +curvearrowright mmlalias 8631 21B7 alias ISOAMSA curarr +cuvee isoamsb 8910 22CE /curlyvee B: curly logical or +cuwed isoamsb 8911 22CF /curlywedge B: curly logical and +cwconint isotech 8754 2232 contour integral, clockwise + +cwint isotech 8753 2231 clockwise integral +cylcty isotech 9005 232D cylindricity + + ------------------------------------------------------------------------ + +D A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Dagger isoamsb 8225 2021 /ddagger B: double dagger relation +Dagger isopub 8225 2021 /ddagger B: =double dagger +dagger isoamsb 8224 2020 /dagger B: dagger relation +dagger isopub 8224 2020 /dagger B: =dagger +daleth isoamso 8504 2138 /daleth - daleth, Hebrew +Darr isoamsa 8609 21A1 down two-headed arrow +dArr isoamsa 8659 21D3 /Downarrow A: down dbl arrow +darr isonum 8595 2193 /downarrow A: =downward arrow +dash isopub 8208 2010 =hyphen (true graphic) +Dashv isoamsr 58127 E30F dbl dash, vertical + +dashv isoamsr 8867 22A3 /dashv R: dash, vertical +dbkarow mmlalias 57863 E207 alias ISOAMSA rBarr +dblac isodia 733 02DD =double acute accent +Dcaron isolat2 270 010E =capital D, caron +dcaron isolat2 271 010F =small d, caron +Dcy isocyr1 1044 0414 =capital DE, Cyrillic +dcy isocyr1 1076 0434 =small de, Cyrillic +DD mmlextra 63307 F74B short form of CapitalDifferentialD +dd mmlextra 63308 F74C short form of ⅆ +ddagger mmlalias 8225 2021 alias ISOPUB Dagger + +ddarr isoamsa 8650 21CA /downdownarrows A: two down arrows +DDotrahd isoamsa 57912 E238 right arrow with dotted stem +ddotseq mmlalias 58121 E309 alias ISOAMSR eDDot +deg isonum 176 00B0 =degree sign +Del mmlalias 8711 2207 alias ISOTECH nabla +Delta isogrk3 916 0394 /Delta capital Delta, Greek +delta isogrk3 948 03B4 /delta small delta, Greek +demptyv isoamso 58087 E2E7 circle, slash, bar above +dfisht isoamsa 57932 E24C down fish tail +Dfr isomfrk 58723 E563 /frak D, upper case d + +dfr isomfrk 58755 E583 /frak d, lower case d +Dgr isogrk1 916 0394 =capital Delta, Greek +dgr isogrk1 948 03B4 =small delta, Greek +dHar isoamsa 57895 E227 down harpoon-left, down harpoon-right +dharl isoamsa 8643 21C3 /downharpoonleft A: dn harpoon-left +dharr isoamsa 8642 21C2 /downharpoonright A: down harpoon-rt +DiacriticalAcute mmlalias 180 00B4 alias ISODIA acute +DiacriticalDot mmlalias 729 02D9 alias ISODIA dot +DiacriticalDoubleAcute mmlalias 733 02DD alias ISODIA dblac +DiacriticalGrave mmlalias 96 0060 alias ISODIA grave + +DiacriticalTilde mmlalias 732 02DC alias ISODIA tilde +diam isoamsb 8900 22C4 /diamond B: open diamond +Diamond mmlalias 8900 22C4 alias ISOAMSB diam +diamond mmlalias 8900 22C4 alias ISOAMSB diam +diamondsuit mmlalias 9830 2666 ISOPUB diams +diams isopub 9830 2666 /diamondsuit =diamond suit symbol +die isodia 168 00A8 =dieresis +DifferentialD mmlextra 63308 F74C d for use in differentials, e.g., within integrals +digamma mmlalias 988 03DC alias ISOGRK3 gammad +disin isotech 58272 E3A0 set membership, long horizontal stroke + +div mmlalias 247 00F7 alias ISONUM divide +divide isonum 247 00F7 /div B: =divide sign +divideontimes mmlalias 8903 22C7 alias ISOAMSB divonx +divonx isoamsb 8903 22C7 /divideontimes B: division on times +DJcy isocyr2 1026 0402 =capital DJE, Serbian +djcy isocyr2 1106 0452 =small dje, Serbian +dlcorn isoamsc 8990 231E /llcorner O: lower left corner +dlcrop isopub 8973 230D downward left crop mark +dollar isonum 36 0024 =dollar sign +Dopf isomopf 58627 E503 /Bbb D, open face D + +Dot isotech 168 00A8 dieresis or umlaut mark +dot isodia 729 02D9 =dot above +DotDot isotech 8412 20DC four dots above +doteq mmlalias 8784 2250 alias ISOAMSR esdot +doteqdot mmlalias 8785 2251 alias ISOAMSR eDot +DotEqual mmlalias 8784 2250 alias ISOAMSR esdot +dotminus mmlalias 8760 2238 alias ISOAMSB minusd +dotplus mmlalias 8724 2214 alias ISOAMSB plusdo +dotsquare mmlalias 8865 22A1 alias ISOAMSB sdotb +doublebarwedge mmlalias 8966 2306 alias ISOAMSB Barwed + +DoubleContourIntegral mmlalias 8751 222F alias ISOTECH Conint +DoubleDot mmlalias 168 00A8 alias ISODIA die +DoubleDownArrow mmlalias 8659 21D3 alias ISOAMSA dArr +DoubleLeftArrow mmlalias 8656 21D0 alias ISOTECH lArr +DoubleLeftRightArrow mmlalias 8660 21D4 alias ISOAMSA hArr +DoubleLeftTee mmlalias 58127 E30F alias for ⫤ +DoubleLongLeftArrow mmlalias 57856 E200 alias ISOAMSA xlArr +DoubleLongLeftRightArrow mmlalias 57858 E202 alias ISOAMSA xhArr +DoubleLongRightArrow mmlalias 57860 E204 alias ISOAMSA xrArr +DoubleRightArrow mmlalias 8658 21D2 alias ISOTECH rArr + +DoubleRightTee mmlalias 8872 22A8 alias ISOAMSR vDash +DoubleUpArrow mmlalias 8657 21D1 alias ISOAMSA uArr +DoubleUpDownArrow mmlalias 8661 21D5 alias ISOAMSA vArr +DoubleVerticalBar mmlalias 8741 2225 alias ISOTECH par +DownArrow mmlalias 8595 2193 alias ISONUM darr +Downarrow mmlalias 8659 21D3 alias ISOAMSA dArr +downarrow mmlalias 8595 2193 alias ISONUM darr +DownArrowBar mmlextra 62724 F504 down arrow to bar +DownArrowUpArrow mmlalias 57878 E216 alias ISOAMSA duarr +DownBreve mmlextra 785 0311 breve, inverted (non-spacing) + +downdownarrows mmlalias 8650 21CA alias ISOAMSA ddarr +downharpoonleft mmlalias 8643 21C3 alias ISOAMSA dharl +downharpoonright mmlalias 8642 21C2 alias ISOAMSA dharr +DownLeftRightVector mmlextra 62731 F50B left-down-right-down harpoon +DownLeftTeeVector mmlextra 62734 F50E left-down harpoon from bar +DownLeftVector mmlalias 8637 21BD alias ISOAMSA lhard +DownLeftVectorBar mmlextra 62732 F50C left-down harpoon to bar +DownRightTeeVector mmlextra 62735 F50F right-down harpoon from bar +DownRightVector mmlalias 8641 21C1 alias ISOAMSA rhard +DownRightVectorBar mmlextra 62733 F50D right-down harpoon to bar + +DownTee mmlalias 8868 22A4 alias ISOTECH top +DownTeeArrow mmlextra 8615 21A7 alias for mapstodown +drbkarow mmlalias 57865 E209 alias ISOAMSA RBarr +drcorn isoamsc 8991 231F /lrcorner C: lower right corner +drcrop isopub 8972 230C downward right crop mark +Dscr isomscr 58659 E523 /scr D, script letter D +dscr isomscr 58691 E543 /scr d, script letter d +DScy isocyr2 1029 0405 =capital DSE, Macedonian +dscy isocyr2 1109 0455 =small dse, Macedonian +dsol isotech 58281 E3A9 solidus, bar above + +Dstrok isolat2 272 0110 =capital D, stroke +dstrok isolat2 273 0111 =small d, stroke +dtdot isotech 8945 22F1 /ddots, three dots, descending +dtri isopub 9663 25BF /triangledown =down triangle, open +dtrif isopub 9662 25BE /blacktriangledown =dn tri, filled +duarr isoamsa 57878 E216 down arrow, up arrow +duhar isoamsa 57879 E217 down harp, up harp +dwangle isotech 58282 E3AA large downward pointing angle +DZcy isocyr2 1039 040F =capital dze, Serbian +dzcy isocyr2 1119 045F =small dze, Serbian + +dzigrarr isoamsa 8669 21DD right long zig-zag arrow + + ------------------------------------------------------------------------ + +E A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Eacgr isogrk2 904 0388 =capital Epsilon, accent, Greek +eacgr isogrk2 941 03AD =small epsilon, accent, Greek +Eacute isolat1 201 00C9 =capital E, acute accent +eacute isolat1 233 00E9 =small e, acute accent +easter isoamsr 8795 225B equal, asterisk above +Ecaron isolat2 282 011A =capital E, caron +ecaron isolat2 283 011B =small e, caron +ecir isoamsr 8790 2256 /eqcirc R: circle on equals sign +Ecirc isolat1 202 00CA =capital E, circumflex accent +ecirc isolat1 234 00EA =small e, circumflex accent + +ecolon isoamsr 8789 2255 /eqcolon R: equals, colon +Ecy isocyr1 1069 042D =capital E, Cyrillic +ecy isocyr1 1101 044D =small e, Cyrillic +eDDot isoamsr 58121 E309 /ddotseq R: equal with four dots +Edot isolat2 278 0116 =capital E, dot above +eDot isoamsr 8785 2251 /doteqdot /Doteq R: eq, even dots +edot isolat2 279 0117 =small e, dot above +ee mmlextra 63309 F74D short form of ⅇ +EEacgr isogrk2 905 0389 =capital Eta, accent, Greek +eeacgr isogrk2 942 03AE =small eta, accent, Greek + +EEgr isogrk1 919 0397 =capital Eta, Greek +eegr isogrk1 951 03B7 =small eta, Greek +efDot isoamsr 8786 2252 /fallingdotseq R: eq, falling dots +Efr isomfrk 58724 E564 /frak E, upper case e +efr isomfrk 58756 E584 /frak e, lower case e +eg isoamsr 58152 E328 equal-or-greater +Egr isogrk1 917 0395 =capital Epsilon, Greek +egr isogrk1 949 03B5 =small epsilon, Greek +Egrave isolat1 200 00C8 =capital E, grave accent +egrave isolat1 232 00E8 =small e, grave accent + +egs isoamsr 8925 22DD /eqslantgtr R: equal-or-gtr, slanted +egsdot isoamsr 58148 E324 equal-or-greater, slanted, dot inside +el isoamsr 58151 E327 equal-or-less +Element mmlalias 8712 2208 alias ISOTECH isinv +elinters isotech 58279 E3A7 electrical intersection +ell isoamso 8467 2113 /ell - cursive small l +els isoamsr 8924 22DC /eqslantless R: eq-or-less, slanted +elsdot isoamsr 58147 E323 equal-or-less, slanted, dot inside +Emacr isolat2 274 0112 =capital E, macron +emacr isolat2 275 0113 =small e, macron + +empty isoamso 58067 E2D3 /emptyset - zero, slash +emptyset mmlalias 58067 E2D3 alias ISOAMSO empty +EmptySmallSquare mmlextra 62759 F527 empty small square +emptyv isoamso 8709 2205 /varnothing - circle, slash +EmptyVerySmallSquare mmlextra 62768 F530 empty small square +emsp isopub 8195 2003 =em space +emsp13 isopub 8196 2004 =1/3-em space +emsp14 isopub 8197 2005 =1/4-em space +ENG isolat2 330 014A =capital ENG, Lapp +eng isolat2 331 014B =small eng, Lapp + +ensp isopub 8194 2002 =en space (1/2-em) +Eogon isolat2 280 0118 =capital E, ogonek +eogon isolat2 281 0119 =small e, ogonek +Eopf isomopf 58628 E504 /Bbb E, open face E +epar isotech 8917 22D5 parallel, equal; equal or parallel +eparsl isotech 58244 E384 parallel, slanted, equal; homothetically congruent to +eplus isoamsb 57960 E268 equal, plus +epsi isogrk3 949 03B5 /straightepsilon, small epsilon, Greek +epsiv isogrk3 603 025B /varepsilon +eqcirc mmlalias 8790 2256 alias ISOAMSR ecir + +eqcolon mmlalias 8789 2255 alias ISOAMSR ecolon +eqsim mmlalias 8770 2242 alias ISOAMSR esim +eqslantgtr mmlalias 8925 22DD alias ISOAMSR egs +eqslantless mmlalias 8924 22DC alias ISOAMSR els +Equal mmlextra 62513 F431 two consecutive equal signs +equals isonum 61 003D =equals sign R: +EqualTilde mmlalias 8770 2242 alias ISOAMSR esim +equest isoamsr 8799 225F /questeq R: equal with questionmark +Equilibrium mmlalias 8652 21CC alias ISOAMSA rlhar +equiv isotech 8801 2261 /equiv R: identical with + +equivDD isoamsr 58136 E318 equivalent, four dots above +eqvparsl isotech 58246 E386 equivalent, equal; congruent and parallel +erarr isoamsa 57910 E236 equal, right arrow below +erDot isoamsr 8787 2253 /risingdotseq R: eq, rising dots +Escr isomscr 8496 2130 /scr E, script letter E +escr isomscr 8495 212F /scr e, script letter e +esdot isoamsr 8784 2250 /doteq R: equals, single dot above +Esim isoamsr 58135 E317 equal, similar +esim isoamsr 8770 2242 /esim R: equals, similar +eta isogrk3 951 03B7 /eta small eta, Greek + +ETH isolat1 208 00D0 =capital Eth, Icelandic +eth isolat1 240 00F0 =small eth, Icelandic +Euml isolat1 203 00CB =capital E, dieresis or umlaut mark +euml isolat1 235 00EB =small e, dieresis or umlaut mark +excl isonum 33 0021 =exclamation mark +exist isotech 8707 2203 /exists at least one exists +Exists mmlalias 8707 2203 alias ISOTECH exist +ExponentialE mmlextra 63309 F74D e use for the exponential base of the natural logarithms + + ------------------------------------------------------------------------ + +F A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +fallingdotseq mmlalias 8786 2252 alias ISOAMSR efDot +false mmlextra 59559 E8A7 logical constant false +Fcy isocyr1 1060 0424 =capital EF, Cyrillic +fcy isocyr1 1092 0444 =small ef, Cyrillic +female isopub 9792 2640 =female symbol +ffilig isopub 64259 FB03 small ffi ligature +fflig isopub 64256 FB00 small ff ligature +ffllig isopub 64260 FB04 small ffl ligature +Ffr isomfrk 58725 E565 /frak F, upper case f +ffr isomfrk 58757 E585 /frak f, lower case f + +filig isopub 64257 FB01 small fi ligature +FilledSmallSquare mmlextra 62760 F528 filled small square +FilledVerySmallSquare mmlextra 62761 F529 filled very small square +fjlig isopub 58290 E3B2 small fj ligature +flat isopub 9837 266D /flat =musical flat +fllig isopub 64258 FB02 small fl ligature +fltns isotech 58241 E381 flatness +fnof isotech 402 0192 function of (italic small f) +Fopf isomopf 58629 E505 /Bbb F, open face F +ForAll mmlalias 8704 2200 alias ISOTECH forall + +forall isotech 8704 2200 /forall for all +fork isoamsr 8916 22D4 /pitchfork R: pitchfork +forkv isoamsr 58139 E31B fork, variant +fpartint isotech 58262 E396 finite part integral +frac12 isonum 189 00BD =fraction one-half +frac13 isopub 8531 2153 =fraction one-third +frac14 isonum 188 00BC =fraction one-quarter +frac15 isopub 8533 2155 =fraction one-fifth +frac16 isopub 8537 2159 =fraction one-sixth +frac18 isonum 8539 215B =fraction one-eighth + +frac23 isopub 8532 2154 =fraction two-thirds +frac25 isopub 8534 2156 =fraction two-fifths +frac34 isonum 190 00BE =fraction three-quarters +frac35 isopub 8535 2157 =fraction three-fifths +frac38 isonum 8540 215C =fraction three-eighths +frac45 isopub 8536 2158 =fraction four-fifths +frac56 isopub 8538 215A =fraction five-sixths +frac58 isonum 8541 215D =fraction five-eighths +frac78 isonum 8542 215E =fraction seven-eighths +frown isoamsr 8994 2322 /frown R: down curve + +Fscr isomscr 8497 2131 /scr F, script letter F +fscr isomscr 58693 E545 /scr f, script letter f + + ------------------------------------------------------------------------ + +G A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +gacute isolat2 501 01F5 =small g, acute accent +Gamma isogrk3 915 0393 /Gamma capital Gamma, Greek +gamma isogrk3 947 03B3 /gamma small gamma, Greek +Gammad isogrk3 988 03DC capital digamma +gammad isogrk3 988 03DC /digamma +gap isoamsr 8819 2273 /gtrapprox R: greater, approximate +Gbreve isolat2 286 011E =capital G, breve +gbreve isolat2 287 011F =small g, breve +Gcedil isolat2 290 0122 =capital G, cedilla +Gcirc isolat2 284 011C =capital G, circumflex accent + +gcirc isolat2 285 011D =small g, circumflex accent +Gcy isocyr1 1043 0413 =capital GHE, Cyrillic +gcy isocyr1 1075 0433 =small ghe, Cyrillic +Gdot isolat2 288 0120 =capital G, dot above +gdot isolat2 289 0121 =small g, dot above +gE isoamsr 8807 2267 /geqq R: greater, double equals +ge isotech 8805 2265 /geq /ge R: greater-than-or-equal +gEl isoamsr 8923 22DB /gtreqqless R: gt, dbl equals, less +gel isoamsr 8923 22DB /gtreqless R: greater, equals, less +geq mmlalias 8805 2265 alias ISOTECH ge + +geqq mmlalias 8807 2267 alias ISOAMSR gE +geqslant mmlalias 58102 E2F6 alias ISOAMSR ges +ges isoamsr 58102 E2F6 /geqslant R: gt-or-equal, slanted +gescc isoamsr 58200 E358 greater than, closed by curve, equal, slanted +gesdot isoamsr 58142 E31E greater-than-or-equal, slanted, dot inside +gesdoto isoamsr 58144 E320 greater-than-or-equal, slanted, dot above +gesdotol isoamsr 58146 E322 greater-than-or-equal, slanted, dot above left +gesl isoamsr 58156 E32C greater, equal, slanted, less +gesles isoamsr 58162 E332 greater, equal, slanted, less, equal, slanted +Gfr isomfrk 58726 E566 /frak G, upper case g + +gfr isomfrk 58758 E586 /frak g, lower case g +Gg isoamsr 8921 22D9 /ggg /Gg /gggtr R: triple gtr-than +gg mmlalias 8811 226B alias ISOAMSR Gt +ggg mmlalias 8921 22D9 alias ISOAMSR Gg +Ggr isogrk1 915 0393 =capital Gamma, Greek +ggr isogrk1 947 03B3 =small gamma, Greek +gimel isoamso 8503 2137 /gimel - gimel, Hebrew +GJcy isocyr2 1027 0403 =capital GJE Macedonian +gjcy isocyr2 1107 0453 =small gje, Macedonian +gl isoamsr 8823 2277 /gtrless R: greater, less + +gla isoamsr 58160 E330 greater, less, apart +glE isoamsr 58158 E32E greater, less, equal +glj isoamsr 58159 E32F greater, less, overlapping +gnap isoamsn 58015 E29F /gnapprox N: greater, not approximate +gnapprox mmlalias 58015 E29F alias ISOAMSN gnap +gnE isoamsn 8809 2269 /gneqq N: greater, not dbl equals +gne isoamsn 8809 2269 /gneq N: greater, not equals +gneq mmlalias 8809 2269 alias ISOAMSN gne +gneqq mmlalias 8809 2269 alias ISOAMSN gnE +gnsim isoamsn 8935 22E7 /gnsim N: greater, not similar + +GoodBreak mmlextra 59539 E893 if a linebreak is needed, here is a good spot +Gopf isomopf 58630 E506 /Bbb G, open face G +grave isodia 96 0060 =grave accent +GreaterEqual mmlalias 8805 2265 alias ISOTECH ge +GreaterEqualLess mmlalias 8923 22DB alias ISOAMSR gel +GreaterFullEqual mmlalias 8807 2267 alias ISOAMSR gE +GreaterGreater mmlextra 58103 E2F7 alias for GT +GreaterLess mmlalias 8823 2277 alias ISOAMSR gl +GreaterSlantEqual mmlalias 58102 E2F6 alias ISOAMSR ges +GreaterTilde mmlalias 8819 2273 alias ISOAMSR gsim + +Gscr isomscr 58662 E526 /scr G, script letter G +gscr isomscr 58694 E546 /scr g, script letter g +gsim isoamsr 8819 2273 /gtrsim R: greater, similar +gsime isoamsr 58164 E334 greater, similar, equal +gsiml isoamsr 58166 E336 greater, similar, less +Gt isoamsr 8811 226B /gg R: dbl greater-than sign +gt isonum 62 003E =greater-than sign R: +gtcc isoamsr 58198 E356 greater than, closed by curve +gtcir isoamsr 58150 E326 greater than, circle inside +gtdot isoamsr 8919 22D7 /gtrdot R: greater than, with dot + +gtlPar isoamsc 58006 E296 dbl left parenthesis, greater +gtquest isoamsr 58154 E32A greater than, questionmark above +gtrapprox mmlalias 8819 2273 alias ISOAMSR gap +gtrarr isoamsr 58207 E35F greater than, right arrow +gtrdot mmlalias 8919 22D7 alias ISOAMSR gtdot +gtreqless mmlalias 8923 22DB alias ISOAMSR gel +gtreqqless mmlalias 8923 22DB alias ISOAMSR gEl +gtrless mmlalias 8823 2277 alias ISOAMSR gl +gtrsim mmlalias 8819 2273 alias ISOAMSR gsim +gvertneqq mmlalias 58017 E2A1 alias ISOAMSN gvnE + +gvnE isoamsn 58017 E2A1 /gvertneqq N: gt, vert, not dbl eq + + ------------------------------------------------------------------------ + +H A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Hacek mmlalias 711 02C7 alias ISODIA caron +hairsp isopub 8202 200A =hair space +half isonum 189 00BD =fraction one-half +hamilt isotech 8459 210B Hamiltonian (script capital H) +HARDcy isocyr1 1066 042A =capital HARD sign, Cyrillic +hardcy isocyr1 1098 044A =small hard sign, Cyrillic +hArr isoamsa 8660 21D4 /Leftrightarrow A: l&r dbl arrow +harr isoamsa 8596 2194 /leftrightarrow A: l&r arrow +harrcir isoamsa 57920 E240 left and right arrow with a circle +harrw isoamsa 8621 21AD /leftrightsquigarrow A: l&r arr-wavy + +Hat mmlalias 770 0302 circumflex accent (circ in ISODIA) +hbar mmlalias 58069 E2D5 alias ISOAMSO plank +Hcirc isolat2 292 0124 =capital H, circumflex accent +hcirc isolat2 293 0125 =small h, circumflex accent +hearts isopub 9825 2661 /heartsuit =heart suit symbol +heartsuit mmlalias 9825 2661 ISOPUB hearts +hellip isopub 8230 2026 =ellipsis (horizontal) +hercon isoamsb 8889 22B9 hermitian conjugate matrix +Hfr isomfrk 8460 210C /frak H, upper case h +hfr isomfrk 58759 E587 /frak h, lower case h + +hksearow mmlalias 57867 E20B alias ISOAMSA searhk +hkswarow mmlalias 57866 E20A alias ISOAMSA swarhk +hoarr isoamsa 57923 E243 horizontal open arrow +homtht isoamsr 8763 223B homothetic +hookleftarrow mmlalias 8617 21A9 alias ISOAMSA larrhk +hookrightarrow mmlalias 8618 21AA alias ISOAMSA rarrhk +Hopf isomopf 58631 E507 /Bbb H, open face H +horbar isonum 8213 2015 =horizontal bar +HorizontalLine mmlextra 59481 E859 short horizontal line +Hscr isomscr 8459 210B /scr H, script letter H + +hscr isomscr 58695 E547 /scr h, script letter h +hslash mmlalias 8463 210F alias ISOAMSO plankv +Hstrok isolat2 294 0126 =capital H, stroke +hstrok isolat2 295 0127 =small h, stroke +HumpDownHump mmlalias 8782 224E alias ISOAMSR bump +HumpEqual mmlalias 8783 224F alias ISOAMSR bumpe +hybull isopub 8259 2043 rectangle, filled (hyphen bullet) +hyphen isonum 8208 2010 =hyphen + + ------------------------------------------------------------------------ + +I A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Iacgr isogrk2 906 038A =capital Iota, accent, Greek +iacgr isogrk2 943 03AF =small iota, accent, Greek +Iacute isolat1 205 00CD =capital I, acute accent +iacute isolat1 237 00ED =small i, acute accent +ic mmlextra 59548 E89C short form of ⁣ +Icirc isolat1 206 00CE =capital I, circumflex accent +icirc isolat1 238 00EE =small i, circumflex accent +Icy isocyr1 1048 0418 =capital I, Cyrillic +icy isocyr1 1080 0438 =small i, Cyrillic +idiagr isogrk2 912 0390 =small iota, dieresis, accent, Greek + +Idigr isogrk2 938 03AA =capital Iota, dieresis, Greek +idigr isogrk2 970 03CA =small iota, dieresis, Greek +Idot isolat2 304 0130 =capital I, dot above +IEcy isocyr1 1045 0415 =capital IE, Cyrillic +iecy isocyr1 1077 0435 =small ie, Cyrillic +iexcl isonum 161 00A1 =inverted exclamation mark +iff isotech 58213 E365 /iff if and only if +Ifr isomfrk 8465 2111 /frak I, upper case i +ifr isomfrk 58760 E588 /frak i, lower case i +Igr isogrk1 921 0399 =capital Iota, Greek + +igr isogrk1 953 03B9 =small iota, Greek +Igrave isolat1 204 00CC =capital I, grave accent +igrave isolat1 236 00EC =small i, grave accent +ii mmlextra 63310 F74E short form of ⅈ +iiiint mmlalias 58232 E378 alias ISOTECH qint +iiint mmlalias 8749 222D alias ISOTECH tint +iinfin isotech 58226 E372 infinity sign, incomplete +iiota isoamso 8489 2129 inverted iota +IJlig isolat2 306 0132 =capital IJ ligature +ijlig isolat2 307 0133 =small ij ligature + +Im mmlalias 8465 2111 ISOAMSO image +Imacr isolat2 298 012A =capital I, macron +imacr isolat2 299 012B =small i, macron +image isoamso 8465 2111 /Im - imaginary +ImaginaryI mmlextra 63310 F74E i for use as a square root of -1 +imath isoamso 305 0131 /imath - small i, no dot +imof isoamsa 8887 22B7 image of +imped isotech 58635 E50B impedance +Implies mmlalias 8658 21D2 alias ISOTECH rArr +in mmlalias 8712 2208 ISOTECH isin + +incare isopub 8453 2105 =in-care-of symbol +IndentingNewLine mmlextra 59537 E891 force a line break and indent appropriately on next line +infin isotech 8734 221E /infty infinity +infintie isotech 58636 E50C tie, infinity +inodot isolat2 305 0131 =small i without dot +Int isotech 8748 222C double integral operator +int isotech 8747 222B /int L: integral operator +intcal isoamsb 8890 22BA /intercal B: intercal +Integral mmlalias 8747 222B alias ISOTECH int +intercal mmlalias 8890 22BA alias ISOAMSB intcal + +Intersection mmlalias 8898 22C2 alias ISOAMSB xcap +intlarhk isotech 58266 E39A integral, left arrow with hook +intprod mmlalias 57945 E259 alias ISOAMSB iprod +InvisibleComma mmlextra 59548 E89C used as a separator, e.g., in indices +InvisibleTimes mmlextra 59550 E89E marks multiplication when it is understood without a mark +IOcy isocyr1 1025 0401 =capital IO, Russian +iocy isocyr1 1105 0451 =small io, Russian +Iogon isolat2 302 012E =capital I, ogonek +iogon isolat2 303 012F =small i, ogonek +Iopf isomopf 58632 E508 /Bbb I, open face I + +iota isogrk3 953 03B9 /iota small iota, Greek +iprod isoamsb 57945 E259 /intprod +iquest isonum 191 00BF =inverted question mark +Iscr isomscr 8464 2110 /scr I, script letter I +iscr isomscr 58696 E548 /scr i, script letter i +isin isotech 8712 2208 /in R: set membership +isindot isotech 58268 E39C set membership, dot above +isinE isotech 58270 E39E set membership, two horizontal strokes +isins isotech 58276 E3A4 set membership, vertical bar on horizontal stroke +isinsv isotech 58274 E3A2 large set membership, vertical bar on horizontal stroke + +isinv isotech 8712 2208 set membership, variant +it mmlextra 59550 E89E short form of ⁢ +Itilde isolat2 296 0128 =capital I, tilde +itilde isolat2 297 0129 =small i, tilde +Iukcy isocyr2 1030 0406 =capital I, Ukrainian +iukcy isocyr2 1110 0456 =small i, Ukrainian +Iuml isolat1 207 00CF =capital I, dieresis or umlaut mark +iuml isolat1 239 00EF =small i, dieresis or umlaut mark + + ------------------------------------------------------------------------ + +J A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Jcirc isolat2 308 0134 =capital J, circumflex accent +jcirc isolat2 309 0135 =small j, circumflex accent +Jcy isocyr1 1049 0419 =capital short I, Cyrillic +jcy isocyr1 1081 0439 =small short i, Cyrillic +Jfr isomfrk 58729 E569 /frak J, upper case j +jfr isomfrk 58761 E589 /frak j, lower case j +jmath isoamso 58068 E2D4 /jmath - small j, no dot +Jopf isomopf 58633 E509 /Bbb J, open face J +Jscr isomscr 58665 E529 /scr J, script letter J +jscr isomscr 58697 E549 /scr j, script letter j + +Jsercy isocyr2 1032 0408 =capital JE, Serbian +jsercy isocyr2 1112 0458 =small je, Serbian +Jukcy isocyr2 1028 0404 =capital JE, Ukrainian +jukcy isocyr2 1108 0454 =small je, Ukrainian + + ------------------------------------------------------------------------ + +K A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +kappa isogrk3 954 03BA /kappa small kappa, Greek +kappav isogrk3 1008 03F0 /varkappa +Kcedil isolat2 310 0136 =capital K, cedilla +kcedil isolat2 311 0137 =small k, cedilla +Kcy isocyr1 1050 041A =capital KA, Cyrillic +kcy isocyr1 1082 043A =small ka, Cyrillic +Kfr isomfrk 58730 E56A /frak K, upper case k +kfr isomfrk 58762 E58A /frak k, lower case k +Kgr isogrk1 922 039A =capital Kappa, Greek +kgr isogrk1 954 03BA =small kappa, Greek + +kgreen isolat2 312 0138 =small k, Greenlandic +KHcy isocyr1 1061 0425 =capital HA, Cyrillic +khcy isocyr1 1093 0445 =small ha, Cyrillic +KHgr isogrk1 935 03A7 =capital Chi, Greek +khgr isogrk1 967 03C7 =small chi, Greek +KJcy isocyr2 1036 040C =capital KJE, Macedonian +kjcy isocyr2 1116 045C =small kje Macedonian +Kopf isomopf 58634 E50A /Bbb K, open face K +Kscr isomscr 58666 E52A /scr K, script letter K +kscr isomscr 58698 E54A /scr k, script letter k + + ------------------------------------------------------------------------ + +L A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +lAarr isoamsa 8666 21DA /Lleftarrow A: left triple arrow +Lacute isolat2 313 0139 =capital L, acute accent +lacute isolat2 314 013A =small l, acute accent +laemptyv isoamso 58090 E2EA circle, slash, left arrow above +lagran isotech 8466 2112 Lagrangian (script capital L) +Lambda isogrk3 923 039B /Lambda capital Lambda, Greek +lambda isogrk3 955 03BB /lambda small lambda, Greek +Lang isotech 12298 300A left angle bracket, double +lang isotech 12296 3008 /langle O: left angle bracket +langd isoamsc 58007 E297 left angle, dot + +langle mmlalias 12296 3008 alias ISOTECH lang +lap isoamsr 8818 2272 /lessapprox R: less, approximate +laquo isonum 171 00AB =angle quotation mark, left +Larr isoamsa 8606 219E /twoheadleftarrow A: +lArr isotech 8656 21D0 /Leftarrow A: is implied by +larr isonum 8592 2190 /leftarrow /gets A: =leftward arrow +larrb mmlextra 8676 21E4 leftwards arrow to bar +larrbfs isoamsa 57888 E220 left arrow-bar, filled square +larrfs isoamsa 57890 E222 left arrow, filled square +larrhk isoamsa 8617 21A9 /hookleftarrow A: left arrow-hooked + +larrlp isoamsa 8619 21AB /looparrowleft A: left arrow-looped +larrpl isoamsa 57919 E23F left arrow, plus +larrsim isoamsa 57934 E24E left arrow, similar +larrtl isoamsa 8610 21A2 /leftarrowtail A: left arrow-tailed +lat isoamsr 58170 E33A larger than +lAtail isoamsa 57917 E23D left double arrow-tail +latail isoamsa 57916 E23C left arrow-tail +late isoamsr 58172 E33C larger than or equal +lates isoamsr 58174 E33E larger than or equal, slanted +lBarr isoamsa 57862 E206 left doubly broken arrow + +lbarr isoamsa 58370 E402 left broken arrow +lbbrk isotech 12308 3014 left broken bracket +lbrace mmlalias 123 007B alias ISONUM lcub +lbrack mmlalias 91 005B alias ISONUM lsqb +lbrke isoamsc 58009 E299 left bracket, equal +lbrksld isoamsc 58013 E29D left bracket, solidus bottom corner +lbrkslu isoamsc 58011 E29B left bracket, solidus top corner +Lcaron isolat2 317 013D =capital L, caron +lcaron isolat2 318 013E =small l, caron +Lcedil isolat2 315 013B =capital L, cedilla + +lcedil isolat2 316 013C =small l, cedilla +lceil isoamsc 8968 2308 /lceil O: left ceiling +lcub isonum 123 007B /lbrace O: =left curly bracket +Lcy isocyr1 1051 041B =capital EL, Cyrillic +lcy isocyr1 1083 043B =small el, Cyrillic +ldca isoamsa 57882 E21A left down curved arrow +ldquo isonum 8220 201C =double quotation mark, left +ldquor isopub 8222 201E =rising dbl quote, left (low) +ldrdhar isoamsa 57900 E22C left harpoon-down over right harpoon-down +ldrushar isoamsa 57896 E228 left-down-right-up harpoon + +ldsh isoamsa 8626 21B2 left down angled arrow +lE isoamsr 8806 2266 /leqq R: less, double equals +le isotech 8804 2264 /leq /le R: less-than-or-equal +LeftAngleBracket mmlalias 12296 3008 alias ISOTECH lang +LeftArrow mmlalias 8592 2190 alias ISONUM larr +Leftarrow mmlalias 8656 21D0 alias ISOTECH lArr +leftarrow mmlalias 8592 2190 alias ISONUM larr +LeftArrowBar mmlextra 8676 21E4 alias for larrb +LeftArrowRightArrow mmlalias 8646 21C6 alias ISOAMSA lrarr +leftarrowtail mmlalias 8610 21A2 alias ISOAMSA larrtl + +LeftBracketingBar mmlextra 62979 F603 left vertical delimiter +LeftCeiling mmlalias 8968 2308 alias ISOAMSC lceil +LeftDoubleBracket mmlalias 12314 301A left double bracket delimiter +LeftDoubleBracketingBar mmlextra 62981 F605 left double vertical delimiter +LeftDownTeeVector mmlextra 62745 F519 down-left harpoon from bar +LeftDownVector mmlalias 8643 21C3 alias ISOAMSA dharl +LeftDownVectorBar mmlextra 62743 F517 down-left harpoon to bar +LeftFloor mmlalias 8970 230A alias ISOAMSC lfloor +leftharpoondown mmlalias 8637 21BD alias ISOAMSA lhard +leftharpoonup mmlalias 8636 21BC alias ISOAMSA lharu + +leftleftarrows mmlalias 8647 21C7 alias ISOAMSA llarr +LeftRightArrow mmlalias 8596 2194 alias ISOAMSA harr +Leftrightarrow mmlalias 8660 21D4 alias ISOAMSA hArr +leftrightarrow mmlalias 8596 2194 alias ISOAMSA harr +leftrightarrows mmlalias 8646 21C6 alias ISOAMSA lrarr +leftrightharpoons mmlalias 8651 21CB alias ISOAMSA lrhar +leftrightsquigarrow mmlalias 8621 21AD alias ISOAMSA harrw +LeftRightVector mmlextra 62725 F505 left-up-right-up harpoon +LeftSkeleton mmlextra 59472 E850 start of missing information +LeftTee mmlalias 8867 22A3 alias ISOAMSR dashv + +LeftTeeArrow mmlextra 8612 21A4 alias for mapstoleft +LeftTeeVector mmlextra 62729 F509 left-up harpoon from bar +leftthreetimes mmlalias 8907 22CB alias ISOAMSB lthree +LeftTriangle mmlalias 8882 22B2 alias ISOAMSR vltri +LeftTriangleBar mmlextra 62480 F410 not left triangle, vertical bar +LeftTriangleEqual mmlalias 8884 22B4 alias ISOAMSR ltrie +LeftUpDownVector mmlextra 62741 F515 up-left-down-left harpoon +LeftUpTeeVector mmlextra 62744 F518 up-left harpoon from bar +LeftUpVector mmlalias 8639 21BF alias ISOAMSA uharl +LeftUpVectorBar mmlextra 62742 F516 up-left harpoon to bar + +LeftVector mmlalias 8636 21BC alias ISOAMSA lharu +LeftVectorBar mmlextra 62727 F507 left-up harpoon to bar +lEg isoamsr 8922 22DA /lesseqqgtr R: less, dbl eq, greater +leg isoamsr 8922 22DA /lesseqgtr R: less, eq, greater +leq mmlalias 8804 2264 alias ISOTECH le +leqq mmlalias 8806 2266 alias ISOAMSR lE +leqslant mmlalias 58106 E2FA alias ISOAMSR les +les isoamsr 58106 E2FA /leqslant R: less-than-or-eq, slant +lescc isoamsr 58199 E357 less than, closed by curve, equal, slanted +lesdot isoamsr 58141 E31D less-than-or-equal, slanted, dot inside + +lesdoto isoamsr 58143 E31F less-than-or-equal, slanted, dot above +lesdotor isoamsr 58145 E321 less-than-or-equal, slanted, dot above right +lesg isoamsr 58155 E32B less, equal, slanted, greater +lesges isoamsr 58161 E331 less, equal, slanted, greater, equal, slanted +lessapprox mmlalias 8818 2272 alias ISOAMSR lap +lessdot mmlalias 8918 22D6 alias ISOAMSR ltdot +lesseqgtr mmlalias 8922 22DA alias ISOAMSR leg +lesseqqgtr mmlalias 8922 22DA alias ISOAMSR lEg +LessEqualGreater mmlalias 8922 22DA alias ISOAMSR leg +LessFullEqual mmlalias 8806 2266 alias ISOAMSR lE + +LessGreater mmlalias 8822 2276 alias ISOAMSR lg +lessgtr mmlalias 8822 2276 alias ISOAMSR lg +LessLess mmlextra 58107 E2FB alias for Lt +lesssim mmlalias 8818 2272 alias ISOAMSR lsim +LessSlantEqual mmlalias 58106 E2FA alias ISOAMSR les +LessTilde mmlalias 8818 2272 alias ISOAMSR lsim +lfisht isoamsa 57876 E214 left fish tail +lfloor isoamsc 8970 230A /lfloor O: left floor +Lfr isomfrk 58731 E56B /frak L, upper case l +lfr isomfrk 58763 E58B /frak l, lower case l + +lg isoamsr 8822 2276 /lessgtr R: less, greater +lgE isoamsr 58157 E32D less, greater, equal +Lgr isogrk1 923 039B =capital Lambda, Greek +lgr isogrk1 955 03BB =small lambda, Greek +lHar isoamsa 57893 E225 left harpoon-up over left harpoon-down +lhard isoamsa 8637 21BD /leftharpoondown A: l harpoon-down +lharu isoamsa 8636 21BC /leftharpoonup A: left harpoon-up +lharul isoamsa 57902 E22E left harpoon-up over long dash +lhblk isopub 9604 2584 =lower half block +LJcy isocyr2 1033 0409 =capital LJE, Serbian + +ljcy isocyr2 1113 0459 =small lje, Serbian +Ll isoamsr 8920 22D8 /Ll /lll /llless R: triple less-than +ll mmlalias 8810 226A alias ISOAMSR Lt +llarr isoamsa 8647 21C7 /leftleftarrows A: two left arrows +llcorner mmlalias 8990 231E alias ISOAMSC dlcorn +Lleftarrow mmlalias 8666 21DA alias ISOAMSA lAarr +llhard isoamsa 57905 E231 left harpoon-down below long dash +lltri isoamso 58085 E2E5 lower left triangle +Lmidot isolat2 319 013F =capital L, middle dot +lmidot isolat2 320 0140 =small l, middle dot + +lmoust isoamsc 58004 E294 /lmoustache +lmoustache mmlalias 58004 E294 alias ISOAMSC lmoust +lnap isoamsn 58018 E2A2 /lnapprox N: less, not approximate +lnapprox mmlalias 58018 E2A2 alias ISOAMSN lnap +lnE isoamsn 8808 2268 /lneqq N: less, not double equals +lne isoamsn 8808 2268 /lneq N: less, not equals +lneq mmlalias 8808 2268 alias ISOAMSN lne +lneqq mmlalias 8808 2268 alias ISOAMSN lnE +lnsim isoamsn 8934 22E6 /lnsim N: less, not similar +loang isotech 12312 3018 left open angular bracket + +loarr isoamsa 57922 E242 left open arrow +lobrk isotech 12314 301A left open bracket +LongLeftArrow mmlalias 57857 E201 alias ISOAMSA xlarr +Longleftarrow mmlalias 57856 E200 alias ISOAMSA xlArr +longleftarrow mmlalias 57857 E201 alias ISOAMSA xlarr +LongLeftRightArrow mmlalias 57859 E203 alias ISOAMSA xharr +Longleftrightarrow mmlalias 57858 E202 alias ISOAMSA xhArr +longleftrightarrow mmlalias 57859 E203 alias ISOAMSA xharr +longmapsto mmlalias 57864 E208 alias ISOAMSA xmap +LongRightArrow mmlalias 57861 E205 alias ISOAMSA xrarr + +Longrightarrow mmlalias 57860 E204 alias ISOAMSA xrArr +longrightarrow mmlalias 57861 E205 alias ISOAMSA xrarr +looparrowleft mmlalias 8619 21AB alias ISOAMSA larrlp +looparrowright mmlalias 8620 21AC alias ISOAMSA rarrlp +lopar isotech 58233 E379 left open parenthesis +Lopf isomopf 58635 E50B /Bbb L, open face L +loplus isoamsb 57948 E25C plus sign in left half circle +lotimes isoamsb 57950 E25E multiply sign in left half circle +lowast isotech 8727 2217 low asterisk +lowbar isonum 95 005F =low line + +LowerLeftArrow mmlalias 8601 2199 alias ISOAMSA swarr +LowerRightArrow mmlalias 8600 2198 alias ISOAMSA searr +loz isopub 9674 25CA /lozenge - lozenge or total mark +lozenge mmlalias 9674 25CA alias ISOPUB loz +lozf isopub 59403 E80B /blacklozenge - lozenge, filled +lpar isonum 40 0028 O: =left parenthesis +lparlt isoamsc 58002 E292 O: left parenthesis, lt +lrarr isoamsa 8646 21C6 /leftrightarrows A: l arr over r arr +lrcorner mmlalias 8991 231F alias ISOAMSC drcorn +lrhar isoamsa 8651 21CB /leftrightharpoons A: l harp over r + +lrhard isoamsa 57903 E22F right harpoon-down below long dash +lrtri isoamso 58083 E2E3 lower right triangle +Lscr isomscr 8466 2112 /scr L, script letter L +lscr isomscr 58699 E54B /scr l, script letter l +Lsh mmlalias 8624 21B0 alias ISOAMSA lsh +lsh isoamsa 8624 21B0 /Lsh A: +lsim isoamsr 8818 2272 /lesssim R: less, similar +lsime isoamsr 58163 E333 less, similar, equal +lsimg isoamsr 58165 E335 less, similar, greater +lsqb isonum 91 005B /lbrack O: =left square bracket + +lsquo isonum 8216 2018 =single quotation mark, left +lsquor isopub 8218 201A =rising single quote, left (low) +Lstrok isolat2 321 0141 =capital L, stroke +lstrok isolat2 322 0142 =small l, stroke +Lt isoamsr 8810 226A /ll R: double less-than sign +lt isonum 60 003C =less-than sign R: +ltcc isoamsr 58197 E355 less than, closed by curve +ltcir isoamsr 58149 E325 less than, circle inside +ltdot isoamsr 8918 22D6 /lessdot R: less than, with dot +lthree isoamsb 8907 22CB /leftthreetimes B: + +ltimes isoamsb 8905 22C9 /ltimes B: times sign, left closed +ltlarr isoamsr 58206 E35E less than, left arrow +ltquest isoamsr 58153 E329 less than, questionmark above +ltri isopub 9667 25C3 /triangleleft B: l triangle, open +ltrie isoamsr 8884 22B4 /trianglelefteq R: left triangle, eq +ltrif isopub 9666 25C2 /blacktriangleleft R: =l tri, filled +ltrPar isoamsc 58005 E295 dbl right parenthesis, less +lurdshar isoamsa 57897 E229 left-up-right-down harpoon +luruhar isoamsa 57899 E22B left harpoon-up over right harpoon-up +lvertneqq mmlalias 58020 E2A4 alias ISOAMSN lvnE + +lvnE isoamsn 58020 E2A4 /lvertneqq N: less, vert, not dbl eq + + ------------------------------------------------------------------------ + +M A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +macr isodia 175 00AF =macron +male isopub 9794 2642 =male symbol +malt isopub 10016 2720 /maltese =maltese cross +maltese mmlalias 10016 2720 alias ISOPUB malt +Map isoamsa 57874 E212 twoheaded mapsto +map isoamsa 8614 21A6 /mapsto A: +mapsto mmlalias 8614 21A6 alias ISOAMSA map +mapstodown mmlextra 8615 21A7 downwards arrow from bar +mapstoleft mmlextra 8612 21A4 leftwards arrow from bar +mapstoup mmlextra 8613 21A5 upwards arrow from bar + +marker isopub 9646 25AE =histogram marker +mcomma isoamsr 58138 E31A minus, comma above +Mcy isocyr1 1052 041C =capital EM, Cyrillic +mcy isocyr1 1084 043C =small em, Cyrillic +mdash isopub 8212 2014 =em dash +mDDot isoamsr 8762 223A minus with four dots, geometric properties +measuredangle mmlalias 8737 2221 alias ISOAMSO angmsd +Mfr isomfrk 58732 E56C /frak M, upper case m +mfr isomfrk 58764 E58C /frak m, lower case m +Mgr isogrk1 924 039C =capital Mu, Greek + +mgr isogrk1 956 03BC =small mu, Greek +mho isoamso 8487 2127 /mho - conductance +micro isonum 181 00B5 =micro sign +mid isoamsr 8739 2223 /mid R: +midast isoamsb 42 002A /ast B: asterisk +midcir isoamsa 57935 E24F mid, circle below +middot isonum 183 00B7 /centerdot B: =middle dot +minus isotech 8722 2212 B: minus sign +minusb isoamsb 8863 229F /boxminus B: minus sign in box +minusd isoamsb 8760 2238 /dotminus B: minus sign, dot above + +minusdu isoamsb 57947 E25B minus sign, dot below +MinusPlus mmlalias 8723 2213 alias ISOTECH mnplus +mlcp isoamsr 58122 E30A /mlcp +mldr isopub 8230 2026 em leader +mnplus isotech 8723 2213 /mp B: minus-or-plus sign +models isoamsr 8871 22A7 /models R: +Mopf isomopf 58636 E50C /Bbb M, open face M +mp mmlalias 8723 2213 alias ISOTECH mnplus +Mscr isomscr 8499 2133 /scr M, script letter M +mscr isomscr 58700 E54C /scr m, script letter m + +mstpos isoamsr 8766 223E most positive +mu isogrk3 956 03BC /mu small mu, Greek +multimap mmlalias 8888 22B8 alias ISOAMSA mumap +mumap isoamsa 8888 22B8 /multimap A: + + ------------------------------------------------------------------------ + +N A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +nabla isotech 8711 2207 /nabla del, Hamilton operator +Nacute isolat2 323 0143 =capital N, acute accent +nacute isolat2 324 0144 =small n, acute accent +nang isoamso 58072 E2D8 not, vert, angle +nap isoamsn 8777 2249 /napprox N: not approximate +napE isoamsn 58055 E2C7 not approximately equal or equal to +napid isoamsn 58044 E2BC not approximately identical to +napos isolat2 329 0149 =small n, apostrophe +napprox mmlalias 8777 2249 alias ISOAMSN nap +natur isopub 9838 266E /natural - music natural + +natural mmlalias 9838 266E alias ISOPUB natur +nbsp isonum 160 00A0 =no break (required) space +nbump mmlextra 58902 E616 not bumpy equals +nbumpe mmlextra 59469 E84D not bumpy single equals +ncap isoamsb 57988 E284 bar, intersection +Ncaron isolat2 327 0147 =capital N, caron +ncaron isolat2 328 0148 =small n, caron +Ncedil isolat2 325 0145 =capital N, cedilla +ncedil isolat2 326 0146 =small n, cedilla +ncong isoamsn 8775 2247 /ncong N: not congruent with + +ncongdot isoamsn 58053 E2C5 not congruent, dot +ncup isoamsb 57987 E283 bar, union +Ncy isocyr1 1053 041D =capital EN, Cyrillic +ncy isocyr1 1085 043D =small en, Cyrillic +ndash isopub 8211 2013 =en dash +ne isotech 8800 2260 /ne /neq R: not equal +nearhk isoamsa 57869 E20D NE arrow-hooked +neArr isoamsa 8663 21D7 NE pointing dbl arrow +nearr isoamsa 8599 2197 /nearrow A: NE pointing arrow +nearrow mmlalias 8599 2197 alias ISOAMSA nearr + +nedot isotech 58250 E38A not equal, dot +NegativeMediumSpace mmlextra 59546 E89A space of width -4/18 em +NegativeThickSpace mmlextra 59547 E89B space of width -5/18 em +NegativeThinSpace mmlextra 59545 E899 space of width -3/18 em +NegativeVeryThinSpace mmlextra 59544 E898 space of width -1/18 em +nequiv isoamsn 8802 2262 /nequiv N: not identical with +nesear isoamsa 57870 E20E /toea A: NE & SE arrows +nesim mmlextra 59470 E84E not equal or similar +NestedGreaterGreater mmlalias 8811 226B alias ISOAMSR Gt +NestedLessLess mmlalias 8810 226A alias ISOAMSR Lt + +NewLine mmlextra 10 000A force a line break; line feed +nexist isoamso 8708 2204 /nexists - negated exists +nexists mmlalias 8708 2204 alias ISOAMSO nexist +Nfr isomfrk 58733 E56D /frak N, upper case n +nfr isomfrk 58765 E58D /frak n, lower case n +ngE isoamsn 8817 2271 /ngeqq N: not greater, dbl equals +nge isoamsn 58022 E2A6 /ngeq N: not greater-than-or-equal +ngeq mmlalias 58022 E2A6 alias ISOAMSN nge +ngeqq mmlalias 8817 2271 alias ISOAMSN ngE +ngeqslant mmlalias 8817 2271 alias ISOAMSN nges + +nges isoamsn 8817 2271 /ngeqslant N: not gt-or-eq, slanted +nGg isoamsn 58062 E2CE not triple greater than +Ngr isogrk1 925 039D =capital Nu, Greek +ngr isogrk1 957 03BD =small nu, Greek +ngsim isoamsn 8821 2275 not greater, similar +nGt isoamsn 58058 E2CA not, vert, much greater than +ngt isoamsn 8815 226F /ngtr N: not greater-than +ngtr mmlalias 8815 226F alias ISOAMSN ngt +nGtv isoamsn 58060 E2CC not much greater than, variant +nhArr isoamsa 8654 21CE /nLeftrightarrow A: not l&r dbl arr + +nharr isoamsa 8622 21AE /nleftrightarrow A: not l&r arrow +nhpar isotech 58253 E38D not, horizontal, parallel +ni isotech 8715 220B /ni /owns R: contains +nis isotech 58277 E3A5 contains, vertical bar on horizontal stroke +nisd isotech 58273 E3A1 contains, long horizontal stroke +niv isotech 8715 220B contains, variant +NJcy isocyr2 1034 040A =capital NJE, Serbian +njcy isocyr2 1114 045A =small nje, Serbian +nlArr isoamsa 8653 21CD /nLeftarrow A: not implied by +nlarr isoamsa 8602 219A /nleftarrow A: not left arrow + +nldr isopub 8229 2025 =double baseline dot (en leader) +nlE isoamsn 8816 2270 /nleqq N: not less, dbl equals +nle isoamsn 58023 E2A7 /nleq N: not less-than-or-equal +nLeftarrow mmlalias 8653 21CD alias ISOAMSA nlArr +nleftarrow mmlalias 8602 219A alias ISOAMSA nlarr +nLeftrightarrow mmlalias 8654 21CE alias ISOAMSA nhArr +nleftrightarrow mmlalias 8622 21AE alias ISOAMSA nharr +nleq mmlalias 58023 E2A7 alias ISOAMSN nle +nleqq mmlalias 8816 2270 alias ISOAMSN nlE +nleqslant mmlalias 8816 2270 alias ISOAMSN nles + +nles isoamsn 8816 2270 /nleqslant N: not less-or-eq, slant +nless mmlalias 8814 226E alias ISOAMSN nlt +nLl isoamsn 58061 E2CD not triple less than +nlsim isoamsn 8820 2274 not less, similar +nLt isoamsn 58057 E2C9 not, vert, much less than +nlt isoamsn 8814 226E /nless N: not less-than +nltri isoamsn 8938 22EA /ntriangleleft N: not left triangle +nltrie isoamsn 8940 22EC /ntrianglelefteq N: not l tri, eq +nLtv isoamsn 58059 E2CB not much less than, variant +nmid isoamsn 8740 2224 /nmid + +NoBreak mmlextra 59538 E892 never break line here +Nopf isomopf 8469 2115 /Bbb N, open face N +Not isotech 58284 E3AC not with two horizontal strokes +not isonum 172 00AC /neg /lnot =not sign +NotANumber mmlextra 59562 E8AA used in MML 4.3.2.9 +NotCongruent mmlalias 8802 2262 alias ISOAMSN nequiv +NotCupCap mmlextra 8813 226D alias for &nasymp; +NotDoubleVerticalBar mmlalias 8742 2226 alias ISOAMSN npar +NotElement mmlalias 8713 2209 alias ISOTECH notin +NotEqual mmlalias 8800 2260 alias ISOTECH ne + +NotEqualTilde mmlextra 59470 E84E alias for ≂̸ +NotExists mmlalias 8708 2204 alias ISOAMSO nexist +NotGreater mmlalias 8815 226F alias ISOAMSN ngt +NotGreaterEqual mmlalias 58022 E2A6 alias ISOAMSN nge +NotGreaterFullEqual mmlalias 8816 2270 alias ISOAMSN nlE +NotGreaterGreater mmlalias 58060 E2CC alias ISOAMSN nGtv +NotGreaterLess mmlalias 8825 2279 alias ISOAMSN ntvgl +NotGreaterSlantEqual mmlalias 8817 2271 alias ISOAMSN nges +NotGreaterTilde mmlalias 8821 2275 alias ISOAMSN ngsim +NotHumpDownHump mmlextra 58902 E616 alias for ≎̸ + +NotHumpEqual mmlextra 59469 E84D alias for ≏̸ +notin isotech 8713 2209 /notin N: negated set membership +notindot isotech 58269 E39D negated set membership, dot above +notinE isotech 58637 E50D negated set membership, two horizontal strokes +notinva isotech 58224 E370 negated set membership, variant +notinvb isotech 58235 E37B negated set membership, variant +notinvc isotech 58236 E37C negated set membership, variant +NotLeftTriangle mmlalias 8938 22EA alias ISOAMSN nltri +NotLeftTriangleBar mmlextra 62482 F412 not left triangle, vertical bar +NotLeftTriangleEqual mmlalias 8940 22EC alias ISOAMSN nltrie + +NotLess mmlalias 8814 226E alias ISOAMSN nlt +NotLessEqual mmlalias 58023 E2A7 alias ISOAMSN nle +NotLessGreater mmlalias 8824 2278 alias ISOAMSN ntvlg +NotLessLess mmlalias 58059 E2CB alias ISOAMSN nLtv +NotLessSlantEqual mmlalias 8816 2270 alias ISOAMSN nles +NotLessTilde mmlalias 8820 2274 alias ISOAMSN nlsim +NotNestedGreaterGreater mmlextra 62504 F428 not double greater-than sign +NotNestedLessLess mmlextra 62499 F423 not double less-than sign +notni isotech 8716 220C negated contains +notniva isotech 8716 220C negated contains, variant + +notnivb isotech 58237 E37D contains, variant +notnivc isotech 58238 E37E contains, variant +NotPrecedes mmlalias 8832 2280 alias ISOAMSN npr +NotPrecedesEqual mmlalias 58844 E5DC alias ISOAMSN npre +NotPrecedesSlantEqual mmlalias 8928 22E0 alias ISOAMSN nprcue +NotReverseElement mmlalias 8716 220C alias ISOTECH notniva +NotRightTriangle mmlalias 8939 22EB alias ISOAMSN nrtri +NotRightTriangleBar mmlextra 62483 F413 not vertical bar, right triangle +NotRightTriangleEqual mmlalias 8941 22ED alias ISOAMSN nrtrie +NotSquareSubset mmlextra 58884 E604 square not subset + +NotSquareSubsetEqual mmlalias 8930 22E2 alias ISOAMSN nsqsube +NotSquareSuperset mmlextra 58901 E615 negated set-like partial order operator +NotSquareSupersetEqual mmlalias 8931 22E3 alias ISOAMSN nsqsupe +NotSubset mmlalias 8836 2284 alias ISOAMSN vnsub +NotSubsetEqual mmlalias 8840 2288 alias ISOAMSN nsube +NotSucceeds mmlalias 8833 2281 alias ISOAMSN nsc +NotSucceedsEqual mmlalias 58865 E5F1 alias ISOAMSN nsce +NotSucceedsSlantEqual mmlalias 8929 22E1 alias ISOAMSN nsccue +NotSucceedsTilde mmlextra 59447 E837 not succeeds or similar +NotSuperset mmlalias 8837 2285 alias ISOAMSN vnsup + +NotSupersetEqual mmlalias 8841 2289 alias ISOAMSN nsupe +NotTilde mmlalias 8769 2241 alias ISOAMSN nsim +NotTildeEqual mmlalias 8772 2244 alias ISOAMSN nsime +NotTildeFullEqual mmlalias 8775 2247 alias ISOAMSN ncong +NotTildeTilde mmlalias 8777 2249 alias ISOAMSN nap +NotVerticalBar mmlalias 8740 2224 alias ISOAMSN nmid +npar isoamsn 8742 2226 /nparallel N: not parallel +nparallel mmlalias 8742 2226 alias ISOAMSN npar +nparsl isotech 58249 E389 not parallel, slanted +npart isotech 58256 E390 not partial differential + +npolint isotech 58265 E399 line integration, not including the pole +npr isoamsn 8832 2280 /nprec N: not precedes +nprcue isoamsn 8928 22E0 not curly precedes, eq +npre isoamsn 58844 E5DC /npreceq N: not precedes, equals +nprec mmlalias 8832 2280 alias ISOAMSN npr +npreceq mmlalias 58844 E5DC alias ISOAMSN npre +nrArr isoamsa 8655 21CF /nRightarrow A: not implies +nrarr isoamsa 8603 219B /nrightarrow A: not right arrow +nrarrc isoamsa 57885 E21D not right arrow-curved +nrarrw isoamsa 57883 E21B not right arrow-wavy + +nRightarrow mmlalias 8655 21CF alias ISOAMSA nrArr +nrightarrow mmlalias 8603 219B alias ISOAMSA nrarr +nrtri isoamsn 8939 22EB /ntriangleright N: not rt triangle +nrtrie isoamsn 8941 22ED /ntrianglerighteq N: not r tri, eq +nsc isoamsn 8833 2281 /nsucc N: not succeeds +nsccue isoamsn 8929 22E1 not succeeds, curly eq +nsce isoamsn 58865 E5F1 /nsucceq N: not succeeds, equals +Nscr isomscr 58669 E52D /scr N, script letter N +nscr isomscr 58701 E54D /scr n, script letter n +nshortmid mmlalias 58026 E2AA alias ISOAMSN nsmid + +nshortparallel mmlalias 58027 E2AB alias ISOAMSN nspar +nsim isoamsn 8769 2241 /nsim N: not similar +nsime isoamsn 8772 2244 /nsimeq N: not similar, equals +nsimeq mmlalias 8772 2244 alias ISOAMSN nsime +nsmid isoamsn 58026 E2AA /nshortmid +nspar isoamsn 58027 E2AB /nshortparallel N: not short par +nsqsube isoamsn 8930 22E2 not, square subset, equals +nsqsupe isoamsn 8931 22E3 not, square superset, equals +nsub isoamsn 8836 2284 not subset +nsubE isoamsn 8840 2288 /nsubseteqq N: not subset, dbl eq + +nsube isoamsn 8840 2288 /nsubseteq N: not subset, equals +nsubset mmlalias 8836 2284 alias ISOAMSN vnsub +nsubseteq mmlalias 8840 2288 alias ISOAMSN nsube +nsubseteqq mmlalias 8840 2288 alias ISOAMSN nsubE +nsucc mmlalias 8833 2281 alias ISOAMSN nsc +nsucceq mmlalias 58865 E5F1 alias ISOAMSN nsce +nsup isoamsn 8837 2285 not superset +nsupE isoamsn 8841 2289 /nsupseteqq N: not superset, dbl eq +nsupe isoamsn 8841 2289 /nsupseteq N: not superset, equals +nsupset mmlalias 8837 2285 alias ISOAMSN vnsup + +nsupseteq mmlalias 8841 2289 alias ISOAMSN nsupe +nsupseteqq mmlalias 8841 2289 alias ISOAMSN nsupE +ntgl isoamsn 8825 2279 not greater, less +Ntilde isolat1 209 00D1 =capital N, tilde +ntilde isolat1 241 00F1 =small n, tilde +ntlg isoamsn 8824 2278 not less, greater +ntriangleleft mmlalias 8938 22EA alias ISOAMSN nltri +ntrianglelefteq mmlalias 8940 22EC alias ISOAMSN nltrie +ntriangleright mmlalias 8939 22EB alias ISOAMSN nrtri +ntrianglerighteq mmlalias 8941 22ED alias ISOAMSN nrtrie + +nu isogrk3 957 03BD /nu small nu, Greek +num isonum 35 0023 =number sign +numero isocyr1 8470 2116 =numero sign +numsp isopub 8199 2007 =digit space (width of a number) +nvap isoamsn 58054 E2C6 not, vert, approximate +nVDash isoamsn 8879 22AF /nVDash N: not dbl vert, dbl dash +nVdash isoamsn 8878 22AE /nVdash N: not dbl vertical, dash +nvDash isoamsn 8877 22AD /nvDash N: not vertical, dbl dash +nvdash isoamsn 8876 22AC /nvdash N: not vertical, dash +nvge isoamsn 8817 2271 not, vert, greater-than-or-equal + +nvgt isoamsn 8815 226F not, vert, greater-than +nvHarr isoamsa 8654 21CE not, vert, left and right double arrow +nvinfin isotech 58254 E38E not, vert, infinity +nvlArr isoamsa 8653 21CD not, vert, left double arrow +nvle isoamsn 8816 2270 not, vert, less-than-or-equal +nvlt isoamsn 8814 226E not, vert, less-than +nvltrie isoamsn 58064 E2D0 not, vert, left triangle, equals +nvrArr isoamsa 8655 21CF not, vert, right double arrow +nvrtrie isoamsn 58063 E2CF not, vert, right triangle, equals +nvsim isoamsn 58389 E415 not, vert, similar + +nwarhk isoamsa 57868 E20C NW arrow-hooked +nwArr isoamsa 8662 21D6 NW pointing dbl arrow +nwarr isoamsa 8598 2196 /nwarrow A: NW pointing arrow +nwarrow mmlalias 8598 2196 alias ISOAMSA nwarr +nwnear isoamsa 57873 E211 NW & NE arrows + + ------------------------------------------------------------------------ + +O A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Oacgr isogrk2 908 038C =capital Omicron, accent, Greek +oacgr isogrk2 972 03CC =small omicron, accent, Greek +Oacute isolat1 211 00D3 =capital O, acute accent +oacute isolat1 243 00F3 =small o, acute accent +oast isoamsb 8859 229B /circledast B: asterisk in circle +ocir isoamsb 8858 229A /circledcirc B: small circle in circle +Ocirc isolat1 212 00D4 =capital O, circumflex accent +ocirc isolat1 244 00F4 =small o, circumflex accent +Ocy isocyr1 1054 041E =capital O, Cyrillic +ocy isocyr1 1086 043E =small o, Cyrillic + +odash isoamsb 8861 229D /circleddash B: hyphen in circle +Odblac isolat2 336 0150 =capital O, double acute accent +odblac isolat2 337 0151 =small o, double acute accent +odiv isoamsb 57989 E285 divide in circle +odot isoamsb 8857 2299 /odot B: middle dot in circle +odsold isoamsb 57990 E286 dot, solidus, dot in circle +OElig isolat2 338 0152 =capital OE ligature +oelig isolat2 339 0153 =small oe ligature +ofcir isoamsb 57991 E287 filled circle in circle +Ofr isomfrk 58734 E56E /frak O, upper case o + +ofr isomfrk 58766 E58E /frak o, lower case o +ogon isodia 731 02DB =ogonek +Ogr isogrk1 927 039F =capital Omicron, Greek +ogr isogrk1 959 03BF =small omicron, Greek +Ograve isolat1 210 00D2 =capital O, grave accent +ograve isolat1 242 00F2 =small o, grave accent +ogt isoamsb 57993 E289 greater-than in circle +OHacgr isogrk2 911 038F =capital Omega, accent, Greek +ohacgr isogrk2 974 03CE =small omega, accent, Greek +ohbar isoamsb 57952 E260 circle with horizontal bar + +OHgr isogrk1 937 03A9 =capital Omega, Greek +ohgr isogrk1 969 03C9 =small omega, Greek +ohm isonum 8486 2126 =ohm sign +oint mmlalias 8750 222E alias ISOTECH conint +olarr isoamsa 8634 21BA /circlearrowleft A: l arr in circle +olcir isoamsb 58377 E409 large circle in circle +olcross isotech 58280 E3A8 circle, cross +olt isoamsb 57992 E288 less-than in circle +Omacr isolat2 332 014C =capital O, macron +omacr isolat2 333 014D =small o, macron + +Omega isogrk3 937 03A9 /Omega capital Omega, Greek +omega isogrk3 969 03C9 /omega small omega, Greek +omid isoamsb 58378 E40A vertical bar in circle +ominus isoamsb 8854 2296 /ominus B: minus sign in circle +Oopf isomopf 58638 E50E /Bbb O, open face O +opar isoamsb 57994 E28A parallel in circle +OpenCurlyDoubleQuote mmlalias 8220 201C alias ISONUM ldquo +OpenCurlyQuote mmlalias 8216 2018 alias ISONUM lsquo +operp isoamsb 57995 E28B perpendicular in circle +oplus isoamsb 8853 2295 /oplus B: plus sign in circle + +Or isotech 58229 E375 dbl logical or +or isotech 8744 2228 /vee /lor B: logical or +orarr isoamsa 8635 21BB /circlearrowright A: r arr in circle +ord isotech 58259 E393 or, horizontal dash +order isotech 8500 2134 order of (script small o) +ordf isonum 170 00AA =ordinal indicator, feminine +ordm isonum 186 00BA =ordinal indicator, masculine +origof isoamsa 8886 22B6 original of +oror isotech 58223 E36F two logical or +orslope isotech 58286 E3AE sloping large or + +orv isotech 58258 E392 or with middle stem +oS isoamso 9416 24C8 /circledS - capital S in circle +Oscr isomscr 58670 E52E /scr O, script letter O +oscr isomscr 8500 2134 /scr o, script letter o +Oslash isolat1 216 00D8 =capital O, slash +oslash isolat1 248 00F8 latin small letter o with stroke +osol isoamsb 8856 2298 /oslash B: solidus in circle +Otilde isolat1 213 00D5 =capital O, tilde +otilde isolat1 245 00F5 =small o, tilde +Otimes isoamsb 57996 E28C multiply sign in double circle + +otimes isoamsb 8855 2297 /otimes B: multiply sign in circle +otimesas isoamsb 57997 E28D multiply sign in circle, circumflex accent +Ouml isolat1 214 00D6 =capital O, dieresis or umlaut mark +ouml isolat1 246 00F6 =small o, dieresis or umlaut mark +ovbar isoamsb 59448 E838 circle with vertical bar +OverBar mmlextra 175 00AF over bar +OverBrace mmlextra 62994 F612 over brace +OverBracket mmlextra 62996 F614 over bracket +OverParenthesis mmlextra 62992 F610 over parenthesis + + ------------------------------------------------------------------------ + +P A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +par isotech 8741 2225 /parallel R: parallel +para isonum 182 00B6 =pilcrow (paragraph sign) +parallel mmlalias 8741 2225 alias ISOTECH par +parsim isoamsn 58056 E2C8 parallel, similar +parsl isotech 58242 E382 parallel, slanted +part isotech 8706 2202 /partial partial differential +PartialD mmlalias 8706 2202 alias ISOTECH part +Pcy isocyr1 1055 041F =capital PE, Cyrillic +pcy isocyr1 1087 043F =small pe, Cyrillic +percnt isonum 37 0025 =percent sign + +period isonum 46 002E =full stop, period +permil isotech 8240 2030 per thousand +perp isotech 8869 22A5 /perp R: perpendicular +pertenk isotech 8241 2031 per 10 thousand +Pfr isomfrk 58735 E56F /frak P, upper case p +pfr isomfrk 58767 E58F /frak p, lower case p +Pgr isogrk1 928 03A0 =capital Pi, Greek +pgr isogrk1 960 03C0 =small pi, Greek +PHgr isogrk1 934 03A6 =capital Phi, Greek +phgr isogrk1 966 03C6 =small phi, Greek + +Phi isogrk3 934 03A6 /Phi capital Phi, Greek +phi isogrk3 966 03C6 /straightphi - small phi, Greek +phiv isogrk3 981 03D5 /varphi - curly or open phi +phmmat isotech 8499 2133 physics M-matrix (script capital M) +phone isopub 9742 260E =telephone symbol +Pi isogrk3 928 03A0 /Pi capital Pi, Greek +pi isogrk3 960 03C0 /pi small pi, Greek +pitchfork mmlalias 8916 22D4 alias ISOAMSR fork +piv isogrk3 982 03D6 /varpi +plank isoamso 58069 E2D5 /hbar - Planck's over 2pi + +plankv isoamso 8463 210F /hslash - variant Planck's over 2pi +plus isonum 43 002B =plus sign B: +plusacir isoamsb 57962 E26A plus, circumflex accent above +plusb isoamsb 8862 229E /boxplus B: plus sign in box +pluscir isoamsb 57958 E266 plus, small circle above +plusdo isoamsb 8724 2214 /dotplus B: plus sign, dot above +plusdu isoamsb 57946 E25A plus sign, dot below +pluse isoamsb 57959 E267 plus, equals +PlusMinus mmlalias 177 00B1 alias ISONUM plusmn +plusmn isonum 177 00B1 /pm B: =plus-or-minus sign + +plussim isoamsb 57964 E26C plus, similar below +plustwo isoamsb 57961 E269 plus, two; Nim-addition +pm mmlalias 177 00B1 alias ISONUM plusmn +pointint isotech 58230 E376 integral around a point operator +Popf isomopf 8473 2119 /Bbb P, open face P +pound isonum 163 00A3 =pound sign +Pr isoamsr 58204 E35C dbl precedes +pr isoamsr 8826 227A /prec R: precedes +prap isoamsr 8830 227E /precapprox R: precedes, approximate +prcue isoamsr 8828 227C /preccurlyeq R: precedes, curly eq + +prE isoamsr 58110 E2FE precedes, dbl equals +pre isoamsr 58110 E2FE /preceq R: precedes, equals +prec mmlalias 8826 227A alias ISOAMSR pr +precapprox mmlalias 8830 227E alias ISOAMSR prap +preccurlyeq mmlalias 8828 227C alias ISOAMSR prcue +Precedes mmlalias 8826 227A alias ISOAMSR pr +PrecedesEqual mmlalias 58110 E2FE alias ISOAMSR pre +PrecedesSlantEqual mmlalias 8828 227C alias ISOAMSR prcue +PrecedesTilde mmlalias 8830 227E alias ISOAMSR prsim +preceq mmlalias 58110 E2FE alias ISOAMSR pre + +precnapprox mmlalias 8936 22E8 alias ISOAMSN prnap +precneqq mmlalias 58035 E2B3 alias ISOAMSN prnE +precnsim mmlalias 8936 22E8 alias ISOAMSN prnsim +precsim mmlalias 8830 227E alias ISOAMSR prsim +Prime isotech 8243 2033 double prime or second +prime isotech 8242 2032 /prime prime or minute +prnap isoamsn 8936 22E8 /precnapprox N: precedes, not approx +prnE isoamsn 58035 E2B3 /precneqq N: precedes, not dbl eq +prnsim isoamsn 8936 22E8 /precnsim N: precedes, not similar +prod isoamsb 8719 220F /prod L: product operator + +Product mmlextra 8719 220F alias for &prod +profalar isotech 9006 232E all-around profile +profline isotech 8978 2312 profile of a line +profsurf isotech 8979 2313 profile of a surface +prop isotech 8733 221D /propto R: is proportional to +Proportion mmlalias 8759 2237 alias ISOAMSR Colon +Proportional mmlalias 8733 221D alias ISOTECH prop +propto mmlalias 8733 221D alias ISOTECH prop +prsim isoamsr 8830 227E /precsim R: precedes, similar +prurel isoamsr 8880 22B0 element precedes under relation + +Pscr isomscr 58671 E52F /scr P, script letter P +pscr isomscr 58703 E54F /scr p, script letter p +PSgr isogrk1 936 03A8 =capital Psi, Greek +psgr isogrk1 968 03C8 =small psi, Greek +Psi isogrk3 936 03A8 /Psi capital Psi, Greek +psi isogrk3 968 03C8 /psi small psi, Greek +puncsp isopub 8200 2008 =punctuation space (width of comma) + + ------------------------------------------------------------------------ + +Q A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Qfr isomfrk 58736 E570 /frak Q, upper case q +qfr isomfrk 58768 E590 /frak q, lower case q +qint isotech 58232 E378 /iiiint quadruple integral operator +Qopf isomopf 8474 211A /Bbb Q, open face Q +qprime isotech 58225 E371 quadruple prime +Qscr isomscr 58672 E530 /scr Q, script letter Q +qscr isomscr 58704 E550 /scr q, script letter q +quatint isotech 58231 E377 quaternion integral operator +quest isonum 63 003F =question mark +questeq mmlalias 8799 225F alias ISOAMSR equest + +quot isonum 34 0022 =quotation mark + + ------------------------------------------------------------------------ + +R A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +rAarr isoamsa 8667 21DB /Rrightarrow A: right triple arrow +race isoamsb 58380 E40C reverse most positive, line below +Racute isolat2 340 0154 =capital R, acute accent +racute isolat2 341 0155 =small r, acute accent +radic isotech 8730 221A /surd radical +raemptyv isoamso 58089 E2E9 circle, slash, right arrow above +Rang isotech 12299 300B right angle bracket, double +rang isotech 12297 3009 /rangle C: right angle bracket +rangd isoamsc 58008 E298 right angle, dot +range isoamso 58071 E2D7 reverse angle, equal + +rangle mmlalias 12297 3009 alias ISOTECH rang +raquo isonum 187 00BB =angle quotation mark, right +Rarr isoamsa 8608 21A0 /twoheadrightarrow A: +rArr isotech 8658 21D2 /Rightarrow A: implies +rarr isonum 8594 2192 /rightarrow /to A: =rightward arrow +rarrap isoamsa 57909 E235 approximate, right arrow above +rarrb mmlextra 8677 21E5 leftwards arrow to bar +rarrbfs isoamsa 57889 E221 right arrow-bar, filled square +rarrc isoamsa 57884 E21C right arrow-curved +rarrfs isoamsa 57891 E223 right arrow, filled square + +rarrhk isoamsa 8618 21AA /hookrightarrow A: rt arrow-hooked +rarrlp isoamsa 8620 21AC /looparrowright A: rt arrow-looped +rarrpl isoamsa 57886 E21E right arrow, plus +rarrsim isoamsa 57933 E24D right arrow, similar +Rarrtl isoamsa 57913 E239 right two-headed arrow with tail +rarrtl isoamsa 8611 21A3 /rightarrowtail A: rt arrow-tailed +rarrw isoamsa 8669 21DD /rightsquigarrow A: rt arrow-wavy +rAtail isoamsa 57915 E23B right double arrow-tail +ratail isoamsa 8611 21A3 right arrow-tail +ratio isoamsr 8758 2236 /ratio + +RBarr isoamsa 57865 E209 /drbkarow A: twoheaded right broken arrow +rBarr isoamsa 57863 E207 /dbkarow A: right doubly broken arrow +rbarr isoamsa 58373 E405 /bkarow A: right broken arrow +rbbrk isotech 12309 3015 right broken bracket +rbrace mmlalias 125 007D alias ISONUM rcub +rbrack mmlalias 93 005D alias ISONUM rsqb +rbrke isoamsc 58010 E29A right bracket, equal +rbrksld isoamsc 58012 E29C right bracket, solidus bottom corner +rbrkslu isoamsc 58014 E29E right bracket, solidus top corner +Rcaron isolat2 344 0158 =capital R, caron + +rcaron isolat2 345 0159 =small r, caron +Rcedil isolat2 342 0156 =capital R, cedilla +rcedil isolat2 343 0157 =small r, cedilla +rceil isoamsc 8969 2309 /rceil C: right ceiling +rcub isonum 125 007D /rbrace C: =right curly bracket +Rcy isocyr1 1056 0420 =capital ER, Cyrillic +rcy isocyr1 1088 0440 =small er, Cyrillic +rdca isoamsa 57881 E219 right down curved arrow +rdldhar isoamsa 57901 E22D right harpoon-down over left harpoon-down +rdquo isonum 8221 201D =double quotation mark, right + +rdquor isopub 8221 201D rising dbl quote, right (high) +rdsh isoamsa 8627 21B3 right down angled arrow +Re mmlalias 8476 211C ISOAMSO real +real isoamso 8476 211C /Re - real +rect isopub 9645 25AD =rectangle, open +reg isonum 174 00AE /circledR =registered sign +ReverseElement mmlalias 8715 220B alias ISOTECH niv +ReverseEquilibrium mmlalias 8651 21CB alias ISOAMSA lrhar +ReverseUpEquilibrium mmlalias 57879 E217 alias ISOAMSA duhar +rfisht isoamsa 57877 E215 right fish tail + +rfloor isoamsc 8971 230B /rfloor C: right floor +Rfr isomfrk 8476 211C /frak R, upper case r +rfr isomfrk 58769 E591 /frak r, lower case r +Rgr isogrk1 929 03A1 =capital Rho, Greek +rgr isogrk1 961 03C1 =small rho, Greek +rHar isoamsa 57892 E224 right harpoon-up over right harpoon-down +rhard isoamsa 8641 21C1 /rightharpoondown A: rt harpoon-down +rharu isoamsa 8640 21C0 /rightharpoonup A: rt harpoon-up +rharul isoamsa 57904 E230 right harpoon-up over long dash +rho isogrk3 961 03C1 /rho small rho, Greek + +rhov isogrk3 1009 03F1 /varrho +RightAngleBracket mmlalias 12297 3009 alias ISOTECH rang +RightArrow mmlalias 8594 2192 alias ISONUM rarr +Rightarrow mmlalias 8658 21D2 alias ISOTECH rArr +rightarrow mmlalias 8594 2192 alias ISONUM rarr +RightArrowBar mmlextra 8677 21E5 alias for rarrb +RightArrowLeftArrow mmlalias 8644 21C4 alias ISOAMSA rlarr +rightarrowtail mmlalias 8611 21A3 alias ISOAMSA rarrtl +RightBracketingBar mmlextra 62980 F604 right vertical delimiter +RightCeiling mmlalias 8969 2309 alias ISOAMSC rceil + +RightDoubleBracket mmlalias 12315 301B right double bracket delimiter +RightDoubleBracketingBar mmlextra 62982 F606 right double vertical delimiter +RightDownTeeVector mmlextra 62740 F514 down-right harpoon from bar +RightDownVector mmlalias 8642 21C2 alias ISOAMSA dharr +RightDownVectorBar mmlextra 62738 F512 down-right harpoon to bar +RightFloor mmlalias 8971 230B alias ISOAMSC rfloor +rightharpoondown mmlalias 8641 21C1 alias ISOAMSA rhard +rightharpoonup mmlalias 8640 21C0 alias ISOAMSA rharu +rightleftarrows mmlalias 8644 21C4 alias ISOAMSA rlarr +rightleftharpoons mmlalias 8652 21CC alias ISOAMSA rlhar + +rightrightarrows mmlalias 8649 21C9 alias ISOAMSA rrarr +RightSkeleton mmlextra 59473 E851 end of missing information +rightsquigarrow mmlalias 8669 21DD alias ISOAMSA rarrw +RightTee mmlalias 8866 22A2 alias ISOAMSR vdash +RightTeeArrow mmlalias 8614 21A6 alias ISOAMSA map +RightTeeVector mmlextra 62730 F50A right-up harpoon from bar +rightthreetimes mmlalias 8908 22CC alias ISOAMSB rthree +RightTriangle mmlalias 8883 22B3 alias ISOAMSR vrtri +RightTriangleBar mmlextra 62481 F411 vertical bar, right triangle +RightTriangleEqual mmlalias 8885 22B5 alias ISOAMSR rtrie + +RightUpDownVector mmlextra 62736 F510 up-right-down-right harpoon +RightUpTeeVector mmlextra 62739 F513 up-right harpoon from bar +RightUpVector mmlalias 8638 21BE alias ISOAMSA uharr +RightUpVectorBar mmlextra 62737 F511 up-right harpoon to bar +RightVector mmlalias 8640 21C0 alias ISOAMSA rharu +RightVectorBar mmlextra 62728 F508 up-right harpoon to bar +ring isodia 730 02DA =ring +risingdotseq mmlalias 8787 2253 alias ISOAMSR erDot +rlarr isoamsa 8644 21C4 /rightleftarrows A: r arr over l arr +rlhar isoamsa 8652 21CC /rightleftharpoons A: r harp over l + +rmoust isoamsc 58003 E293 /rmoustache +rmoustache mmlalias 58003 E293 alias ISOAMSC rmoust +rnmid isoamsn 58065 E2D1 reverse /nmid +roang isotech 12313 3019 right open angular bracket +roarr isoamsa 57921 E241 right open arrow +robrk isotech 12315 301B right open bracket +ropar isotech 58234 E37A right open parenthesis +Ropf isomopf 8477 211D /Bbb R, open face R +roplus isoamsb 57949 E25D plus sign in right half circle +rotimes isoamsb 57951 E25F multiply sign in right half circle + +RoundImplies mmlextra 62756 F524 round implies +rpar isonum 41 0029 C: =right parenthesis +rpargt isoamsc 58001 E291 C: right paren, gt +rppolint isotech 58263 E397 line integration, rectangular path around pole +rrarr isoamsa 8649 21C9 /rightrightarrows A: two rt arrows +Rrightarrow mmlalias 8667 21DB alias ISOAMSA rAarr +Rscr isomscr 58673 E531 /scr R, script letter R +rscr isomscr 58705 E551 /scr r, script letter r +Rsh mmlalias 8625 21B1 alias ISOAMSA rsh +rsh isoamsa 8625 21B1 /Rsh A: + +rsqb isonum 93 005D /rbrack C: =right square bracket +rsquo isonum 8217 2019 =single quotation mark, right +rsquor isopub 8217 2019 rising single quote, right (high) +rthree isoamsb 8908 22CC /rightthreetimes B: +rtimes isoamsb 8906 22CA /rtimes B: times sign, right closed +rtri isopub 9657 25B9 /triangleright B: r triangle, open +rtrie isoamsr 8885 22B5 /trianglerighteq R: right tri, eq +rtrif isopub 9656 25B8 /blacktriangleright R: =r tri, filled +rtriltri isoamsr 58201 E359 right triangle above left triangle +RuleDelayed mmlextra 62751 F51F rule-delayed (colon right arrow) + +ruluhar isoamsa 57898 E22A right harpoon-up over left harpoon-up +rx isopub 8478 211E pharmaceutical prescription (Rx) + + ------------------------------------------------------------------------ + +S A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Sacute isolat2 346 015A =capital S, acute accent +sacute isolat2 347 015B =small s, acute accent +Sc isoamsr 58205 E35D dbl succeeds +sc isoamsr 8827 227B /succ R: succeeds +scap isoamsr 8831 227F /succapprox R: succeeds, approximate +Scaron isolat2 352 0160 =capital S, caron +scaron isolat2 353 0161 =small s, caron +sccue isoamsr 8829 227D /succcurlyeq R: succeeds, curly eq +scE isoamsr 8830 227E succeeds, dbl equals +sce isoamsr 8829 227D /succeq R: succeeds, equals + +Scedil isolat2 350 015E =capital S, cedilla +scedil isolat2 351 015F =small s, cedilla +Scirc isolat2 348 015C =capital S, circumflex accent +scirc isolat2 349 015D =small s, circumflex accent +scnap isoamsn 8937 22E9 /succnapprox N: succeeds, not approx +scnE isoamsn 58037 E2B5 /succneqq N: succeeds, not dbl eq +scnsim isoamsn 8937 22E9 /succnsim N: succeeds, not similar +scpolint isotech 58264 E398 line integration, semi-circular path around pole +scsim isoamsr 8831 227F /succsim R: succeeds, similar +Scy isocyr1 1057 0421 =capital ES, Cyrillic + +scy isocyr1 1089 0441 =small es, Cyrillic +sdot isoamsb 8901 22C5 /cdot B: small middle dot +sdotb isoamsb 8865 22A1 /dotsquare /boxdot B: small dot in box +sdote isoamsr 58137 E319 equal, dot below +searhk isoamsa 57867 E20B /hksearow A: SE arrow-hooken +seArr isoamsa 8664 21D8 SE pointing dbl arrow +searr isoamsa 8600 2198 /searrow A: SE pointing arrow +searrow mmlalias 8600 2198 alias ISOAMSA searr +sect isonum 167 00A7 =section sign +semi isonum 59 003B =semicolon P: + +seswar isoamsa 57871 E20F /tosa A: SE & SW arrows +setminus mmlalias 8726 2216 alias ISOAMSB setmn +setmn isoamsb 8726 2216 /setminus B: reverse solidus +sext isopub 10038 2736 sextile (6-pointed star) +sfgr isogrk1 962 03C2 =final small sigma, Greek +Sfr isomfrk 58738 E572 /frak S, upper case s +sfr isomfrk 58770 E592 /frak s, lower case s +Sgr isogrk1 931 03A3 =capital Sigma, Greek +sgr isogrk1 963 03C3 =small sigma, Greek +sharp isopub 9839 266F /sharp =musical sharp + +SHCHcy isocyr1 1065 0429 =capital SHCHA, Cyrillic +shchcy isocyr1 1097 0449 =small shcha, Cyrillic +SHcy isocyr1 1064 0428 =capital SHA, Cyrillic +shcy isocyr1 1096 0448 =small sha, Cyrillic +ShortDownArrow mmlextra 59519 E87F short down arrow +ShortLeftArrow mmlalias 57907 E233 alias ISOAMSA slarr +shortmid mmlalias 58113 E301 alias ISOAMSR smid +shortparallel mmlalias 58114 E302 alias ISOAMSR spar +ShortRightArrow mmlalias 57906 E232 alias ISOAMSA srarr +ShortUpArrow mmlextra 59520 E880 sort up arrow + +shy isonum 173 00AD =soft hyphen +Sigma isogrk3 931 03A3 /Sigma capital Sigma, Greek +sigma isogrk3 963 03C3 /sigma small sigma, Greek +sigmav isogrk3 962 03C2 /varsigma +sim isotech 8764 223C /sim R: similar +simdot isotech 58251 E38B similar, dot +sime isotech 8771 2243 /simeq R: similar, equals +simeq mmlalias 8771 2243 alias ISOTECH sime +simg isoamsr 58124 E30C similar, greater +simgE isoamsr 58168 E338 similar, greater, equal + +siml isoamsr 58123 E30B similar, less +simlE isoamsr 58167 E337 similar, less, equal +simne isoamsn 8774 2246 similar, not equals +simplus isoamsb 57963 E26B plus, similar above +simrarr isoamsa 57908 E234 similar, right arrow below +slarr isoamsa 57907 E233 short left arrow +SmallCircle mmlalias 8728 2218 alias ISOTECH compfn +smallsetminus mmlalias 59460 E844 alias ISOAMSB ssetmn +smashp isoamsb 57956 E264 smash product +smeparsl isotech 58245 E385 similar, parallel, slanted, equal + +smid isoamsr 58113 E301 /shortmid R: +smile isoamsr 8995 2323 /smile R: up curve +smt isoamsr 58169 E339 smaller than +smte isoamsr 58171 E33B smaller than or equal +smtes isoamsr 58173 E33D smaller than or equal, slanted +SOFTcy isocyr1 1068 042C =capital SOFT sign, Cyrillic +softcy isocyr1 1100 044C =small soft sign, Cyrillic +sol isonum 47 002F =solidus +solb isoamsb 57983 E27F solidus in square +solbar isoamsn 58390 E416 solidus, bar through + +Sopf isomopf 58642 E512 /Bbb S, open face S +spades isopub 9824 2660 /spadesuit =spades suit symbol +spadesuit mmlalias 9824 2660 ISOPUB spades +spar isoamsr 58114 E302 /shortparallel R: short parallel +sqcap isoamsb 8851 2293 /sqcap B: square intersection +sqcaps isoamsb 57975 E277 square intersection, serifs +sqcup isoamsb 8852 2294 /sqcup B: square union +sqcups isoamsb 57974 E276 square union, serifs +Sqrt mmlalias 8730 221A alias ISOTECH radic +sqsub isoamsr 8847 228F /sqsubset R: square subset + +sqsube isoamsr 8849 2291 /sqsubseteq R: square subset, equals +sqsubset mmlalias 8847 228F alias ISOAMSR sqsub +sqsubseteq mmlalias 8849 2291 alias ISOAMSR sqsube +sqsup isoamsr 8848 2290 /sqsupset R: square superset +sqsupe isoamsr 8850 2292 /sqsupseteq R: square superset, eq +sqsupset mmlalias 8848 2290 alias ISOAMSR sqsup +sqsupseteq mmlalias 8850 2292 alias ISOAMSR sqsupe +squ isopub 9633 25A1 =square, open +Square mmlalias 9633 25A1 alias for square +square isotech 9633 25A1 /square, square + +SquareIntersection mmlalias 8851 2293 alias ISOAMSB sqcap +SquareSubset mmlalias 8847 228F alias ISOAMSR sqsub +SquareSubsetEqual mmlalias 8849 2291 alias ISOAMSR sqsube +SquareSuperset mmlalias 8848 2290 alias ISOAMSR sqsup +SquareSupersetEqual mmlalias 8850 2292 alias ISOAMSR sqsupe +SquareUnion mmlalias 8852 2294 alias ISOAMSB sqcup +squarf isotech 9642 25AA /blacksquare, square, filled +squf isopub 9642 25AA /blacksquare =sq bullet, filled +srarr isoamsa 57906 E232 short right arrow +Sscr isomscr 58674 E532 /scr S, script letter S + +sscr isomscr 58706 E552 /scr s, script letter s +ssetmn isoamsb 59460 E844 /smallsetminus B: sm reverse solidus +sstarf isoamsb 8902 22C6 /star B: small star, filled +Star mmlalias 8902 22C6 alias ISOAMSB sstarf +star isopub 8902 22C6 =star, open +starf isopub 9733 2605 /bigstar - star, filled +straightepsilon mmlalias 949 03B5 alias ISOGRK3 epsi +straightphi mmlalias 966 03C6 alias ISOGRK3 phi +strns isotech 58240 E380 straightness +Sub isoamsr 8912 22D0 /Subset R: double subset + +sub isotech 8834 2282 /subset R: subset or is implied by +subdot isoamsb 57954 E262 subset, with dot +subE isoamsr 8838 2286 /subseteqq R: subset, dbl equals +sube isotech 8838 2286 /subseteq R: subset, equals +subedot isoamsr 58191 E34F subset, equals, dot +submult isoamsr 58179 E343 subset, multiply +subnE isoamsn 8842 228A /subsetneqq N: subset, not dbl eq +subne isoamsn 8842 228A /subsetneq N: subset, not equals +subplus isoamsr 58177 E341 subset, plus +subrarr isoamsr 58175 E33F subset, right arrow + +Subset mmlalias 8912 22D0 alias ISOAMSR Sub +subset mmlalias 8834 2282 alias ISOTECH sub +subseteq mmlalias 8838 2286 alias ISOTECH sube +subseteqq mmlalias 8838 2286 alias ISOAMSR subE +SubsetEqual mmlalias 8838 2286 alias ISOTECH sube +subsetneq mmlalias 8842 228A alias ISOAMSN subne +subsetneqq mmlalias 8842 228A alias ISOAMSN subnE +subsim isoamsr 58181 E345 subset, similar +subsub isoamsr 58185 E349 subset above subset +subsup isoamsr 58183 E347 subset above superset + +succ mmlalias 8827 227B alias ISOAMSR sc +succapprox mmlalias 8831 227F alias ISOAMSR scap +succcurlyeq mmlalias 8829 227D alias ISOAMSR sccue +Succeeds mmlalias 8827 227B alias ISOAMSR sc +SucceedsEqual mmlalias 8829 227D alias ISOAMSR sce +SucceedsSlantEqual mmlalias 8829 227D alias ISOAMSR sccue +SucceedsTilde mmlalias 8831 227F alias ISOAMSR scsim +succeq mmlalias 8829 227D alias ISOAMSR sce +succnapprox mmlalias 8937 22E9 alias ISOAMSN scnap +succneqq mmlalias 58037 E2B5 alias ISOAMSN scnE + +succnsim mmlalias 8937 22E9 alias ISOAMSN scnsim +succsim mmlalias 8831 227F alias ISOAMSR scsim +SuchThat mmlalias 8715 220B ISOTECH ni +Sum mmlalias 8721 2211 alias ISOAMSB sum +sum isoamsb 8721 2211 /sum L: summation operator +sung isonum 9834 266A =music note (sung text sign) +Sup isoamsr 8913 22D1 /Supset R: dbl superset +sup isotech 8835 2283 /supset R: superset or implies +sup1 isonum 185 00B9 =superscript one +sup2 isonum 178 00B2 =superscript two + +sup3 isonum 179 00B3 =superscript three +supdot isoamsb 57955 E263 superset, with dot +supdsub isoamsr 58188 E34C superset, subset, dash joining them +supE isoamsr 8839 2287 /supseteqq R: superset, dbl equals +supe isotech 8839 2287 /supseteq R: superset, equals +supedot isoamsr 58192 E350 superset, equals, dot +Superset mmlalias 8835 2283 alias ISOTECH sup +SupersetEqual mmlalias 8839 2287 alias ISOTECH supe +suphsol isoamsr 58190 E34E superset, solidus +suphsub isoamsr 58187 E34B superset, subset + +suplarr isoamsr 58176 E340 superset, left arrow +supmult isoamsr 58180 E344 superset, multiply +supnE isoamsn 8843 228B /supsetneqq N: superset, not dbl eq +supne isoamsn 8843 228B /supsetneq N: superset, not equals +supplus isoamsr 58178 E342 superset, plus +Supset mmlalias 8913 22D1 alias ISOAMSR Sup +supset mmlalias 8835 2283 alias ISOTECH sup +supseteq mmlalias 8839 2287 alias ISOTECH supe +supseteqq mmlalias 8839 2287 alias ISOAMSR supE +supsetneq mmlalias 8843 228B alias ISOAMSN supne + +supsetneqq mmlalias 8843 228B alias ISOAMSN supnE +supsim isoamsr 58182 E346 superset, similar +supsub isoamsr 58184 E348 superset above subset +supsup isoamsr 58186 E34A superset above superset +swarhk isoamsa 57866 E20A /hkswarow A: SW arrow-hooked +swArr isoamsa 8665 21D9 SW pointing dbl arrow +swarr isoamsa 8601 2199 /swarrow A: SW pointing arrow +swarrow mmlalias 8601 2199 alias ISOAMSA swarr +swnwar isoamsa 57872 E210 SW & NW arrows +szlig isolat1 223 00DF =small sharp s, German (sz ligature) + + ------------------------------------------------------------------------ + +T A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Tab mmlextra 9 0009 tabulator stop; horizontal tabulation +target isopub 8982 2316 register mark or target +tau isogrk3 964 03C4 /tau small tau, Greek +tbrk isoamso 58095 E2EF top square bracket +Tcaron isolat2 356 0164 =capital T, caron +tcaron isolat2 357 0165 =small t, caron +Tcedil isolat2 354 0162 =capital T, cedilla +tcedil isolat2 355 0163 =small t, cedilla +Tcy isocyr1 1058 0422 =capital TE, Cyrillic +tcy isocyr1 1090 0442 =small te, Cyrillic + +tdot isotech 8411 20DB three dots above +telrec isopub 8981 2315 =telephone recorder symbol +Tfr isomfrk 58739 E573 /frak T, upper case t +tfr isomfrk 58771 E593 /frak t, lower case t +Tgr isogrk1 932 03A4 =capital Tau, Greek +tgr isogrk1 964 03C4 =small tau, Greek +there4 isotech 8756 2234 /therefore R: therefore +Therefore mmlalias 8756 2234 alias ISOTECH there4 +therefore mmlalias 8756 2234 alias ISOTECH there4 +Theta isogrk3 920 0398 /Theta capital Theta, Greek + +theta isogrk3 952 03B8 /theta straight theta, small theta, Greek +thetav isogrk3 977 03D1 /vartheta - curly or open theta +THgr isogrk1 920 0398 =capital Theta, Greek +thgr isogrk1 952 03B8 =small theta, Greek +thickapprox mmlalias 58118 E306 ISOAMSR thkap +thicksim mmlalias 58409 E429 ISOAMSR thksim +ThickSpace mmlextra 59543 E897 space of width 5/18 em +thinsp isopub 8201 2009 =thin space (1/6-em) +ThinSpace mmlalias 8201 2009 space of width 3/18 em alias ISOPUB thinsp +thkap isoamsr 58118 E306 /thickapprox R: thick approximate + +thksim isoamsr 58409 E429 /thicksim R: thick similar +THORN isolat1 222 00DE =capital THORN, Icelandic +thorn isolat1 254 00FE =small thorn, Icelandic +Tilde mmlalias 8764 223C alias ISOTECH sim +tilde isodia 732 02DC =tilde +TildeEqual mmlalias 8771 2243 alias ISOTECH sime +TildeFullEqual mmlalias 8773 2245 alias ISOTECH cong +TildeTilde mmlalias 8776 2248 alias ISOTECH ap +times isonum 215 00D7 /times B: =multiply sign +timesb isoamsb 8864 22A0 /boxtimes B: multiply sign in box + +timesbar isoamsb 57998 E28E multiply sign, bar below +timesd isoamsb 57965 E26D times, dot +tint isotech 8749 222D /iiint triple integral operator +toea mmlalias 57870 E20E alias ISOAMSA nesear +top isotech 8868 22A4 /top top +topbot isotech 9014 2336 top and bottom +topcir isotech 58243 E383 top, circle below +Topf isomopf 58643 E513 /Bbb T, open face T +topfork isoamsr 58140 E31C fork with top +tosa mmlalias 57871 E20F alias ISOAMSA seswar + +tprime isotech 8244 2034 triple prime +trade isonum 8482 2122 =trade mark sign +triangle mmlalias 9653 25B5 alias ISOPUB utri +triangledown mmlalias 9663 25BF alias ISOPUB dtri +triangleleft mmlalias 9667 25C3 alias ISOPUB ltri +trianglelefteq mmlalias 8884 22B4 alias ISOAMSR ltrie +triangleq mmlalias 8796 225C alias ISOAMSR trie +triangleright mmlalias 9657 25B9 alias ISOPUB rtri +trianglerighteq mmlalias 8885 22B5 alias ISOAMSR rtrie +tridot isoamsb 9708 25EC dot in triangle + +trie isoamsr 8796 225C /triangleq R: triangle, equals +triminus isoamsb 57980 E27C minus in triangle +TripleDot mmlalias 8411 20DB alias ISOTECH tdot +triplus isoamsb 57979 E27B plus in triangle +trisb isoamsb 57982 E27E triangle, serifs at bottom +tritime isoamsb 57981 E27D multiply in triangle +trpezium isoamso 58092 E2EC trapezium +true mmlextra 59563 E8AB logical constant true +Tscr isomscr 58675 E533 /scr T, script letter T +tscr isomscr 58707 E553 /scr t, script letter t + +TScy isocyr1 1062 0426 =capital TSE, Cyrillic +tscy isocyr1 1094 0446 =small tse, Cyrillic +TSHcy isocyr2 1035 040B =capital TSHE, Serbian +tshcy isocyr2 1115 045B =small tshe, Serbian +Tstrok isolat2 358 0166 =capital T, stroke +tstrok isolat2 359 0167 =small t, stroke +twixt isoamsr 8812 226C /between R: between +twoheadleftarrow mmlalias 8606 219E alias ISOAMSA Larr +twoheadrightarrow mmlalias 8608 21A0 alias ISOAMSA Rarr + + ------------------------------------------------------------------------ + +U A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Uacgr isogrk2 910 038E =capital Upsilon, accent, Greek +uacgr isogrk2 973 03CD =small upsilon, accent, Greek +Uacute isolat1 218 00DA =capital U, acute accent +uacute isolat1 250 00FA =small u, acute accent +Uarr isoamsa 8607 219F up two-headed arrow +uArr isoamsa 8657 21D1 /Uparrow A: up dbl arrow +uarr isonum 8593 2191 /uparrow A: =upward arrow +Uarrocir isoamsa 57911 E237 up two-headed arrow above circle +Ubrcy isocyr2 1038 040E =capital U, Byelorussian +ubrcy isocyr2 1118 045E =small u, Byelorussian + +Ubreve isolat2 364 016C =capital U, breve +ubreve isolat2 365 016D =small u, breve +Ucirc isolat1 219 00DB =capital U, circumflex accent +ucirc isolat1 251 00FB =small u, circumflex accent +Ucy isocyr1 1059 0423 =capital U, Cyrillic +ucy isocyr1 1091 0443 =small u, Cyrillic +udarr isoamsa 8645 21C5 up arrow, down arrow +Udblac isolat2 368 0170 =capital U, double acute accent +udblac isolat2 369 0171 =small u, double acute accent +udhar isoamsa 57880 E218 up harp, down harp + +udiagr isogrk2 944 03B0 =small upsilon, dieresis, accent, Greek +Udigr isogrk2 939 03AB =capital Upsilon, dieresis, Greek +udigr isogrk2 971 03CB =small upsilon, dieresis, Greek +ufisht isoamsa 57931 E24B up fish tail +Ufr isomfrk 58740 E574 /frak U, upper case u +ufr isomfrk 58772 E594 /frak u, lower case u +Ugr isogrk1 933 03A5 =capital Upsilon, Greek +ugr isogrk1 965 03C5 =small upsilon, Greek +Ugrave isolat1 217 00D9 =capital U, grave accent +ugrave isolat1 249 00F9 =small u, grave accent + +uHar isoamsa 57894 E226 up harpoon-left, up harpoon-right +uharl isoamsa 8639 21BF /upharpoonleft A: up harpoon-left +uharr isoamsa 8638 21BE /upharpoonright /restriction A: up harp-r +uhblk isopub 9600 2580 =upper half block +ulcorn isoamsc 8988 231C /ulcorner O: upper left corner +ulcorner mmlalias 8988 231C alias ISOAMSC ulcorn +ulcrop isopub 8975 230F upward left crop mark +ultri isoamso 58084 E2E4 upper left triangle +Umacr isolat2 362 016A =capital U, macron +umacr isolat2 363 016B =small u, macron + +uml isodia 168 00A8 =umlaut mark +UnderBar mmlextra 818 0332 combining low line +UnderBrace mmlextra 62995 F613 under brace +UnderBracket mmlextra 62997 F615 under bracket +UnderParenthesis mmlextra 62993 F611 under parenthesis +Union mmlalias 8899 22C3 alias ISOAMSB xcup +UnionPlus mmlalias 8846 228E alias ISOAMSB uplus +Uogon isolat2 370 0172 =capital U, ogonek +uogon isolat2 371 0173 =small u, ogonek +Uopf isomopf 58644 E514 /Bbb U, open face U + +UpArrow mmlalias 8593 2191 alias ISONUM uarr +Uparrow mmlalias 8657 21D1 alias ISOAMSA uArr +uparrow mmlalias 8593 2191 alias ISONUM uarr +UpArrowBar mmlextra 62723 F503 up arrow to bar +UpArrowDownArrow mmlalias 8645 21C5 alias ISOAMSA udarr +UpDownArrow mmlalias 8597 2195 alias ISOAMSA varr +Updownarrow mmlalias 8661 21D5 alias ISOAMSA vArr +updownarrow mmlalias 8597 2195 alias ISOAMSA varr +UpEquilibrium mmlalias 57880 E218 alias ISOAMSA udhar +upharpoonleft mmlalias 8639 21BF alias ISOAMSA uharl + +upharpoonright mmlalias 8638 21BE alias ISOAMSA uharr +uplus isoamsb 8846 228E /uplus B: plus sign in union +UpperLeftArrow mmlalias 8598 2196 alias ISOAMSA nwarr +UpperRightArrow mmlalias 8599 2197 alias ISOAMSA nearr +Upsi isogrk3 978 03D2 /Upsilon capital Upsilon, Greek +upsi isogrk3 965 03C5 /upsilon small upsilon, Greek +Upsilon mmlalias 978 03D2 alias ISOGRK3 Upsi +upsilon mmlalias 965 03C5 alias ISOGRK3 upsi +UpTee mmlalias 8869 22A5 alias ISOTECH perp +UpTeeArrow mmlextra 8613 21A5 Alias mapstoup + +upuparrows mmlalias 8648 21C8 alias ISOAMSA uuarr +urcorn isoamsc 8989 231D /urcorner C: upper right corner +urcorner mmlalias 8989 231D alias ISOAMSC urcorn +urcrop isopub 8974 230E upward right crop mark +Uring isolat2 366 016E =capital U, ring +uring isolat2 367 016F =small u, ring +urtri isoamso 58082 E2E2 upper right triangle +Uscr isomscr 58676 E534 /scr U, script letter U +uscr isomscr 58708 E554 /scr u, script letter u +utdot isotech 8944 22F0 three dots, ascending + +Utilde isolat2 360 0168 =capital U, tilde +utilde isolat2 361 0169 =small u, tilde +utri isopub 9653 25B5 /triangle =up triangle, open +utrif isopub 9652 25B4 /blacktriangle =up tri, filled +uuarr isoamsa 8648 21C8 /upuparrows A: two up arrows +Uuml isolat1 220 00DC =capital U, dieresis or umlaut mark +uuml isolat1 252 00FC =small u, dieresis or umlaut mark +uwangle isotech 58283 E3AB large upward pointing angle + + ------------------------------------------------------------------------ + +V A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +vangrt isotech 8894 22BE right angle, variant +varepsilon mmlalias 603 025B alias ISOGRK3 epsiv +varkappa mmlalias 1008 03F0 alias ISOGRK3 kappav +varnothing mmlalias 8709 2205 alias ISOAMSO emptyv +varphi mmlalias 981 03D5 alias ISOGRK3 phiv +varpi mmlalias 982 03D6 alias ISOGRK3 piv +varpropto mmlalias 8733 221D alias ISOAMSR vprop +vArr isoamsa 8661 21D5 /Updownarrow A: up&down dbl arrow +varr isoamsa 8597 2195 /updownarrow A: up&down arrow +varrho mmlalias 1009 03F1 alias ISOGRK3 rhov + +varsigma mmlalias 962 03C2 alias ISOGRK3 sigmav +varsubsetneq mmlalias 58041 E2B9 alias ISOAMSN vsubne +varsubsetneqq mmlalias 58040 E2B8 alias ISOAMSN vsubnE +varsupsetneq mmlalias 58042 E2BA alias ISOAMSN vsupne +varsupsetneqq mmlalias 58043 E2BB alias ISOAMSN vsupnE +vartheta mmlalias 977 03D1 alias ISOGRK3 thetav +vartriangleleft mmlalias 8882 22B2 alias ISOAMSR vltri +vartriangleright mmlalias 8883 22B3 alias ISOAMSR vrtri +Vbar isoamsr 58125 E30D dbl vert, bar (under) +vBar isoamsr 58128 E310 vert, dbl bar (under) + +vBarv isoamsr 58130 E312 dbl bar, vert over and under +Vcy isocyr1 1042 0412 =capital VE, Cyrillic +vcy isocyr1 1074 0432 =small ve, Cyrillic +VDash isoamsr 8875 22AB dbl vert, dbl dash +Vdash isoamsr 8873 22A9 /Vdash R: dbl vertical, dash +vDash isoamsr 8872 22A8 /vDash R: vertical, dbl dash +vdash isoamsr 8866 22A2 /vdash R: vertical, dash +Vdashl isoamsr 58131 E313 vertical, dash (long) +Vee mmlalias 8897 22C1 alias ISOAMSB xvee +vee mmlalias 8744 2228 alias ISOTECH or + +veebar isoamsb 8891 22BB /veebar B: logical or, bar below +veeeq isotech 8794 225A logical or, equals +vellip isopub 8942 22EE vertical ellipsis +Verbar isotech 8214 2016 /Vert dbl vertical bar +verbar isonum 124 007C /vert =vertical bar +Vert mmlalias 8214 2016 alias ISOTECH Verbar +vert mmlalias 124 007C alias ISONUM verbar +VerticalBar mmlalias 8739 2223 alias ISOAMSR mid +VerticalLine mmlextra 59482 E85A short vertical line +VerticalSeparator mmlextra 59484 E85C vertical separating operator + +VerticalTilde mmlalias 8768 2240 alias ISOAMSB wreath +VeryThinSpace mmlalias 8202 200A space of width 1/18 em alias ISOPUB hairsp +Vfr isomfrk 58741 E575 /frak V, upper case v +vfr isomfrk 58773 E595 /frak v, lower case v +vltri isoamsr 8882 22B2 /vartriangleleft R: l tri, open, var +vnsub isoamsn 8836 2284 /nsubset N: not subset, var +vnsup isoamsn 8837 2285 /nsupset N: not superset, var +Vopf isomopf 58645 E515 /Bbb V, open face V +vprop isoamsr 8733 221D /varpropto R: proportional, variant +vrtri isoamsr 8883 22B3 /vartriangleright R: r tri, open, var + +Vscr isomscr 58677 E535 /scr V, script letter V +vscr isomscr 58709 E555 /scr v, script letter v +vsubnE isoamsn 58040 E2B8 /varsubsetneqq N: subset not dbl eq, var +vsubne isoamsn 58041 E2B9 /varsubsetneq N: subset, not eq, var +vsupnE isoamsn 58043 E2BB /varsupsetneqq N: super not dbl eq, var +vsupne isoamsn 58042 E2BA /varsupsetneq N: superset, not eq, var +Vvdash isoamsr 8874 22AA /Vvdash R: triple vertical, dash +vzigzag isoamso 58091 E2EB vertical zig-zag line + + ------------------------------------------------------------------------ + +W A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Wcirc isolat2 372 0174 =capital W, circumflex accent +wcirc isolat2 373 0175 =small w, circumflex accent +wedbar isoamsb 57957 E265 wedge, bar below +Wedge mmlalias 8896 22C0 alias ISOAMSB xwedge +wedge mmlalias 8743 2227 alias ISOTECH and +wedgeq isotech 8793 2259 /wedgeq R: corresponds to (wedge, equals) +weierp isoamso 8472 2118 /wp - Weierstrass p +Wfr isomfrk 58742 E576 /frak W, upper case w +wfr isomfrk 58774 E596 /frak w, lower case w +Wopf isomopf 58646 E516 /Bbb W, open face W + +wp mmlalias 8472 2118 alias ISOAMSO weierp +wr mmlalias 8768 2240 alias ISOAMSB wreath +wreath isoamsb 8768 2240 /wr B: wreath product +Wscr isomscr 58678 E536 /scr W, script letter W +wscr isomscr 58710 E556 /scr w, script letter w + + ------------------------------------------------------------------------ + +X A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +xcap isoamsb 8898 22C2 /bigcap L: intersection operator +xcirc isoamsb 9711 25EF /bigcirc B: large circle +xcup isoamsb 8899 22C3 /bigcup L: union operator +xdtri isoamsb 9661 25BD /bigtriangledown B: big dn tri, open +Xfr isomfrk 58743 E577 /frak X, upper case x +xfr isomfrk 58775 E597 /frak x, lower case x +Xgr isogrk1 926 039E =capital Xi, Greek +xgr isogrk1 958 03BE =small xi, Greek +xhArr isoamsa 57858 E202 /Longleftrightarrow A: long l&r dbl arr +xharr isoamsa 57859 E203 /longleftrightarrow A: long l&r arr + +Xi isogrk3 926 039E /Xi capital Xi, Greek +xi isogrk3 958 03BE /xi small xi, Greek +xlArr isoamsa 57856 E200 /Longleftarrow A: long l dbl arrow +xlarr isoamsa 57857 E201 /longleftarrow A: long left arrow +xmap isoamsa 57864 E208 /longmapsto A: +xnis isotech 58275 E3A3 large contains, vertical bar on horizontal stroke +xodot isoamsb 8857 2299 /bigodot L: circle dot operator +Xopf isomopf 58647 E517 /Bbb X, open face X +xoplus isoamsb 8853 2295 /bigoplus L: circle plus operator +xotime isoamsb 8855 2297 /bigotimes L: circle times operator + +xrArr isoamsa 57860 E204 /Longrightarrow A: long rt dbl arr +xrarr isoamsa 57861 E205 /longrightarrow A: long right arrow +Xscr isomscr 58679 E537 /scr X, script letter X +xscr isomscr 58711 E557 /scr x, script letter x +xsqcup isoamsb 8852 2294 /bigsqcup L: square union operator +xuplus isoamsb 8846 228E /biguplus L: +xutri isoamsb 9651 25B3 /bigtriangleup B: big up tri, open +xvee isoamsb 8897 22C1 /bigvee L: logical and operator +xwedge isoamsb 8896 22C0 /bigwedge L: logical or operator + + ------------------------------------------------------------------------ + +Y A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Yacute isolat1 221 00DD =capital Y, acute accent +yacute isolat1 253 00FD =small y, acute accent +YAcy isocyr1 1071 042F =capital YA, Cyrillic +yacy isocyr1 1103 044F =small ya, Cyrillic +Ycirc isolat2 374 0176 =capital Y, circumflex accent +ycirc isolat2 375 0177 =small y, circumflex accent +Ycy isocyr1 1067 042B =capital YERU, Cyrillic +ycy isocyr1 1099 044B =small yeru, Cyrillic +yen isonum 165 00A5 /yen =yen sign +Yfr isomfrk 58744 E578 /frak Y, upper case y + +yfr isomfrk 58776 E598 /frak y, lower case y +YIcy isocyr2 1031 0407 =capital YI, Ukrainian +yicy isocyr2 1111 0457 =small yi, Ukrainian +Yopf isomopf 58648 E518 /Bbb Y, open face Y +Yscr isomscr 58680 E538 /scr Y, script letter Y +yscr isomscr 58712 E558 /scr y, script letter y +YUcy isocyr1 1070 042E =capital YU, Cyrillic +yucy isocyr1 1102 044E =small yu, Cyrillic +Yuml isolat2 376 0178 =capital Y, dieresis or umlaut mark +yuml isolat1 255 00FF =small y, dieresis or umlaut mark + + ------------------------------------------------------------------------ + +Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +Character Name Group Code Description +========================= ========= ========== ========================================== +Zacute isolat2 377 0179 =capital Z, acute accent +zacute isolat2 378 017A =small z, acute accent +Zcaron isolat2 381 017D =capital Z, caron +zcaron isolat2 382 017E =small z, caron +Zcy isocyr1 1047 0417 =capital ZE, Cyrillic +zcy isocyr1 1079 0437 =small ze, Cyrillic +Zdot isolat2 379 017B =capital Z, dot above +zdot isolat2 380 017C =small z, dot above +ZeroWidthSpace mmlextra 8203 200B zero width space +zeta isogrk3 950 03B6 /zeta small zeta, Greek + +Zfr isomfrk 58745 E579 /frak Z, upper case z +zfr isomfrk 58777 E599 /frak z, lower case z +Zgr isogrk1 918 0396 =capital Zeta, Greek +zgr isogrk1 950 03B6 =small zeta, Greek +ZHcy isocyr1 1046 0416 =capital ZHE, Cyrillic +zhcy isocyr1 1078 0436 =small zhe, Cyrillic +zigrarr isoamsa 57924 E244 right zig-zag arrow +Zopf isomopf 8484 2124 /Bbb Z, open face Z +Zscr isomscr 58681 E539 /scr Z, script letter Z +zscr isomscr 58713 E559 /scr z, script letter z diff --git a/mozilla/layout/mathml/tools/bycodes.txt b/mozilla/layout/mathml/tools/bycodes.txt new file mode 100644 index 00000000000..2166dee9997 --- /dev/null +++ b/mozilla/layout/mathml/tools/bycodes.txt @@ -0,0 +1,2523 @@ + Up: Chapter 6 Next: Alphabetically REC-MathML-19980407; revised 19990707 + ------------------------------------------------------------------------ + +Printing MathML Character Entities ordered by Unicode + +Based on ISO 9573-13 extended with aliases + +00 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +0009 9 Tab mmlextra tabulator stop; horizontal tabulation +000A 10 NewLine mmlextra force a line break; line feed +0021 33 excl isonum =exclamation mark +0022 34 quot isonum =quotation mark +0023 35 num isonum =number sign +0024 36 dollar isonum =dollar sign +0025 37 percnt isonum =percent sign +0026 38 amp isonum =ampersand +0027 39 apos isonum =apostrophe +0028 40 lpar isonum O: =left parenthesis + +0029 41 rpar isonum C: =right parenthesis +002A 42 ast isonum /ast B: =asterisk +002A 42 midast isoamsb /ast B: asterisk +002B 43 plus isonum =plus sign B: +002C 44 comma isonum P: =comma +002E 46 period isonum =full stop, period +002F 47 sol isonum =solidus +003A 58 colon isonum /colon P: +003B 59 semi isonum =semicolon P: +003C 60 lt isonum =less-than sign R: + +003D 61 equals isonum =equals sign R: +003E 62 gt isonum =greater-than sign R: +003F 63 quest isonum =question mark +0040 64 commat isonum =commercial at +005B 91 lbrack mmlalias alias ISONUM lsqb +005B 91 lsqb isonum /lbrack O: =left square bracket +005C 92 bsol isonum /backslash =reverse solidus +005D 93 rbrack mmlalias alias ISONUM rsqb +005D 93 rsqb isonum /rbrack C: =right square bracket +005E 94 circ isodia circumflex accent + +005F 95 lowbar isonum =low line +0060 96 DiacriticalGrave mmlalias alias ISODIA grave +0060 96 grave isodia =grave accent +007B 123 lbrace mmlalias alias ISONUM lcub +007B 123 lcub isonum /lbrace O: =left curly bracket +007C 124 verbar isonum /vert =vertical bar +007C 124 vert mmlalias alias ISONUM verbar +007D 125 rbrace mmlalias alias ISONUM rcub +007D 125 rcub isonum /rbrace C: =right curly bracket +00A0 160 nbsp isonum =no break (required) space + +00A1 161 iexcl isonum =inverted exclamation mark +00A2 162 cent isonum =cent sign +00A3 163 pound isonum =pound sign +00A4 164 curren isonum =general currency sign +00A5 165 yen isonum /yen =yen sign +00A6 166 brvbar isonum =broken (vertical) bar +00A7 167 sect isonum =section sign +00A8 168 Dot isotech dieresis or umlaut mark +00A8 168 DoubleDot mmlalias alias ISODIA die +00A8 168 die isodia =dieresis + +00A8 168 uml isodia =umlaut mark +00A9 169 copy isonum =copyright sign +00AA 170 ordf isonum =ordinal indicator, feminine +00AB 171 laquo isonum =angle quotation mark, left +00AC 172 not isonum /neg /lnot =not sign +00AD 173 shy isonum =soft hyphen +00AE 174 circledR mmlalias alias ISONUM reg +00AE 174 reg isonum /circledR =registered sign +00AF 175 OverBar mmlextra over bar +00AF 175 macr isodia =macron + +00B0 176 deg isonum =degree sign +00B1 177 PlusMinus mmlalias alias ISONUM plusmn +00B1 177 plusmn isonum /pm B: =plus-or-minus sign +00B1 177 pm mmlalias alias ISONUM plusmn +00B2 178 sup2 isonum =superscript two +00B3 179 sup3 isonum =superscript three +00B4 180 DiacriticalAcute mmlalias alias ISODIA acute +00B4 180 acute isodia =acute accent +00B5 181 micro isonum =micro sign +00B6 182 para isonum =pilcrow (paragraph sign) + +00B7 183 CenterDot mmlalias alias ISONUM middot +00B7 183 centerdot mmlalias alias ISONUM middot +00B7 183 middot isonum /centerdot B: =middle dot +00B8 184 Cedilla mmlalias alias ISODIA cedil +00B8 184 cedil isodia =cedilla +00B9 185 sup1 isonum =superscript one +00BA 186 ordm isonum =ordinal indicator, masculine +00BB 187 raquo isonum =angle quotation mark, right +00BC 188 frac14 isonum =fraction one-quarter +00BD 189 frac12 isonum =fraction one-half + +00BD 189 half isonum =fraction one-half +00BE 190 frac34 isonum =fraction three-quarters +00BF 191 iquest isonum =inverted question mark +00C0 192 Agrave isolat1 =capital A, grave accent +00C1 193 Aacute isolat1 =capital A, acute accent +00C2 194 Acirc isolat1 =capital A, circumflex accent +00C3 195 Atilde isolat1 =capital A, tilde +00C4 196 Auml isolat1 =capital A, dieresis or umlaut mark +00C5 197 Aring isolat1 =capital A, ring +00C6 198 AElig isolat1 =capital AE diphthong (ligature) + +00C7 199 Ccedil isolat1 =capital C, cedilla +00C8 200 Egrave isolat1 =capital E, grave accent +00C9 201 Eacute isolat1 =capital E, acute accent +00CA 202 Ecirc isolat1 =capital E, circumflex accent +00CB 203 Euml isolat1 =capital E, dieresis or umlaut mark +00CC 204 Igrave isolat1 =capital I, grave accent +00CD 205 Iacute isolat1 =capital I, acute accent +00CE 206 Icirc isolat1 =capital I, circumflex accent +00CF 207 Iuml isolat1 =capital I, dieresis or umlaut mark +00D0 208 ETH isolat1 =capital Eth, Icelandic + +00D1 209 Ntilde isolat1 =capital N, tilde +00D2 210 Ograve isolat1 =capital O, grave accent +00D3 211 Oacute isolat1 =capital O, acute accent +00D4 212 Ocirc isolat1 =capital O, circumflex accent +00D5 213 Otilde isolat1 =capital O, tilde +00D6 214 Ouml isolat1 =capital O, dieresis or umlaut mark +00D7 215 times isonum /times B: =multiply sign +00D8 216 Oslash isolat1 =capital O, slash +00D9 217 Ugrave isolat1 =capital U, grave accent +00DA 218 Uacute isolat1 =capital U, acute accent + +00DB 219 Ucirc isolat1 =capital U, circumflex accent +00DC 220 Uuml isolat1 =capital U, dieresis or umlaut mark +00DD 221 Yacute isolat1 =capital Y, acute accent +00DE 222 THORN isolat1 =capital THORN, Icelandic +00DF 223 szlig isolat1 =small sharp s, German (sz ligature) +00E0 224 agrave isolat1 =small a, grave accent +00E1 225 aacute isolat1 =small a, acute accent +00E2 226 acirc isolat1 =small a, circumflex accent +00E3 227 atilde isolat1 =small a, tilde +00E4 228 auml isolat1 =small a, dieresis or umlaut mark + +00E5 229 aring isolat1 =small a, ring +00E6 230 aelig isolat1 =small ae diphthong (ligature) +00E7 231 ccedil isolat1 =small c, cedilla +00E8 232 egrave isolat1 =small e, grave accent +00E9 233 eacute isolat1 =small e, acute accent +00EA 234 ecirc isolat1 =small e, circumflex accent +00EB 235 euml isolat1 =small e, dieresis or umlaut mark +00EC 236 igrave isolat1 =small i, grave accent +00ED 237 iacute isolat1 =small i, acute accent +00EE 238 icirc isolat1 =small i, circumflex accent + +00EF 239 iuml isolat1 =small i, dieresis or umlaut mark +00F0 240 eth isolat1 =small eth, Icelandic +00F1 241 ntilde isolat1 =small n, tilde +00F2 242 ograve isolat1 =small o, grave accent +00F3 243 oacute isolat1 =small o, acute accent +00F4 244 ocirc isolat1 =small o, circumflex accent +00F5 245 otilde isolat1 =small o, tilde +00F6 246 ouml isolat1 =small o, dieresis or umlaut mark +00F7 247 div mmlalias alias ISONUM divide +00F7 247 divide isonum /div B: =divide sign + +00F8 248 oslash isolat1 latin small letter o with stroke +00F9 249 ugrave isolat1 =small u, grave accent +00FA 250 uacute isolat1 =small u, acute accent +00FB 251 ucirc isolat1 =small u, circumflex accent +00FC 252 uuml isolat1 =small u, dieresis or umlaut mark +00FD 253 yacute isolat1 =small y, acute accent +00FE 254 thorn isolat1 =small thorn, Icelandic +00FF 255 yuml isolat1 =small y, dieresis or umlaut mark + +01 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +0100 256 Amacr isolat2 =capital A, macron +0101 257 amacr isolat2 =small a, macron +0102 258 Abreve isolat2 =capital A, breve +0103 259 abreve isolat2 =small a, breve +0104 260 Aogon isolat2 =capital A, ogonek +0105 261 aogon isolat2 =small a, ogonek +0106 262 Cacute isolat2 =capital C, acute accent +0107 263 cacute isolat2 =small c, acute accent +0108 264 Ccirc isolat2 =capital C, circumflex accent +0109 265 ccirc isolat2 =small c, circumflex accent + +010A 266 Cdot isolat2 =capital C, dot above +010B 267 cdot isolat2 =small c, dot above +010C 268 Ccaron isolat2 =capital C, caron +010D 269 ccaron isolat2 =small c, caron +010E 270 Dcaron isolat2 =capital D, caron +010F 271 dcaron isolat2 =small d, caron +0110 272 Dstrok isolat2 =capital D, stroke +0111 273 dstrok isolat2 =small d, stroke +0112 274 Emacr isolat2 =capital E, macron +0113 275 emacr isolat2 =small e, macron + +0116 278 Edot isolat2 =capital E, dot above +0117 279 edot isolat2 =small e, dot above +0118 280 Eogon isolat2 =capital E, ogonek +0119 281 eogon isolat2 =small e, ogonek +011A 282 Ecaron isolat2 =capital E, caron +011B 283 ecaron isolat2 =small e, caron +011C 284 Gcirc isolat2 =capital G, circumflex accent +011D 285 gcirc isolat2 =small g, circumflex accent +011E 286 Gbreve isolat2 =capital G, breve +011F 287 gbreve isolat2 =small g, breve + +0120 288 Gdot isolat2 =capital G, dot above +0121 289 gdot isolat2 =small g, dot above +0122 290 Gcedil isolat2 =capital G, cedilla +0124 292 Hcirc isolat2 =capital H, circumflex accent +0125 293 hcirc isolat2 =small h, circumflex accent +0126 294 Hstrok isolat2 =capital H, stroke +0127 295 hstrok isolat2 =small h, stroke +0128 296 Itilde isolat2 =capital I, tilde +0129 297 itilde isolat2 =small i, tilde +012A 298 Imacr isolat2 =capital I, macron + +012B 299 imacr isolat2 =small i, macron +012E 302 Iogon isolat2 =capital I, ogonek +012F 303 iogon isolat2 =small i, ogonek +0130 304 Idot isolat2 =capital I, dot above +0131 305 imath isoamso /imath - small i, no dot +0131 305 inodot isolat2 =small i without dot +0132 306 IJlig isolat2 =capital IJ ligature +0133 307 ijlig isolat2 =small ij ligature +0134 308 Jcirc isolat2 =capital J, circumflex accent +0135 309 jcirc isolat2 =small j, circumflex accent + +0136 310 Kcedil isolat2 =capital K, cedilla +0137 311 kcedil isolat2 =small k, cedilla +0138 312 kgreen isolat2 =small k, Greenlandic +0139 313 Lacute isolat2 =capital L, acute accent +013A 314 lacute isolat2 =small l, acute accent +013B 315 Lcedil isolat2 =capital L, cedilla +013C 316 lcedil isolat2 =small l, cedilla +013D 317 Lcaron isolat2 =capital L, caron +013E 318 lcaron isolat2 =small l, caron +013F 319 Lmidot isolat2 =capital L, middle dot + +0140 320 lmidot isolat2 =small l, middle dot +0141 321 Lstrok isolat2 =capital L, stroke +0142 322 lstrok isolat2 =small l, stroke +0143 323 Nacute isolat2 =capital N, acute accent +0144 324 nacute isolat2 =small n, acute accent +0145 325 Ncedil isolat2 =capital N, cedilla +0146 326 ncedil isolat2 =small n, cedilla +0147 327 Ncaron isolat2 =capital N, caron +0148 328 ncaron isolat2 =small n, caron +0149 329 napos isolat2 =small n, apostrophe + +014A 330 ENG isolat2 =capital ENG, Lapp +014B 331 eng isolat2 =small eng, Lapp +014C 332 Omacr isolat2 =capital O, macron +014D 333 omacr isolat2 =small o, macron +0150 336 Odblac isolat2 =capital O, double acute accent +0151 337 odblac isolat2 =small o, double acute accent +0152 338 OElig isolat2 =capital OE ligature +0153 339 oelig isolat2 =small oe ligature +0154 340 Racute isolat2 =capital R, acute accent +0155 341 racute isolat2 =small r, acute accent + +0156 342 Rcedil isolat2 =capital R, cedilla +0157 343 rcedil isolat2 =small r, cedilla +0158 344 Rcaron isolat2 =capital R, caron +0159 345 rcaron isolat2 =small r, caron +015A 346 Sacute isolat2 =capital S, acute accent +015B 347 sacute isolat2 =small s, acute accent +015C 348 Scirc isolat2 =capital S, circumflex accent +015D 349 scirc isolat2 =small s, circumflex accent +015E 350 Scedil isolat2 =capital S, cedilla +015F 351 scedil isolat2 =small s, cedilla + +0160 352 Scaron isolat2 =capital S, caron +0161 353 scaron isolat2 =small s, caron +0162 354 Tcedil isolat2 =capital T, cedilla +0163 355 tcedil isolat2 =small t, cedilla +0164 356 Tcaron isolat2 =capital T, caron +0165 357 tcaron isolat2 =small t, caron +0166 358 Tstrok isolat2 =capital T, stroke +0167 359 tstrok isolat2 =small t, stroke +0168 360 Utilde isolat2 =capital U, tilde +0169 361 utilde isolat2 =small u, tilde + +016A 362 Umacr isolat2 =capital U, macron +016B 363 umacr isolat2 =small u, macron +016C 364 Ubreve isolat2 =capital U, breve +016D 365 ubreve isolat2 =small u, breve +016E 366 Uring isolat2 =capital U, ring +016F 367 uring isolat2 =small u, ring +0170 368 Udblac isolat2 =capital U, double acute accent +0171 369 udblac isolat2 =small u, double acute accent +0172 370 Uogon isolat2 =capital U, ogonek +0173 371 uogon isolat2 =small u, ogonek + +0174 372 Wcirc isolat2 =capital W, circumflex accent +0175 373 wcirc isolat2 =small w, circumflex accent +0176 374 Ycirc isolat2 =capital Y, circumflex accent +0177 375 ycirc isolat2 =small y, circumflex accent +0178 376 Yuml isolat2 =capital Y, dieresis or umlaut mark +0179 377 Zacute isolat2 =capital Z, acute accent +017A 378 zacute isolat2 =small z, acute accent +017B 379 Zdot isolat2 =capital Z, dot above +017C 380 zdot isolat2 =small z, dot above +017D 381 Zcaron isolat2 =capital Z, caron + +017E 382 zcaron isolat2 =small z, caron +0192 402 fnof isotech function of (italic small f) +01F5 501 gacute isolat2 =small g, acute accent + +02 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +025B 603 epsiv isogrk3 /varepsilon +025B 603 varepsilon mmlalias alias ISOGRK3 epsiv +02C7 711 Hacek mmlalias alias ISODIA caron +02C7 711 caron isodia =caron +02D8 728 Breve mmlalias alias ISODIA breve +02D8 728 breve isodia =breve +02D9 729 DiacriticalDot mmlalias alias ISODIA dot +02D9 729 dot isodia =dot above +02DA 730 ring isodia =ring +02DB 731 ogon isodia =ogonek + +02DC 732 DiacriticalTilde mmlalias alias ISODIA tilde +02DC 732 tilde isodia =tilde +02DD 733 DiacriticalDoubleAcute mmlalias alias ISODIA dblac +02DD 733 dblac isodia =double acute accent + +03 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +0302 770 Hat mmlalias circumflex accent (circ in ISODIA) +0311 785 DownBreve mmlextra breve, inverted (non-spacing) +0332 818 UnderBar mmlextra combining low line +0386 902 Aacgr isogrk2 =capital Alpha, accent, Greek +0388 904 Eacgr isogrk2 =capital Epsilon, accent, Greek +0389 905 EEacgr isogrk2 =capital Eta, accent, Greek +038A 906 Iacgr isogrk2 =capital Iota, accent, Greek +038C 908 Oacgr isogrk2 =capital Omicron, accent, Greek +038E 910 Uacgr isogrk2 =capital Upsilon, accent, Greek +038F 911 OHacgr isogrk2 =capital Omega, accent, Greek + +0390 912 idiagr isogrk2 =small iota, dieresis, accent, Greek +0391 913 Agr isogrk1 =capital Alpha, Greek +0392 914 Bgr isogrk1 =capital Beta, Greek +0393 915 Gamma isogrk3 /Gamma capital Gamma, Greek +0393 915 Ggr isogrk1 =capital Gamma, Greek +0394 916 Delta isogrk3 /Delta capital Delta, Greek +0394 916 Dgr isogrk1 =capital Delta, Greek +0395 917 Egr isogrk1 =capital Epsilon, Greek +0396 918 Zgr isogrk1 =capital Zeta, Greek +0397 919 EEgr isogrk1 =capital Eta, Greek + +0398 920 THgr isogrk1 =capital Theta, Greek +0398 920 Theta isogrk3 /Theta capital Theta, Greek +0399 921 Igr isogrk1 =capital Iota, Greek +039A 922 Kgr isogrk1 =capital Kappa, Greek +039B 923 Lambda isogrk3 /Lambda capital Lambda, Greek +039B 923 Lgr isogrk1 =capital Lambda, Greek +039C 924 Mgr isogrk1 =capital Mu, Greek +039D 925 Ngr isogrk1 =capital Nu, Greek +039E 926 Xgr isogrk1 =capital Xi, Greek +039E 926 Xi isogrk3 /Xi capital Xi, Greek + +039F 927 Ogr isogrk1 =capital Omicron, Greek +03A0 928 Pgr isogrk1 =capital Pi, Greek +03A0 928 Pi isogrk3 /Pi capital Pi, Greek +03A1 929 Rgr isogrk1 =capital Rho, Greek +03A3 931 Sgr isogrk1 =capital Sigma, Greek +03A3 931 Sigma isogrk3 /Sigma capital Sigma, Greek +03A4 932 Tgr isogrk1 =capital Tau, Greek +03A5 933 Ugr isogrk1 =capital Upsilon, Greek +03A6 934 PHgr isogrk1 =capital Phi, Greek +03A6 934 Phi isogrk3 /Phi capital Phi, Greek + +03A7 935 KHgr isogrk1 =capital Chi, Greek +03A8 936 PSgr isogrk1 =capital Psi, Greek +03A8 936 Psi isogrk3 /Psi capital Psi, Greek +03A9 937 OHgr isogrk1 =capital Omega, Greek +03A9 937 Omega isogrk3 /Omega capital Omega, Greek +03AA 938 Idigr isogrk2 =capital Iota, dieresis, Greek +03AB 939 Udigr isogrk2 =capital Upsilon, dieresis, Greek +03AC 940 aacgr isogrk2 =small alpha, accent, Greek +03AD 941 eacgr isogrk2 =small epsilon, accent, Greek +03AE 942 eeacgr isogrk2 =small eta, accent, Greek + +03AF 943 iacgr isogrk2 =small iota, accent, Greek +03B0 944 udiagr isogrk2 =small upsilon, dieresis, accent, Greek +03B1 945 agr isogrk1 =small alpha, Greek +03B1 945 alpha isogrk3 /alpha small alpha, Greek +03B2 946 beta isogrk3 /beta small beta, Greek +03B2 946 bgr isogrk1 =small beta, Greek +03B3 947 gamma isogrk3 /gamma small gamma, Greek +03B3 947 ggr isogrk1 =small gamma, Greek +03B4 948 delta isogrk3 /delta small delta, Greek +03B4 948 dgr isogrk1 =small delta, Greek + +03B5 949 egr isogrk1 =small epsilon, Greek +03B5 949 epsi isogrk3 /straightepsilon, small epsilon, Greek +03B5 949 straightepsilon mmlalias alias ISOGRK3 epsi +03B6 950 zeta isogrk3 /zeta small zeta, Greek +03B6 950 zgr isogrk1 =small zeta, Greek +03B7 951 eegr isogrk1 =small eta, Greek +03B7 951 eta isogrk3 /eta small eta, Greek +03B8 952 theta isogrk3 /theta straight theta, small theta, Greek +03B8 952 thgr isogrk1 =small theta, Greek +03B9 953 igr isogrk1 =small iota, Greek + +03B9 953 iota isogrk3 /iota small iota, Greek +03BA 954 kappa isogrk3 /kappa small kappa, Greek +03BA 954 kgr isogrk1 =small kappa, Greek +03BB 955 lambda isogrk3 /lambda small lambda, Greek +03BB 955 lgr isogrk1 =small lambda, Greek +03BC 956 mgr isogrk1 =small mu, Greek +03BC 956 mu isogrk3 /mu small mu, Greek +03BD 957 ngr isogrk1 =small nu, Greek +03BD 957 nu isogrk3 /nu small nu, Greek +03BE 958 xgr isogrk1 =small xi, Greek + +03BE 958 xi isogrk3 /xi small xi, Greek +03BF 959 ogr isogrk1 =small omicron, Greek +03C0 960 pgr isogrk1 =small pi, Greek +03C0 960 pi isogrk3 /pi small pi, Greek +03C1 961 rgr isogrk1 =small rho, Greek +03C1 961 rho isogrk3 /rho small rho, Greek +03C2 962 sfgr isogrk1 =final small sigma, Greek +03C2 962 sigmav isogrk3 /varsigma +03C2 962 varsigma mmlalias alias ISOGRK3 sigmav +03C3 963 sgr isogrk1 =small sigma, Greek + +03C3 963 sigma isogrk3 /sigma small sigma, Greek +03C4 964 tau isogrk3 /tau small tau, Greek +03C4 964 tgr isogrk1 =small tau, Greek +03C5 965 ugr isogrk1 =small upsilon, Greek +03C5 965 upsi isogrk3 /upsilon small upsilon, Greek +03C5 965 upsilon mmlalias alias ISOGRK3 upsi +03C6 966 phgr isogrk1 =small phi, Greek +03C6 966 phi isogrk3 /straightphi - small phi, Greek +03C6 966 straightphi mmlalias alias ISOGRK3 phi +03C7 967 chi isogrk3 /chi small chi, Greek + +03C7 967 khgr isogrk1 =small chi, Greek +03C8 968 psgr isogrk1 =small psi, Greek +03C8 968 psi isogrk3 /psi small psi, Greek +03C9 969 ohgr isogrk1 =small omega, Greek +03C9 969 omega isogrk3 /omega small omega, Greek +03CA 970 idigr isogrk2 =small iota, dieresis, Greek +03CB 971 udigr isogrk2 =small upsilon, dieresis, Greek +03CC 972 oacgr isogrk2 =small omicron, accent, Greek +03CD 973 uacgr isogrk2 =small upsilon, accent, Greek +03CE 974 ohacgr isogrk2 =small omega, accent, Greek + +03D1 977 thetav isogrk3 /vartheta - curly or open theta +03D1 977 vartheta mmlalias alias ISOGRK3 thetav +03D2 978 Upsi isogrk3 /Upsilon capital Upsilon, Greek +03D2 978 Upsilon mmlalias alias ISOGRK3 Upsi +03D5 981 phiv isogrk3 /varphi - curly or open phi +03D5 981 varphi mmlalias alias ISOGRK3 phiv +03D6 982 piv isogrk3 /varpi +03D6 982 varpi mmlalias alias ISOGRK3 piv +03DC 988 Gammad isogrk3 capital digamma +03DC 988 digamma mmlalias alias ISOGRK3 gammad + +03DC 988 gammad isogrk3 /digamma +03F0 1008 kappav isogrk3 /varkappa +03F0 1008 varkappa mmlalias alias ISOGRK3 kappav +03F1 1009 rhov isogrk3 /varrho +03F1 1009 varrho mmlalias alias ISOGRK3 rhov + +04 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +0401 1025 IOcy isocyr1 =capital IO, Russian +0402 1026 DJcy isocyr2 =capital DJE, Serbian +0403 1027 GJcy isocyr2 =capital GJE Macedonian +0404 1028 Jukcy isocyr2 =capital JE, Ukrainian +0405 1029 DScy isocyr2 =capital DSE, Macedonian +0406 1030 Iukcy isocyr2 =capital I, Ukrainian +0407 1031 YIcy isocyr2 =capital YI, Ukrainian +0408 1032 Jsercy isocyr2 =capital JE, Serbian +0409 1033 LJcy isocyr2 =capital LJE, Serbian +040A 1034 NJcy isocyr2 =capital NJE, Serbian + +040B 1035 TSHcy isocyr2 =capital TSHE, Serbian +040C 1036 KJcy isocyr2 =capital KJE, Macedonian +040E 1038 Ubrcy isocyr2 =capital U, Byelorussian +040F 1039 DZcy isocyr2 =capital dze, Serbian +0410 1040 Acy isocyr1 =capital A, Cyrillic +0411 1041 Bcy isocyr1 =capital BE, Cyrillic +0412 1042 Vcy isocyr1 =capital VE, Cyrillic +0413 1043 Gcy isocyr1 =capital GHE, Cyrillic +0414 1044 Dcy isocyr1 =capital DE, Cyrillic +0415 1045 IEcy isocyr1 =capital IE, Cyrillic + +0416 1046 ZHcy isocyr1 =capital ZHE, Cyrillic +0417 1047 Zcy isocyr1 =capital ZE, Cyrillic +0418 1048 Icy isocyr1 =capital I, Cyrillic +0419 1049 Jcy isocyr1 =capital short I, Cyrillic +041A 1050 Kcy isocyr1 =capital KA, Cyrillic +041B 1051 Lcy isocyr1 =capital EL, Cyrillic +041C 1052 Mcy isocyr1 =capital EM, Cyrillic +041D 1053 Ncy isocyr1 =capital EN, Cyrillic +041E 1054 Ocy isocyr1 =capital O, Cyrillic +041F 1055 Pcy isocyr1 =capital PE, Cyrillic + +0420 1056 Rcy isocyr1 =capital ER, Cyrillic +0421 1057 Scy isocyr1 =capital ES, Cyrillic +0422 1058 Tcy isocyr1 =capital TE, Cyrillic +0423 1059 Ucy isocyr1 =capital U, Cyrillic +0424 1060 Fcy isocyr1 =capital EF, Cyrillic +0425 1061 KHcy isocyr1 =capital HA, Cyrillic +0426 1062 TScy isocyr1 =capital TSE, Cyrillic +0427 1063 CHcy isocyr1 =capital CHE, Cyrillic +0428 1064 SHcy isocyr1 =capital SHA, Cyrillic +0429 1065 SHCHcy isocyr1 =capital SHCHA, Cyrillic + +042A 1066 HARDcy isocyr1 =capital HARD sign, Cyrillic +042B 1067 Ycy isocyr1 =capital YERU, Cyrillic +042C 1068 SOFTcy isocyr1 =capital SOFT sign, Cyrillic +042D 1069 Ecy isocyr1 =capital E, Cyrillic +042E 1070 YUcy isocyr1 =capital YU, Cyrillic +042F 1071 YAcy isocyr1 =capital YA, Cyrillic +0430 1072 acy isocyr1 =small a, Cyrillic +0431 1073 bcy isocyr1 =small be, Cyrillic +0432 1074 vcy isocyr1 =small ve, Cyrillic +0433 1075 gcy isocyr1 =small ghe, Cyrillic + +0434 1076 dcy isocyr1 =small de, Cyrillic +0435 1077 iecy isocyr1 =small ie, Cyrillic +0436 1078 zhcy isocyr1 =small zhe, Cyrillic +0437 1079 zcy isocyr1 =small ze, Cyrillic +0438 1080 icy isocyr1 =small i, Cyrillic +0439 1081 jcy isocyr1 =small short i, Cyrillic +043A 1082 kcy isocyr1 =small ka, Cyrillic +043B 1083 lcy isocyr1 =small el, Cyrillic +043C 1084 mcy isocyr1 =small em, Cyrillic +043D 1085 ncy isocyr1 =small en, Cyrillic + +043E 1086 ocy isocyr1 =small o, Cyrillic +043F 1087 pcy isocyr1 =small pe, Cyrillic +0440 1088 rcy isocyr1 =small er, Cyrillic +0441 1089 scy isocyr1 =small es, Cyrillic +0442 1090 tcy isocyr1 =small te, Cyrillic +0443 1091 ucy isocyr1 =small u, Cyrillic +0444 1092 fcy isocyr1 =small ef, Cyrillic +0445 1093 khcy isocyr1 =small ha, Cyrillic +0446 1094 tscy isocyr1 =small tse, Cyrillic +0447 1095 chcy isocyr1 =small che, Cyrillic + +0448 1096 shcy isocyr1 =small sha, Cyrillic +0449 1097 shchcy isocyr1 =small shcha, Cyrillic +044A 1098 hardcy isocyr1 =small hard sign, Cyrillic +044B 1099 ycy isocyr1 =small yeru, Cyrillic +044C 1100 softcy isocyr1 =small soft sign, Cyrillic +044D 1101 ecy isocyr1 =small e, Cyrillic +044E 1102 yucy isocyr1 =small yu, Cyrillic +044F 1103 yacy isocyr1 =small ya, Cyrillic +0451 1105 iocy isocyr1 =small io, Russian +0452 1106 djcy isocyr2 =small dje, Serbian + +0453 1107 gjcy isocyr2 =small gje, Macedonian +0454 1108 jukcy isocyr2 =small je, Ukrainian +0455 1109 dscy isocyr2 =small dse, Macedonian +0456 1110 iukcy isocyr2 =small i, Ukrainian +0457 1111 yicy isocyr2 =small yi, Ukrainian +0458 1112 jsercy isocyr2 =small je, Serbian +0459 1113 ljcy isocyr2 =small lje, Serbian +045A 1114 njcy isocyr2 =small nje, Serbian +045B 1115 tshcy isocyr2 =small tshe, Serbian +045C 1116 kjcy isocyr2 =small kje Macedonian + +045E 1118 ubrcy isocyr2 =small u, Byelorussian +045F 1119 dzcy isocyr2 =small dze, Serbian + +20 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2002 8194 ensp isopub =en space (1/2-em) +2003 8195 emsp isopub =em space +2004 8196 emsp13 isopub =1/3-em space +2005 8197 emsp14 isopub =1/4-em space +2007 8199 numsp isopub =digit space (width of a number) +2008 8200 puncsp isopub =punctuation space (width of comma) +2009 8201 ThinSpace mmlalias space of width 3/18 em alias ISOPUB thinsp +2009 8201 thinsp isopub =thin space (1/6-em) +200A 8202 VeryThinSpace mmlalias space of width 1/18 em alias ISOPUB hairsp +200A 8202 hairsp isopub =hair space + +200B 8203 ZeroWidthSpace mmlextra zero width space +2010 8208 dash isopub =hyphen (true graphic) +2010 8208 hyphen isonum =hyphen +2013 8211 ndash isopub =en dash +2014 8212 mdash isopub =em dash +2015 8213 horbar isonum =horizontal bar +2016 8214 Verbar isotech /Vert dbl vertical bar +2016 8214 Vert mmlalias alias ISOTECH Verbar +2018 8216 OpenCurlyQuote mmlalias alias ISONUM lsquo +2018 8216 lsquo isonum =single quotation mark, left + +2019 8217 CloseCurlyQuote mmlalias alias ISONUM rsquo +2019 8217 rsquo isonum =single quotation mark, right +2019 8217 rsquor isopub rising single quote, right (high) +201A 8218 lsquor isopub =rising single quote, left (low) +201C 8220 OpenCurlyDoubleQuote mmlalias alias ISONUM ldquo +201C 8220 ldquo isonum =double quotation mark, left +201D 8221 CloseCurlyDoubleQuote mmlalias alias ISONUM rdquo +201D 8221 rdquo isonum =double quotation mark, right +201D 8221 rdquor isopub rising dbl quote, right (high) +201E 8222 ldquor isopub =rising dbl quote, left (low) + +2020 8224 dagger isoamsb /dagger B: dagger relation +2020 8224 dagger isopub /dagger B: =dagger +2021 8225 Dagger isoamsb /ddagger B: double dagger relation +2021 8225 Dagger isopub /ddagger B: =double dagger +2021 8225 ddagger mmlalias alias ISOPUB Dagger +2022 8226 bull isopub /bullet B: =round bullet, filled +2022 8226 bullet mmlalias alias ISOPUB bull +2025 8229 nldr isopub =double baseline dot (en leader) +2026 8230 hellip isopub =ellipsis (horizontal) +2026 8230 mldr isopub em leader + +2030 8240 permil isotech per thousand +2031 8241 pertenk isotech per 10 thousand +2032 8242 prime isotech /prime prime or minute +2033 8243 Prime isotech double prime or second +2034 8244 tprime isotech triple prime +2035 8245 backprime mmlalias alias ISOAMSO bprime +2035 8245 bprime isoamso /backprime - reverse prime +2041 8257 caret isopub =caret (insertion mark) +2043 8259 hybull isopub rectangle, filled (hyphen bullet) +20DB 8411 TripleDot mmlalias alias ISOTECH tdot + +20DB 8411 tdot isotech three dots above +20DC 8412 DotDot isotech four dots above + +21 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2102 8450 Copf isomopf /Bbb C, open face C +2105 8453 incare isopub =in-care-of symbol +210B 8459 Hscr isomscr /scr H, script letter H +210B 8459 hamilt isotech Hamiltonian (script capital H) +210C 8460 Hfr isomfrk /frak H, upper case h +210F 8463 hslash mmlalias alias ISOAMSO plankv +210F 8463 plankv isoamso /hslash - variant Planck's over 2pi +2110 8464 Iscr isomscr /scr I, script letter I +2111 8465 Ifr isomfrk /frak I, upper case i +2111 8465 Im mmlalias ISOAMSO image + +2111 8465 image isoamso /Im - imaginary +2112 8466 Lscr isomscr /scr L, script letter L +2112 8466 lagran isotech Lagrangian (script capital L) +2113 8467 ell isoamso /ell - cursive small l +2115 8469 Nopf isomopf /Bbb N, open face N +2116 8470 numero isocyr1 =numero sign +2117 8471 copysr isopub =sound recording copyright sign +2118 8472 weierp isoamso /wp - Weierstrass p +2118 8472 wp mmlalias alias ISOAMSO weierp +2119 8473 Popf isomopf /Bbb P, open face P + +211A 8474 Qopf isomopf /Bbb Q, open face Q +211C 8476 Re mmlalias ISOAMSO real +211C 8476 Rfr isomfrk /frak R, upper case r +211C 8476 real isoamso /Re - real +211D 8477 Ropf isomopf /Bbb R, open face R +211E 8478 rx isopub pharmaceutical prescription (Rx) +2122 8482 trade isonum =trade mark sign +2124 8484 Zopf isomopf /Bbb Z, open face Z +2126 8486 ohm isonum =ohm sign +2127 8487 mho isoamso /mho - conductance + +2129 8489 iiota isoamso inverted iota +212B 8491 angst isotech Angstrom capital A, ring +212C 8492 Bscr isomscr /scr B, script letter B +212C 8492 bernou isotech Bernoulli function (script capital B) +212F 8495 escr isomscr /scr e, script letter e +2130 8496 Escr isomscr /scr E, script letter E +2131 8497 Fscr isomscr /scr F, script letter F +2133 8499 Mscr isomscr /scr M, script letter M +2133 8499 phmmat isotech physics M-matrix (script capital M) +2134 8500 order isotech order of (script small o) + +2134 8500 oscr isomscr /scr o, script letter o +2135 8501 aleph isotech /aleph aleph, Hebrew +2136 8502 beth isoamso /beth - beth, Hebrew +2137 8503 gimel isoamso /gimel - gimel, Hebrew +2138 8504 daleth isoamso /daleth - daleth, Hebrew +2153 8531 frac13 isopub =fraction one-third +2154 8532 frac23 isopub =fraction two-thirds +2155 8533 frac15 isopub =fraction one-fifth +2156 8534 frac25 isopub =fraction two-fifths +2157 8535 frac35 isopub =fraction three-fifths + +2158 8536 frac45 isopub =fraction four-fifths +2159 8537 frac16 isopub =fraction one-sixth +215A 8538 frac56 isopub =fraction five-sixths +215B 8539 frac18 isonum =fraction one-eighth +215C 8540 frac38 isonum =fraction three-eighths +215D 8541 frac58 isonum =fraction five-eighths +215E 8542 frac78 isonum =fraction seven-eighths +2190 8592 LeftArrow mmlalias alias ISONUM larr +2190 8592 larr isonum /leftarrow /gets A: =leftward arrow +2190 8592 leftarrow mmlalias alias ISONUM larr + +2191 8593 UpArrow mmlalias alias ISONUM uarr +2191 8593 uarr isonum /uparrow A: =upward arrow +2191 8593 uparrow mmlalias alias ISONUM uarr +2192 8594 RightArrow mmlalias alias ISONUM rarr +2192 8594 rarr isonum /rightarrow /to A: =rightward arrow +2192 8594 rightarrow mmlalias alias ISONUM rarr +2193 8595 DownArrow mmlalias alias ISONUM darr +2193 8595 darr isonum /downarrow A: =downward arrow +2193 8595 downarrow mmlalias alias ISONUM darr +2194 8596 LeftRightArrow mmlalias alias ISOAMSA harr + +2194 8596 harr isoamsa /leftrightarrow A: l&r arrow +2194 8596 leftrightarrow mmlalias alias ISOAMSA harr +2195 8597 UpDownArrow mmlalias alias ISOAMSA varr +2195 8597 updownarrow mmlalias alias ISOAMSA varr +2195 8597 varr isoamsa /updownarrow A: up&down arrow +2196 8598 UpperLeftArrow mmlalias alias ISOAMSA nwarr +2196 8598 nwarr isoamsa /nwarrow A: NW pointing arrow +2196 8598 nwarrow mmlalias alias ISOAMSA nwarr +2197 8599 UpperRightArrow mmlalias alias ISOAMSA nearr +2197 8599 nearr isoamsa /nearrow A: NE pointing arrow + +2197 8599 nearrow mmlalias alias ISOAMSA nearr +2198 8600 LowerRightArrow mmlalias alias ISOAMSA searr +2198 8600 searr isoamsa /searrow A: SE pointing arrow +2198 8600 searrow mmlalias alias ISOAMSA searr +2199 8601 LowerLeftArrow mmlalias alias ISOAMSA swarr +2199 8601 swarr isoamsa /swarrow A: SW pointing arrow +2199 8601 swarrow mmlalias alias ISOAMSA swarr +219A 8602 nlarr isoamsa /nleftarrow A: not left arrow +219A 8602 nleftarrow mmlalias alias ISOAMSA nlarr +219B 8603 nrarr isoamsa /nrightarrow A: not right arrow + +219B 8603 nrightarrow mmlalias alias ISOAMSA nrarr +219E 8606 Larr isoamsa /twoheadleftarrow A: +219E 8606 twoheadleftarrow mmlalias alias ISOAMSA Larr +219F 8607 Uarr isoamsa up two-headed arrow +21A0 8608 Rarr isoamsa /twoheadrightarrow A: +21A0 8608 twoheadrightarrow mmlalias alias ISOAMSA Rarr +21A1 8609 Darr isoamsa down two-headed arrow +21A2 8610 larrtl isoamsa /leftarrowtail A: left arrow-tailed +21A2 8610 leftarrowtail mmlalias alias ISOAMSA larrtl +21A3 8611 rarrtl isoamsa /rightarrowtail A: rt arrow-tailed + +21A3 8611 ratail isoamsa right arrow-tail +21A3 8611 rightarrowtail mmlalias alias ISOAMSA rarrtl +21A4 8612 LeftTeeArrow mmlextra alias for mapstoleft +21A4 8612 mapstoleft mmlextra leftwards arrow from bar +21A5 8613 UpTeeArrow mmlextra Alias mapstoup +21A5 8613 mapstoup mmlextra upwards arrow from bar +21A6 8614 RightTeeArrow mmlalias alias ISOAMSA map +21A6 8614 map isoamsa /mapsto A: +21A6 8614 mapsto mmlalias alias ISOAMSA map +21A7 8615 DownTeeArrow mmlextra alias for mapstodown + +21A7 8615 mapstodown mmlextra downwards arrow from bar +21A9 8617 hookleftarrow mmlalias alias ISOAMSA larrhk +21A9 8617 larrhk isoamsa /hookleftarrow A: left arrow-hooked +21AA 8618 hookrightarrow mmlalias alias ISOAMSA rarrhk +21AA 8618 rarrhk isoamsa /hookrightarrow A: rt arrow-hooked +21AB 8619 larrlp isoamsa /looparrowleft A: left arrow-looped +21AB 8619 looparrowleft mmlalias alias ISOAMSA larrlp +21AC 8620 looparrowright mmlalias alias ISOAMSA rarrlp +21AC 8620 rarrlp isoamsa /looparrowright A: rt arrow-looped +21AD 8621 harrw isoamsa /leftrightsquigarrow A: l&r arr-wavy + +21AD 8621 leftrightsquigarrow mmlalias alias ISOAMSA harrw +21AE 8622 nharr isoamsa /nleftrightarrow A: not l&r arrow +21AE 8622 nleftrightarrow mmlalias alias ISOAMSA nharr +21B0 8624 Lsh mmlalias alias ISOAMSA lsh +21B0 8624 lsh isoamsa /Lsh A: +21B1 8625 Rsh mmlalias alias ISOAMSA rsh +21B1 8625 rsh isoamsa /Rsh A: +21B2 8626 ldsh isoamsa left down angled arrow +21B3 8627 rdsh isoamsa right down angled arrow +21B6 8630 cularr isoamsa /curvearrowleft A: left curved arrow + +21B6 8630 curvearrowleft mmlalias alias ISOAMSA cularr +21B7 8631 curarr isoamsa /curvearrowright A: rt curved arrow +21B7 8631 curvearrowright mmlalias alias ISOAMSA curarr +21BA 8634 circlearrowleft mmlalias alias ISOAMSA olarr +21BA 8634 olarr isoamsa /circlearrowleft A: l arr in circle +21BB 8635 circlearrowright mmlalias alias ISOAMSA orarr +21BB 8635 orarr isoamsa /circlearrowright A: r arr in circle +21BC 8636 LeftVector mmlalias alias ISOAMSA lharu +21BC 8636 leftharpoonup mmlalias alias ISOAMSA lharu +21BC 8636 lharu isoamsa /leftharpoonup A: left harpoon-up + +21BD 8637 DownLeftVector mmlalias alias ISOAMSA lhard +21BD 8637 leftharpoondown mmlalias alias ISOAMSA lhard +21BD 8637 lhard isoamsa /leftharpoondown A: l harpoon-down +21BE 8638 RightUpVector mmlalias alias ISOAMSA uharr +21BE 8638 uharr isoamsa /upharpoonright /restriction A: up harp-r +21BE 8638 upharpoonright mmlalias alias ISOAMSA uharr +21BF 8639 LeftUpVector mmlalias alias ISOAMSA uharl +21BF 8639 uharl isoamsa /upharpoonleft A: up harpoon-left +21BF 8639 upharpoonleft mmlalias alias ISOAMSA uharl +21C0 8640 RightVector mmlalias alias ISOAMSA rharu + +21C0 8640 rharu isoamsa /rightharpoonup A: rt harpoon-up +21C0 8640 rightharpoonup mmlalias alias ISOAMSA rharu +21C1 8641 DownRightVector mmlalias alias ISOAMSA rhard +21C1 8641 rhard isoamsa /rightharpoondown A: rt harpoon-down +21C1 8641 rightharpoondown mmlalias alias ISOAMSA rhard +21C2 8642 RightDownVector mmlalias alias ISOAMSA dharr +21C2 8642 dharr isoamsa /downharpoonright A: down harpoon-rt +21C2 8642 downharpoonright mmlalias alias ISOAMSA dharr +21C3 8643 LeftDownVector mmlalias alias ISOAMSA dharl +21C3 8643 dharl isoamsa /downharpoonleft A: dn harpoon-left + +21C3 8643 downharpoonleft mmlalias alias ISOAMSA dharl +21C4 8644 RightArrowLeftArrow mmlalias alias ISOAMSA rlarr +21C4 8644 rightleftarrows mmlalias alias ISOAMSA rlarr +21C4 8644 rlarr isoamsa /rightleftarrows A: r arr over l arr +21C5 8645 UpArrowDownArrow mmlalias alias ISOAMSA udarr +21C5 8645 udarr isoamsa up arrow, down arrow +21C6 8646 LeftArrowRightArrow mmlalias alias ISOAMSA lrarr +21C6 8646 leftrightarrows mmlalias alias ISOAMSA lrarr +21C6 8646 lrarr isoamsa /leftrightarrows A: l arr over r arr +21C7 8647 leftleftarrows mmlalias alias ISOAMSA llarr + +21C7 8647 llarr isoamsa /leftleftarrows A: two left arrows +21C8 8648 upuparrows mmlalias alias ISOAMSA uuarr +21C8 8648 uuarr isoamsa /upuparrows A: two up arrows +21C9 8649 rightrightarrows mmlalias alias ISOAMSA rrarr +21C9 8649 rrarr isoamsa /rightrightarrows A: two rt arrows +21CA 8650 ddarr isoamsa /downdownarrows A: two down arrows +21CA 8650 downdownarrows mmlalias alias ISOAMSA ddarr +21CB 8651 ReverseEquilibrium mmlalias alias ISOAMSA lrhar +21CB 8651 leftrightharpoons mmlalias alias ISOAMSA lrhar +21CB 8651 lrhar isoamsa /leftrightharpoons A: l harp over r + +21CC 8652 Equilibrium mmlalias alias ISOAMSA rlhar +21CC 8652 rightleftharpoons mmlalias alias ISOAMSA rlhar +21CC 8652 rlhar isoamsa /rightleftharpoons A: r harp over l +21CD 8653 nLeftarrow mmlalias alias ISOAMSA nlArr +21CD 8653 nlArr isoamsa /nLeftarrow A: not implied by +21CD 8653 nvlArr isoamsa not, vert, left double arrow +21CE 8654 nLeftrightarrow mmlalias alias ISOAMSA nhArr +21CE 8654 nhArr isoamsa /nLeftrightarrow A: not l&r dbl arr +21CE 8654 nvHarr isoamsa not, vert, left and right double arrow +21CF 8655 nRightarrow mmlalias alias ISOAMSA nrArr + +21CF 8655 nrArr isoamsa /nRightarrow A: not implies +21CF 8655 nvrArr isoamsa not, vert, right double arrow +21D0 8656 DoubleLeftArrow mmlalias alias ISOTECH lArr +21D0 8656 Leftarrow mmlalias alias ISOTECH lArr +21D0 8656 lArr isotech /Leftarrow A: is implied by +21D1 8657 DoubleUpArrow mmlalias alias ISOAMSA uArr +21D1 8657 Uparrow mmlalias alias ISOAMSA uArr +21D1 8657 uArr isoamsa /Uparrow A: up dbl arrow +21D2 8658 DoubleRightArrow mmlalias alias ISOTECH rArr +21D2 8658 Implies mmlalias alias ISOTECH rArr + +21D2 8658 Rightarrow mmlalias alias ISOTECH rArr +21D2 8658 rArr isotech /Rightarrow A: implies +21D3 8659 DoubleDownArrow mmlalias alias ISOAMSA dArr +21D3 8659 Downarrow mmlalias alias ISOAMSA dArr +21D3 8659 dArr isoamsa /Downarrow A: down dbl arrow +21D4 8660 DoubleLeftRightArrow mmlalias alias ISOAMSA hArr +21D4 8660 Leftrightarrow mmlalias alias ISOAMSA hArr +21D4 8660 hArr isoamsa /Leftrightarrow A: l&r dbl arrow +21D5 8661 DoubleUpDownArrow mmlalias alias ISOAMSA vArr +21D5 8661 Updownarrow mmlalias alias ISOAMSA vArr + +21D5 8661 vArr isoamsa /Updownarrow A: up&down dbl arrow +21D6 8662 nwArr isoamsa NW pointing dbl arrow +21D7 8663 neArr isoamsa NE pointing dbl arrow +21D8 8664 seArr isoamsa SE pointing dbl arrow +21D9 8665 swArr isoamsa SW pointing dbl arrow +21DA 8666 Lleftarrow mmlalias alias ISOAMSA lAarr +21DA 8666 lAarr isoamsa /Lleftarrow A: left triple arrow +21DB 8667 Rrightarrow mmlalias alias ISOAMSA rAarr +21DB 8667 rAarr isoamsa /Rrightarrow A: right triple arrow +21DD 8669 dzigrarr isoamsa right long zig-zag arrow + +21DD 8669 rarrw isoamsa /rightsquigarrow A: rt arrow-wavy +21DD 8669 rightsquigarrow mmlalias alias ISOAMSA rarrw +21E4 8676 LeftArrowBar mmlextra alias for larrb +21E4 8676 larrb mmlextra leftwards arrow to bar +21E5 8677 RightArrowBar mmlextra alias for rarrb +21E5 8677 rarrb mmlextra leftwards arrow to bar + +22 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2200 8704 ForAll mmlalias alias ISOTECH forall +2200 8704 forall isotech /forall for all +2201 8705 comp isoamso /complement - complement sign +2201 8705 complement mmlalias alias ISOAMSO comp +2202 8706 PartialD mmlalias alias ISOTECH part +2202 8706 part isotech /partial partial differential +2203 8707 Exists mmlalias alias ISOTECH exist +2203 8707 exist isotech /exists at least one exists +2204 8708 NotExists mmlalias alias ISOAMSO nexist +2204 8708 nexist isoamso /nexists - negated exists + +2204 8708 nexists mmlalias alias ISOAMSO nexist +2205 8709 emptyv isoamso /varnothing - circle, slash +2205 8709 varnothing mmlalias alias ISOAMSO emptyv +2207 8711 Del mmlalias alias ISOTECH nabla +2207 8711 nabla isotech /nabla del, Hamilton operator +2208 8712 Element mmlalias alias ISOTECH isinv +2208 8712 in mmlalias ISOTECH isin +2208 8712 isin isotech /in R: set membership +2208 8712 isinv isotech set membership, variant +2209 8713 NotElement mmlalias alias ISOTECH notin + +2209 8713 notin isotech /notin N: negated set membership +220B 8715 ReverseElement mmlalias alias ISOTECH niv +220B 8715 SuchThat mmlalias ISOTECH ni +220B 8715 ni isotech /ni /owns R: contains +220B 8715 niv isotech contains, variant +220C 8716 NotReverseElement mmlalias alias ISOTECH notniva +220C 8716 notni isotech negated contains +220C 8716 notniva isotech negated contains, variant +220F 8719 Product mmlextra alias for &prod +220F 8719 prod isoamsb /prod L: product operator + +2210 8720 Coproduct mmlalias alias ISOAMSB coprod +2210 8720 coprod isoamsb /coprod L: coproduct operator +2211 8721 Sum mmlalias alias ISOAMSB sum +2211 8721 sum isoamsb /sum L: summation operator +2212 8722 minus isotech B: minus sign +2213 8723 MinusPlus mmlalias alias ISOTECH mnplus +2213 8723 mnplus isotech /mp B: minus-or-plus sign +2213 8723 mp mmlalias alias ISOTECH mnplus +2214 8724 dotplus mmlalias alias ISOAMSB plusdo +2214 8724 plusdo isoamsb /dotplus B: plus sign, dot above + +2216 8726 Backslash mmlalias alias ISOAMSB setmn +2216 8726 setminus mmlalias alias ISOAMSB setmn +2216 8726 setmn isoamsb /setminus B: reverse solidus +2217 8727 lowast isotech low asterisk +2218 8728 SmallCircle mmlalias alias ISOTECH compfn +2218 8728 compfn isotech /circ B: composite function (small circle) +221A 8730 Sqrt mmlalias alias ISOTECH radic +221A 8730 radic isotech /surd radical +221D 8733 Proportional mmlalias alias ISOTECH prop +221D 8733 prop isotech /propto R: is proportional to + +221D 8733 propto mmlalias alias ISOTECH prop +221D 8733 varpropto mmlalias alias ISOAMSR vprop +221D 8733 vprop isoamsr /varpropto R: proportional, variant +221E 8734 infin isotech /infty infinity +221F 8735 angrt isotech right (90 degree) angle +2220 8736 ang isoamso /angle - angle +2220 8736 angle mmlalias alias ISOAMSO ang +2221 8737 angmsd isoamso /measuredangle - angle-measured +2221 8737 measuredangle mmlalias alias ISOAMSO angmsd +2222 8738 angsph isotech /sphericalangle angle-spherical + +2223 8739 VerticalBar mmlalias alias ISOAMSR mid +2223 8739 mid isoamsr /mid R: +2224 8740 NotVerticalBar mmlalias alias ISOAMSN nmid +2224 8740 nmid isoamsn /nmid +2225 8741 DoubleVerticalBar mmlalias alias ISOTECH par +2225 8741 par isotech /parallel R: parallel +2225 8741 parallel mmlalias alias ISOTECH par +2226 8742 NotDoubleVerticalBar mmlalias alias ISOAMSN npar +2226 8742 npar isoamsn /nparallel N: not parallel +2226 8742 nparallel mmlalias alias ISOAMSN npar + +2227 8743 and isotech /wedge /land B: logical and +2227 8743 wedge mmlalias alias ISOTECH and +2228 8744 or isotech /vee /lor B: logical or +2228 8744 vee mmlalias alias ISOTECH or +2229 8745 cap isotech /cap B: intersection +222A 8746 cup isotech /cup B: union or logical sum +222B 8747 Integral mmlalias alias ISOTECH int +222B 8747 int isotech /int L: integral operator +222C 8748 Int isotech double integral operator +222D 8749 iiint mmlalias alias ISOTECH tint + +222D 8749 tint isotech /iiint triple integral operator +222E 8750 ContourIntegral mmlalias alias ISOTECH conint +222E 8750 conint isotech /oint L: contour integral operator +222E 8750 oint mmlalias alias ISOTECH conint +222F 8751 Conint isotech double contour integral operator +222F 8751 DoubleContourIntegral mmlalias alias ISOTECH Conint +2230 8752 Cconint isotech triple contour integral operator +2231 8753 cwint isotech clockwise integral +2232 8754 ClockwiseContourIntegral mmlalias alias ISOTECH cwconint +2232 8754 cwconint isotech contour integral, clockwise + +2233 8755 CounterClockwiseContourIntegral mmlalias alias ISOTECH awconint +2233 8755 awconint isotech contour integral, anti-clockwise +2234 8756 Therefore mmlalias alias ISOTECH there4 +2234 8756 there4 isotech /therefore R: therefore +2234 8756 therefore mmlalias alias ISOTECH there4 +2235 8757 Because mmlalias alias ISOTECH becaus +2235 8757 becaus isotech /because R: because +2235 8757 because mmlalias alias ISOTECH becaus +2236 8758 ratio isoamsr /ratio +2237 8759 Colon isoamsr /Colon, two colons + +2237 8759 Proportion mmlalias alias ISOAMSR Colon +2238 8760 dotminus mmlalias alias ISOAMSB minusd +2238 8760 minusd isoamsb /dotminus B: minus sign, dot above +223A 8762 mDDot isoamsr minus with four dots, geometric properties +223B 8763 homtht isoamsr homothetic +223C 8764 Tilde mmlalias alias ISOTECH sim +223C 8764 sim isotech /sim R: similar +223D 8765 backsim mmlalias alias ISOAMSR bsim +223D 8765 bsim isoamsr /backsim R: reverse similar +223E 8766 mstpos isoamsr most positive + +2240 8768 VerticalTilde mmlalias alias ISOAMSB wreath +2240 8768 wr mmlalias alias ISOAMSB wreath +2240 8768 wreath isoamsb /wr B: wreath product +2241 8769 NotTilde mmlalias alias ISOAMSN nsim +2241 8769 nsim isoamsn /nsim N: not similar +2242 8770 EqualTilde mmlalias alias ISOAMSR esim +2242 8770 eqsim mmlalias alias ISOAMSR esim +2242 8770 esim isoamsr /esim R: equals, similar +2243 8771 TildeEqual mmlalias alias ISOTECH sime +2243 8771 sime isotech /simeq R: similar, equals + +2243 8771 simeq mmlalias alias ISOTECH sime +2244 8772 NotTildeEqual mmlalias alias ISOAMSN nsime +2244 8772 nsime isoamsn /nsimeq N: not similar, equals +2244 8772 nsimeq mmlalias alias ISOAMSN nsime +2245 8773 TildeFullEqual mmlalias alias ISOTECH cong +2245 8773 cong isotech /cong R: congruent with +2246 8774 simne isoamsn similar, not equals +2247 8775 NotTildeFullEqual mmlalias alias ISOAMSN ncong +2247 8775 ncong isoamsn /ncong N: not congruent with +2248 8776 TildeTilde mmlalias alias ISOTECH ap + +2248 8776 ap isotech /approx R: approximate +2248 8776 approx mmlalias alias ISOTECH ap +2249 8777 NotTildeTilde mmlalias alias ISOAMSN nap +2249 8777 nap isoamsn /napprox N: not approximate +2249 8777 napprox mmlalias alias ISOAMSN nap +224A 8778 apE isoamsr approximately equal or equal to +224A 8778 ape isoamsr /approxeq R: approximate, equals +224A 8778 approxeq mmlalias alias ISOAMSR ape +224B 8779 apid isoamsr approximately identical to +224C 8780 backcong mmlalias alias ISOAMSR bcong + +224C 8780 bcong isoamsr /backcong R: reverse congruent +224D 8781 CupCap mmlalias alias ISOAMSR asymp +224D 8781 asymp isoamsr /asymp R: asymptotically equal to +224E 8782 Bumpeq mmlalias alias ISOAMSR bump +224E 8782 HumpDownHump mmlalias alias ISOAMSR bump +224E 8782 bump isoamsr /Bumpeq R: bumpy equals +224F 8783 HumpEqual mmlalias alias ISOAMSR bumpe +224F 8783 bumpe isoamsr /bumpeq R: bumpy equals, equals +224F 8783 bumpeq mmlalias alias ISOAMSR bumpe +2250 8784 DotEqual mmlalias alias ISOAMSR esdot + +2250 8784 doteq mmlalias alias ISOAMSR esdot +2250 8784 esdot isoamsr /doteq R: equals, single dot above +2251 8785 doteqdot mmlalias alias ISOAMSR eDot +2251 8785 eDot isoamsr /doteqdot /Doteq R: eq, even dots +2252 8786 efDot isoamsr /fallingdotseq R: eq, falling dots +2252 8786 fallingdotseq mmlalias alias ISOAMSR efDot +2253 8787 erDot isoamsr /risingdotseq R: eq, rising dots +2253 8787 risingdotseq mmlalias alias ISOAMSR erDot +2254 8788 colone isoamsr /coloneq R: colon, equals +2254 8788 coloneq mmlalias alias ISOAMSR colone + +2255 8789 ecolon isoamsr /eqcolon R: equals, colon +2255 8789 eqcolon mmlalias alias ISOAMSR ecolon +2256 8790 ecir isoamsr /eqcirc R: circle on equals sign +2256 8790 eqcirc mmlalias alias ISOAMSR ecir +2257 8791 circeq mmlalias alias ISOAMSR cire +2257 8791 cire isoamsr /circeq R: circle, equals +2259 8793 wedgeq isotech /wedgeq R: corresponds to (wedge, equals) +225A 8794 veeeq isotech logical or, equals +225B 8795 easter isoamsr equal, asterisk above +225C 8796 triangleq mmlalias alias ISOAMSR trie + +225C 8796 trie isoamsr /triangleq R: triangle, equals +225F 8799 equest isoamsr /questeq R: equal with questionmark +225F 8799 questeq mmlalias alias ISOAMSR equest +2260 8800 NotEqual mmlalias alias ISOTECH ne +2260 8800 ne isotech /ne /neq R: not equal +2261 8801 Congruent mmlalias alias ISOTECH equiv +2261 8801 equiv isotech /equiv R: identical with +2262 8802 NotCongruent mmlalias alias ISOAMSN nequiv +2262 8802 nequiv isoamsn /nequiv N: not identical with +2264 8804 le isotech /leq /le R: less-than-or-equal + +2264 8804 leq mmlalias alias ISOTECH le +2265 8805 GreaterEqual mmlalias alias ISOTECH ge +2265 8805 ge isotech /geq /ge R: greater-than-or-equal +2265 8805 geq mmlalias alias ISOTECH ge +2266 8806 LessFullEqual mmlalias alias ISOAMSR lE +2266 8806 lE isoamsr /leqq R: less, double equals +2266 8806 leqq mmlalias alias ISOAMSR lE +2267 8807 GreaterFullEqual mmlalias alias ISOAMSR gE +2267 8807 gE isoamsr /geqq R: greater, double equals +2267 8807 geqq mmlalias alias ISOAMSR gE + +2268 8808 lnE isoamsn /lneqq N: less, not double equals +2268 8808 lne isoamsn /lneq N: less, not equals +2268 8808 lneq mmlalias alias ISOAMSN lne +2268 8808 lneqq mmlalias alias ISOAMSN lnE +2269 8809 gnE isoamsn /gneqq N: greater, not dbl equals +2269 8809 gne isoamsn /gneq N: greater, not equals +2269 8809 gneq mmlalias alias ISOAMSN gne +2269 8809 gneqq mmlalias alias ISOAMSN gnE +226A 8810 Lt isoamsr /ll R: double less-than sign +226A 8810 NestedLessLess mmlalias alias ISOAMSR Lt + +226A 8810 ll mmlalias alias ISOAMSR Lt +226B 8811 Gt isoamsr /gg R: dbl greater-than sign +226B 8811 NestedGreaterGreater mmlalias alias ISOAMSR Gt +226B 8811 gg mmlalias alias ISOAMSR Gt +226C 8812 between mmlalias alias ISOAMSR twixt +226C 8812 twixt isoamsr /between R: between +226D 8813 NotCupCap mmlextra alias for &nasymp; +226E 8814 NotLess mmlalias alias ISOAMSN nlt +226E 8814 nless mmlalias alias ISOAMSN nlt +226E 8814 nlt isoamsn /nless N: not less-than + +226E 8814 nvlt isoamsn not, vert, less-than +226F 8815 NotGreater mmlalias alias ISOAMSN ngt +226F 8815 ngt isoamsn /ngtr N: not greater-than +226F 8815 ngtr mmlalias alias ISOAMSN ngt +226F 8815 nvgt isoamsn not, vert, greater-than +2270 8816 NotGreaterFullEqual mmlalias alias ISOAMSN nlE +2270 8816 NotLessSlantEqual mmlalias alias ISOAMSN nles +2270 8816 nlE isoamsn /nleqq N: not less, dbl equals +2270 8816 nleqq mmlalias alias ISOAMSN nlE +2270 8816 nleqslant mmlalias alias ISOAMSN nles + +2270 8816 nles isoamsn /nleqslant N: not less-or-eq, slant +2270 8816 nvle isoamsn not, vert, less-than-or-equal +2271 8817 NotGreaterSlantEqual mmlalias alias ISOAMSN nges +2271 8817 ngE isoamsn /ngeqq N: not greater, dbl equals +2271 8817 ngeqq mmlalias alias ISOAMSN ngE +2271 8817 ngeqslant mmlalias alias ISOAMSN nges +2271 8817 nges isoamsn /ngeqslant N: not gt-or-eq, slanted +2271 8817 nvge isoamsn not, vert, greater-than-or-equal +2272 8818 LessTilde mmlalias alias ISOAMSR lsim +2272 8818 lap isoamsr /lessapprox R: less, approximate + +2272 8818 lessapprox mmlalias alias ISOAMSR lap +2272 8818 lesssim mmlalias alias ISOAMSR lsim +2272 8818 lsim isoamsr /lesssim R: less, similar +2273 8819 GreaterTilde mmlalias alias ISOAMSR gsim +2273 8819 gap isoamsr /gtrapprox R: greater, approximate +2273 8819 gsim isoamsr /gtrsim R: greater, similar +2273 8819 gtrapprox mmlalias alias ISOAMSR gap +2273 8819 gtrsim mmlalias alias ISOAMSR gsim +2274 8820 NotLessTilde mmlalias alias ISOAMSN nlsim +2274 8820 nlsim isoamsn not less, similar + +2275 8821 NotGreaterTilde mmlalias alias ISOAMSN ngsim +2275 8821 ngsim isoamsn not greater, similar +2276 8822 LessGreater mmlalias alias ISOAMSR lg +2276 8822 lessgtr mmlalias alias ISOAMSR lg +2276 8822 lg isoamsr /lessgtr R: less, greater +2277 8823 GreaterLess mmlalias alias ISOAMSR gl +2277 8823 gl isoamsr /gtrless R: greater, less +2277 8823 gtrless mmlalias alias ISOAMSR gl +2278 8824 NotLessGreater mmlalias alias ISOAMSN ntvlg +2278 8824 ntlg isoamsn not less, greater + +2279 8825 NotGreaterLess mmlalias alias ISOAMSN ntvgl +2279 8825 ntgl isoamsn not greater, less +227A 8826 Precedes mmlalias alias ISOAMSR pr +227A 8826 pr isoamsr /prec R: precedes +227A 8826 prec mmlalias alias ISOAMSR pr +227B 8827 Succeeds mmlalias alias ISOAMSR sc +227B 8827 sc isoamsr /succ R: succeeds +227B 8827 succ mmlalias alias ISOAMSR sc +227C 8828 PrecedesSlantEqual mmlalias alias ISOAMSR prcue +227C 8828 prcue isoamsr /preccurlyeq R: precedes, curly eq + +227C 8828 preccurlyeq mmlalias alias ISOAMSR prcue +227D 8829 SucceedsEqual mmlalias alias ISOAMSR sce +227D 8829 SucceedsSlantEqual mmlalias alias ISOAMSR sccue +227D 8829 sccue isoamsr /succcurlyeq R: succeeds, curly eq +227D 8829 sce isoamsr /succeq R: succeeds, equals +227D 8829 succcurlyeq mmlalias alias ISOAMSR sccue +227D 8829 succeq mmlalias alias ISOAMSR sce +227E 8830 PrecedesTilde mmlalias alias ISOAMSR prsim +227E 8830 prap isoamsr /precapprox R: precedes, approximate +227E 8830 precapprox mmlalias alias ISOAMSR prap + +227E 8830 precsim mmlalias alias ISOAMSR prsim +227E 8830 prsim isoamsr /precsim R: precedes, similar +227E 8830 scE isoamsr succeeds, dbl equals +227F 8831 SucceedsTilde mmlalias alias ISOAMSR scsim +227F 8831 scap isoamsr /succapprox R: succeeds, approximate +227F 8831 scsim isoamsr /succsim R: succeeds, similar +227F 8831 succapprox mmlalias alias ISOAMSR scap +227F 8831 succsim mmlalias alias ISOAMSR scsim +2280 8832 NotPrecedes mmlalias alias ISOAMSN npr +2280 8832 npr isoamsn /nprec N: not precedes + +2280 8832 nprec mmlalias alias ISOAMSN npr +2281 8833 NotSucceeds mmlalias alias ISOAMSN nsc +2281 8833 nsc isoamsn /nsucc N: not succeeds +2281 8833 nsucc mmlalias alias ISOAMSN nsc +2282 8834 sub isotech /subset R: subset or is implied by +2282 8834 subset mmlalias alias ISOTECH sub +2283 8835 Superset mmlalias alias ISOTECH sup +2283 8835 sup isotech /supset R: superset or implies +2283 8835 supset mmlalias alias ISOTECH sup +2284 8836 NotSubset mmlalias alias ISOAMSN vnsub + +2284 8836 nsub isoamsn not subset +2284 8836 nsubset mmlalias alias ISOAMSN vnsub +2284 8836 vnsub isoamsn /nsubset N: not subset, var +2285 8837 NotSuperset mmlalias alias ISOAMSN vnsup +2285 8837 nsup isoamsn not superset +2285 8837 nsupset mmlalias alias ISOAMSN vnsup +2285 8837 vnsup isoamsn /nsupset N: not superset, var +2286 8838 SubsetEqual mmlalias alias ISOTECH sube +2286 8838 subE isoamsr /subseteqq R: subset, dbl equals +2286 8838 sube isotech /subseteq R: subset, equals + +2286 8838 subseteq mmlalias alias ISOTECH sube +2286 8838 subseteqq mmlalias alias ISOAMSR subE +2287 8839 SupersetEqual mmlalias alias ISOTECH supe +2287 8839 supE isoamsr /supseteqq R: superset, dbl equals +2287 8839 supe isotech /supseteq R: superset, equals +2287 8839 supseteq mmlalias alias ISOTECH supe +2287 8839 supseteqq mmlalias alias ISOAMSR supE +2288 8840 NotSubsetEqual mmlalias alias ISOAMSN nsube +2288 8840 nsubE isoamsn /nsubseteqq N: not subset, dbl eq +2288 8840 nsube isoamsn /nsubseteq N: not subset, equals + +2288 8840 nsubseteq mmlalias alias ISOAMSN nsube +2288 8840 nsubseteqq mmlalias alias ISOAMSN nsubE +2289 8841 NotSupersetEqual mmlalias alias ISOAMSN nsupe +2289 8841 nsupE isoamsn /nsupseteqq N: not superset, dbl eq +2289 8841 nsupe isoamsn /nsupseteq N: not superset, equals +2289 8841 nsupseteq mmlalias alias ISOAMSN nsupe +2289 8841 nsupseteqq mmlalias alias ISOAMSN nsupE +228A 8842 subnE isoamsn /subsetneqq N: subset, not dbl eq +228A 8842 subne isoamsn /subsetneq N: subset, not equals +228A 8842 subsetneq mmlalias alias ISOAMSN subne + +228A 8842 subsetneqq mmlalias alias ISOAMSN subnE +228B 8843 supnE isoamsn /supsetneqq N: superset, not dbl eq +228B 8843 supne isoamsn /supsetneq N: superset, not equals +228B 8843 supsetneq mmlalias alias ISOAMSN supne +228B 8843 supsetneqq mmlalias alias ISOAMSN supnE +228D 8845 cupdot isoamsb union, with dot +228E 8846 UnionPlus mmlalias alias ISOAMSB uplus +228E 8846 biguplus mmlalias alias ISOAMSB xuplus +228E 8846 uplus isoamsb /uplus B: plus sign in union +228E 8846 xuplus isoamsb /biguplus L: + +228F 8847 SquareSubset mmlalias alias ISOAMSR sqsub +228F 8847 sqsub isoamsr /sqsubset R: square subset +228F 8847 sqsubset mmlalias alias ISOAMSR sqsub +2290 8848 SquareSuperset mmlalias alias ISOAMSR sqsup +2290 8848 sqsup isoamsr /sqsupset R: square superset +2290 8848 sqsupset mmlalias alias ISOAMSR sqsup +2291 8849 SquareSubsetEqual mmlalias alias ISOAMSR sqsube +2291 8849 sqsube isoamsr /sqsubseteq R: square subset, equals +2291 8849 sqsubseteq mmlalias alias ISOAMSR sqsube +2292 8850 SquareSupersetEqual mmlalias alias ISOAMSR sqsupe + +2292 8850 sqsupe isoamsr /sqsupseteq R: square superset, eq +2292 8850 sqsupseteq mmlalias alias ISOAMSR sqsupe +2293 8851 SquareIntersection mmlalias alias ISOAMSB sqcap +2293 8851 sqcap isoamsb /sqcap B: square intersection +2294 8852 SquareUnion mmlalias alias ISOAMSB sqcup +2294 8852 bigsqcup mmlalias alias ISOAMSB xsqcup +2294 8852 sqcup isoamsb /sqcup B: square union +2294 8852 xsqcup isoamsb /bigsqcup L: square union operator +2295 8853 CirclePlus mmlalias alias ISOAMSB oplus +2295 8853 bigoplus mmlalias alias ISOAMSB xoplus + +2295 8853 oplus isoamsb /oplus B: plus sign in circle +2295 8853 xoplus isoamsb /bigoplus L: circle plus operator +2296 8854 CircleMinus mmlalias alias ISOAMSB ominus +2296 8854 ominus isoamsb /ominus B: minus sign in circle +2297 8855 CircleTimes mmlalias alias ISOAMSB otimes +2297 8855 bigotimes mmlalias alias ISOAMSB xotime +2297 8855 otimes isoamsb /otimes B: multiply sign in circle +2297 8855 xotime isoamsb /bigotimes L: circle times operator +2298 8856 osol isoamsb /oslash B: solidus in circle +2299 8857 CircleDot mmlalias alias ISOAMSB odot + +2299 8857 bigodot mmlalias alias ISOAMSB xodot +2299 8857 odot isoamsb /odot B: middle dot in circle +2299 8857 xodot isoamsb /bigodot L: circle dot operator +229A 8858 circledcirc mmlalias alias ISOAMSB ocir +229A 8858 ocir isoamsb /circledcirc B: small circle in circle +229B 8859 circledast mmlalias alias ISOAMSB oast +229B 8859 oast isoamsb /circledast B: asterisk in circle +229D 8861 circleddash mmlalias alias ISOAMSB odash +229D 8861 odash isoamsb /circleddash B: hyphen in circle +229E 8862 boxplus mmlalias alias ISOAMSB plusb + +229E 8862 plusb isoamsb /boxplus B: plus sign in box +229F 8863 boxminus mmlalias alias ISOAMSB minusb +229F 8863 minusb isoamsb /boxminus B: minus sign in box +22A0 8864 boxtimes mmlalias alias ISOAMSB timesb +22A0 8864 timesb isoamsb /boxtimes B: multiply sign in box +22A1 8865 dotsquare mmlalias alias ISOAMSB sdotb +22A1 8865 sdotb isoamsb /dotsquare /boxdot B: small dot in box +22A2 8866 RightTee mmlalias alias ISOAMSR vdash +22A2 8866 vdash isoamsr /vdash R: vertical, dash +22A3 8867 LeftTee mmlalias alias ISOAMSR dashv + +22A3 8867 dashv isoamsr /dashv R: dash, vertical +22A4 8868 DownTee mmlalias alias ISOTECH top +22A4 8868 top isotech /top top +22A5 8869 UpTee mmlalias alias ISOTECH perp +22A5 8869 bot mmlalias alias ISOTECH bottom +22A5 8869 bottom isotech /bot bottom +22A5 8869 perp isotech /perp R: perpendicular +22A7 8871 models isoamsr /models R: +22A8 8872 DoubleRightTee mmlalias alias ISOAMSR vDash +22A8 8872 vDash isoamsr /vDash R: vertical, dbl dash + +22A9 8873 Vdash isoamsr /Vdash R: dbl vertical, dash +22AA 8874 Vvdash isoamsr /Vvdash R: triple vertical, dash +22AB 8875 VDash isoamsr dbl vert, dbl dash +22AC 8876 nvdash isoamsn /nvdash N: not vertical, dash +22AD 8877 nvDash isoamsn /nvDash N: not vertical, dbl dash +22AE 8878 nVdash isoamsn /nVdash N: not dbl vertical, dash +22AF 8879 nVDash isoamsn /nVDash N: not dbl vert, dbl dash +22B0 8880 prurel isoamsr element precedes under relation +22B2 8882 LeftTriangle mmlalias alias ISOAMSR vltri +22B2 8882 vartriangleleft mmlalias alias ISOAMSR vltri + +22B2 8882 vltri isoamsr /vartriangleleft R: l tri, open, var +22B3 8883 RightTriangle mmlalias alias ISOAMSR vrtri +22B3 8883 vartriangleright mmlalias alias ISOAMSR vrtri +22B3 8883 vrtri isoamsr /vartriangleright R: r tri, open, var +22B4 8884 LeftTriangleEqual mmlalias alias ISOAMSR ltrie +22B4 8884 ltrie isoamsr /trianglelefteq R: left triangle, eq +22B4 8884 trianglelefteq mmlalias alias ISOAMSR ltrie +22B5 8885 RightTriangleEqual mmlalias alias ISOAMSR rtrie +22B5 8885 rtrie isoamsr /trianglerighteq R: right tri, eq +22B5 8885 trianglerighteq mmlalias alias ISOAMSR rtrie + +22B6 8886 origof isoamsa original of +22B7 8887 imof isoamsa image of +22B8 8888 multimap mmlalias alias ISOAMSA mumap +22B8 8888 mumap isoamsa /multimap A: +22B9 8889 hercon isoamsb hermitian conjugate matrix +22BA 8890 intcal isoamsb /intercal B: intercal +22BA 8890 intercal mmlalias alias ISOAMSB intcal +22BB 8891 veebar isoamsb /veebar B: logical or, bar below +22BC 8892 barwed isoamsb /barwedge B: logical and, bar above +22BC 8892 barwedge mmlalias alias ISOAMSB barwed + +22BD 8893 barvee isoamsb bar, vee +22BE 8894 vangrt isotech right angle, variant +22C0 8896 Wedge mmlalias alias ISOAMSB xwedge +22C0 8896 bigwedge mmlalias alias ISOAMSB xwedge +22C0 8896 xwedge isoamsb /bigwedge L: logical or operator +22C1 8897 Vee mmlalias alias ISOAMSB xvee +22C1 8897 bigvee mmlalias alias ISOAMSB xvee +22C1 8897 xvee isoamsb /bigvee L: logical and operator +22C2 8898 Intersection mmlalias alias ISOAMSB xcap +22C2 8898 bigcap mmlalias alias ISOAMSB xcap + +22C2 8898 xcap isoamsb /bigcap L: intersection operator +22C3 8899 Union mmlalias alias ISOAMSB xcup +22C3 8899 bigcup mmlalias alias ISOAMSB xcup +22C3 8899 xcup isoamsb /bigcup L: union operator +22C4 8900 Diamond mmlalias alias ISOAMSB diam +22C4 8900 diam isoamsb /diamond B: open diamond +22C4 8900 diamond mmlalias alias ISOAMSB diam +22C5 8901 sdot isoamsb /cdot B: small middle dot +22C6 8902 Star mmlalias alias ISOAMSB sstarf +22C6 8902 sstarf isoamsb /star B: small star, filled + +22C6 8902 star isopub =star, open +22C7 8903 divideontimes mmlalias alias ISOAMSB divonx +22C7 8903 divonx isoamsb /divideontimes B: division on times +22C8 8904 bowtie isoamsr /bowtie R: +22C9 8905 ltimes isoamsb /ltimes B: times sign, left closed +22CA 8906 rtimes isoamsb /rtimes B: times sign, right closed +22CB 8907 leftthreetimes mmlalias alias ISOAMSB lthree +22CB 8907 lthree isoamsb /leftthreetimes B: +22CC 8908 rightthreetimes mmlalias alias ISOAMSB rthree +22CC 8908 rthree isoamsb /rightthreetimes B: + +22CD 8909 backsimeq mmlalias alias ISOAMSR bsime +22CD 8909 bsime isoamsr /backsimeq R: reverse similar, eq +22CE 8910 curlyvee mmlalias alias ISOAMSB cuvee +22CE 8910 cuvee isoamsb /curlyvee B: curly logical or +22CF 8911 curlywedge mmlalias alias ISOAMSB cuwed +22CF 8911 cuwed isoamsb /curlywedge B: curly logical and +22D0 8912 Sub isoamsr /Subset R: double subset +22D0 8912 Subset mmlalias alias ISOAMSR Sub +22D1 8913 Sup isoamsr /Supset R: dbl superset +22D1 8913 Supset mmlalias alias ISOAMSR Sup + +22D2 8914 Cap isoamsb /Cap /doublecap B: dbl intersection +22D3 8915 Cup isoamsb /Cup /doublecup B: dbl union +22D4 8916 fork isoamsr /pitchfork R: pitchfork +22D4 8916 pitchfork mmlalias alias ISOAMSR fork +22D5 8917 epar isotech parallel, equal; equal or parallel +22D6 8918 lessdot mmlalias alias ISOAMSR ltdot +22D6 8918 ltdot isoamsr /lessdot R: less than, with dot +22D7 8919 gtdot isoamsr /gtrdot R: greater than, with dot +22D7 8919 gtrdot mmlalias alias ISOAMSR gtdot +22D8 8920 Ll isoamsr /Ll /lll /llless R: triple less-than + +22D9 8921 Gg isoamsr /ggg /Gg /gggtr R: triple gtr-than +22D9 8921 ggg mmlalias alias ISOAMSR Gg +22DA 8922 LessEqualGreater mmlalias alias ISOAMSR leg +22DA 8922 lEg isoamsr /lesseqqgtr R: less, dbl eq, greater +22DA 8922 leg isoamsr /lesseqgtr R: less, eq, greater +22DA 8922 lesseqgtr mmlalias alias ISOAMSR leg +22DA 8922 lesseqqgtr mmlalias alias ISOAMSR lEg +22DB 8923 GreaterEqualLess mmlalias alias ISOAMSR gel +22DB 8923 gEl isoamsr /gtreqqless R: gt, dbl equals, less +22DB 8923 gel isoamsr /gtreqless R: greater, equals, less + +22DB 8923 gtreqless mmlalias alias ISOAMSR gel +22DB 8923 gtreqqless mmlalias alias ISOAMSR gEl +22DC 8924 els isoamsr /eqslantless R: eq-or-less, slanted +22DC 8924 eqslantless mmlalias alias ISOAMSR els +22DD 8925 egs isoamsr /eqslantgtr R: equal-or-gtr, slanted +22DD 8925 eqslantgtr mmlalias alias ISOAMSR egs +22DE 8926 cuepr isoamsr /curlyeqprec R: curly eq, precedes +22DE 8926 curlyeqprec mmlalias alias ISOAMSR cuepr +22DF 8927 cuesc isoamsr /curlyeqsucc R: curly eq, succeeds +22DF 8927 curlyeqsucc mmlalias alias ISOAMSR cuesc + +22E0 8928 NotPrecedesSlantEqual mmlalias alias ISOAMSN nprcue +22E0 8928 nprcue isoamsn not curly precedes, eq +22E1 8929 NotSucceedsSlantEqual mmlalias alias ISOAMSN nsccue +22E1 8929 nsccue isoamsn not succeeds, curly eq +22E2 8930 NotSquareSubsetEqual mmlalias alias ISOAMSN nsqsube +22E2 8930 nsqsube isoamsn not, square subset, equals +22E3 8931 NotSquareSupersetEqual mmlalias alias ISOAMSN nsqsupe +22E3 8931 nsqsupe isoamsn not, square superset, equals +22E6 8934 lnsim isoamsn /lnsim N: less, not similar +22E7 8935 gnsim isoamsn /gnsim N: greater, not similar + +22E8 8936 precnapprox mmlalias alias ISOAMSN prnap +22E8 8936 precnsim mmlalias alias ISOAMSN prnsim +22E8 8936 prnap isoamsn /precnapprox N: precedes, not approx +22E8 8936 prnsim isoamsn /precnsim N: precedes, not similar +22E9 8937 scnap isoamsn /succnapprox N: succeeds, not approx +22E9 8937 scnsim isoamsn /succnsim N: succeeds, not similar +22E9 8937 succnapprox mmlalias alias ISOAMSN scnap +22E9 8937 succnsim mmlalias alias ISOAMSN scnsim +22EA 8938 NotLeftTriangle mmlalias alias ISOAMSN nltri +22EA 8938 nltri isoamsn /ntriangleleft N: not left triangle + +22EA 8938 ntriangleleft mmlalias alias ISOAMSN nltri +22EB 8939 NotRightTriangle mmlalias alias ISOAMSN nrtri +22EB 8939 nrtri isoamsn /ntriangleright N: not rt triangle +22EB 8939 ntriangleright mmlalias alias ISOAMSN nrtri +22EC 8940 NotLeftTriangleEqual mmlalias alias ISOAMSN nltrie +22EC 8940 nltrie isoamsn /ntrianglelefteq N: not l tri, eq +22EC 8940 ntrianglelefteq mmlalias alias ISOAMSN nltrie +22ED 8941 NotRightTriangleEqual mmlalias alias ISOAMSN nrtrie +22ED 8941 nrtrie isoamsn /ntrianglerighteq N: not r tri, eq +22ED 8941 ntrianglerighteq mmlalias alias ISOAMSN nrtrie + +22EE 8942 vellip isopub vertical ellipsis +22EF 8943 ctdot isotech /cdots, three dots, centered +22F0 8944 utdot isotech three dots, ascending +22F1 8945 dtdot isotech /ddots, three dots, descending + +23 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2306 8966 Barwed isoamsb /doublebarwedge B: log and, dbl bar above +2306 8966 doublebarwedge mmlalias alias ISOAMSB Barwed +2308 8968 LeftCeiling mmlalias alias ISOAMSC lceil +2308 8968 lceil isoamsc /lceil O: left ceiling +2309 8969 RightCeiling mmlalias alias ISOAMSC rceil +2309 8969 rceil isoamsc /rceil C: right ceiling +230A 8970 LeftFloor mmlalias alias ISOAMSC lfloor +230A 8970 lfloor isoamsc /lfloor O: left floor +230B 8971 RightFloor mmlalias alias ISOAMSC rfloor +230B 8971 rfloor isoamsc /rfloor C: right floor + +230C 8972 drcrop isopub downward right crop mark +230D 8973 dlcrop isopub downward left crop mark +230E 8974 urcrop isopub upward right crop mark +230F 8975 ulcrop isopub upward left crop mark +2310 8976 bnot isotech reverse not +2312 8978 profline isotech profile of a line +2313 8979 profsurf isotech profile of a surface +2315 8981 telrec isopub =telephone recorder symbol +2316 8982 target isopub register mark or target +231C 8988 ulcorn isoamsc /ulcorner O: upper left corner + +231C 8988 ulcorner mmlalias alias ISOAMSC ulcorn +231D 8989 urcorn isoamsc /urcorner C: upper right corner +231D 8989 urcorner mmlalias alias ISOAMSC urcorn +231E 8990 dlcorn isoamsc /llcorner O: lower left corner +231E 8990 llcorner mmlalias alias ISOAMSC dlcorn +231F 8991 drcorn isoamsc /lrcorner C: lower right corner +231F 8991 lrcorner mmlalias alias ISOAMSC drcorn +2322 8994 frown isoamsr /frown R: down curve +2323 8995 smile isoamsr /smile R: up curve +232D 9005 cylcty isotech cylindricity + +232E 9006 profalar isotech all-around profile +2336 9014 topbot isotech top and bottom + +24 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2423 9251 blank isopub =significant blank symbol +24C8 9416 circledS mmlalias alias ISOAMSO oS +24C8 9416 oS isoamso /circledS - capital S in circle + +25 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2500 9472 boxh isobox horizontal line +2502 9474 boxv isobox vertical line +250C 9484 boxdr isobox lower right quadrant +2510 9488 boxdl isobox lower left quadrant +2514 9492 boxur isobox upper right quadrant +2518 9496 boxul isobox upper left quadrant +251C 9500 boxvr isobox upper and lower right quadrants +2524 9508 boxvl isobox upper and lower left quadrants +252C 9516 boxhd isobox lower left and right quadrants +2534 9524 boxhu isobox upper left and right quadrants + +253C 9532 boxvh isobox all four quadrants +2550 9552 boxH isobox horizontal line +2551 9553 boxV isobox vertical line +2552 9554 boxdR isobox lower right quadrant +2553 9555 boxDr isobox lower right quadrant +2554 9556 boxDR isobox lower right quadrant +2555 9557 boxdL isobox lower left quadrant +2556 9558 boxDl isobox lower left quadrant +2557 9559 boxDL isobox lower left quadrant +2558 9560 boxuR isobox upper right quadrant + +2559 9561 boxUr isobox upper right quadrant +255A 9562 boxUR isobox upper right quadrant +255B 9563 boxuL isobox upper left quadrant +255C 9564 boxUl isobox upper left quadrant +255D 9565 boxUL isobox upper left quadrant +255E 9566 boxvR isobox upper and lower right quadrants +255F 9567 boxVr isobox upper and lower right quadrants +2560 9568 boxVR isobox upper and lower right quadrants +2561 9569 boxvL isobox upper and lower left quadrants +2562 9570 boxVl isobox upper and lower left quadrants + +2563 9571 boxVL isobox upper and lower left quadrants +2564 9572 boxHd isobox lower left and right quadrants +2565 9573 boxhD isobox lower left and right quadrants +2566 9574 boxHD isobox lower left and right quadrants +2567 9575 boxHu isobox upper left and right quadrants +2568 9576 boxhU isobox upper left and right quadrants +2569 9577 boxHU isobox upper left and right quadrants +256A 9578 boxvH isobox all four quadrants +256B 9579 boxVh isobox all four quadrants +256C 9580 boxVH isobox all four quadrants + +2580 9600 uhblk isopub =upper half block +2584 9604 lhblk isopub =lower half block +2588 9608 block isopub =full block +2591 9617 blk14 isopub =25% shaded block +2592 9618 blk12 isopub =50% shaded block +2593 9619 blk34 isopub =75% shaded block +25A1 9633 Square mmlalias alias for square +25A1 9633 squ isopub =square, open +25A1 9633 square isotech /square, square +25AA 9642 blacksquare mmlalias ISOTECH squarf + +25AA 9642 squarf isotech /blacksquare, square, filled +25AA 9642 squf isopub /blacksquare =sq bullet, filled +25AD 9645 rect isopub =rectangle, open +25AE 9646 marker isopub =histogram marker +25B3 9651 bigtriangleup mmlalias alias ISOAMSB xutri +25B3 9651 xutri isoamsb /bigtriangleup B: big up tri, open +25B4 9652 blacktriangle mmlalias alias ISOPUB utrif +25B4 9652 utrif isopub /blacktriangle =up tri, filled +25B5 9653 triangle mmlalias alias ISOPUB utri +25B5 9653 utri isopub /triangle =up triangle, open + +25B8 9656 blacktriangleright mmlalias alias ISOPUB rtrif +25B8 9656 rtrif isopub /blacktriangleright R: =r tri, filled +25B9 9657 rtri isopub /triangleright B: r triangle, open +25B9 9657 triangleright mmlalias alias ISOPUB rtri +25BD 9661 bigtriangledown mmlalias alias ISOAMSB xdtri +25BD 9661 xdtri isoamsb /bigtriangledown B: big dn tri, open +25BE 9662 blacktriangledown mmlalias alias ISOPUB dtrif +25BE 9662 dtrif isopub /blacktriangledown =dn tri, filled +25BF 9663 dtri isopub /triangledown =down triangle, open +25BF 9663 triangledown mmlalias alias ISOPUB dtri + +25C2 9666 blacktriangleleft mmlalias alias ISOPUB ltrif +25C2 9666 ltrif isopub /blacktriangleleft R: =l tri, filled +25C3 9667 ltri isopub /triangleleft B: l triangle, open +25C3 9667 triangleleft mmlalias alias ISOPUB ltri +25CA 9674 loz isopub /lozenge - lozenge or total mark +25CA 9674 lozenge mmlalias alias ISOPUB loz +25CB 9675 cir isopub /circ B: =circle, open +25EC 9708 tridot isoamsb dot in triangle +25EF 9711 bigcirc mmlalias alias ISOAMSB xcirc +25EF 9711 xcirc isoamsb /bigcirc B: large circle + +26 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2605 9733 bigstar mmlalias ISOPUB starf +2605 9733 starf isopub /bigstar - star, filled +260E 9742 phone isopub =telephone symbol +2640 9792 female isopub =female symbol +2642 9794 male isopub =male symbol +2660 9824 spades isopub /spadesuit =spades suit symbol +2660 9824 spadesuit mmlalias ISOPUB spades +2661 9825 hearts isopub /heartsuit =heart suit symbol +2661 9825 heartsuit mmlalias ISOPUB hearts +2663 9827 clubs isopub /clubsuit =club suit symbol + +2663 9827 clubsuit mmlalias ISOPUB clubs +2666 9830 diamondsuit mmlalias ISOPUB diams +2666 9830 diams isopub /diamondsuit =diamond suit symbol +266A 9834 sung isonum =music note (sung text sign) +266D 9837 flat isopub /flat =musical flat +266E 9838 natur isopub /natural - music natural +266E 9838 natural mmlalias alias ISOPUB natur +266F 9839 sharp isopub /sharp =musical sharp + +27 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +2713 10003 check isopub /checkmark =tick, check mark +2713 10003 checkmark mmlalias alias ISOPUB check +2717 10007 cross isopub =ballot cross +2720 10016 malt isopub /maltese =maltese cross +2720 10016 maltese mmlalias alias ISOPUB malt +2736 10038 sext isopub sextile (6-pointed star) + +30 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +3008 12296 LeftAngleBracket mmlalias alias ISOTECH lang +3008 12296 lang isotech /langle O: left angle bracket +3008 12296 langle mmlalias alias ISOTECH lang +3009 12297 RightAngleBracket mmlalias alias ISOTECH rang +3009 12297 rang isotech /rangle C: right angle bracket +3009 12297 rangle mmlalias alias ISOTECH rang +300A 12298 Lang isotech left angle bracket, double +300B 12299 Rang isotech right angle bracket, double +3014 12308 lbbrk isotech left broken bracket +3015 12309 rbbrk isotech right broken bracket + +3018 12312 loang isotech left open angular bracket +3019 12313 roang isotech right open angular bracket +301A 12314 LeftDoubleBracket mmlalias left double bracket delimiter +301A 12314 lobrk isotech left open bracket +301B 12315 RightDoubleBracket mmlalias right double bracket delimiter +301B 12315 robrk isotech right open bracket + +E2 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E200 57856 DoubleLongLeftArrow mmlalias alias ISOAMSA xlArr +E200 57856 Longleftarrow mmlalias alias ISOAMSA xlArr +E200 57856 xlArr isoamsa /Longleftarrow A: long l dbl arrow +E201 57857 LongLeftArrow mmlalias alias ISOAMSA xlarr +E201 57857 longleftarrow mmlalias alias ISOAMSA xlarr +E201 57857 xlarr isoamsa /longleftarrow A: long left arrow +E202 57858 DoubleLongLeftRightArrow mmlalias alias ISOAMSA xhArr +E202 57858 Longleftrightarrow mmlalias alias ISOAMSA xhArr +E202 57858 xhArr isoamsa /Longleftrightarrow A: long l&r dbl arr +E203 57859 LongLeftRightArrow mmlalias alias ISOAMSA xharr + +E203 57859 longleftrightarrow mmlalias alias ISOAMSA xharr +E203 57859 xharr isoamsa /longleftrightarrow A: long l&r arr +E204 57860 DoubleLongRightArrow mmlalias alias ISOAMSA xrArr +E204 57860 Longrightarrow mmlalias alias ISOAMSA xrArr +E204 57860 xrArr isoamsa /Longrightarrow A: long rt dbl arr +E205 57861 LongRightArrow mmlalias alias ISOAMSA xrarr +E205 57861 longrightarrow mmlalias alias ISOAMSA xrarr +E205 57861 xrarr isoamsa /longrightarrow A: long right arrow +E206 57862 lBarr isoamsa left doubly broken arrow +E207 57863 ac isoamsb most positive + +E207 57863 dbkarow mmlalias alias ISOAMSA rBarr +E207 57863 rBarr isoamsa /dbkarow A: right doubly broken arrow +E208 57864 longmapsto mmlalias alias ISOAMSA xmap +E208 57864 xmap isoamsa /longmapsto A: +E209 57865 RBarr isoamsa /drbkarow A: twoheaded right broken arrow +E209 57865 drbkarow mmlalias alias ISOAMSA RBarr +E20A 57866 hkswarow mmlalias alias ISOAMSA swarhk +E20A 57866 swarhk isoamsa /hkswarow A: SW arrow-hooked +E20B 57867 hksearow mmlalias alias ISOAMSA searhk +E20B 57867 searhk isoamsa /hksearow A: SE arrow-hooken + +E20C 57868 nwarhk isoamsa NW arrow-hooked +E20D 57869 nearhk isoamsa NE arrow-hooked +E20E 57870 nesear isoamsa /toea A: NE & SE arrows +E20E 57870 toea mmlalias alias ISOAMSA nesear +E20F 57871 seswar isoamsa /tosa A: SE & SW arrows +E20F 57871 tosa mmlalias alias ISOAMSA seswar +E210 57872 swnwar isoamsa SW & NW arrows +E211 57873 nwnear isoamsa NW & NE arrows +E212 57874 Map isoamsa twoheaded mapsto +E214 57876 lfisht isoamsa left fish tail + +E215 57877 rfisht isoamsa right fish tail +E216 57878 DownArrowUpArrow mmlalias alias ISOAMSA duarr +E216 57878 duarr isoamsa down arrow, up arrow +E217 57879 ReverseUpEquilibrium mmlalias alias ISOAMSA duhar +E217 57879 duhar isoamsa down harp, up harp +E218 57880 UpEquilibrium mmlalias alias ISOAMSA udhar +E218 57880 udhar isoamsa up harp, down harp +E219 57881 rdca isoamsa right down curved arrow +E21A 57882 ldca isoamsa left down curved arrow +E21B 57883 nrarrw isoamsa not right arrow-wavy + +E21C 57884 rarrc isoamsa right arrow-curved +E21D 57885 nrarrc isoamsa not right arrow-curved +E21E 57886 rarrpl isoamsa right arrow, plus +E220 57888 larrbfs isoamsa left arrow-bar, filled square +E221 57889 rarrbfs isoamsa right arrow-bar, filled square +E222 57890 larrfs isoamsa left arrow, filled square +E223 57891 rarrfs isoamsa right arrow, filled square +E224 57892 rHar isoamsa right harpoon-up over right harpoon-down +E225 57893 lHar isoamsa left harpoon-up over left harpoon-down +E226 57894 uHar isoamsa up harpoon-left, up harpoon-right + +E227 57895 dHar isoamsa down harpoon-left, down harpoon-right +E228 57896 ldrushar isoamsa left-down-right-up harpoon +E229 57897 lurdshar isoamsa left-up-right-down harpoon +E22A 57898 ruluhar isoamsa right harpoon-up over left harpoon-up +E22B 57899 luruhar isoamsa left harpoon-up over right harpoon-up +E22C 57900 ldrdhar isoamsa left harpoon-down over right harpoon-down +E22D 57901 rdldhar isoamsa right harpoon-down over left harpoon-down +E22E 57902 lharul isoamsa left harpoon-up over long dash +E22F 57903 lrhard isoamsa right harpoon-down below long dash +E230 57904 rharul isoamsa right harpoon-up over long dash + +E231 57905 llhard isoamsa left harpoon-down below long dash +E232 57906 ShortRightArrow mmlalias alias ISOAMSA srarr +E232 57906 srarr isoamsa short right arrow +E233 57907 ShortLeftArrow mmlalias alias ISOAMSA slarr +E233 57907 slarr isoamsa short left arrow +E234 57908 simrarr isoamsa similar, right arrow below +E235 57909 rarrap isoamsa approximate, right arrow above +E236 57910 erarr isoamsa equal, right arrow below +E237 57911 Uarrocir isoamsa up two-headed arrow above circle +E238 57912 DDotrahd isoamsa right arrow with dotted stem + +E239 57913 Rarrtl isoamsa right two-headed arrow with tail +E23B 57915 rAtail isoamsa right double arrow-tail +E23C 57916 latail isoamsa left arrow-tail +E23D 57917 lAtail isoamsa left double arrow-tail +E23E 57918 cudarrl isoamsa left, curved, down arrow +E23F 57919 larrpl isoamsa left arrow, plus +E240 57920 harrcir isoamsa left and right arrow with a circle +E241 57921 roarr isoamsa right open arrow +E242 57922 loarr isoamsa left open arrow +E243 57923 hoarr isoamsa horizontal open arrow + +E244 57924 zigrarr isoamsa right zig-zag arrow +E248 57928 angzarr isoamsa angle with down zig-zag arrow +E249 57929 curarrm isoamsa curved right arrow with minus +E24A 57930 cularrp isoamsa curved left arrow with plus +E24B 57931 ufisht isoamsa up fish tail +E24C 57932 dfisht isoamsa down fish tail +E24D 57933 rarrsim isoamsa right arrow, similar +E24E 57934 larrsim isoamsa left arrow, similar +E24F 57935 midcir isoamsa mid, circle below +E250 57936 cirmid isoamsa circle, mid below + +E251 57937 amalg isoamsb /amalg B: amalgamation or coproduct +E259 57945 intprod mmlalias alias ISOAMSB iprod +E259 57945 iprod isoamsb /intprod +E25A 57946 plusdu isoamsb plus sign, dot below +E25B 57947 minusdu isoamsb minus sign, dot below +E25C 57948 loplus isoamsb plus sign in left half circle +E25D 57949 roplus isoamsb plus sign in right half circle +E25E 57950 lotimes isoamsb multiply sign in left half circle +E25F 57951 rotimes isoamsb multiply sign in right half circle +E260 57952 ohbar isoamsb circle with horizontal bar + +E261 57953 capdot isoamsb intersection, with dot +E262 57954 subdot isoamsb subset, with dot +E263 57955 supdot isoamsb superset, with dot +E264 57956 smashp isoamsb smash product +E265 57957 wedbar isoamsb wedge, bar below +E266 57958 pluscir isoamsb plus, small circle above +E267 57959 pluse isoamsb plus, equals +E268 57960 eplus isoamsb equal, plus +E269 57961 plustwo isoamsb plus, two; Nim-addition +E26A 57962 plusacir isoamsb plus, circumflex accent above + +E26B 57963 simplus isoamsb plus, similar above +E26C 57964 plussim isoamsb plus, similar below +E26D 57965 timesd isoamsb times, dot +E26E 57966 cupcap isoamsb union above intersection +E26F 57967 capcup isoamsb intersection above union +E270 57968 cupbrcap isoamsb union, bar, intersection +E271 57969 capbrcup isoamsb intersection, bar, union +E272 57970 cupcup isoamsb union, union, joined +E273 57971 capcap isoamsb intersection, intersection, joined +E274 57972 cups isoamsb union, serifs + +E275 57973 caps isoamsb intersection, serifs +E276 57974 sqcups isoamsb square union, serifs +E277 57975 sqcaps isoamsb square intersection, serifs +E278 57976 ccups isoamsb closed union, serifs +E279 57977 ccaps isoamsb closed intersection, serifs +E27A 57978 ccupssm isoamsb closed union, serifs, smash product +E27B 57979 triplus isoamsb plus in triangle +E27C 57980 triminus isoamsb minus in triangle +E27D 57981 tritime isoamsb multiply in triangle +E27E 57982 trisb isoamsb triangle, serifs at bottom + +E27F 57983 solb isoamsb solidus in square +E280 57984 bsolb isoamsb reverse solidus in square +E281 57985 capand isoamsb intersection, and +E282 57986 cupor isoamsb union, or +E283 57987 ncup isoamsb bar, union +E284 57988 ncap isoamsb bar, intersection +E285 57989 odiv isoamsb divide in circle +E286 57990 odsold isoamsb dot, solidus, dot in circle +E287 57991 ofcir isoamsb filled circle in circle +E288 57992 olt isoamsb less-than in circle + +E289 57993 ogt isoamsb greater-than in circle +E28A 57994 opar isoamsb parallel in circle +E28B 57995 operp isoamsb perpendicular in circle +E28C 57996 Otimes isoamsb multiply sign in double circle +E28D 57997 otimesas isoamsb multiply sign in circle, circumflex accent +E28E 57998 timesbar isoamsb multiply sign, bar below +E290 58000 acE isoamsb most positive, two lines below +E291 58001 rpargt isoamsc C: right paren, gt +E292 58002 lparlt isoamsc O: left parenthesis, lt +E293 58003 rmoust isoamsc /rmoustache + +E293 58003 rmoustache mmlalias alias ISOAMSC rmoust +E294 58004 lmoust isoamsc /lmoustache +E294 58004 lmoustache mmlalias alias ISOAMSC lmoust +E295 58005 ltrPar isoamsc dbl right parenthesis, less +E296 58006 gtlPar isoamsc dbl left parenthesis, greater +E297 58007 langd isoamsc left angle, dot +E298 58008 rangd isoamsc right angle, dot +E299 58009 lbrke isoamsc left bracket, equal +E29A 58010 rbrke isoamsc right bracket, equal +E29B 58011 lbrkslu isoamsc left bracket, solidus top corner + +E29C 58012 rbrksld isoamsc right bracket, solidus bottom corner +E29D 58013 lbrksld isoamsc left bracket, solidus bottom corner +E29E 58014 rbrkslu isoamsc right bracket, solidus top corner +E29F 58015 gnap isoamsn /gnapprox N: greater, not approximate +E29F 58015 gnapprox mmlalias alias ISOAMSN gnap +E2A1 58017 gvertneqq mmlalias alias ISOAMSN gvnE +E2A1 58017 gvnE isoamsn /gvertneqq N: gt, vert, not dbl eq +E2A2 58018 lnap isoamsn /lnapprox N: less, not approximate +E2A2 58018 lnapprox mmlalias alias ISOAMSN lnap +E2A4 58020 lvertneqq mmlalias alias ISOAMSN lvnE + +E2A4 58020 lvnE isoamsn /lvertneqq N: less, vert, not dbl eq +E2A6 58022 NotGreaterEqual mmlalias alias ISOAMSN nge +E2A6 58022 nge isoamsn /ngeq N: not greater-than-or-equal +E2A6 58022 ngeq mmlalias alias ISOAMSN nge +E2A7 58023 NotLessEqual mmlalias alias ISOAMSN nle +E2A7 58023 nle isoamsn /nleq N: not less-than-or-equal +E2A7 58023 nleq mmlalias alias ISOAMSN nle +E2AA 58026 nshortmid mmlalias alias ISOAMSN nsmid +E2AA 58026 nsmid isoamsn /nshortmid +E2AB 58027 nshortparallel mmlalias alias ISOAMSN nspar + +E2AB 58027 nspar isoamsn /nshortparallel N: not short par +E2B3 58035 precneqq mmlalias alias ISOAMSN prnE +E2B3 58035 prnE isoamsn /precneqq N: precedes, not dbl eq +E2B5 58037 scnE isoamsn /succneqq N: succeeds, not dbl eq +E2B5 58037 succneqq mmlalias alias ISOAMSN scnE +E2B8 58040 varsubsetneqq mmlalias alias ISOAMSN vsubnE +E2B8 58040 vsubnE isoamsn /varsubsetneqq N: subset not dbl eq, var +E2B9 58041 varsubsetneq mmlalias alias ISOAMSN vsubne +E2B9 58041 vsubne isoamsn /varsubsetneq N: subset, not eq, var +E2BA 58042 varsupsetneq mmlalias alias ISOAMSN vsupne + +E2BA 58042 vsupne isoamsn /varsupsetneq N: superset, not eq, var +E2BB 58043 varsupsetneqq mmlalias alias ISOAMSN vsupnE +E2BB 58043 vsupnE isoamsn /varsupsetneqq N: super not dbl eq, var +E2BC 58044 napid isoamsn not approximately identical to +E2C5 58053 ncongdot isoamsn not congruent, dot +E2C6 58054 nvap isoamsn not, vert, approximate +E2C7 58055 napE isoamsn not approximately equal or equal to +E2C8 58056 parsim isoamsn parallel, similar +E2C9 58057 nLt isoamsn not, vert, much less than +E2CA 58058 nGt isoamsn not, vert, much greater than + +E2CB 58059 NotLessLess mmlalias alias ISOAMSN nLtv +E2CB 58059 nLtv isoamsn not much less than, variant +E2CC 58060 NotGreaterGreater mmlalias alias ISOAMSN nGtv +E2CC 58060 nGtv isoamsn not much greater than, variant +E2CD 58061 nLl isoamsn not triple less than +E2CE 58062 nGg isoamsn not triple greater than +E2CF 58063 nvrtrie isoamsn not, vert, right triangle, equals +E2D0 58064 nvltrie isoamsn not, vert, left triangle, equals +E2D1 58065 rnmid isoamsn reverse /nmid +E2D3 58067 empty isoamso /emptyset - zero, slash + +E2D3 58067 emptyset mmlalias alias ISOAMSO empty +E2D4 58068 jmath isoamso /jmath - small j, no dot +E2D5 58069 hbar mmlalias alias ISOAMSO plank +E2D5 58069 plank isoamso /hbar - Planck's over 2pi +E2D6 58070 ange isoamso angle, equal +E2D7 58071 range isoamso reverse angle, equal +E2D8 58072 nang isoamso not, vert, angle +E2D9 58073 angmsdaa isoamso angle-measured, arrow, up, right +E2DA 58074 angmsdab isoamso angle-measured, arrow, up, left +E2DB 58075 angmsdac isoamso angle-measured, arrow, down, right + +E2DC 58076 angmsdad isoamso angle-measured, arrow, down, left +E2DD 58077 angmsdae isoamso angle-measured, arrow, right, up +E2DE 58078 angmsdaf isoamso angle-measured, arrow, left, up +E2DF 58079 angmsdag isoamso angle-measured, arrow, right, down +E2E0 58080 angmsdah isoamso angle-measured, arrow, left, down +E2E1 58081 angrtvbd isoamso right angle-measured, dot +E2E2 58082 urtri isoamso upper right triangle +E2E3 58083 lrtri isoamso lower right triangle +E2E4 58084 ultri isoamso upper left triangle +E2E5 58085 lltri isoamso lower left triangle + +E2E6 58086 boxbox isoamso two joined squares +E2E7 58087 demptyv isoamso circle, slash, bar above +E2E8 58088 cemptyv isoamso circle, slash, small circle above +E2E9 58089 raemptyv isoamso circle, slash, right arrow above +E2EA 58090 laemptyv isoamso circle, slash, left arrow above +E2EB 58091 vzigzag isoamso vertical zig-zag line +E2EC 58092 trpezium isoamso trapezium +E2ED 58093 bsemi isoamso reverse semi-colon +E2EE 58094 bbrk isoamso bottom square bracket +E2EF 58095 tbrk isoamso top square bracket + +E2F6 58102 GreaterSlantEqual mmlalias alias ISOAMSR ges +E2F6 58102 geqslant mmlalias alias ISOAMSR ges +E2F6 58102 ges isoamsr /geqslant R: gt-or-equal, slanted +E2F7 58103 GreaterGreater mmlextra alias for GT +E2FA 58106 LessSlantEqual mmlalias alias ISOAMSR les +E2FA 58106 leqslant mmlalias alias ISOAMSR les +E2FA 58106 les isoamsr /leqslant R: less-than-or-eq, slant +E2FB 58107 LessLess mmlextra alias for Lt +E2FE 58110 PrecedesEqual mmlalias alias ISOAMSR pre +E2FE 58110 prE isoamsr precedes, dbl equals + +E2FE 58110 pre isoamsr /preceq R: precedes, equals +E2FE 58110 preceq mmlalias alias ISOAMSR pre + +E3 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E301 58113 shortmid mmlalias alias ISOAMSR smid +E301 58113 smid isoamsr /shortmid R: +E302 58114 shortparallel mmlalias alias ISOAMSR spar +E302 58114 spar isoamsr /shortparallel R: short parallel +E306 58118 thickapprox mmlalias ISOAMSR thkap +E306 58118 thkap isoamsr /thickapprox R: thick approximate +E309 58121 ddotseq mmlalias alias ISOAMSR eDDot +E309 58121 eDDot isoamsr /ddotseq R: equal with four dots +E30A 58122 mlcp isoamsr /mlcp +E30B 58123 siml isoamsr similar, less + +E30C 58124 simg isoamsr similar, greater +E30D 58125 Vbar isoamsr dbl vert, bar (under) +E30E 58126 Colone isoamsr double colon, equals +E30F 58127 Dashv isoamsr dbl dash, vertical +E30F 58127 DoubleLeftTee mmlalias alias for ⫤ +E310 58128 vBar isoamsr vert, dbl bar (under) +E311 58129 Barv isoamsr vert, dbl bar (over) +E312 58130 vBarv isoamsr dbl bar, vert over and under +E313 58131 Vdashl isoamsr vertical, dash (long) +E314 58132 congdot isoamsr congruent, dot + +E316 58134 bumpE isoamsr bump, equals +E317 58135 Esim isoamsr equal, similar +E318 58136 equivDD isoamsr equivalent, four dots above +E319 58137 sdote isoamsr equal, dot below +E31A 58138 mcomma isoamsr minus, comma above +E31B 58139 forkv isoamsr fork, variant +E31C 58140 topfork isoamsr fork with top +E31D 58141 lesdot isoamsr less-than-or-equal, slanted, dot inside +E31E 58142 gesdot isoamsr greater-than-or-equal, slanted, dot inside +E31F 58143 lesdoto isoamsr less-than-or-equal, slanted, dot above + +E320 58144 gesdoto isoamsr greater-than-or-equal, slanted, dot above +E321 58145 lesdotor isoamsr less-than-or-equal, slanted, dot above right +E322 58146 gesdotol isoamsr greater-than-or-equal, slanted, dot above left +E323 58147 elsdot isoamsr equal-or-less, slanted, dot inside +E324 58148 egsdot isoamsr equal-or-greater, slanted, dot inside +E325 58149 ltcir isoamsr less than, circle inside +E326 58150 gtcir isoamsr greater than, circle inside +E327 58151 el isoamsr equal-or-less +E328 58152 eg isoamsr equal-or-greater +E329 58153 ltquest isoamsr less than, questionmark above + +E32A 58154 gtquest isoamsr greater than, questionmark above +E32B 58155 lesg isoamsr less, equal, slanted, greater +E32C 58156 gesl isoamsr greater, equal, slanted, less +E32D 58157 lgE isoamsr less, greater, equal +E32E 58158 glE isoamsr greater, less, equal +E32F 58159 glj isoamsr greater, less, overlapping +E330 58160 gla isoamsr greater, less, apart +E331 58161 lesges isoamsr less, equal, slanted, greater, equal, slanted +E332 58162 gesles isoamsr greater, equal, slanted, less, equal, slanted +E333 58163 lsime isoamsr less, similar, equal + +E334 58164 gsime isoamsr greater, similar, equal +E335 58165 lsimg isoamsr less, similar, greater +E336 58166 gsiml isoamsr greater, similar, less +E337 58167 simlE isoamsr similar, less, equal +E338 58168 simgE isoamsr similar, greater, equal +E339 58169 smt isoamsr smaller than +E33A 58170 lat isoamsr larger than +E33B 58171 smte isoamsr smaller than or equal +E33C 58172 late isoamsr larger than or equal +E33D 58173 smtes isoamsr smaller than or equal, slanted + +E33E 58174 lates isoamsr larger than or equal, slanted +E33F 58175 subrarr isoamsr subset, right arrow +E340 58176 suplarr isoamsr superset, left arrow +E341 58177 subplus isoamsr subset, plus +E342 58178 supplus isoamsr superset, plus +E343 58179 submult isoamsr subset, multiply +E344 58180 supmult isoamsr superset, multiply +E345 58181 subsim isoamsr subset, similar +E346 58182 supsim isoamsr superset, similar +E347 58183 subsup isoamsr subset above superset + +E348 58184 supsub isoamsr superset above subset +E349 58185 subsub isoamsr subset above subset +E34A 58186 supsup isoamsr superset above superset +E34B 58187 suphsub isoamsr superset, subset +E34C 58188 supdsub isoamsr superset, subset, dash joining them +E34D 58189 bsolhsub isoamsr reverse solidus, subset +E34E 58190 suphsol isoamsr superset, solidus +E34F 58191 subedot isoamsr subset, equals, dot +E350 58192 supedot isoamsr superset, equals, dot +E351 58193 csub isoamsr subset, closed + +E352 58194 csup isoamsr superset, closed +E353 58195 csube isoamsr subset, closed, equals +E354 58196 csupe isoamsr superset, closed, equals +E355 58197 ltcc isoamsr less than, closed by curve +E356 58198 gtcc isoamsr greater than, closed by curve +E357 58199 lescc isoamsr less than, closed by curve, equal, slanted +E358 58200 gescc isoamsr greater than, closed by curve, equal, slanted +E359 58201 rtriltri isoamsr right triangle above left triangle +E35C 58204 Pr isoamsr dbl precedes +E35D 58205 Sc isoamsr dbl succeeds + +E35E 58206 ltlarr isoamsr less than, left arrow +E35F 58207 gtrarr isoamsr greater than, right arrow +E365 58213 iff isotech /iff if and only if +E36E 58222 andand isotech two logical and +E36F 58223 oror isotech two logical or +E370 58224 notinva isotech negated set membership, variant +E371 58225 qprime isotech quadruple prime +E372 58226 iinfin isotech infinity sign, incomplete +E374 58228 And isotech dbl logical and +E375 58229 Or isotech dbl logical or + +E376 58230 pointint isotech integral around a point operator +E377 58231 quatint isotech quaternion integral operator +E378 58232 iiiint mmlalias alias ISOTECH qint +E378 58232 qint isotech /iiiint quadruple integral operator +E379 58233 lopar isotech left open parenthesis +E37A 58234 ropar isotech right open parenthesis +E37B 58235 notinvb isotech negated set membership, variant +E37C 58236 notinvc isotech negated set membership, variant +E37D 58237 notnivb isotech contains, variant +E37E 58238 notnivc isotech contains, variant + +E380 58240 strns isotech straightness +E381 58241 fltns isotech flatness +E382 58242 parsl isotech parallel, slanted +E383 58243 topcir isotech top, circle below +E384 58244 eparsl isotech parallel, slanted, equal; homothetically congruent to +E385 58245 smeparsl isotech similar, parallel, slanted, equal +E386 58246 eqvparsl isotech equivalent, equal; congruent and parallel +E387 58247 bnequiv isotech reverse not equivalent +E388 58248 bne isotech reverse not equal +E389 58249 nparsl isotech not parallel, slanted + +E38A 58250 nedot isotech not equal, dot +E38B 58251 simdot isotech similar, dot +E38C 58252 apacir isotech approximate, circumflex accent +E38D 58253 nhpar isotech not, horizontal, parallel +E38E 58254 nvinfin isotech not, vert, infinity +E390 58256 npart isotech not partial differential +E391 58257 andv isotech and with middle stem +E392 58258 orv isotech or with middle stem +E393 58259 ord isotech or, horizontal dash +E394 58260 andd isotech and, horizontal dash + +E395 58261 cirfnint isotech circulation function +E396 58262 fpartint isotech finite part integral +E397 58263 rppolint isotech line integration, rectangular path around pole +E398 58264 scpolint isotech line integration, semi-circular path around pole +E399 58265 npolint isotech line integration, not including the pole +E39A 58266 intlarhk isotech integral, left arrow with hook +E39B 58267 awint isotech anti clock-wise integration +E39C 58268 isindot isotech set membership, dot above +E39D 58269 notindot isotech negated set membership, dot above +E39E 58270 isinE isotech set membership, two horizontal strokes + +E3A0 58272 disin isotech set membership, long horizontal stroke +E3A1 58273 nisd isotech contains, long horizontal stroke +E3A2 58274 isinsv isotech large set membership, vertical bar on horizontal stroke +E3A3 58275 xnis isotech large contains, vertical bar on horizontal stroke +E3A4 58276 isins isotech set membership, vertical bar on horizontal stroke +E3A5 58277 nis isotech contains, vertical bar on horizontal stroke +E3A6 58278 acd isotech ac current +E3A7 58279 elinters isotech electrical intersection +E3A8 58280 olcross isotech circle, cross +E3A9 58281 dsol isotech solidus, bar above + +E3AA 58282 dwangle isotech large downward pointing angle +E3AB 58283 uwangle isotech large upward pointing angle +E3AC 58284 Not isotech not with two horizontal strokes +E3AD 58285 bNot isotech reverse not with two horizontal strokes +E3AE 58286 orslope isotech sloping large or +E3B2 58290 fjlig isopub small fj ligature + +E4 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E400 58368 cudarrr isoamsa right, curved, down arrow +E402 58370 lbarr isoamsa left broken arrow +E405 58373 bkarow mmlalias alias ISOAMSA rbarr +E405 58373 rbarr isoamsa /bkarow A: right broken arrow +E409 58377 olcir isoamsb large circle in circle +E40A 58378 omid isoamsb vertical bar in circle +E40C 58380 race isoamsb reverse most positive, line below +E415 58389 nvsim isoamsn not, vert, similar +E416 58390 solbar isoamsn solidus, bar through +E418 58392 angrtvb isoamso right angle-measured + +E419 58393 bbrktbrk isoamso bottom above top square bracket +E41A 58394 bemptyv isoamso reversed circle, slash +E41B 58395 cirE isoamso circle, two horizontal stroked to the right +E41C 58396 cirscir isoamso circle, small circle to the right +E429 58409 thicksim mmlalias ISOAMSR thksim +E429 58409 thksim isoamsr /thicksim R: thick similar + +E5 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E500 58624 Aopf isomopf /Bbb A, open face A +E501 58625 Bopf isomopf /Bbb B, open face B +E503 58627 Dopf isomopf /Bbb D, open face D +E504 58628 Eopf isomopf /Bbb E, open face E +E505 58629 Fopf isomopf /Bbb F, open face F +E506 58630 Gopf isomopf /Bbb G, open face G +E507 58631 Hopf isomopf /Bbb H, open face H +E508 58632 Iopf isomopf /Bbb I, open face I +E509 58633 Jopf isomopf /Bbb J, open face J +E50A 58634 Kopf isomopf /Bbb K, open face K + +E50A 58634 andslope isotech sloping large and +E50B 58635 Lopf isomopf /Bbb L, open face L +E50B 58635 imped isotech impedance +E50C 58636 Mopf isomopf /Bbb M, open face M +E50C 58636 infintie isotech tie, infinity +E50D 58637 notinE isotech negated set membership, two horizontal strokes +E50E 58638 Oopf isomopf /Bbb O, open face O +E512 58642 Sopf isomopf /Bbb S, open face S +E513 58643 Topf isomopf /Bbb T, open face T +E514 58644 Uopf isomopf /Bbb U, open face U + +E515 58645 Vopf isomopf /Bbb V, open face V +E516 58646 Wopf isomopf /Bbb W, open face W +E517 58647 Xopf isomopf /Bbb X, open face X +E518 58648 Yopf isomopf /Bbb Y, open face Y +E520 58656 Ascr isomscr /scr A, script letter A +E522 58658 Cscr isomscr /scr C, script letter C +E523 58659 Dscr isomscr /scr D, script letter D +E526 58662 Gscr isomscr /scr G, script letter G +E529 58665 Jscr isomscr /scr J, script letter J +E52A 58666 Kscr isomscr /scr K, script letter K + +E52D 58669 Nscr isomscr /scr N, script letter N +E52E 58670 Oscr isomscr /scr O, script letter O +E52F 58671 Pscr isomscr /scr P, script letter P +E530 58672 Qscr isomscr /scr Q, script letter Q +E531 58673 Rscr isomscr /scr R, script letter R +E532 58674 Sscr isomscr /scr S, script letter S +E533 58675 Tscr isomscr /scr T, script letter T +E534 58676 Uscr isomscr /scr U, script letter U +E535 58677 Vscr isomscr /scr V, script letter V +E536 58678 Wscr isomscr /scr W, script letter W + +E537 58679 Xscr isomscr /scr X, script letter X +E538 58680 Yscr isomscr /scr Y, script letter Y +E539 58681 Zscr isomscr /scr Z, script letter Z +E540 58688 ascr isomscr /scr a, script letter a +E541 58689 bscr isomscr /scr b, script letter b +E542 58690 cscr isomscr /scr c, script letter c +E543 58691 dscr isomscr /scr d, script letter d +E545 58693 fscr isomscr /scr f, script letter f +E546 58694 gscr isomscr /scr g, script letter g +E547 58695 hscr isomscr /scr h, script letter h + +E548 58696 iscr isomscr /scr i, script letter i +E549 58697 jscr isomscr /scr j, script letter j +E54A 58698 kscr isomscr /scr k, script letter k +E54B 58699 lscr isomscr /scr l, script letter l +E54C 58700 mscr isomscr /scr m, script letter m +E54D 58701 nscr isomscr /scr n, script letter n +E54F 58703 pscr isomscr /scr p, script letter p +E550 58704 qscr isomscr /scr q, script letter q +E551 58705 rscr isomscr /scr r, script letter r +E552 58706 sscr isomscr /scr s, script letter s + +E553 58707 tscr isomscr /scr t, script letter t +E554 58708 uscr isomscr /scr u, script letter u +E555 58709 vscr isomscr /scr v, script letter v +E556 58710 wscr isomscr /scr w, script letter w +E557 58711 xscr isomscr /scr x, script letter x +E558 58712 yscr isomscr /scr y, script letter y +E559 58713 zscr isomscr /scr z, script letter z +E560 58720 Afr isomfrk /frak A, upper case a +E561 58721 Bfr isomfrk /frak B, upper case b +E562 58722 Cfr isomfrk /frak C, upper case c + +E563 58723 Dfr isomfrk /frak D, upper case d +E564 58724 Efr isomfrk /frak E, upper case e +E565 58725 Ffr isomfrk /frak F, upper case f +E566 58726 Gfr isomfrk /frak G, upper case g +E569 58729 Jfr isomfrk /frak J, upper case j +E56A 58730 Kfr isomfrk /frak K, upper case k +E56B 58731 Lfr isomfrk /frak L, upper case l +E56C 58732 Mfr isomfrk /frak M, upper case m +E56D 58733 Nfr isomfrk /frak N, upper case n +E56E 58734 Ofr isomfrk /frak O, upper case o + +E56F 58735 Pfr isomfrk /frak P, upper case p +E570 58736 Qfr isomfrk /frak Q, upper case q +E572 58738 Sfr isomfrk /frak S, upper case s +E573 58739 Tfr isomfrk /frak T, upper case t +E574 58740 Ufr isomfrk /frak U, upper case u +E575 58741 Vfr isomfrk /frak V, upper case v +E576 58742 Wfr isomfrk /frak W, upper case w +E577 58743 Xfr isomfrk /frak X, upper case x +E578 58744 Yfr isomfrk /frak Y, upper case y +E579 58745 Zfr isomfrk /frak Z, upper case z + +E580 58752 afr isomfrk /frak a, lower case a +E581 58753 bfr isomfrk /frak b, lower case b +E582 58754 cfr isomfrk /frak c, lower case c +E583 58755 dfr isomfrk /frak d, lower case d +E584 58756 efr isomfrk /frak e, lower case e +E585 58757 ffr isomfrk /frak f, lower case f +E586 58758 gfr isomfrk /frak g, lower case g +E587 58759 hfr isomfrk /frak h, lower case h +E588 58760 ifr isomfrk /frak i, lower case i +E589 58761 jfr isomfrk /frak j, lower case j + +E58A 58762 kfr isomfrk /frak k, lower case k +E58B 58763 lfr isomfrk /frak l, lower case l +E58C 58764 mfr isomfrk /frak m, lower case m +E58D 58765 nfr isomfrk /frak n, lower case n +E58E 58766 ofr isomfrk /frak o, lower case o +E58F 58767 pfr isomfrk /frak p, lower case p +E590 58768 qfr isomfrk /frak q, lower case q +E591 58769 rfr isomfrk /frak r, lower case r +E592 58770 sfr isomfrk /frak s, lower case s +E593 58771 tfr isomfrk /frak t, lower case t + +E594 58772 ufr isomfrk /frak u, lower case u +E595 58773 vfr isomfrk /frak v, lower case v +E596 58774 wfr isomfrk /frak w, lower case w +E597 58775 xfr isomfrk /frak x, lower case x +E598 58776 yfr isomfrk /frak y, lower case y +E599 58777 zfr isomfrk /frak z, lower case z +E5DC 58844 NotPrecedesEqual mmlalias alias ISOAMSN npre +E5DC 58844 npre isoamsn /npreceq N: not precedes, equals +E5DC 58844 npreceq mmlalias alias ISOAMSN npre +E5F1 58865 NotSucceedsEqual mmlalias alias ISOAMSN nsce + +E5F1 58865 nsce isoamsn /nsucceq N: not succeeds, equals +E5F1 58865 nsucceq mmlalias alias ISOAMSN nsce + +E6 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E604 58884 NotSquareSubset mmlextra square not subset +E615 58901 NotSquareSuperset mmlextra negated set-like partial order operator +E616 58902 NotHumpDownHump mmlextra alias for ≎̸ +E616 58902 nbump mmlextra not bumpy equals +E619 58905 Cross mmlextra cross or vector product + +E7 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E700 59136 b.alpha isogrk4 small alpha, Greek +E701 59137 b.beta isogrk4 small beta, Greek +E702 59138 b.gamma isogrk4 small gamma, Greek +E703 59139 b.Gamma isogrk4 capital gamma, Greek +E704 59140 b.gammad isogrk4 digamma, Greek +E705 59141 b.Gammad isogrk4 capital digamma, Greek +E706 59142 b.delta isogrk4 small delta, Greek +E707 59143 b.Delta isogrk4 capital delta, Greek +E708 59144 b.epsi isogrk4 small epsilon, Greek +E709 59146 b.epsiv isogrk4 varepsilion + +E70B 59145 b.zeta isogrk4 small zeta, Greek +E70C 59148 b.eta isogrk4 small eta, Greek +E70D 59149 b.thetas isogrk4 straight theta, Greek +E70E 59150 b.Theta isogrk4 capital theta, Greek +E70F 59151 b.thetav isogrk4 var theta, Greek +E710 59152 b.iota isogrk4 small iota, Greek +E711 59153 b.kappa isogrk4 small kappa, Greek +E712 59154 b.kappav isogrk4 var kappa, Greek +E713 59155 b.lambda isogrk4 small lambda, Greek +E714 59156 b.Lambda isogrk4 capital lambda, Greek + +E715 59157 b.mu isogrk4 small mu, Greek +E716 59158 b.nu isogrk4 small nu, Greek +E717 59159 b.xi isogrk4 small xi, Greek +E718 59160 b.Xi isogrk4 capital xi, Greek +E719 59161 b.pi isogrk4 small pi, Greek +E71A 59162 b.Pi isogrk4 capital pi, Greek +E71B 59163 b.piv isogrk4 varpi +E71C 59164 b.rho isogrk4 small rho, Greek +E71D 59165 b.rhov isogrk4 varrho +E71E 59166 b.sigma isogrk4 small sigma, Greek + +E71F 59167 b.Sigma isogrk4 capital sigma, Greek +E720 59168 b.sigmav isogrk4 varsigma +E721 59169 b.tau isogrk4 small tau, Greek +E722 59170 b.upsi isogrk4 small upsilon, Greek +E723 59171 b.Upsilon isogrk4 capital upsilon, Greek +E724 59172 b.phis isogrk4 straight phi, Greek +E725 59173 b.Phi isogrk4 capital Phi, Greek +E726 59174 b.phiv isogrk4 varphi +E727 59175 b.chi isogrk4 small chi, Greek +E728 59176 b.psi isogrk4 small psi, Greek + +E729 59177 b.Psi isogrk4 capital Psi, Greek +E72A 59178 b.omega isogrk4 small omega, Greek +E72B 59179 b.Omega isogrk4 capital Omega, Greek + +E8 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +E800 59392 backepsilon mmlalias alias ISOAMSR bepsi +E800 59392 bepsi isoamsr /backepsilon R: such that +E80B 59403 blacklozenge mmlalias alias ISOPUB lozf +E80B 59403 lozf isopub /blacklozenge - lozenge, filled +E837 59447 NotSucceedsTilde mmlextra not succeeds or similar +E838 59448 ovbar isoamsb circle with vertical bar +E844 59460 smallsetminus mmlalias alias ISOAMSB ssetmn +E844 59460 ssetmn isoamsb /smallsetminus B: sm reverse solidus +E84D 59469 NotHumpEqual mmlextra alias for ≏̸ +E84D 59469 nbumpe mmlextra not bumpy single equals + +E84E 59470 NotEqualTilde mmlextra alias for ≂̸ +E84E 59470 nesim mmlextra not equal or similar +E850 59472 LeftSkeleton mmlextra start of missing information +E851 59473 RightSkeleton mmlextra end of missing information +E859 59481 HorizontalLine mmlextra short horizontal line +E85A 59482 VerticalLine mmlextra short vertical line +E85B 59483 Assign mmlextra assignment operator +E85C 59484 VerticalSeparator mmlextra vertical separating operator +E87F 59519 ShortDownArrow mmlextra short down arrow +E880 59520 ShortUpArrow mmlextra sort up arrow + +E891 59537 IndentingNewLine mmlextra force a line break and indent appropriately on next line +E892 59538 NoBreak mmlextra never break line here +E893 59539 GoodBreak mmlextra if a linebreak is needed, here is a good spot +E894 59540 BadBreak mmlextra if a linebreak is needed, try to avoid breaking here +E897 59543 ThickSpace mmlextra space of width 5/18 em +E898 59544 NegativeVeryThinSpace mmlextra space of width -1/18 em +E899 59545 NegativeThinSpace mmlextra space of width -3/18 em +E89A 59546 NegativeMediumSpace mmlextra space of width -4/18 em +E89B 59547 NegativeThickSpace mmlextra space of width -5/18 em +E89C 59548 InvisibleComma mmlextra used as a separator, e.g., in indices + +E89C 59548 ic mmlextra short form of ⁣ +E89E 59550 InvisibleTimes mmlextra marks multiplication when it is understood without a mark +E89E 59550 it mmlextra short form of ⁢ +E8A0 59552 ApplyFunction mmlextra character showing function application in presentation tagging +E8A0 59552 af mmlextra short form of ⁡ +E8A7 59559 false mmlextra logical constant false +E8AA 59562 NotANumber mmlextra used in MML 4.3.2.9 +E8AB 59563 true mmlextra logical constant true + +F4 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +F410 62480 LeftTriangleBar mmlextra not left triangle, vertical bar +F411 62481 RightTriangleBar mmlextra vertical bar, right triangle +F412 62482 NotLeftTriangleBar mmlextra not left triangle, vertical bar +F413 62483 NotRightTriangleBar mmlextra not vertical bar, right triangle +F423 62499 NotNestedLessLess mmlextra not double less-than sign +F428 62504 NotNestedGreaterGreater mmlextra not double greater-than sign +F431 62513 Equal mmlextra two consecutive equal signs + +F5 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +F503 62723 UpArrowBar mmlextra up arrow to bar +F504 62724 DownArrowBar mmlextra down arrow to bar +F505 62725 LeftRightVector mmlextra left-up-right-up harpoon +F507 62727 LeftVectorBar mmlextra left-up harpoon to bar +F508 62728 RightVectorBar mmlextra up-right harpoon to bar +F509 62729 LeftTeeVector mmlextra left-up harpoon from bar +F50A 62730 RightTeeVector mmlextra right-up harpoon from bar +F50B 62731 DownLeftRightVector mmlextra left-down-right-down harpoon +F50C 62732 DownLeftVectorBar mmlextra left-down harpoon to bar +F50D 62733 DownRightVectorBar mmlextra right-down harpoon to bar + +F50E 62734 DownLeftTeeVector mmlextra left-down harpoon from bar +F50F 62735 DownRightTeeVector mmlextra right-down harpoon from bar +F510 62736 RightUpDownVector mmlextra up-right-down-right harpoon +F511 62737 RightUpVectorBar mmlextra up-right harpoon to bar +F512 62738 RightDownVectorBar mmlextra down-right harpoon to bar +F513 62739 RightUpTeeVector mmlextra up-right harpoon from bar +F514 62740 RightDownTeeVector mmlextra down-right harpoon from bar +F515 62741 LeftUpDownVector mmlextra up-left-down-left harpoon +F516 62742 LeftUpVectorBar mmlextra up-left harpoon to bar +F517 62743 LeftDownVectorBar mmlextra down-left harpoon to bar + +F518 62744 LeftUpTeeVector mmlextra up-left harpoon from bar +F519 62745 LeftDownTeeVector mmlextra down-left harpoon from bar +F51F 62751 RuleDelayed mmlextra rule-delayed (colon right arrow) +F524 62756 RoundImplies mmlextra round implies +F527 62759 EmptySmallSquare mmlextra empty small square +F528 62760 FilledSmallSquare mmlextra filled small square +F529 62761 FilledVerySmallSquare mmlextra filled very small square +F530 62768 EmptyVerySmallSquare mmlextra empty small square + +F6 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +F603 62979 LeftBracketingBar mmlextra left vertical delimiter +F604 62980 RightBracketingBar mmlextra right vertical delimiter +F605 62981 LeftDoubleBracketingBar mmlextra left double vertical delimiter +F606 62982 RightDoubleBracketingBar mmlextra right double vertical delimiter +F610 62992 OverParenthesis mmlextra over parenthesis +F611 62993 UnderParenthesis mmlextra under parenthesis +F612 62994 OverBrace mmlextra over brace +F613 62995 UnderBrace mmlextra under brace +F614 62996 OverBracket mmlextra over bracket +F615 62997 UnderBracket mmlextra under bracket + +F7 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +F74B 63307 CapitalDifferentialD mmlextra D for use in differentials, e.g., within integrals +F74B 63307 DD mmlextra short form of CapitalDifferentialD +F74C 63308 DifferentialD mmlextra d for use in differentials, e.g., within integrals +F74C 63308 dd mmlextra short form of ⅆ +F74D 63309 ExponentialE mmlextra e use for the exponential base of the natural logarithms +F74D 63309 ee mmlextra short form of ⅇ +F74E 63310 ImaginaryI mmlextra i for use as a square root of -1 +F74E 63310 ii mmlextra short form of ⅈ + +FB 00 01 02 03 04 20 21 22 23 24 25 26 27 30 E2 E3 E4 E5 E6 E7 E8 F4 F5 +F6 F7 FB + +Code Character Name Group Description +=========== ============================== ========== ========================================== +FB00 64256 fflig isopub small ff ligature +FB01 64257 filig isopub small fi ligature +FB02 64258 fllig isopub small fl ligature +FB03 64259 ffilig isopub small ffi ligature +FB04 64260 ffllig isopub small ffl ligature diff --git a/mozilla/layout/mathml/tools/gendtd.pl b/mozilla/layout/mathml/tools/gendtd.pl new file mode 100644 index 00000000000..2b471217088 --- /dev/null +++ b/mozilla/layout/mathml/tools/gendtd.pl @@ -0,0 +1,761 @@ +#!/bin/perl + +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is The University Of +# Queensland. Portions created by The University Of Queensland are +# Copyright (C) 1999 The University Of Queensland. All +# Rights Reserved. +# +# Contributor(s): +# Roger B. Sidje +# + +# Purpose: +# This script processes unicode points and generates a file that +# contains the MathML DTD, i.e., the XML definitions of +# MathML entities. +# RBS - Aug 27, 1999. + +$usage = <$entity_file") || die("can't open $entity_file"); + +print "\n\nBuilding the entity list and Saving into:\n$entity_file ...\n"; + +# collect the aliases in an array of strings. + +$count = $pua = 0; +$ignore = join(" ",@IGNORE); + +for ($i=0; $i<=$#ENTITY_SET; ++$i) { + $entity = $ENTITY_SET[$i]; + $unicode = $UNICODE{$entity}; + + #skip if entity should be ignored + next if $ignore =~ /$entity/; + + #skip if no unicode or entity is already in the table + next if $unicode eq "" || $TABLE{$unicode} =~ /$entity/; + + $TABLE{$unicode} .= " $entity"; + + $XML_DECLARATION{$unicode} .= + ' '; + ++$count; + + $XML_CONTENT .= '&' . $entity . ";\n"; + + if ($unicode ge "E000" && $unicode le "F8FF") { +# print "PUA\n-------------------------\n" if $pua == 0; +# print "$unicode $entity\n"; + $TABLE_PUA{$unicode} .= " $entity"; + ++$pua; + } +} + +foreach $unicode (sort keys %TABLE_PUA) { + $PUA .= "$unicode $TABLE_PUA{$unicode}\n"; +} + +foreach $unicode (sort keys %TABLE) { +# print OUTPUT_FILE "$unicode $TABLE{$unicode}\n"; + $XML_DOCTYPE .= $XML_DECLARATION{$unicode} . "\n"; +} + +print OUTPUT_FILE < + --> + + + +HEADER_DATA + +#print OUTPUT_FILE "\n\n"; + + +#print OUTPUT_FILE "$XML_CONTENT\n"; +#print < +#XML + + +close(OUTPUT_FILE); + +print "Done $count unicode points. PUA: $pua\n"; + +exit(0); + +################################ + + + + + + +# All outputs are global variables ... + +# +# extract all the symbols of the MathML REC byalpha.txt or bycodes.txt (the +# name of the file is passed as argument) +# INPUT: "byalpha.txt" or "bycodes.txt" +# OUTPUT: - hash array %UNICODE holding $UNICODE{$entity} = $unicode +# - array @ENTITY such $ENTITY[$i] is an entity name +# - hash array %ENTITY_LAST_ALIAS such that +# $ENTITY_LAST_ALIAS{$unicode} = last entity with that unicode +sub getUnicode { + local($infile) = @_[0]; + + $byalpha = $infile =~ /byalpha/; + + print "\nScanning $infile ..."; + open (INFILE, $infile) || die("Can't open $infile"); + + $count = 0; + while () { + #pattern byalpha: entity isolat2 377 unicode =capital Z, acute accent + if ($byalpha) { # byalpha -- ALIASES ARE INCLUDED + if ( /^([a-z\.]\S+)\s+\S+\s+\d+\s+(\S+)\s+.*/i ) { + ($entity,$unicode) = ($1,$2); + if ($UNICODE{$entity}) { #conflicting mapping ? + next if $UNICODE{$entity} eq $unicode; + print "\nWARNING! Found: $entity -> $unicode <-- $map --> $UNICODE{$entity}"; + } + + $UNICODE{$entity} = $unicode; + $ENTITY_LAST_ALIAS{$unicode} = $entity; + ++$count; + } + } + else { # bycodes -- ALIASES ARE NOT INCLUDED + #pattern bycode: unicode 9 entity mmlextra tabulator stop; horizontal tabulation + if ( /^(\S+)\s+\d+\s+([a-z\.]+)\s+\S+\s+.*/i ) { + ($unicode,$entity) = ($1,$2); +# print "\n$entity $unicode"; + $UNICODE{$entity} = $unicode; + $ENTITY_LAST_ALIAS{$unicode} = $entity; + ++$count; + } + } + } + @ENTITY = (keys %UNICODE); + print "\nFound: $count unicode points, " . ($#ENTITY+1) . " entities\n"; +} + +#Get entity names of TeX Symbols +#Symbols obtained by using TeX2MathML (http://hutchinson.belmont.ma.us/tth/mml/tthmmlform.html) +#The input snippets were taken from David Carlisle's symbols.tex (ver 3.2) +# INPUT: +# OUTPUT: an array @TEX such that $TEX[$i] is the name of an entity +sub getTeX { +@SYMBOLS = <>\asymp∥⊂⊃≈\bowtie⊆⊇≅\Join\sqsubset\sqsupset≠ +\smile\sqsubseteq\sqsupseteq\doteq\frown∈∋∝=\vdash\dashv +←←↑⇐⇐⇑→→↓⇒⇒⇑⇆⇆ +↓&lrArr;&lrArr;↓→\longmapsto\nearrow\hookleftarrow\hookrightarrow\searrow +\leftharpoonup\rightharpoonup\swarrow\leftharpoondown\rightharpoondown\nwarrow\rightleftharpoons\leadsto +……:ℵ'∀∞∅∃ı▿¬\Diamondȷ +√\flat\triangleℓ⊤\natural♣℘⊥\sharp♦&rfraktur; +\♥&ifraktur;∠∂♠\mho +∑⋂\bigodotΠ⋃⨂\coprod\bigsqcup⨁∫⋁\biguplus∮⋀ +⪻ +()↑⇑[]↓⇑{}↓↓⌊⌋⌈⌉⟨⟩/\‖ +TEX2MathML + +# extract the relevant part + $count = 0; + $string = join("",@SYMBOLS); + $string =~ s#\n##g; + $string =~ s#[^a-zA-Z\&;]##g; + $string =~ s#;#;\n#g; + while ($string =~ m#\&([a-zA-z]+);#g) { + $TEX[$count] = $1; + ++$count; + } +} + +#Get entity names of MathML Operators +# INPUT: +# OUTPUT: an array @OPERATOR such that $OPERATOR[$i] is the name of an operator entity +sub getMathMLOperators { +@SYMBOLS = <" form="infix" lspace=".27777em" rspace=".27777em" + + ":" form="infix" lspace=".27777em" rspace=".27777em" + + ".." form="postfix" lspace=".22222em" rspace="0em" + "..." form="postfix" lspace=".22222em" rspace="0em" + + "∋" form="infix" lspace=".27777em" rspace=".27777em" + + "⫤" form="infix" lspace=".27777em" rspace=".27777em" + "⊨" form="infix" lspace=".27777em" rspace=".27777em" + "⊤" form="infix" lspace=".27777em" rspace=".27777em" + "⊣" form="infix" lspace=".27777em" rspace=".27777em" + "⊢" form="infix" lspace=".27777em" rspace=".27777em" + + "⇒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥰" form="infix" lspace=".27777em" rspace=".27777em" + + "|" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "||" form="infix" lspace=".22222em" rspace=".22222em" + "⩔" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + + "&&" form="infix" lspace=".27777em" rspace=".27777em" + "⩓" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + + "&" form="infix" lspace=".27777em" rspace=".27777em" + + "!" form="prefix" lspace="0em" rspace=".27777em" + "⫬" form="prefix" lspace="0em" rspace=".27777em" + + "∃" form="prefix" lspace="0em" rspace=".27777em" + "∀" form="prefix" lspace="0em" rspace=".27777em" + "∄" form="prefix" lspace="0em" rspace=".27777em" + + "∈" form="infix" lspace=".27777em" rspace=".27777em" + "∉" form="infix" lspace=".27777em" rspace=".27777em" + "∌" form="infix" lspace=".27777em" rspace=".27777em" + "⊏̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋢" form="infix" lspace=".27777em" rspace=".27777em" + "⊐̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋣" form="infix" lspace=".27777em" rspace=".27777em" + "⊂⃒" form="infix" lspace=".27777em" rspace=".27777em" + "⊈" form="infix" lspace=".27777em" rspace=".27777em" + "⊃⃒" form="infix" lspace=".27777em" rspace=".27777em" + "⊉" form="infix" lspace=".27777em" rspace=".27777em" + "∋" form="infix" lspace=".27777em" rspace=".27777em" + "⊏" form="infix" lspace=".27777em" rspace=".27777em" + "⊑" form="infix" lspace=".27777em" rspace=".27777em" + "⊐" form="infix" lspace=".27777em" rspace=".27777em" + "⊒" form="infix" lspace=".27777em" rspace=".27777em" + "⋐" form="infix" lspace=".27777em" rspace=".27777em" + "⊆" form="infix" lspace=".27777em" rspace=".27777em" + "⊃" form="infix" lspace=".27777em" rspace=".27777em" + "⊇" form="infix" lspace=".27777em" rspace=".27777em" + + "⇐" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇔" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥐" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥞" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↽" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥖" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥟" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇁" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥗" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "←" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇤" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇆" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↔" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥎" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↤" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥚" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↼" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥒" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↙" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↘" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "→" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇥" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇄" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↦" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥛" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⇀" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⥓" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "←" form="infix" lspace=".27777em" rspace=".27777em" + "→" form="infix" lspace=".27777em" rspace=".27777em" + "↖" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "↗" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + + "=" form="infix" lspace=".27777em" rspace=".27777em" + "<" form="infix" lspace=".27777em" rspace=".27777em" + ">" form="infix" lspace=".27777em" rspace=".27777em" + "!=" form="infix" lspace=".27777em" rspace=".27777em" + "==" form="infix" lspace=".27777em" rspace=".27777em" + "<=" form="infix" lspace=".27777em" rspace=".27777em" + ">=" form="infix" lspace=".27777em" rspace=".27777em" + "≡" form="infix" lspace=".27777em" rspace=".27777em" + "≍" form="infix" lspace=".27777em" rspace=".27777em" + "≐" form="infix" lspace=".27777em" rspace=".27777em" + "∥" form="infix" lspace=".27777em" rspace=".27777em" + "⩵" form="infix" lspace=".27777em" rspace=".27777em" + "≂" form="infix" lspace=".27777em" rspace=".27777em" + "⇌" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "≥" form="infix" lspace=".27777em" rspace=".27777em" + "⋛" form="infix" lspace=".27777em" rspace=".27777em" + "≧" form="infix" lspace=".27777em" rspace=".27777em" + "⪢" form="infix" lspace=".27777em" rspace=".27777em" + "≷" form="infix" lspace=".27777em" rspace=".27777em" + "⩾" form="infix" lspace=".27777em" rspace=".27777em" + "≳" form="infix" lspace=".27777em" rspace=".27777em" + "≎" form="infix" lspace=".27777em" rspace=".27777em" + "≏" form="infix" lspace=".27777em" rspace=".27777em" + "⊲" form="infix" lspace=".27777em" rspace=".27777em" + "⧏" form="infix" lspace=".27777em" rspace=".27777em" + "⊴" form="infix" lspace=".27777em" rspace=".27777em" + "≤" form="infix" lspace=".27777em" rspace=".27777em" + "⋚" form="infix" lspace=".27777em" rspace=".27777em" + "≦" form="infix" lspace=".27777em" rspace=".27777em" + "≶" form="infix" lspace=".27777em" rspace=".27777em" + "⪡" form="infix" lspace=".27777em" rspace=".27777em" + "⩽" form="infix" lspace=".27777em" rspace=".27777em" + "≲" form="infix" lspace=".27777em" rspace=".27777em" + "≫" form="infix" lspace=".27777em" rspace=".27777em" + "≪" form="infix" lspace=".27777em" rspace=".27777em" + "≢" form="infix" lspace=".27777em" rspace=".27777em" + "≭" form="infix" lspace=".27777em" rspace=".27777em" + "∦" form="infix" lspace=".27777em" rspace=".27777em" + "≠" form="infix" lspace=".27777em" rspace=".27777em" + "≂̸" form="infix" lspace=".27777em" rspace=".27777em" + "≯" form="infix" lspace=".27777em" rspace=".27777em" + "≱" form="infix" lspace=".27777em" rspace=".27777em" + "≧̸" form="infix" lspace=".27777em" rspace=".27777em" + "≫̸" form="infix" lspace=".27777em" rspace=".27777em" + "≹" form="infix" lspace=".27777em" rspace=".27777em" + "⩾̸" form="infix" lspace=".27777em" rspace=".27777em" + "≵" form="infix" lspace=".27777em" rspace=".27777em" + "≎̸" form="infix" lspace=".27777em" rspace=".27777em" + "≏̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋪" form="infix" lspace=".27777em" rspace=".27777em" + "⧏̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋬" form="infix" lspace=".27777em" rspace=".27777em" + "≮" form="infix" lspace=".27777em" rspace=".27777em" + "≰" form="infix" lspace=".27777em" rspace=".27777em" + "&NotLessFullEqual;" form="infix" lspace=".27777em" rspace=".27777em" + "≸" form="infix" lspace=".27777em" rspace=".27777em" + "≪̸" form="infix" lspace=".27777em" rspace=".27777em" + "⩽̸" form="infix" lspace=".27777em" rspace=".27777em" + "≴" form="infix" lspace=".27777em" rspace=".27777em" + "⪢̸" form="infix" lspace=".27777em" rspace=".27777em" + "⪡̸" form="infix" lspace=".27777em" rspace=".27777em" + "⊀" form="infix" lspace=".27777em" rspace=".27777em" + "⪯̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋠" form="infix" lspace=".27777em" rspace=".27777em" + "&NotPrecedesTilde;" form="infix" lspace=".27777em" rspace=".27777em" + "⋫" form="infix" lspace=".27777em" rspace=".27777em" + "⧐̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋭" form="infix" lspace=".27777em" rspace=".27777em" + "⊁" form="infix" lspace=".27777em" rspace=".27777em" + "⪰̸" form="infix" lspace=".27777em" rspace=".27777em" + "⋡" form="infix" lspace=".27777em" rspace=".27777em" + "≿̸" form="infix" lspace=".27777em" rspace=".27777em" + "≁" form="infix" lspace=".27777em" rspace=".27777em" + "≄" form="infix" lspace=".27777em" rspace=".27777em" + "≇" form="infix" lspace=".27777em" rspace=".27777em" + "≉" form="infix" lspace=".27777em" rspace=".27777em" + "∤" form="infix" lspace=".27777em" rspace=".27777em" + "≺" form="infix" lspace=".27777em" rspace=".27777em" + "⪯" form="infix" lspace=".27777em" rspace=".27777em" + "≼" form="infix" lspace=".27777em" rspace=".27777em" + "≾" form="infix" lspace=".27777em" rspace=".27777em" + "∷" form="infix" lspace=".27777em" rspace=".27777em" + "∝" form="infix" lspace=".27777em" rspace=".27777em" + "⇋" form="infix" stretchy="true" lspace=".27777em" rspace=".27777em" + "⊳" form="infix" lspace=".27777em" rspace=".27777em" + "⧐" form="infix" lspace=".27777em" rspace=".27777em" + "⊵" form="infix" lspace=".27777em" rspace=".27777em" + "≻" form="infix" lspace=".27777em" rspace=".27777em" + "⪰" form="infix" lspace=".27777em" rspace=".27777em" + "≽" form="infix" lspace=".27777em" rspace=".27777em" + "≿" form="infix" lspace=".27777em" rspace=".27777em" + "∼" form="infix" lspace=".27777em" rspace=".27777em" + "≃" form="infix" lspace=".27777em" rspace=".27777em" + "≅" form="infix" lspace=".27777em" rspace=".27777em" + "≈" form="infix" lspace=".27777em" rspace=".27777em" + "⊥" form="infix" lspace=".27777em" rspace=".27777em" + "∣" form="infix" lspace=".27777em" rspace=".27777em" + + "⊔" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + "⋃" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + "⊎" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + + "-" form="infix" lspace=".22222em" rspace=".22222em" + "+" form="infix" lspace=".22222em" rspace=".22222em" + "⋂" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + "∓" form="infix" lspace=".22222em" rspace=".22222em" + "±" form="infix" lspace=".22222em" rspace=".22222em" + "⊓" form="infix" stretchy="true" lspace=".22222em" rspace=".22222em" + + "⋁" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "⊖" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" + "⊕" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" + "∑" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "⋃" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "⊎" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "lim" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" + "max" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" + "min" form="prefix" movablelimits="true" lspace="0em" rspace=".16666em" + + "⊖" form="infix" lspace=".16666em" rspace=".16666em" + "⊕" form="infix" lspace=".16666em" rspace=".16666em" + + "∲" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + "∮" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + "∳" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + "∯" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + "∫" form="prefix" largeop="true" stretchy="true" lspace="0em" rspace="0em" + + "⋓" form="infix" lspace=".16666em" rspace=".16666em" + + "⋒" form="infix" lspace=".16666em" rspace=".16666em" + + "≀" form="infix" lspace=".16666em" rspace=".16666em" + + "⋀" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "⊗" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" + "∐" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "∏" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + "⋂" form="prefix" largeop="true" movablelimits="true" stretchy="true" lspace="0em" rspace=".16666em" + + "∐" form="infix" lspace=".16666em" rspace=".16666em" + + "⋆" form="infix" lspace=".16666em" rspace=".16666em" + + "⊙" form="prefix" largeop="true" movablelimits="true" lspace="0em" rspace=".16666em" + + "*" form="infix" lspace=".16666em" rspace=".16666em" + "⁢" form="infix" lspace="0em" rspace="0em" + + "·" form="infix" lspace=".16666em" rspace=".16666em" + + "⊗" form="infix" lspace=".16666em" rspace=".16666em" + + "⋁" form="infix" lspace=".16666em" rspace=".16666em" + + "⋀" form="infix" lspace=".16666em" rspace=".16666em" + + "⋄" form="infix" lspace=".16666em" rspace=".16666em" + + "∖" form="infix" stretchy="true" lspace=".16666em" rspace=".16666em" + + "/" form="infix" stretchy="true" lspace=".16666em" rspace=".16666em" + + "-" form="prefix" lspace="0em" rspace=".05555em" + "+" form="prefix" lspace="0em" rspace=".05555em" + "∓" form="prefix" lspace="0em" rspace=".05555em" + "±" form="prefix" lspace="0em" rspace=".05555em" + + "." form="infix" lspace="0em" rspace="0em" + + "⨯" form="infix" lspace=".11111em" rspace=".11111em" + + "**" form="infix" lspace=".11111em" rspace=".11111em" + + "⊙" form="infix" lspace=".11111em" rspace=".11111em" + + "∘" form="infix" lspace=".11111em" rspace=".11111em" + + "□" form="prefix" lspace="0em" rspace=".11111em" + + "∇" form="prefix" lspace="0em" rspace=".11111em" + "∂" form="prefix" lspace="0em" rspace=".11111em" + + "ⅅ" form="prefix" lspace="0em" rspace=".11111em" + "ⅆ" form="prefix" lspace="0em" rspace=".11111em" + + "√" form="prefix" stretchy="true" lspace="0em" rspace=".11111em" + + "⇓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟸" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟺" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟹" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⤓" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇵" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↧" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥡" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇃" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥙" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥠" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↿" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥘" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟵" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟷" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⟶" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥯" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥝" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇂" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥏" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥜" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↾" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥔" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↓" form="infix" lspace=".11111em" rspace=".11111em" + "↑" form="infix" lspace=".11111em" rspace=".11111em" + "↑" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⤒" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⇅" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↕" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "⥮" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + "↥" form="infix" stretchy="true" lspace=".11111em" rspace=".11111em" + + "^" form="infix" lspace=".11111em" rspace=".11111em" + + "<>" form="infix" lspace=".11111em" rspace=".11111em" + + "'" form="postfix" lspace=".11111em" rspace="0em" + + "!" form="postfix" lspace=".11111em" rspace="0em" + "!!" form="postfix" lspace=".11111em" rspace="0em" + + "~" form="infix" lspace=".11111em" rspace=".11111em" + + "@" form="infix" lspace=".11111em" rspace=".11111em" + + "--" form="postfix" lspace=".11111em" rspace="0em" + "--" form="prefix" lspace="0em" rspace=".11111em" + "++" form="postfix" lspace=".11111em" rspace="0em" + "++" form="prefix" lspace="0em" rspace=".11111em" + + "⁡" form="infix" lspace="0em" rspace="0em" + + "?" form="infix" lspace=".11111em" rspace=".11111em" + + "_" form="infix" lspace=".11111em" rspace=".11111em" + + "˘" form="postfix" accent="true" lspace="0em" rspace="0em" + "¸" form="postfix" accent="true" lspace="0em" rspace="0em" + "`" form="postfix" accent="true" lspace="0em" rspace="0em" + "˙" form="postfix" accent="true" lspace="0em" rspace="0em" + "˝" form="postfix" accent="true" lspace="0em" rspace="0em" + "&DiacriticalLeftArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "&DiacriticalLeftRightArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "&DiacriticalLeftRightVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "&DiacriticalLeftVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "´" form="postfix" accent="true" lspace="0em" rspace="0em" + "&DiacriticalRightArrow;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "&DiacriticalRightVector;" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "˜" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "¨" form="postfix" accent="true" lspace="0em" rspace="0em" + "̑" form="postfix" accent="true" lspace="0em" rspace="0em" + "ˇ" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "^" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "‾" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⏞" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⎴" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⏜" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⃛" form="postfix" accent="true" lspace="0em" rspace="0em" + "_" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⏟" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⎵" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" + "⏝" form="postfix" accent="true" stretchy="true" lspace="0em" rspace="0em" +MathMLOperatorDictionary + +# extract the relevant part + $count = 0; + $string = join("",@SYMBOLS); + $string =~ s#\n##g; + $string =~ s#[^a-zA-Z\&;]##g; + $string =~ s#;#;\n#g; + while ($string =~ m#\&([a-zA-z]+);#g) { + $OPERATOR[$count] = $1; + ++$count; + } +} \ No newline at end of file diff --git a/mozilla/layout/mathml/tools/operator.pl b/mozilla/layout/mathml/tools/operator.pl new file mode 100644 index 00000000000..c2d88679244 --- /dev/null +++ b/mozilla/layout/mathml/tools/operator.pl @@ -0,0 +1,774 @@ +#!/bin/perl + +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla MathML Project. +# +# The Initial Developer of the Original Code is The University Of +# Queensland. Portions created by The University Of Queensland are +# Copyright (C) 1999 The University Of Queensland. All +# Rights Reserved. +# +# Contributor(s): +# Roger B. Sidje +# + +# Purpose: +# This script produces data for the operator dictionary +# RBS - Aug 28, 1999. + +# Output: the file $operator_file contains the dictionary in suitable +# format for inclusion with C++ macros. + +# $operator_file = '..\content\src\nsMathMLOperatorList.h'; +$operator_file = 'operator.list'; +$unicode_file = "byalpha.txt"; + +&getUnicode($unicode_file); # $unicode_file = "byalpha.txt" or "bycodes.txt" + # byalpha.txt, bycodes.txt are simply the Save as text of + # http://www.w3.org/TR/REC-MathML/chap6/byalpha.html + # http://www.w3.org/TR/REC-MathML/chap6/bycodes.html + +&getMathMLOperators(); # Get the MathML Operators - exact *copy-paste* from + # http://www.w3.org/TR/REC-MathML/appendixC.html + + +print "\n***** Saving into the file ***** $operator_file *****\n"; + +open(OUTPUT_FILE, ">$operator_file") || die("can't open $operator_file"); + +print OUTPUT_FILE < + */ + +/* MathML Operator Dictionary - Auto-generated by operator.pl. Do not edit! */ + +/* FORMAT +MATHML_OPERATOR(_rank, + _operator,= string value of the operator + _flags, = bitwise: movablelimits|separator|largeop|accent|fence|stretchy|form + _lspace, = leftspace in em + _rspace) = rightspace in em +*/ + +HEADER_DATA + + +# There are three global variables available here: +# $MACRO_LIST_UNICHAR - list of unicode that make the operator names +# $MACRO_LIST_UNIDATA - dictionary with the name of the operator as unicode +# $MACRO_LIST_ENTDATA - dictionary with the name of the operator as entity + +print OUTPUT_FILE <) { + #pattern byalpha: entity isolat2 377 unicode =capital Z, acute accent + if ($byalpha) { # byalpha -- ALIASES ARE INCLUDED + if ( /^([a-z\.]\S+)\s+\S+\s+\d+\s+(\S+)\s+.*/i ) { + ($entity,$unicode) = ($1,$2); + if ($UNICODE{$entity}) { #conflicting mapping ? + next if $UNICODE{$entity} eq $unicode; + print "\nWARNING! Found: $entity -> $unicode <> $UNICODE{$entity}"; + } + + $UNICODE{$entity} = $unicode; + $ENTITY_LAST_ALIAS{$unicode} = $entity; + ++$count; + } + } + else { # bycodes -- ALIASES ARE NOT INCLUDED + #pattern bycode: unicode 9 entity mmlextra tabulator stop; horizontal tabulation + if ( /^(\S+)\s+\d+\s+([a-z\.]+)\s+\S+\s+.*/i ) { + ($unicode,$entity) = ($1,$2); +# print "\n$entity $unicode"; + $UNICODE{$entity} = $unicode; + $ENTITY_LAST_ALIAS{$unicode} = $entity; + ++$count; + } + } + } + @ENTITY = (keys %UNICODE); + print "\nFound: $count unicode points, " . ($#ENTITY+1) . " entities\n"; +} + + +#Make the MathML Operator dictionary +# INPUT: +# OUTPUT: +# $MACRO_LIST_UNICHAR - list of unicode that make the operator names +# $MACRO_LIST_UNIDATA - dictionary with the name of the operator as unicode +# $MACRO_LIST_ENTDATA - dictionary with the name of the operator as entity + +sub getMathMLOperators { + +#Operator attributes: +# values <-- default --> +# form prefix |infix | postfix determined by position in mrow +# fence true | false set by dictionary +# accent true | false set by dictionary +# lspace number h-unit set by dictionary +# rspace number h-unit set by dictionary +# largeop true | false set by dictionary +# stretchy true | false set by dictionary +# separator true | false set by dictionary +# movablelimits true | false set by dictionary +# symmetric true | false true +# minzize number [h-unit | v-unit] 0 +# maxsize number [h-unit | v-unit] | infinity infinity + +$DATA = <