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

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

PowerPoint поддерживает множество математических символов для создания уравнений. Однако создание сложных уравнений в PowerPoint часто не даёт хорошего и профессионального результата. Пользователи, которым часто требуется создавать математические презентации, прибегают к сторонним решениям для получения красиво оформленных формул.
Используя Aspose.Slide API, вы можете программно работать с математическими уравнениями в презентациях PowerPoint на C++. Создавать новые математические выражения или редактировать уже созданные. Экспорт математических структур в изображения также поддерживается частично.
Как создать математическое уравнение
Математические элементы используются для построения любых математических конструкций любой степени вложенности. Последовательность математических элементов образует математический блок, представленный классом MathBlock. Класс MathBlock по сути представляет отдельное математическое выражение, формулу или уравнение. Класс MathPortion — это математическая часть, используемая для хранения математического текста (не путать с Portion). Класс MathParagraph позволяет управлять набором математических блоков. Указанные классы являются ключом к работе с математическими уравнениями PowerPoint через Aspose.Slides API.
Рассмотрим, как создать следующее математическое уравнение с помощью Aspose.Slides API:

Чтобы добавить математическое выражение на слайд, сначала добавьте фигуру, в которой будет содержаться математический текст:
auto pres = System::MakeObject<Presentation>();
auto mathShape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddMathShape(0.0f, 0.0f, 720.0f, 150.0f);
После создания фигура уже содержит один абзац с математической частью по умолчанию. Класс MathPortion — это часть, содержащая математический текст. Чтобы получить доступ к содержимому внутри MathPortion, обратитесь к переменной MathParagraph:
auto mathParagraph = (System::AsCast<MathPortion>(mathShape->get_TextFrame()->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)))->get_MathParagraph();
Класс MathParagraph позволяет читать, добавлять, редактировать и удалять математические блоки (MathBlock), состоящие из комбинации математических элементов. Например, создать дробь и разместить её в презентации:
auto fraction = System::MakeObject<MathematicalText>(u"x")->Divide(u"y");
mathParagraph->Add(System::MakeObject<MathBlock>(fraction));
Каждый математический элемент представлен классом, реализующим интерфейс IMathElement. Этот интерфейс предоставляет множество методов для простого создания математических выражений. Можно создать достаточно сложное выражение одной строкой кода. Например, теорема Пифагора будет выглядеть так:
auto mathBlock = System::MakeObject<MathematicalText>(u"c")
->SetSuperscript(u"2")
->Join(u"=")
->Join(System::MakeObject<MathematicalText>(u"a")->SetSuperscript(u"2"))
->Join(u"+")
->Join(System::MakeObject<MathematicalText>(u"b")->SetSuperscript(u"2"));
Операции интерфейса IMathElement реализованы во всех типах элементов, включая MathBlock.
Полный пример кода:
auto pres = System::MakeObject<Presentation>();
auto mathShape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddMathShape(0.0f, 0.0f, 720.0f, 150.0f);
auto mathParagraph = (System::AsCast<MathPortion>(mathShape->get_TextFrame()->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)))->get_MathParagraph();
auto fraction = System::MakeObject<MathematicalText>(u"x")->Divide(u"y");
mathParagraph->Add(System::MakeObject<MathBlock>(fraction));
auto mathBlock = System::MakeObject<MathematicalText>(u"c")
->SetSuperscript(u"2")
->Join(u"=")
->Join(System::MakeObject<MathematicalText>(u"a")->SetSuperscript(u"2"))
->Join(u"+")->Join(System::MakeObject<MathematicalText>(u"b")->SetSuperscript(u"2"));
mathParagraph->Add(mathBlock);
pres->Save(u"math.pptx", SaveFormat::Pptx);
Типы математических элементов
Математические выражения формируются из последовательностей математических элементов. Последовательность элементов представлена математическим блоком, а аргументы элементов образуют древовидную вложенность.
Существует множество типов математических элементов, которые можно использовать для построения математического блока. Каждый такой элемент может быть включён (агрегирован) в другой элемент. Таким образом, элементы выступают контейнерами для других, образуя древовидную структуру. Самый простой тип элемента не содержит других элементов математического текста.
Каждый тип элемента реализует интерфейс IMathElement, позволяя использовать общий набор математических операций для разных типов элементов.
Класс MathematicalText
Класс MathematicalText представляет математический текст — базовый элемент всех математических конструкций. Математический текст может представлять операнды и операторы, переменные и любой линейный текст.
Пример: 𝑎=𝑏+𝑐
Класс MathFraction
Класс MathFraction определяет объект дроби, состоящий из числителя и знаменателя, разделённых чертой. Черта может быть горизонтальной или диагональной в зависимости от свойств дроби. Объект дроби также используется для представления функции стека, размещающей один элемент над другим без черты.
Пример:

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

Класс MathFunction
Класс MathFunction определяет функцию от аргумента. Содержит методы: get_Name() — имя функции и get_Base() — аргумент функции.
Пример:

Класс MathNaryOperator
Класс MathNaryOperator определяет N‑арный математический объект, такой как сумма или интеграл. Он состоит из оператора, основания (или операнда) и опциональных верхних и нижних пределов. Примеры N‑арных операторов: сумма, объединение, пересечение, интеграл.
Этот класс не включает простые операторы вроде сложения или вычитания; они представлены одним текстовым элементом MathematicalText.
Пример:

Класс MathLimit
Класс MathLimit создаёт верхний или нижний предел. Он состоит из текста на базовой линии и уменьшенного текста непосредственно над или под ним. Этот элемент не включает слово “lim”, но позволяет разместить текст сверху или снизу выражения. Таким образом, выражение

создаётся комбинацией элементов MathFunction и MathLimit:
auto funcName = System::MakeObject<MathLimit>(System::MakeObject<MathematicalText>(u"lim"), System::MakeObject<MathematicalText>(u"𝑥→∞"));
auto mathFunc = System::MakeObject<MathFunction>(funcName, System::MakeObject<MathematicalText>(u"𝑥"));
Классы 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. Ниже перечислены доступные в Aspose.Slides математические операции.
Метод Join
Объединяет математический элемент и формирует математический блок. Пример:
auto element1 = System::MakeObject<MathematicalText>(u"x");
auto element2 = System::MakeObject<MathematicalText>(u"y");
auto block = element1->Join(element2);
Метод Divide
- Divide(String)
- Divide(IMathElement)
- Divide(String, MathFractionTypes)
- Divide(IMathElement, MathFractionTypes)
Создаёт дробь указанного типа с текущим числителем и заданным знаменателем. Пример:
auto numerator = System::MakeObject<MathematicalText>(u"x");
auto fraction = numerator->Divide(u"y", MathFractionTypes::Linear);
Метод Enclose
Оборачивает элемент в указанные символы, такие как скобки или другие символы.
/// <summary>
/// Encloses a math element in parenthesis
/// </summary>
virtual System::SharedPtr<IMathDelimiter> Enclose() = 0;
/// <summary>
/// Encloses this element in specified characters such as parenthesis or another characters as framing
/// </summary>
virtual System::SharedPtr<IMathDelimiter> Enclose(char16_t beginningCharacter, char16_t endingCharacter) = 0;
Пример:
auto delimiter = System::MakeObject<MathematicalText>(u"x")->Enclose(u'[', u']');
auto delimiter2 = System::ExplicitCast<IMathElement>(System::MakeObject<MathematicalText>(u"elem1")->Join(u"elem2"))->Enclose();
Метод Function
Создаёт функцию от аргумента, используя текущий объект в качестве имени функции.
/// <summary>
/// Takes a function of an argument using this instance as the function name
/// </summary>
/// <param name="functionArgument">An argument of the function</param>
virtual System::SharedPtr<IMathFunction> Function(System::SharedPtr<IMathElement> functionArgument) = 0;
virtual System::SharedPtr<IMathFunction> Function(System::String functionArgument) = 0;
Пример:
auto func = System::MakeObject<MathematicalText>(u"sin")->Function(u"x");
Метод AsArgumentOfFunction
- AsArgumentOfFunction(String)
- AsArgumentOfFunction(IMathElement)
- AsArgumentOfFunction(MathFunctionsOfOneArgument)
- AsArgumentOfFunction(MathFunctionsOfTwoArguments, IMathElement)
- AsArgumentOfFunction(MathFunctionsOfTwoArguments, String)
Принимает указанный метод функции, используя текущий объект в качестве аргумента. Можно:
- указать строку как имя функции, например “cos”;
- выбрать одно из предопределённых значений перечислений MathFunctionsOfOneArgument или MathFunctionsOfTwoArguments, например MathFunctionsOfOneArgument.ArcSin;
- передать экземпляр IMathElement.
Пример:
auto funcName = System::MakeObject<MathLimit>(System::MakeObject<MathematicalText>(u"lim"), System::MakeObject<MathematicalText>(u"𝑛→∞"));
auto func1 = System::MakeObject<MathematicalText>(u"2x")->AsArgumentOfFunction(funcName);
auto func2 = System::MakeObject<MathematicalText>(u"x")->AsArgumentOfFunction(u"sin");
auto func3 = System::MakeObject<MathematicalText>(u"x")->AsArgumentOfFunction(MathFunctionsOfOneArgument::Sin);
auto func4 = System::MakeObject<MathematicalText>(u"x")->AsArgumentOfFunction(MathFunctionsOfTwoArguments::Log, u"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 также может использоваться для задания степени числа.
Пример:
auto script = System::MakeObject<MathematicalText>(u"y")->SetSubSuperscriptOnTheLeft(u"2x", u"3z");
Метод Radical
Задаёт радикал (корень) указанной степени от аргумента.
Пример:
auto radical = System::MakeObject<MathematicalText>(u"x")->Radical(u"3");
Методы SetUpperLimit и SetLowerLimit
Задаёт верхний или нижний предел. Здесь верхний и нижний просто указывают расположение аргумента относительно основания.
Рассмотрим выражение:

Такое выражение можно создать комбинацией классов MathFunction и MathLimit, а также операций интерфейса IMathElement:
auto mathExpression = System::MakeObject<MathematicalText>(u"lim")->SetLowerLimit(u"x→∞")->Function(u"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.
Пример:
auto baseArg = System::MakeObject<MathematicalText>(u"x")->Join(System::MakeObject<MathematicalText>(u"dx")->ToBox());
auto integral = baseArg->Integral(MathIntegralTypes::Simple, u"0", u"1");
Метод ToMathArray
ToMathArray размещает элементы в вертикальном массиве. Если вызвать эту операцию у экземпляра MathBlock, все дочерние элементы будут помещены в возвращаемый массив.
Пример:
auto arrayFunction = System::MakeObject<MathematicalText>(u"x")->Join(u"y")->ToMathArray();
Операции форматирования: Accent, Overbar, Underbar, Group, ToBorderBox, ToBox
- Метод Accent добавляет надстрочный диакритический знак (акцент).
- Методы Overbar и Underbar добавляют черту сверху или снизу.
- Метод Group размещает элементы в группе, используя группирующий символ, например нижнюю фигурную скобку.
- Метод ToBorderBox помещает элемент в рамку.
- Метод ToBox помещает элемент в логическую (не визуальную) коробку.
Примеры:
auto accent = System::MakeObject<MathematicalText>(u"x")->Accent(u'\u0303');
auto bar = System::MakeObject<MathematicalText>(u"x")->Overbar();
auto groupChr = System::MakeObject<MathematicalText>(u"x")->Join(u"y")->Join(u"z")->Group(u'\u23E1', MathTopBotPositions::Bottom, MathTopBotPositions::Top);
auto borderBox = System::MakeObject<MathematicalText>(u"x+y+z")->ToBorderBox();
auto boxedOperator = System::MakeObject<MathematicalText>(u":=")->ToBox();
FAQ
Как добавить математическое уравнение на слайд PowerPoint?
Чтобы добавить уравнение, необходимо создать объект математической фигуры, который автоматически содержит математическую часть. Затем получить объект MathParagraph из MathPortion и добавить в него объекты MathBlock.
Можно ли создавать сложные вложенные математические выражения?
Да, Aspose.Slides позволяет создавать сложные выражения, вкладывая MathBlocks. Каждый математический элемент реализует интерфейс IMathElement, что позволяет применять операции (Join, Divide, Enclose и др.) для комбинирования элементов в более сложные структуры.
Как обновить или изменить существующее математическое уравнение?
Чтобы обновить уравнение, нужно получить доступ к существующим MathBlocks через MathParagraph. Затем с помощью методов Join, Divide, Enclose и других изменить отдельные элементы уравнения. После редактирования сохранить презентацию, чтобы изменения вступили в силу.