示例#1
0
文件: RowAtom.cs 项目: step4/rac-quiz
        public Box GenerateDelimiterBox(HorizontalBox result, ref int elementPos, ref int resultPos)
        {
            var curAtom = Elements[elementPos];

            if (!(curAtom is CharSymbol) || !((CharSymbol)curAtom).IsDelimiter)
            {
                // This is not delimiter, hence just create and do nothing.
                var box = curAtom.CreateBox();
                if (curAtom.Type == CharType.BigOperator) // specific patch to BigOperator
                {
                    TexUtility.CentreBox(box);
                }
                if (box is HorizontalBox && (curAtom is AttrSizeAtom || curAtom is AttrStyleAtom)) // specific patch to Atoms that should be wrappable.
                {
                    var h = box as HorizontalBox;
                    result.AddRange(h, resultPos);
                    resultPos += h.children.Count;
                }
                else
                {
                    result.Add(resultPos++, box);
                }
                lastGeneratedBox = box;
                return(box);
            }

            var nextAtom = elementPos + 1 < Elements.Count ? Elements[elementPos + 1] : null;
            var prevAtom = elementPos > 0 ? Elements[elementPos - 1] : null;

            var minHeight = 0f;
            var ourPos    = resultPos;

            if (nextAtom != null && curAtom.RightType == CharType.OpenDelimiter)
            {
                elementPos++;
                var nextBox = GenerateDelimiterBox(result, ref elementPos, ref resultPos);
                minHeight = nextBox.totalHeight;
            }
            else if (lastGeneratedBox != null && curAtom.LeftType == CharType.CloseDelimiter)
            {
                var prevBox = lastGeneratedBox;
                minHeight = prevBox.totalHeight;
            }
            else
            {
                if (prevAtom != null && lastGeneratedBox != null)
                {
                    var prevBox = lastGeneratedBox;
                    minHeight = prevBox.totalHeight;
                }
                if (nextAtom != null)
                {
                    elementPos++;
                    var nextBox = GenerateDelimiterBox(result, ref elementPos, ref resultPos);
                    minHeight = Mathf.Max(nextBox.totalHeight, minHeight);
                }
            }
            var curBox = curAtom is SymbolAtom ? (((SymbolAtom)curAtom).CreateBox(minHeight)) : curAtom.CreateBox();

            TexUtility.CentreBox(curBox);
            result.Add(ourPos, curBox);
            if (ourPos == resultPos)
            {
                lastGeneratedBox = curBox;
            }
            resultPos++;
            return(curBox);
        }
示例#2
0
        public Box GenerateDelimiterBox(HorizontalBox result, ref int elementPos, ref int resultPos, TexStyle style)
        {
            var curAtom = Elements[elementPos];

            if (!(curAtom is CharSymbol) || !((CharSymbol)curAtom).IsDelimiter)
            {
                // This is not delimiter, hence just create and do nothing.
                var box = curAtom.CreateBox(style);
                if (curAtom.Type == CharType.BigOperator)
                {
                    TexUtility.CentreBox(box, style);
                }
                result.Add(resultPos, box);
                lastGeneratedBox = box;

                resultPos++;
                return(box);
            }

            var nextAtom = elementPos + 1 < Elements.Count ? Elements[elementPos + 1] : null;
            var prevAtom = elementPos > 0 ? Elements[elementPos - 1] : null;

            var minHeight = 0f;
            var ourPos    = resultPos;

            if (nextAtom != null && curAtom.GetRightType() == CharType.OpenDelimiter)
            {
                elementPos++;
                var nextBox = GenerateDelimiterBox(result, ref elementPos, ref resultPos, style);
                minHeight = nextBox.totalHeight;
            }
            else if (lastGeneratedBox != null && curAtom.GetLeftType() == CharType.CloseDelimiter)
            {
                var prevBox = lastGeneratedBox;
                minHeight = prevBox.totalHeight;
            }
            else
            {
                if (prevAtom != null && lastGeneratedBox != null)
                {
                    var prevBox = lastGeneratedBox;
                    minHeight = prevBox.totalHeight;
                }
                if (nextAtom != null)
                {
                    elementPos++;
                    var nextBox = GenerateDelimiterBox(result, ref elementPos, ref resultPos, style);
                    minHeight = Mathf.Max(nextBox.totalHeight, minHeight);
                }
            }
            var curBox = curAtom is SymbolAtom ? (((SymbolAtom)curAtom).CreateBox(style, minHeight)) : curAtom.CreateBox(style);

            TexUtility.CentreBox(curBox, style);
            result.Add(ourPos, curBox);
            if (ourPos == resultPos)
            {
                lastGeneratedBox = curBox;
            }
            resultPos++;
            return(curBox);
        }
示例#3
0
        public override Box CreateBox()
        {
            // Create box for base atom.

            // Save it shift and use it later

            // Create result box.


            // Set delta value and preliminary shift-up and shift-down amounts depending on type of base atom.
            float shiftUp = 0, shiftDown = 0;

            Box baseBox; HorizontalBox resultBox;

            if (SubscriptAtom == null && SuperscriptAtom == null)
            {
                return(BaseAtom == null ? StrutBox.Empty : BaseAtom.CreateBox());
            }
            if (BaseAtom is AccentedAtom)
            {
                TexContext.Environment.Push(TexUtility.GetCrampedStyle());
                baseBox = ((AccentedAtom)BaseAtom).BaseAtom.CreateBox();
                TexContext.Environment.Pop();
            }
            else
            {
                baseBox = (BaseAtom == null ? StrutBox.Empty : BaseAtom.CreateBox());
                //if (BaseAtom is CharSymbol)
                //{
                //    var delta = 0f;
                //    var ch = ((CharSymbol)BaseAtom).GetChar();
                //    if (!((CharSymbol)BaseAtom).IsTextSymbol)
                //        delta =  ch.italix + bearing - width;
                //    if (delta > TexUtility.FloatPrecision && SubscriptAtom == null)
                //    {
                //        resultBox.Add(StrutBox.Get(delta, 0, 0, 0));
                //        delta = 0;
                //    }
                //}
            }

            resultBox = HorizontalBox.Get(baseBox);

            var shift = baseBox.shift;


            Box           superscriptBox          = null;
            HorizontalBox superscriptContainerBox = null;
            Box           subscriptBox            = null;
            HorizontalBox subscriptContainerBox   = null;

            TexContext.Environment.Push(TexUtility.GetSuperscriptStyle());
            shiftUp = baseBox.height - TEXConfiguration.main.SupDrop * TexContext.Scale;

            if (SuperscriptAtom != null)
            {
                // Create box for superscript atom.
                superscriptBox          = SuperscriptAtom.CreateBox();
                superscriptContainerBox = HorizontalBox.Get(superscriptBox);

                // Add box for script space.
                superscriptContainerBox.Add(scriptSpaceAtom.CreateBox());

                // Adjust shift-up amount.
                float p;
                if (TexContext.Environment.value == TexEnvironment.Display)
                {
                    p = TEXConfiguration.main.SupMin * TexContext.Scale;
                }
                else
                {
                    p = TEXConfiguration.main.SupMinNarrow * TexContext.Scale;
                }

                shiftUp = Mathf.Max(shiftUp, p);
            }

            TexContext.Environment.Pop();

            TexContext.Environment.Push(TexUtility.GetSubscriptStyle());
            shiftDown = baseBox.depth + TEXConfiguration.main.SubDrop * TexContext.Scale;

            if (SubscriptAtom != null)
            {
                // Create box for subscript atom.
                subscriptBox          = SubscriptAtom.CreateBox();
                subscriptContainerBox = HorizontalBox.Get(subscriptBox);

                // Add box for script space.
                subscriptContainerBox.Add(scriptSpaceAtom.CreateBox());
            }

            TexContext.Environment.Pop();

            // Check if only superscript is set.
            if (subscriptBox == null)
            {
                superscriptContainerBox.shift = -shiftUp;
                resultBox.Add(superscriptContainerBox);
                resultBox.height = shiftUp + superscriptBox.height;
                return(resultBox);
            }

            // Check if only subscript is set.
            if (superscriptBox == null)
            {
                subscriptBox.shift = Mathf.Max(shiftDown, TEXConfiguration.main.SubMinNoSup * TexContext.Scale);
                resultBox.Add(subscriptContainerBox);
                resultBox.depth = shiftDown + subscriptBox.depth;
                return(resultBox);
            }



            // Adjust shift-down amount.
            shiftDown = Mathf.Max(shiftDown, TEXConfiguration.main.SubMinOnSup * TexContext.Scale);

            // Space between subscript and superscript.
            float scriptsInterSpace = shiftUp - superscriptBox.depth + shiftDown - subscriptBox.height;


            scriptsInterSpace = shiftUp - superscriptBox.depth + shiftDown - subscriptBox.height;

            // If baseAtom is null, make it right-aligned

            if (BaseAtom is SpaceAtom && ((SpaceAtom)BaseAtom).policy == StrutPolicy.Misc)
            {
                var max = Mathf.Max(superscriptContainerBox.width, subscriptContainerBox.width);
                if (superscriptContainerBox.width < max)
                {
                    superscriptContainerBox.Add(0, StrutBox.Get(max - superscriptContainerBox.width, 0, 0, 0));
                }
                if (subscriptContainerBox.width < max)
                {
                    subscriptContainerBox.Add(0, StrutBox.Get(max - subscriptContainerBox.width, 0, 0, 0));
                }
            }

            // Create box containing both superscript and subscript.
            var scriptsBox = VerticalBox.Get();

            scriptsBox.Add(superscriptContainerBox);
            scriptsBox.Add(StrutBox.Get(0, scriptsInterSpace, 0, 0));
            scriptsBox.Add(subscriptContainerBox);
            scriptsBox.height = shiftUp + superscriptBox.height;
            scriptsBox.depth  = shiftDown + subscriptBox.depth;
            scriptsBox.shift  = shift;
            resultBox.Add(scriptsBox);

            return(resultBox);
        }