Добавление математических уравнений в презентации PowerPoint на Java
Обзор
В PowerPoint можно написать математическое уравнение или формулу и отобразить её в презентации. Для этого в PowerPoint представлены различные математические символы, которые можно добавить в текст или уравнение. Для создания сложных формул используется конструктор математических уравнений в PowerPoint, который помогает создавать такие выражения, как:
- Математическая дробь
- Математический радикал
- Математическая функция
- Пределы и логарифмические функции
- N-арные операции
- Матрица
- Большие операторы
- Функции sin, cos
Для добавления математического уравнения в PowerPoint используется меню Insert -> Equation:

Это создаст математический текст в XML, который может быть отображён в PowerPoint следующим образом:

PowerPoint поддерживает множество математических символов для создания уравнений. Однако создание сложных уравнений в PowerPoint часто не даёт хорошего и профессионального результата. Пользователи, которым часто нужно создавать математические презентации, прибегают к сторонним решениям для получения красивых формул.
Используя Aspose.Slide API, вы можете программно работать с математическими уравнениями в презентациях PowerPoint на C#. Создавать новые математические выражения или редактировать уже созданные. Экспорт математических структур в изображения также частично поддерживается.
Как создать математическое уравнение
Математические элементы используются для построения любых математических конструкций любой глубины вложения. Последовательная коллекция математических элементов образует математический блок, представленный классом MathBlock. Класс MathBlock по сути представляет отдельное математическое выражение, формулу или уравнение. Класс MathPortion — математическая часть, используемая для хранения математического текста (не путать с Portion). Класс MathParagraph позволяет манипулировать набором математических блоков. Перечисленные выше классы являются ключевыми для работы с математическими уравнениями PowerPoint через Aspose.Slides API.
Посмотрим, как можно создать следующее математическое уравнение с помощью 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();
}
После создания форма уже будет содержать один абзац с математической частью по умолчанию. Класс MathPortion — часть, содержащая внутри себя математический текст. Чтобы получить доступ к математическому содержимому внутри MathPortion, обратитесь к переменной MathParagraph :
IMathParagraph mathParagraph = ((MathPortion)mathShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)).getMathParagraph();
Класс MathParagraph позволяет читать, добавлять, редактировать и удалять математические блоки (MathBlock), состоящие из комбинаций математических элементов. Например, создадим дробь и разместим её в презентации:
IMathFraction fraction = new MathematicalText("x").divide("y");
mathParagraph.add(new MathBlock(fraction));
Каждый математический элемент представлен некоторым классом, реализующим интерфейс IMathElement. Этот интерфейс предоставляет множество методов для простого создания математических выражений. С помощью одной строки кода можно создать довольно сложное выражение. Например, теорема Пифагора будет выглядеть так:
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 задаёт объект дроби, состоящий из числителя и знаменателя, разделённых чертой дроби. Черта может быть горизонтальной или диагональной, в зависимости от свойств дроби. Объект дроби также используется для представления функции «stack», которая размещает один элемент над другим без линии дроби.
Пример:

Класс MathRadical
Класс MathRadical задаёт радикальную функцию (математический корень), состоящую из основания и необязательной степени.
Пример:

Класс MathFunction
Класс MathFunction задаёт функцию от аргумента. Содержит свойства: getName — имя функции и getBase — аргумент функции.
Пример:

Класс MathNaryOperator
Класс MathNaryOperator задаёт N‑арный математический объект, такой как Summation или Integral. Он состоит из оператора, основания (или операнда) и необязательных верхних и нижних пределов. Примеры N‑арных операторов: Summation, Union, Intersection, Integral.
Этот класс не включает простые операторы вроде сложения или вычитания; они представлены одиночным текстовым элементом — 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: задаёт объект‑разделитель, состоящий из открывающего и закрывающего символов (скобки, фигурные скобки, квадратные скобки, вертикальные черты) и одного или более математических элементов внутри, разделённых указанным символом. Примеры: (𝑥2); [𝑥2|𝑦2].
Пример:
-
Класс MathAccent: задаёт акцентную функцию, состоящую из основания и объединяющего диакритического знака.
Пример: 𝑎́. -
Класс MathBar: задаёт функцию бар, состоящую из базового аргумента и надчеркивания или подчеркивания.
Пример:
-
Класс MathGroupingCharacter: задаёт группирующий символ над или под выражением, обычно для выделения отношений между элементами.
Пример:
Математические операции
Каждый математический элемент и математическое выражение (через MathBlock) реализует интерфейс IMathElement. Это позволяет использовать операции над существующей структурой и формировать более сложные выражения. Все операции принимают два набора параметров: либо [IMathElement], либо строку. При передаче строки автоматически создаётся объект [MathematicalText].
Метод Join
Объединяет математический элемент и формирует блок. Например:
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], например [MathFunctionsOfOneArgument].ArcSin;
- передать экземпляр [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 и операциями IMathElement:
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 создают и возвращают N‑арный оператор типа [IMathNaryOperator]. В методе 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();
FAQ
Как добавить математическое уравнение на слайд PowerPoint?
Чтобы добавить уравнение, необходимо создать объект математической формы, который автоматически содержит математическую часть. Затем получить объект MathParagraph из MathPortion и добавить в него объекты MathBlock.
Можно ли создавать сложные вложенные математические выражения?
Да, Aspose.Slides позволяет создавать сложные выражения, вложивая MathBlocks. Каждый математический элемент реализует интерфейс IMathElement, что даёт возможность применять операции (Join, Divide, Enclose и др.) для комбинирования элементов в более сложные структуры.
Как обновить или изменить уже существующее математическое уравнение?
Для обновления уравнения необходимо получить доступ к существующим MathBlocks через MathParagraph. Затем, используя методы Join, Divide, Enclose и другие, можно изменить отдельные части уравнения. После редактирования сохраните презентацию, чтобы изменения вступили в силу.