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

Обзор

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

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

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

todo:image_alt_text

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

todo:image_alt_text

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

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

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

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

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

todo:image_alt_text

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

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”, которая размещает один элемент над другим без черты.

Пример:

todo:image_alt_text

Класс MathRadical

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

Пример:

todo:image_alt_text

Класс MathFunction

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

Пример:

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 следующим образом:

MathLimit funcName = new MathLimit(new MathematicalText("lim"), new MathematicalText("𝑥→∞"));

MathFunction mathFunc = new MathFunction(funcName, new MathematicalText("𝑥"));

Классы MathSubscriptElement, MathSuperscriptElement, MathRightSubSuperscriptElement, MathLeftSubSuperscriptElement

Эти классы задают нижний или верхний индекс. Можно одновременно установить подстрочный и надстрочный индексы слева или справа от аргумента, но одиночный подстрочный или надстрочный индекс поддерживается только справа. Класс 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 неявно создаются из указанных строк при использовании строковых аргументов. Ниже перечислены доступные операции.

Метод Join

Объединяет математический элемент и формирует блок. Пример:

IMathElement element1 = new MathematicalText("x");

IMathElement element2 = new MathematicalText("y");

IMathBlock block = element1.join(element2);

Метод Divide

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

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

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

Пример:

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

Устанавливает подстрочный и надстрочный индексы. Можно задать их одновременно слева или справа от аргумента, но одиночный индекс поддерживается только справа. Superscript также может использоваться для задания степени числа.

Пример:

IMathLeftSubSuperscriptElement script = new MathematicalText("y").setSubSuperscriptOnTheLeft("2x", "3z");

Метод Radical

Задаёт математический корень указанной степени от аргумента.

Пример:

IMathRadical radical = new MathematicalText("x").radical("3");

Методы SetUpperLimit и SetLowerLimit

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

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

todo:image_alt_text

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

IMathFunction mathExpression = new MathematicalText("lim").setLowerLimit("x→∞").function("x");

Методы Nary и Integral

Оба метода 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?

Чтобы добавить уравнение, нужно создать объект math shape, который автоматически содержит математическую часть. Затем получаем MathParagraph из MathPortion и добавляем в него объекты MathBlock.

Можно ли создавать сложные вложенные математические выражения?

Да, Aspose.Slides позволяет создавать сложные выражения, вложивая MathBlocks. Каждый элемент реализует интерфейс IMathElement, что даёт возможность применять операции (Join, Divide, Enclose и др.) для комбинации элементов в более сложные структуры.

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

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