SubSuperScript.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Text.RegularExpressions;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // このサンプルは、下付き文字と上付き文字を描画する方法を示します。
    public class SubSuperScript
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;

            var rc = Common.Util.AddNote(
                "上付き/下付き文字を指定するサンプルです。" +
                "TextFormat.Subscript および TextFormat.Superscript プロパティを使用します。" +
                "ランダムな文字列で段落を描画し、指定した文字のみを上付きまたは下付き文字として描画します。",
                page);

            // ランダムな段落を取得します。
            var para = Common.Util.getString_ja(1, 1, 1);

            // 段落から特定の文字列を抜き出します。
            const string sub = "負け";
            const string super = "いい";
            var frags = Regex.Split(para, $"({sub})|({super})");

            var font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothR.ttc"));

            // 下付き文字と上付き文字のテキスト書式を作成します。
            var tfSub = new TextFormat() { Font = font, FontSize = 12, Subscript = true };
            var tfSuper = new TextFormat(tfSub) { Subscript = false, Superscript = true };

            // 特定の文字列のみ別の書式を使用して、TextLayout にテキストを追加します。
            var tl = g.CreateTextLayout();
            tl.DefaultFormat.Font = font;
            tl.DefaultFormat.FontSize = 12;
            foreach (var frag in frags)
            {
                if (frag == sub)
                    tl.Append(frag, tfSub);
                else if (frag == super)
                    tl.Append(frag, tfSuper);
                else
                    tl.Append(frag);
            }

            // 化学式の表記
            tl.AppendParagraphBreak();
            tl.Append("化学式は、下付き文字を指定して表現できます。\n");
            tl.AppendLine();
            var tfChem = new TextFormat() { Font = font, FontSize = 16};

            const string strchem = @"グルタミン酸:CH3CH2OH";
            foreach (var frag in strchem.ToCharArray())
            {
                if (int.TryParse(frag.ToString(), out var number))
                    tl.Append(frag.ToString(), tfSub);
                else
                    tl.Append(frag.ToString(),tfChem);
            }


            // レイアウトプロパティを設定してテキストを描画します。
            tl.MaxWidth = page.Size.Width;
            tl.MaxHeight = page.Size.Height - rc.Height;
            tl.MarginAll = 72;
            tl.MarginTop = rc.Bottom + 36;
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);

            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}