Android で PowerPoint プレゼンテーションに数式を追加する
概要
PowerPoint では、数式や式を書いてプレゼンテーションに表示することが可能です。そのために、PowerPoint ではさまざまな数学記号が表現でき、テキストや数式に追加できます。これには、PowerPoint の数式コンストラクタを使用し、次のような複雑な式を作成します。
- 数学分数
- 数学根号
- 数学関数
- 極限および対数関数
- N 進演算子
- 行列
- 大きな演算子
- sin、cos 関数
PowerPoint で数式を追加するには、Insert → Equation メニューを使用します。

これにより、XML 形式の数式テキストが作成され、PowerPoint で次のように表示されます。

PowerPoint は多数の数学記号をサポートしていますが、複雑な数式を作成すると見栄えが必ずしも良くなりません。頻繁に数式プレゼンテーションを作成するユーザーは、見栄えの良い数式を作るためにサードパーティ製品を利用することがあります。
Aspose.Slide API を使用すれば、C# で PowerPoint の数式をプログラムから操作できます。新しい数式を作成したり、既存の数式を編集したりできます。また、数式構造を画像としてエクスポートする機能も部分的にサポートされています。
数式の作成方法
数式要素は任意の入れ子構造を持つ数式構築に使用されます。線形に並んだ数式要素の集合は、MathBlock クラスで表される数式ブロックとなります。MathBlock は、分離された数式、式、または方程式を表します。MathPortion は数式テキストを保持する要素で、Portion とは区別してください。MathParagraph は複数の MathBlock を操作できます。これらのクラスが、Aspose.Slides API を介した PowerPoint 数式操作の鍵となります。
以下の数式を Aspose.Slides API で作成する例を見てみましょう。

スライドに数式を追加するには、まず数式テキストを保持するシェイプを追加します。
Presentation pres = new Presentation();
try {
IAutoShape mathShape = pres.getSlides().get_Item(0).getShapes().addMathShape(0, 0, 720, 150);
} finally {
if (pres != null) pres.dispose();
}
作成直後、このシェイプには既にデフォルトで 1 つの段落があり、数学的な Portion が含まれています。MathPortion は数式テキストを保持する要素です。MathPortion 内の数式コンテンツにアクセスするには、MathParagraph 変数を参照します。
IMathParagraph mathParagraph = ((MathPortion)mathShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)).getMathParagraph();
MathParagraph クラスを使って、数式要素の組み合わせからなる MathBlock (MathBlock) を読み取り、追加、編集、削除できます。たとえば、分数を作成してプレゼンテーションに配置する例です。
IMathFraction fraction = new MathematicalText("x").divide("y");
mathParagraph.add(new MathBlock(fraction));
各数学要素は IMathElement インターフェイスを実装するクラスで表されます。このインターフェイスには、数式を簡単に作成するための多くのメソッドが用意されています。たった 1 行のコードでかなり複雑な数式を作ることができます。たとえば、ピタゴラスの定理は次のように記述できます。
IMathBlock mathBlock = new MathematicalText("c")
.setSuperscript("2")
.join("=")
.join(new MathematicalText("a").setSuperscript("2"))
.join("+")
.join(new MathematicalText("b").setSuperscript("2"));
IMathElement の操作は、MathBlock を含むすべての要素で実装されています。
完全なサンプルコードは以下の通りです。
Presentation pres = new Presentation();
try {
IAutoShape mathShape = pres.getSlides().get_Item(0).getShapes().addMathShape(0, 0, 720, 150);
IMathParagraph mathParagraph = ((MathPortion)mathShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)).getMathParagraph();
IMathFraction fraction = new MathematicalText("x").divide("y");
mathParagraph.add(new MathBlock(fraction));
IMathBlock mathBlock = new MathematicalText("c")
.setSuperscript("2")
.join("=")
.join(new MathematicalText("a").setSuperscript("2"))
.join("+")
.join(new MathematicalText("b").setSuperscript("2"));
mathParagraph.add(mathBlock);
pres.save("math.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
数学要素の種類
数式は数学要素のシーケンスから構成されます。要素のシーケンスは数式ブロックで表され、要素の引数はツリー状の入れ子構造になります。
多数の数学要素タイプがあり、これらは他の要素に含める(集約する)ことができます。つまり、要素は他の要素のコンテナとなり、ツリー構造を形成します。最も単純な要素は、他の要素を含まない数学テキストです。
各要素は IMathElement インターフェイスを実装しており、共通の数学操作セットを利用できます。
MathematicalText クラス
MathematicalText クラスは、すべての数式構築の基礎となる数学テキストを表します。オペランド、演算子、変数、その他の直線テキストを表現できます。
例: 𝑎=𝑏+𝑐
MathFraction クラス
MathFraction クラスは、分子と分母からなる分数オブジェクトを表します。分数バーは水平または斜めに設定可能です。また、分数バーなしで要素を上下に配置するスタック関数としても使用できます。
例:

MathRadical クラス
MathRadical クラスは、基底と任意の次数からなる根号関数を表します。
例:

MathFunction クラス
MathFunction クラスは、引数を持つ関数を表します。プロパティは getName(関数名)と getBase(関数の引数)です。
例:

MathNaryOperator クラス
MathNaryOperator クラスは、総和や積分など N 進演算子を表します。演算子、基底(またはオペランド)、任意の上限・下限から構成されます。加算や減算といった単純演算子は含まれません。単純演算子は MathematicalText で表します。
例:

MathLimit クラス
MathLimit クラスは、上限または下限を作成します。ベースライン上のテキストと、その直上または直下に小さく表示されるテキストで構成されます。 “lim” という文字は含まれませんが、式の上部または下部にテキストを配置できます。たとえば次の式は、MathFunction と MathLimit を組み合わせて作成します。
MathLimit funcName = new MathLimit(new MathematicalText("lim"), new MathematicalText("𝑥→∞"));
MathFunction mathFunc = new MathFunction(funcName, new MathematicalText("𝑥"));
MathSubscriptElement, MathSuperscriptElement, MathRightSubSuperscriptElement, MathLeftSubSuperscriptElement クラス
- MathSubscriptElement
- MathSuperscriptElement
- MathRightSubSuperscriptElement
- MathLeftSubSuperscriptElement
これらのクラスは下付きまたは上付きインデックスを指定します。左側または右側に同時に下付き・上付きインデックスを設定可能ですが、右側単体の下付き・上付きインデックスのみサポートします。MathSubscriptElement は数値の次数を設定することもできます。
例:

MathMatrix クラス
MathMatrix クラスは、子要素を行と列で配置した行列オブジェクトを表します。行列にはデフォルトの区切り記号がなく、括弧で囲む場合は IMathDelimiter を使用します。null 引数を渡すと行列に空白を作れます。
例:

MathArray クラス
MathArray クラスは、縦方向に並んだ式や任意の数学オブジェクトの配列を表します。
例:

数学要素の書式設定
-
MathBorderBox クラス: IMathElement の周囲に矩形やその他の枠線を描画します。
例:
-
MathBox クラス: 数学要素の論理的なボックス化を指定します。たとえば、演算子をボックス化して改行を防止したり、ラインブレークを許可しないグループ化に使用します。
-
MathDelimiter クラス: 開閉文字(丸括弧、波括弧、角括弧、縦棒など)と、その内部に含まれる 1 つ以上の数学要素で構成されます。例: (𝑥²); [𝑥²|𝑦²]。
例:
-
MathAccent クラス: 基底と結合アクセント記号からなるアクセント関数を指定します。
例: 𝑎́。 -
MathBar クラス: 基底引数と上バーまたは下バーからなるバー関数を指定します。
例:
-
MathGroupingCharacter クラス: 式の上または下に配置するグルーピング記号で、要素間の関係を強調します。
例:
数学演算
各数学要素および数式(MathBlock を通じて)は IMathElement インターフェイスを実装しています。既存の構造に対して操作を行い、より複雑な数式を作成できます。すべての操作は、[IMathElement] または文字列を引数に取ります。文字列を使用した場合、内部で自動的に MathematicalText インスタンスが生成されます。利用可能な数式操作は以下の通りです。
Join メソッド
数学要素を結合して MathBlock を作成します。例:
IMathElement element1 = new MathematicalText("x");
IMathElement element2 = new MathematicalText("y");
IMathBlock block = element1.join(element2);
Divide メソッド
- divide(String)
- divide(IMathElement)
- divide(String, MathFractionTypes)
- divide(IMathElement, MathFractionTypes)
指定した分子と分母で特定タイプの分数を作成します。例:
IMathElement numerator = new MathematicalText("x");
IMathFraction fraction = numerator.divide("y", MathFractionTypes.Linear);
Enclose メソッド
要素を指定した文字(例: 丸括弧)で囲みます。
/**
* <p>
* Enclose a math element in parenthesis
* </p>
*/
public IMathDelimiter enclose();
/**
* <p>
* Encloses this element in specified characters such as parenthesis or another characters as framing
* </p>
*/
public IMathDelimiter enclose(char beginningCharacter, char endingCharacter);
例:
IMathDelimiter delimiter = new MathematicalText("x").enclose('[', ']');
IMathDelimiter delimiter2 = new MathematicalText("elem1").join("elem2").enclose();
Function メソッド
現在のオブジェクトを関数名として、引数を受け取る関数を作成します。
/**
* <p>
* Takes a function of an argument using this instance as the function name
* </p>
*/
public IMathFunction function(IMathElement functionArgument);
/**
* <p>
* Takes a function of an argument using this instance as the function name
* </p>
*/
public IMathFunction function(String functionArgument);
例:
IMathFunction func = new MathematicalText("sin").function("x");
AsArgumentOfFunction メソッド
- asArgumentOfFunction(String)
- asArgumentOfFunction(IMathElement)
- asArgumentOfFunction(MathFunctionsOfOneArgument)
- asArgumentOfFunction(MathFunctionsOfTwoArguments, IMathElement)
- asArgumentOfFunction(MathFunctionsOfTwoArguments, String)
現在のインスタンスを引数として関数を作成します。使用例:
- 文字列で関数名を指定(例: “cos”)
- 列挙型 MathFunctionsOfOneArgument や MathFunctionsOfTwoArguments の定数を使用
- IMathElement のインスタンスを使用
例:
MathLimit funcName = new MathLimit(new MathematicalText("lim"), new MathematicalText("𝑛→∞"));
IMathFunction func1 = new MathematicalText("2x").asArgumentOfFunction(funcName);
IMathFunction func2 = new MathematicalText("x").asArgumentOfFunction("sin");
IMathFunction func3 = new MathematicalText("x").asArgumentOfFunction(MathFunctionsOfOneArgument.Sin);
IMathFunction func4 = new MathematicalText("x").asArgumentOfFunction(MathFunctionsOfTwoArguments.Log, "3");
SetSubscript、SetSuperscript、SetSubSuperscriptOnTheRight、SetSubSuperscriptOnTheLeft メソッド
- setSubscript(String)
- setSubscript(IMathElement)
- setSuperscript(String)
- setSuperscript(IMathElement)
- setSubSuperscriptOnTheRight(String, String)
- setSubSuperscriptOnTheRight(IMathElement, IMathElement)
- setSubSuperscriptOnTheLeft(String, String)
- setSubSuperscriptOnTheLeft(IMathElement, IMathElement)
下付き・上付きインデックスを設定します。左側または右側に同時に設定可能ですが、右側単体の下付き・上付きのみサポートします。Superscript は数値の次数設定にも利用できます。
例:
IMathLeftSubSuperscriptElement script = new MathematicalText("y").setSubSuperscriptOnTheLeft("2x", "3z");
Radical メソッド
指定した次数の根号を作成します。
例:
IMathRadical radical = new MathematicalText("x").radical("3");
SetUpperLimit と SetLowerLimit メソッド
上限または下限を設定します。上部・下部は基底に対する相対位置を示します。
例として次の式を考えます:

この式は MathFunction と MathLimit の組み合わせで作成できます。
IMathFunction mathExpression = new MathematicalText("lim").setLowerLimit("x→∞").function("x");
Nary と Integral メソッド
- nary(MathNaryOperatorTypes, IMathElement, IMathElement)
- nary(MathNaryOperatorTypes, String, String)
- integral(MathIntegralTypes)
- integral(MathIntegralTypes, IMathElement, IMathElement)
- integral(MathIntegralTypes, String, String)
- integral(MathIntegralTypes, IMathElement, IMathElement, MathLimitLocations)
- integral(MathIntegralTypes, String, String, MathLimitLocations)
nary と integral の両メソッドは、IMathNaryOperator 型の N 進演算子を生成して返します。nary メソッドでは、MathNaryOperatorTypes 列挙体で総和・和集合などのタイプを指定します(積分は除く)。integral メソッドは積分に特化し、MathIntegralTypes 列挙体で積分タイプを指定します。
例:
IMathBlock baseArg = new MathematicalText("x").join(new MathematicalText("dx").toBox());
IMathNaryOperator integral = baseArg.integral(MathIntegralTypes.Simple, "0", "1");
ToMathArray メソッド
toMathArray は要素を縦配列に変換します。MathBlock インスタンスに対して呼び出すと、すべての子要素が配列に配置されます。
例:
IMathArray arrayFunction = new MathematicalText("x").join("y").toMathArray();
書式設定操作: Accent、Overbar、Underbar、Group、ToBorderBox、ToBox
- accent メソッドは、要素の上にアクセント記号(文字)を付加します。
- overbar と underbar は、要素の上部または下部にバーを付加します。
- group メソッドは、下部の波括弧などのグルーピング文字で要素をまとめます。
- toBorderBox メソッドは、要素を枠付きボックスに変換します。
- toBox メソッドは、視覚的でない論理ボックスに変換します。
例:
IMathAccent accent = new MathematicalText("x").accent('\u0303');
IMathBar bar = new MathematicalText("x").overbar();
IMathGroupingCharacter groupChr = new MathematicalText("x").join("y").join("z").group('\u23E1', MathTopBotPositions.Bottom, MathTopBotPositions.Top);
IMathBorderBox borderBox = new MathematicalText("x+y+z").toBorderBox();
IMathBox boxedOperator = new MathematicalText(":=").toBox();
よくある質問
PowerPoint のスライドに数式を追加するにはどうすればよいですか?
数式シェイプオブジェクトを作成すると、デフォルトで数学的な Portion が含まれます。次に、MathParagraph を MathPortion から取得し、MathBlock オブジェクトを追加します。
複雑な入れ子数式を作成できますか?
はい。Aspose.Slides は MathBlock を入れ子にすることで複雑な数式を構築できます。すべての数学要素は IMathElement インターフェイスを実装しており、Join、Divide、Enclose などの操作で要素を組み合わせられます。
既存の数式を更新または修正するには?
数式を更新するには、MathParagraph 経由で既存の MathBlock にアクセスします。その後、Join、Divide、Enclose などのメソッドを使用して個々の要素を変更します。編集後にプレゼンテーションを保存すれば変更が反映されます。