Добавление математических уравнений в презентации PowerPoint на Java

Обзор

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

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

Вкладка Insert в PowerPoint с выбранной командой Equation

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

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

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

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

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

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

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 120);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathBlock 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 {
    presentation.dispose();
}

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathFraction fraction = new MathematicalText("1")
            .divide("x", MathFractionTypes.Skewed);

    mathParagraph.add(new MathBlock(fraction));

    presentation.save("fraction.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Для стоп‑кадра (stacked) дроби используйте MathFractionTypes.Bar:

IMathFraction stackedFraction = new MathematicalText("x + 1").divide("y - 1", MathFractionTypes.Bar);

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

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

    mathParagraph.add(new MathBlock(radical));

    presentation.save("radical.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathFunction limit = new MathematicalText("lim")
            .setLowerLimit("x\u2192\u221E")
            .function("x");

    mathParagraph.add(new MathBlock(limit));

    presentation.save("functions-and-limits.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

IMathFunction customFunction = new MathematicalText("f").function("x + 1");

Добавить n‑арные операторы и интегралы

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 120);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathBlock summationBase = new MathematicalText("x")
            .setSuperscript("k")
            .join(new MathematicalText("a").setSuperscript("n-k"));

    IMathNaryOperator summation = summationBase.nary(MathNaryOperatorTypes.Summation, "k=0", "n");

    mathParagraph.add(new MathBlock(summation));

    presentation.save("nary-operators.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

IMathBlock integralBase = new MathematicalText("x").join(new MathematicalText("dx").toBox());
IMathNaryOperator integral = integralBase.integral(MathIntegralTypes.Simple, "0", "1");

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 120);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    MathMatrix 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 {
    presentation.dispose();
}

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 140);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathArray equationArray = new MathematicalText("x")
            .join("y")
            .toMathArray();

    mathParagraph.add(new MathBlock(equationArray));

    presentation.save("equation-array.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathFunction cosine = new MathematicalText("2x")
            .asArgumentOfFunction(MathFunctionsOfOneArgument.Cos);

    mathParagraph.add(new MathBlock(cosine));

    presentation.save("trigonometric-function.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

Для индексов и степеней используйте вспомогательные методы subscript и superscript. Когда индексы должны располагаться слева от основания, используйте setSubSuperscriptOnTheLeft.

Буква Y с индексом 1 слева и степенью n сверху

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathLeftSubSuperscriptElement scripts = new MathematicalText("Y")
            .setSubSuperscriptOnTheLeft("1", "n");

    mathParagraph.add(new MathBlock(scripts));

    presentation.save("subscript-superscript.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Добавить ограничители

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathDelimiter delimiter = new MathematicalText("x")
            .join("y")
            .join("z")
            .enclose('<', '>');
    delimiter.setSeparatorCharacter('|');

    mathParagraph.add(new MathBlock(delimiter));

    presentation.save("delimiters.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathBorderBox 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 {
    presentation.dispose();
}

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

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

Выражение x + y, сгруппированное с меткой любой текст под ним

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 120);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathLimit grouped = new MathematicalText("x + y")
            .group('\u23DF', MathTopBotPositions.Bottom, MathTopBotPositions.Top)
            .setLowerLimit("any text");

    mathParagraph.add(new MathBlock(grouped));

    presentation.save("grouped-terms.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Форматировать элементы формулы

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

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape mathShape = slide.getShapes().addMathShape(20, 20, 700, 100);
    IMathParagraph mathParagraph = ((MathPortion) mathShape.getTextFrame().getParagraphs()
            .get_Item(0).getPortions().get_Item(0)).getMathParagraph();

    IMathBar overbar = new MathematicalText("ABC").overbar();

    mathParagraph.add(new MathBlock(overbar));

    presentation.save("overbar.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

FAQ

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

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

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

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

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

Aspose.Slides экспортирует математические уравнения в MathML. Если нужен LaTeX, сначала экспортируйте в MathML, а затем преобразуйте MathML с помощью инструмента, поддерживающего ваш целевой диалект LaTeX.