SubSuperScript.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Text.RegularExpressions
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text

'' このサンプルは、下付き文字と上付き文字を描画する方法を示します。
Public Class SubSuperScript
    Sub CreatePDF(ByVal stream As Stream)
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

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

        '' ランダムな段落を取得します。
        Dim para = Util.getString_ja(1, 1, 1)

        '' 段落から特定の文字列を抜き出します。
        Const subs = "負け"
        Const super = "いい"
        Dim frags = Regex.Split(para, $"({subs})|({super})")

        Dim fnt = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf"))

        '' 下付き文字と上付き文字のテキスト書式を作成します。
        Dim tfSub = New TextFormat() With {.Font = fnt, .FontSize = 12, .Subscript = True}
        Dim tfSuper = New TextFormat(tfSub) With {.Subscript = False, .Superscript = True}

        '' 特定の文字列のみ別の書式を使用して、TextLayout にテキストを追加します。
        Dim tl = g.CreateTextLayout()
        tl.DefaultFormat.Font = fnt
        tl.DefaultFormat.FontSize = 12
        For Each frag In frags
            If (frag = subs) Then
                tl.Append(frag, tfSub)
            ElseIf (frag = super) Then
                tl.Append(frag, tfSuper)
            Else
                tl.Append(frag)
            End If
        Next

        ''化学式の表記
        tl.AppendParagraphBreak()
        tl.Append($"化学式は、下付き文字を指定して表現できます。{vbCrLf} ")
        tl.AppendLine()
        Dim tfChem = New TextFormat() With {
                .Font = fnt,
                .FontSize = 16
            }
        Const strchem As String = "グルタミン酸:CH3CH2OH"
        Dim number As Integer = Nothing

        For Each frag In strchem.ToCharArray()

            If Integer.TryParse(frag.ToString(), number) Then
                tl.Append(frag.ToString(), tfSub)
            Else
                tl.Append(frag.ToString(), tfChem)
            End If
        Next


        '' レイアウトプロパティを設定してテキストを描画します。
        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)
    End Sub
End Class