Добавить математические уравнения в презентации PowerPoint на С++

Обзор

В PowerPoint возможно написать математическое уравнение или формулу и отобразить её в презентации. Для этого в PowerPoint представлены различные математические символы, которые можно добавить в текст или уравнение. Для создания сложных формул используется конструктор математических уравнений в PowerPoint, который помогает создавать такие конструкции, как:

  • Математическая дробь
  • Математический радикал
  • Математическая функция
  • Пределы и логарифмические функции
  • N‑арные операции
  • Матрица
  • Большие операторы
  • Функции sin, cos

Для добавления математического уравнения в PowerPoint используется меню Insert -> Equation:

todo:image_alt_text

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

todo:image_alt_text

PowerPoint поддерживает множество математических символов для создания уравнений. Однако создание сложных уравнений в PowerPoint часто не даёт хорошего и профессионального результата. Пользователи, которым часто нужно создавать математические презентации, прибегают к сторонним решениям для получения красивых формул.

Используя Aspose.Slides API, вы можете работать с математическими уравнениями в презентациях PowerPoint программно на C++. Создавать новые математические выражения или редактировать уже созданные. Экспорт математических структур в изображения также частично поддерживается.

Как создать математическое уравнение

Математические элементы используются для построения любых математических конструкций любой степени вложенности. Линейная коллекция математических элементов образует математический блок, представленный классом MathBlock. Класс MathBlock фактически представляет отдельное математическое выражение, формулу или уравнение. Класс MathPortion — это математическая часть, используемая для хранения математического текста (не путать с классом Portion). Класс MathParagraph позволяет управлять набором математических блоков. Указанные выше классы являются ключом к работе с математическими уравнениями PowerPoint через API Aspose.Slides.

Рассмотрим, как создать следующее математическое уравнение с помощью API Aspose.Slides:

todo:image_alt_text

Чтобы добавить математическое выражение на слайд, сначала добавьте форму, которая будет содержать математический текст:

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 описывает объект дроби, состоящий из числителя и знаменателя, разделённых линией дроби. Линия может быть горизонтальной или диагональной в зависимости от свойств дроби. Этот объект также используется для представления функции стека, где один элемент размещён над другим без линии дроби.

Пример:

todo:image_alt_text

Класс MathRadical

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

Пример:

todo:image_alt_text

Класс MathFunction

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

Пример:

todo:image_alt_text

Класс MathNaryOperator

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

Этот класс не включает простые операторы вроде сложения или вычитания; они представлены отдельным элементом — MathematicalText.

Пример:

todo:image_alt_text

Класс MathLimit

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

todo:image_alt_text

создаётся комбинацией 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

Эти классы задают нижний (subscript) или верхний (superscript) индекс. Можно одновременно установить subscript и superscript слева или справа от аргумента, но одиночный subscript или superscript поддерживается только справа. Класс MathSubscriptElement также может использоваться для задания степени числа.

Пример:

todo:image_alt_text

Класс MathMatrix

Класс MathMatrix описывает объект матрицы, состоящий из дочерних элементов, размещённых в строках и столбцах. Важно отметить, что матрицы не имеют встроенных ограничителей. Чтобы окружить матрицу скобками, необходимо использовать объект‑ограничитель — IMathDelimiter. При необходимости можно передать null‑аргументы для создания пробелов в матрице.

Пример:

todo:image_alt_text

Класс MathArray

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

Пример:

todo:image_alt_text

Форматирование математических элементов

  • Класс MathBorderBox: рисует прямоугольную или другую рамку вокруг IMathElement.

    Пример: todo:image_alt_text

  • Класс MathBox: задаёт логическую упаковку (boxing) математического элемента. Например, упакованный объект может выступать в роли эмулятора оператора с точкой согласования или без неё, может служить разрывом строки или быть сгруппированным, чтобы запрещать разрывы внутри. Например, оператор “==” следует упаковать, чтобы предотвратить разрыв строки.

  • Класс MathDelimiter: задаёт ограничитель, состоящий из открывающего и закрывающего символов (скобки, фигурные скобки, квадратные скобки, вертикальные линии) и одного или нескольких математических элементов внутри, разделённых указанным символом. Примеры: (𝑥2); [𝑥2|𝑦2].

    Пример: todo:image_alt_text

  • Класс MathAccent: задаёт акцент над символом, состоящий из основы и объединяющего диакритического знака.

    Пример: 𝑎́.

  • Класс MathBar: задаёт полосу над или под элементом.

    Пример: todo:image_alt_text

  • Класс MathGroupingCharacter: задаёт группирующий символ над или под выражением, обычно для подчёркивания взаимосвязей между элементами.

    Пример: todo:image_alt_text

Математические операции

Каждый математический элемент и математическое выражение (через 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

Создаёт дробь указанного типа с текущим числителем и заданным знаменателем. Пример:

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

Позволяет задать функцию, используя текущий объект как аргумент. Можно:

  • указать строку‑имя функции, например “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

Устанавливают нижний и верхний индексы. Можно задать subscript и superscript одновременно слева или справа, но одиночный subscript или superscript поддерживается только справа. 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

Задают верхний или нижний предел. Здесь «верхний» и «нижний» просто указывают положение аргумента относительно базового элемента.

Рассмотрим выражение:

todo:image_alt_text

Такое выражение создаётся комбинацией классов MathFunction и MathLimit и операциями IMathElement:

auto mathExpression = System::MakeObject<MathematicalText>(u"lim")->SetLowerLimit(u"x→∞")->Function(u"x");

Методы Nary и Integral

Методы 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 позволяет создавать сложные выражения, вложивая MathBlock‑и. Каждый математический элемент реализует интерфейс IMathElement, что даёт возможность применять операции (Join, Divide, Enclose и др.) для комбинации элементов в более сложные структуры.

Как обновить или изменить существующее математическое уравнение?

Чтобы обновить уравнение, нужно получить доступ к существующим MathBlock‑ам через MathParagraph. Затем, используя методы Join, Divide, Enclose и другие, изменить отдельные элементы уравнения. После редактирования сохраните презентацию, чтобы изменения были применены.