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

Обзор

PowerPoint хранит уравнения в виде Office Math Markup Language (OMML). С помощью Aspose.Slides для PHP через Java вы можете программно создавать такой же математический контент: дроби, радикалы, функции, пределы, N‑арные операторы, матрицы, массивы и форматированные блоки математики.

В PowerPoint пользователи обычно добавляют уравнения через Вставка > Уравнение:

Вкладка Вставка PowerPoint с выбранной командой Уравнение

Результатом является редактируемый математический текст на слайде:

Слайд PowerPoint, содержащий редактируемое математическое уравнение

Aspose.Slides формирует этот математический текст с помощью трех основных объектов:

  • Математическая фигура, созданная с помощью addMathShape, является фигурой, содержащей уравнение.
  • MathPortion хранит математическое содержимое внутри текстового кадра фигуры.
  • MathParagraph содержит один или несколько объектов MathBlock.

Большинство примеров ниже используют MathematicalText и цепочные методы из MathElementBase для компактного и читаемого кода.

Для сценариев экспорта MathML см. Export Math Equations from Presentations in PHP via Java.

Создать уравнение

В этом примере создаётся математическая фигура и добавляется теорема Пифагора:

Уравнение c² = a² + b²

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 120);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $equation = (new MathematicalText("c"))
        - >setSuperscript("2")
        - >join("=")
        - >join((new MathematicalText("a"))->setSuperscript("2"))
        - >join("+")
        - >join((new MathematicalText("b"))->setSuperscript("2"));

    $mathParagraph->add($equation);

    $presentation->save("pythagorean-theorem.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить дроби

Используйте divide для создания дроби. Вы можете выбрать стиль дроби с помощью MathFractionTypes.

Наклонная математическая дробь, показывающая 1 делённое на x

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $fraction = (new MathematicalText("1"))
        - >divide("x", MathFractionTypes::Skewed);

    $mathParagraph->add(new MathBlock($fraction));

    $presentation->save("fraction.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Для сложенной (stacked) дроби используйте MathFractionTypes::Bar:

$stackedFraction = (new MathematicalText("x + 1"))->divide("y - 1", MathFractionTypes::Bar);

Добавить радикалы

Используйте radical для создания квадратного корня, кубического корня или другого корня. Текущий элемент становится основанием, а аргумент — степенью.

Выражение n‑го корня с x под радикальным символом

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $radical = (new MathematicalText("x"))
        - >radical("n");

    $mathParagraph->add(new MathBlock($radical));

    $presentation->save("radical.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить функции и пределы

Используйте asArgumentOfFunction или function для функций, таких как sin(x), log(x), или пользовательских имён функций. Для пределов поместите lim в MathLimit или используйте setLowerLimit.

Предел x при x стремящемся к бесконечности

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $limit = (new MathematicalText("lim"))
        - >setLowerLimit("x\u{2192}\u{221E}")
        - >function("x");

    $mathParagraph->add(new MathBlock($limit));

    $presentation->save("functions-and-limits.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Для пользовательского имени функции сделайте имя функции текущим элементом:

$customFunction = (new MathematicalText("f"))->function("x + 1");

Добавить N-арные операторы и интегралы

Используйте nary для сумм, объединений, пересечений и других больших операторов. Используйте integral для интегралов. Оба метода позволяют задавать нижний и верхний пределы.

Сумма с нижним и верхним пределами

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 120);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $summationBase = (new MathematicalText("x"))
        - >setSuperscript("k")
        - >join((new MathematicalText("a"))->setSuperscript("n-k"));

    $summation = $summationBase->nary(MathNaryOperatorTypes::Summation, "k=0", "n");

    $mathParagraph->add(new MathBlock($summation));

    $presentation->save("nary-operators.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

N‑арные операторы предназначены для больших операторов с необязательными пределами. Простые операторы, такие как +, - и = обычно добавляются как MathematicalText и объединяются в выражении.

Для интеграла используйте integral:

$integralBase = (new MathematicalText("x"))->join((new MathematicalText("dx"))->toBox());
$integral = $integralBase->integral(MathIntegralTypes::Simple, "0", "1");

Добавить матрицы

Используйте MathMatrix для строк и столбцов. По умолчанию матрицы не включают скобки, поэтому заключайте матрицу в скобки, квадратные скобки или фигурные скобки, когда это необходимо.

Математическая матрица из двух строк с одной пустой ячейкой

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 120);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $matrix = new MathMatrix(2, 3);
    $matrix->set_Item(0, 0, new MathematicalText("1"));
    $matrix->set_Item(0, 1, new MathematicalText("x"));
    $matrix->set_Item(1, 0, new MathematicalText("x"));
    $matrix->set_Item(1, 1, new MathematicalText("2"));
    $matrix->set_Item(1, 2, new MathematicalText("y"));

    $mathParagraph->add(new MathBlock($matrix));

    $presentation->save("matrix.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить массивы уравнений

Используйте toMathArray, когда нужны выровненные уравнения или вертикальная стековая раскладка выражений.

Вертикальный математический массив с x над y

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 140);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $equationArray = (new MathematicalText("x"))
        - >join("y")
        - >toMathArray();

    $mathParagraph->add(new MathBlock($equationArray));

    $presentation->save("equation-array.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить тригонометрические функции

Используйте asArgumentOfFunction, когда аргумент является текущим элементом, а имя функции известно.

Тригонометрическая функция cos, применённая к 2x

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $cosine = (new MathematicalText("2x"))
        - >asArgumentOfFunction(MathFunctionsOfOneArgument::Cos);

    $mathParagraph->add(new MathBlock($cosine));

    $presentation->save("trigonometric-function.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить нижние и верхние индексы

Используйте вспомогательные функции для нижних и верхних индексов. Когда индексы должны располагаться слева от основания, используйте setSubSuperscriptOnTheLeft.

Большая Y с левым нижним индексом 1 и верхним индексом n

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $scripts = (new MathematicalText("Y"))
        - >setSubSuperscriptOnTheLeft("1", "n");

    $mathParagraph->add(new MathBlock($scripts));

    $presentation->save("subscript-superscript.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить разделители

Используйте enclose для помещения выражения внутри разделителей. Вы также можете задать символ‑разделитель для выражений‑разделителей, содержащих несколько элементов.

Выражение с разделителями, содержащие x, y и z, разделённые вертикальными чертами

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $delimiter = (new MathematicalText("x"))
        - >join("y")
        - >join("z")
        - >enclose(new Java("java.lang.Character", "<"), new Java("java.lang.Character", ">"));
    $delimiter->setSeparatorCharacter(new Java("java.lang.Character", "|"));

    $mathParagraph->add(new MathBlock($delimiter));

    $presentation->save("delimiters.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Добавить рамку

Используйте toBorderBox, когда само уравнение должно быть обрамлено.

Уравнение в рамке, показывающее a² = b² + c²

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $boxedEquation = (new MathematicalText("a"))
        - >setSuperscript("2")
        - >join("=")
        - >join((new MathematicalText("b"))->setSuperscript("2"))
        - >join("+")
        - >join((new MathematicalText("c"))->setSuperscript("2"))
        - >toBorderBox();

    $mathParagraph->add(new MathBlock($boxedEquation));

    $presentation->save("border-box.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Группировать термины

Используйте group для размещения символа группировки над или под выражением. Добавьте предел, чтобы пометить сгруппированные термины.

Выражение x + y, объединённое с меткой любой текст снизу

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 120);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $grouped = (new MathematicalText("x + y"))
        - >group(new Java("java.lang.Character", "\u{23DF}"), MathTopBotPositions::Bottom, MathTopBotPositions::Top)
        - >setLowerLimit("any text");

    $mathParagraph->add(new MathBlock($grouped));

    $presentation->save("grouped-terms.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

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

Используйте вспомогательные функции форматирования только там, где они проясняют формулу. Например, overbar помещает черту над математическим элементом.

Математическое выражение ABC с перекладиной над ним

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $mathShape = $slide->getShapes()->addMathShape(20, 20, 700, 100);
    $mathParagraph = $mathShape->getTextFrame()->getParagraphs()
        - >get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();

    $overbar = (new MathematicalText("ABC"))->overbar();

    $mathParagraph->add(new MathBlock($overbar));

    $presentation->save("overbar.pptx", SaveFormat::Pptx);
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Быстрая справка

Задача Основной API
Создать математический текст MathematicalText
Объединять элементы join
Создавать дроби divide
Добавлять верхний или нижний индекс setSuperscript, setSubscript
Добавлять функции function, asArgumentOfFunction
Добавлять радикалы radical
Добавлять пределы setLowerLimit, setUpperLimit
Добавлять левосторонние индексы setSubSuperscriptOnTheLeft
Добавлять суммы и интегралы nary, integral
Добавлять матрицы MathMatrix
Добавлять массивы уравнений toMathArray
Добавлять разделители enclose
Добавлять черты и рамки overbar, toBorderBox
Группировать термины group

Часто задаваемые вопросы

Могу ли я редактировать существующее уравнение PowerPoint?

Да. Откройте презентацию, найдите фигуру, содержащую MathPortion, получите её MathParagraph и обновите математические блоки в этом абзаце.

Сохраняются ли уравнения как редактируемая математика PowerPoint?

Да. При сохранении в формате PPTX Aspose.Slides записывает уравнение как редактируемый контент Office Math.

Могу ли я экспортировать уравнения в LaTeX?

Да. Получите MathParagraph уравнения из его MathPortion и вызовите MathParagraph::toLatex для прямого экспорта. Полный пример см. в разделе Export Math Equations from Presentations in PHP via Java.