Agregar ecuaciones matemáticas a presentaciones de PowerPoint en С++
Visión general
En PowerPoint es posible escribir una ecuación o fórmula matemática y mostrarla en la presentación. Para ello, varios símbolos matemáticos están representados en PowerPoint y pueden añadirse al texto o a la ecuación. Para ello se utiliza el constructor de ecuaciones matemáticas en PowerPoint, que ayuda a crear fórmulas complejas como:
- Fracción matemática
- Radical matemático
- Función matemática
- Límites y funciones logarítmicas
- Operaciones N-arias
- Matriz
- Operadores grandes
- Funciones seno, coseno
Para agregar una ecuación matemática en PowerPoint, se usa el menú Insertar -> Ecuación:

Esto creará un texto matemático en XML que puede mostrarse en PowerPoint de la siguiente forma:

PowerPoint admite numerosos símbolos matemáticos para crear ecuaciones. Sin embargo, crear ecuaciones complejas en PowerPoint a menudo no produce un resultado profesional. Los usuarios que necesiten crear presentaciones matemáticas con frecuencia recurren a soluciones de terceros para obtener fórmulas con buen aspecto.
Usando Aspose.Slide API, puedes trabajar con ecuaciones matemáticas en presentaciones de PowerPoint de forma programática en C++. Crear nuevas expresiones matemáticas o editar las ya creadas. La exportación de estructuras matemáticas a imágenes también está parcialmente soportada.
Cómo crear una ecuación matemática
Los elementos matemáticos se utilizan para construir cualquier construcción matemática con cualquier nivel de anidamiento. Una colección lineal de elementos forma un bloque matemático representado por la clase MathBlock. La clase MathBlock es esencialmente una expresión, fórmula o ecuación matemática separada. MathPortion es una porción matemática, usada para contener texto matemático (no confundir con Portion). MathParagraph permite manipular un conjunto de bloques matemáticos. Las clases mencionadas son la clave para trabajar con ecuaciones matemáticas de PowerPoint mediante la API Aspose.Slides.
Veamos cómo crear la siguiente ecuación matemática mediante la API Aspose.Slides:

Para añadir una expresión matemática en la diapositiva, primero agrega una forma que contenga el texto matemático:
auto pres = System::MakeObject<Presentation>();
auto mathShape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddMathShape(0.0f, 0.0f, 720.0f, 150.0f);
Después de crearla, la forma ya contendrá un párrafo con una porción matemática por defecto. La clase MathPortion es una porción que contiene texto matemático dentro. Para acceder al contenido matemático dentro de MathPortion, consulta la variable MathParagraph:
auto mathParagraph = (System::AsCast<MathPortion>(mathShape->get_TextFrame()->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)))->get_MathParagraph();
La clase MathParagraph permite leer, agregar, editar y eliminar bloques matemáticos (MathBlock), que consisten en una combinación de elementos matemáticos. Por ejemplo, crear una fracción y colocarla en la presentación:
auto fraction = System::MakeObject<MathematicalText>(u"x")->Divide(u"y");
mathParagraph->Add(System::MakeObject<MathBlock>(fraction));
Cada elemento matemático está representado por una clase que implementa la interfaz IMathElement. Esta interfaz ofrece muchos métodos para crear expresiones matemáticas fácilmente. Puedes crear una expresión bastante compleja con una sola línea de código. Por ejemplo, el teorema de Pitágoras quedaría así:
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"));
Las operaciones de la interfaz IMathElement están implementadas en cualquier tipo de elemento, incluido MathBlock.
Código fuente completo:
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);
Tipos de elementos matemáticos
Las expresiones matemáticas se forman a partir de secuencias de elementos matemáticos. La secuencia de elementos está representada por un bloque matemático, y los argumentos de los elementos forman un anidamiento tipo árbol.
Existen muchos tipos de elementos que pueden usarse para construir un bloque matemático. Cada uno de estos elementos puede incluirse (agregarse) en otro elemento. Es decir, los elementos son contenedores de otros, formando una estructura en árbol. El tipo más simple de elemento es aquel que no contiene otros elementos del texto matemático.
Cada tipo de elemento implementa la interfaz IMathElement, lo que permite usar el conjunto común de operaciones matemáticas sobre diferentes tipos de elementos.
Clase MathematicalText
La clase MathematicalText representa un texto matemático, el elemento subyacente de todas las construcciones matemáticas. El texto matemático puede representar operandos y operadores, variables y cualquier otro texto lineal.
Ejemplo: 𝑎=𝑏+𝑐
Clase MathFraction
La clase MathFraction especifica el objeto fracción, compuesto por numerador y denominador separados por una barra de fracción. La barra puede ser horizontal o diagonal, según las propiedades de la fracción. El mismo objeto también se usa para representar la función de apilamiento, que coloca un elemento sobre otro sin barra de fracción.
Ejemplo:

Clase MathRadical
La clase MathRadical especifica la función radical (raíz matemática), compuesta por una base y un grado opcional.
Ejemplo:

Clase MathFunction
La clase MathFunction especifica una función de un argumento. Contiene los métodos: get_Name() – nombre de la función y get_Base() – argumento de la función.
Ejemplo:

Clase MathNaryOperator
La clase MathNaryOperator especifica un objeto matemático N-ario, como Sumatorio o Integral. Consiste en un operador, una base (u operando) y límites superiores e inferiores opcionales. Ejemplos de operadores N-arios son Sumatorio, Unión, Intersección, Integral.
Esta clase no incluye operadores simples como suma o resta; éstos se representan con un solo elemento de texto – MathematicalText.
Ejemplo:

Clase MathLimit
La clase MathLimit crea el límite superior o inferior. Especifica el objeto límite, compuesto por texto en la línea base y texto de tamaño reducido justo encima o debajo. Este elemento no incluye la palabra “lim”, pero permite colocar texto en la parte superior o inferior de la expresión. Así, la expresión

se crea combinando MathFunction y MathLimit de la siguiente manera:
auto funcName = System::MakeObject<MathLimit>(System::MakeObject<MathematicalText>(u"lim"), System::MakeObject<MathematicalText>(u"𝑥→∞"));
auto mathFunc = System::MakeObject<MathFunction>(funcName, System::MakeObject<MathematicalText>(u"𝑥"));
Clases MathSubscriptElement, MathSuperscriptElement, MathRightSubSuperscriptElement, MathLeftSubSuperscriptElement
- MathSubscriptElement
- MathSuperscriptElement
- MathRightSubSuperscriptElement
- MathLeftSubSuperscriptElement
Las siguientes clases especifican un subíndice o un superíndice. Puedes establecer subíndice y superíndice al mismo tiempo a la izquierda o a la derecha de un argumento, pero solo se admite un subíndice o superíndice simple en el lado derecho. La clase MathSubscriptElement también puede usarse para establecer el grado matemático de un número.
Ejemplo:

Clase MathMatrix
La clase MathMatrix especifica el objeto Matriz, compuesto por elementos hijos dispuestos en una o más filas y columnas. Es importante notar que las matrices no tienen delimitadores incorporados. Para colocar la matriz entre corchetes se debe usar el objeto delimitador – IMathDelimiter. Los argumentos nulos pueden usarse para crear espacios en blanco en matrices.
Ejemplo:

Clase MathArray
La clase MathArray especifica una matriz vertical de ecuaciones o cualquier objeto matemático.
Ejemplo:

Formateo de elementos matemáticos
-
MathBorderBox dibuja un borde rectangular u otro alrededor del IMathElement.
Ejemplo:
-
MathBox especifica el empaquetado lógico del elemento matemático. Por ejemplo, un objeto en caja puede servir como emulador de operador con o sin punto de alineación, como punto de ruptura de línea, o agruparse para evitar quiebres de línea internos. Por ejemplo, el operador “==” debe enmarcarse para evitar quiebres de línea.
-
MathDelimiter especifica el objeto delimitador, compuesto por caracteres de apertura y cierre (paréntesis, llaves, corchetes, barras verticales) y uno o más elementos dentro, separados por un carácter especificado. Ejemplos: (𝑥²); [𝑥²|𝑦²].
Ejemplo:
-
MathAccent especifica la función de acento, compuesta por una base y una marca diacrítica combinada.
Ejemplo: 𝑎́. -
MathBar especifica la función de barra, compuesta por un argumento base y una barra superior o inferior.
Ejemplo:
-
MathGroupingCharacter especifica un símbolo de agrupación sobre o bajo una expresión, generalmente para resaltar relaciones entre elementos.
Ejemplo:
Operaciones matemáticas
Cada elemento y expresión matemática (mediante MathBlock) implementa la interfaz IMathElement. Permite usar operaciones sobre la estructura existente y formar expresiones más complejas. Todas las operaciones tienen dos conjuntos de parámetros: ya sea IMathElement o cadena como argumentos. Las instancias de la clase MathematicalText se crean implícitamente a partir de cadenas cuando se usan argumentos de tipo cadena. Las operaciones matemáticas disponibles en Aspose.Slides se enumeran a continuación.
Método Join
Une un elemento matemático y forma un bloque matemático. Por ejemplo:
auto element1 = System::MakeObject<MathematicalText>(u"x");
auto element2 = System::MakeObject<MathematicalText>(u"y");
auto block = element1->Join(element2);
Método Divide
- Divide(String)
- Divide(IMathElement)
- Divide(String, MathFractionTypes)
- Divide(IMathElement, MathFractionTypes)
Crea una fracción del tipo especificado con este numerador y el denominador indicado. Por ejemplo:
auto numerator = System::MakeObject<MathematicalText>(u"x");
auto fraction = numerator->Divide(u"y", MathFractionTypes::Linear);
Método Enclose
Envuelve el elemento en caracteres especificados, como paréntesis u otro carácter de marco.
/// <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;
Por ejemplo:
auto delimiter = System::MakeObject<MathematicalText>(u"x")->Enclose(u'[', u']');
auto delimiter2 = System::ExplicitCast<IMathElement>(System::MakeObject<MathematicalText>(u"elem1")->Join(u"elem2"))->Enclose();
Método Function
Toma una función de un argumento usando el objeto actual como nombre de la función.
/// <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;
Por ejemplo:
auto func = System::MakeObject<MathematicalText>(u"sin")->Function(u"x");
Método AsArgumentOfFunction
- AsArgumentOfFunction(String)
- AsArgumentOfFunction(IMathElement)
- AsArgumentOfFunction(MathFunctionsOfOneArgument)
- AsArgumentOfFunction(MathFunctionsOfTwoArguments, IMathElement)
- AsArgumentOfFunction(MathFunctionsOfTwoArguments, String)
Toma la función especificada usando la instancia actual como argumento. Puedes:
- especificar una cadena como nombre de la función, por ejemplo “cos”.
- seleccionar uno de los valores predefinidos de las enumeraciones MathFunctionsOfOneArgument o MathFunctionsOfTwoArguments, por ejemplo MathFunctionsOfOneArgument.ArcSin.
- seleccionar la instancia de la IMathElement.
Por ejemplo:
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");
Métodos SetSubscript, SetSuperscript, SetSubSuperscriptOnTheRight, SetSubSuperscriptOnTheLeft
- SetSubscript(String)
- SetSubscript(IMathElement)
- SetSuperscript(String)
- SetSuperscript(IMathElement)
- SetSubSuperscriptOnTheRight(String, String)
- SetSubSuperscriptOnTheRight(IMathElement, IMathElement)
- SetSubSuperscriptOnTheLeft(String, String)
- SetSubSuperscriptOnTheLeft(IMathElement, IMathElement)
Establece subíndice y superíndice. Puedes establecer ambos simultáneamente a la izquierda o a la derecha del argumento, pero solo se admite un subíndice o superíndice individual en el lado derecho. El Superscript también puede usarse para establecer el grado matemático de un número.
Ejemplo:
auto script = System::MakeObject<MathematicalText>(u"y")->SetSubSuperscriptOnTheLeft(u"2x", u"3z");
Método Radical
Especifica la raíz matemática del grado dado a partir del argumento especificado.
Ejemplo:
auto radical = System::MakeObject<MathematicalText>(u"x")->Radical(u"3");
Métodos SetUpperLimit y SetLowerLimit
Establece el límite superior o inferior. Aquí, el superior e inferior indican simplemente la posición del argumento respecto a la base.
Consideremos la expresión:

Tales expresiones pueden crearse combinando las clases MathFunction y MathLimit, y las operaciones de la IMathElement de la siguiente forma:
auto mathExpression = System::MakeObject<MathematicalText>(u"lim")->SetLowerLimit(u"x→∞")->Function(u"x");
Métodos Nary e 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)
Los métodos Nary y Integral crean y devuelven el operador N-ario representado por el tipo IMathNaryOperator. En el método Nary, la enumeración MathNaryOperatorTypes especifica el tipo de operador: sumatoria, unión, etc., sin incluir integrales. En el método Integral, la enumeración MathIntegralTypes define los tipos de integral.
Ejemplo:
auto baseArg = System::MakeObject<MathematicalText>(u"x")->Join(System::MakeObject<MathematicalText>(u"dx")->ToBox());
auto integral = baseArg->Integral(MathIntegralTypes::Simple, u"0", u"1");
Método ToMathArray
ToMathArray coloca los elementos en una matriz vertical. Si esta operación se llama para una instancia de MathBlock, todos los elementos hijos se colocarán en la matriz resultante.
Ejemplo:
auto arrayFunction = System::MakeObject<MathematicalText>(u"x")->Join(u"y")->ToMathArray();
Operaciones de formateo: Accent, Overbar, Underbar, Group, ToBorderBox, ToBox
- Accent establece una marca de acento (un carácter sobre el elemento).
- Overbar y Underbar establecen una barra superior o inferior.
- Group coloca en un grupo usando un carácter de agrupación como una llave inferior u otro.
- ToBorderBox coloca en un cuadro con borde.
- ToBox coloca en un cuadro no visual (agrupación lógica).
Ejemplos:
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();
Preguntas frecuentes
¿Cómo puedo agregar una ecuación matemática a una diapositiva de PowerPoint?
Para agregar una ecuación matemática, debes crear un objeto de forma matemática, que contiene automáticamente una porción matemática. Luego, obtienes el MathParagraph de la MathPortion y agregas objetos MathBlock a él.
¿Es posible crear expresiones matemáticas complejas anidadas?
Sí, Aspose.Slides permite crear expresiones matemáticas complejas mediante la anidación de MathBlocks. Cada elemento matemático implementa la interfaz IMathElement, lo que permite aplicar operaciones (Join, Divide, Enclose, etc.) para combinar elementos en estructuras más complejas.
¿Cómo puedo actualizar o modificar una ecuación matemática existente?
Para actualizar una ecuación, debes acceder a los MathBlocks existentes a través del MathParagraph. Luego, usando métodos como Join, Divide, Enclose, entre otros, puedes modificar los elementos individuales de la ecuación. Después de editar, guarda la presentación para aplicar los cambios.