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

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

PowerPoint поддерживает множество математических символов для создания уравнений. Однако создание сложных уравнений в PowerPoint часто не даёт хорошего и профессионального результата. Пользователи, которым часто требуется создавать математические презентации, прибегают к сторонним решениям для получения красивых формул.
С помощью Aspose.Slide API, вы можете программно работать с математическими уравнениями в презентациях PowerPoint на C#. Создавать новые математические выражения или редактировать уже существующие. Экспорт математических структур в изображения также поддерживается частично.
Как создать математическое уравнение
Математические элементы используются для построения любых математических конструкций любой степени вложенности. Линейная коллекция математических элементов образует математический блок, представленный классом MathBlock. Класс MathBlock по сути является отдельным математическим выражением, формулой или уравнением. Класс MathPortion — математическая часть, используемая для хранения математического текста (не путать с Portion). Класс MathParagraph позволяет манипулировать набором математических блоков. Указанные выше классы являются ключом к работе с математическими уравнениями PowerPoint через API Aspose.Slides.
Посмотрим, как можно создать следующее математическое уравнение через 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 определяет объект дроби, состоящий из числителя и знаменателя, разделённых чертой дроби. Черта может быть горизонтальной или диагональной, в зависимости от свойств дроби. Объект дроби также используется для представления функции стека, помещающей один элемент над другим без черты.
Пример:

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

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

Класс MathNaryOperator
Класс MathNaryOperator определяет N‑арный математический объект, такой как сумма или интеграл. Он состоит из оператора, основания (или операнда) и необязательных верхних и нижних пределов. Примеры 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. Нулевые аргументы могут использоваться для создания пробелов в матрицах.
Пример:

Класс MathArray
Класс MathArray определяет вертикальный массив уравнений или любых математических объектов.
Пример:

Форматирование математических элементов
-
Класс MathBorderBox рисует прямоугольную или другую рамку вокруг IMathElement.
Пример:
-
Класс MathBox определяет логическое упаковивание (boxing) математического элемента. Например, объект в коробке может выступать в роли эмулятора оператора с или без точки выравнивания, служить разрывом строки или группироваться так, чтобы не допускать разрывов внутри. Например, оператор “==” следует помещать в коробку, чтобы предотвратить разрывы строки.
-
Класс MathDelimiter определяет объект ограничителя, состоящий из открывающих и закрывающих символов (скобки, фигурные скобки, квадратные скобки, вертикальные линии) и одного или нескольких математических элементов внутри, разделённых указанным символом. Примеры: (𝑥2); [𝑥2|𝑦2].
Пример:
-
Класс MathAccent определяет функцию акцента, состоящую из основания и объединяющего диакритического знака.
Пример: 𝑎́. -
Класс MathBar определяет функцию черты, состоящую из базового аргумента и надчерты или подчёрты.
Пример:
-
Класс MathGroupingCharacter определяет символ группировки над или под выражением, обычно для подчёркивания взаимосвязей между элементами.
Пример:
Математические операции
Каждый математический элемент и математическое выражение (через MathBlock) реализует интерфейс IMathElement. Он позволяет выполнять операции над существующей структурой и формировать более сложные выражения. Все операции имеют два набора параметров: либо [IMathElement], либо строку. Экземпляры класса MathematicalText неявно создаются из указанных строк, когда используются строковые аргументы. Операции с математикой, доступные в Aspose.Slides, перечислены ниже.
Метод 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 NumericalText("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 и другие, можно изменить отдельные элементы уравнения. После редактирования сохраните презентацию, чтобы применить изменения.