إضافة معادلات رياضية إلى عروض PowerPoint التقديمية بلغة Java
نظرة عامة
في PowerPoint، يمكن كتابة معادلة رياضية أو صيغة وعرضها في العرض التقديمي. للقيام بذلك، يتم تمثيل رموز رياضية متعددة في PowerPoint ويمكن إضافتها إلى النص أو المعادلة. لهذا، يُستخدم مُنشئ المعادلات الرياضية في PowerPoint، والذي يساعد على إنشاء صيغ معقدة مثل:
- كسر رياضي
- جذر رياضي
- دالة رياضية
- حدود ودوال اللوغاريتم
- عمليات N-ary
- مصفوفة
- عوامل كبيرة
- دوال sin, cos
لإضافة معادلة رياضية في PowerPoint، يُستخدم قائمة إدراج → معادلة:

سيتم إنشاء نص رياضي بصيغة XML يمكن عرضه في PowerPoint كما يلي:

يدعم PowerPoint الكثير من الرموز الرياضية لإنشاء معادلات رياضية. ومع ذلك، غالبًا لا ينتج عن إنشاء معادلات رياضية معقدة في PowerPoint نتيجة ذات مظهر مهني جيد. المستخدمون الذين يحتاجون إلى إنشاء عروض تقديمية رياضية بانتظام يلجؤون إلى حلول طرف ثالث لإنشاء صيغ رياضية ذات مظهر جيد.
باستخدام Aspose.Slide API، يمكنك العمل مع المعادلات الرياضية في عروض PowerPoint برمجيًا بلغة C#. أنشئ تعبيرات رياضية جديدة أو حرّر تعبيرات تم إنشاؤها مسبقًا. كما يتم دعم تصدير الهياكل الرياضية إلى صور بشكل جزئي.
كيفية إنشاء معادلة رياضية
تُستخدم العناصر الرياضية لبناء أي بنية رياضية مع أي مستوى تعشيق. تشكّل مجموعة خطية من العناصر الرياضية كتلة رياضية تمثلها فئة MathBlock. فئة MathBlock هي أساسًا تعبير رياضي منفصل، صيغة أو معادلة. فئة MathPortion هي جزء رياضي يُستخدم لحفظ نص رياضي (لا تخلطها مع Portion). فئة MathParagraph تسمح بالتعامل مع مجموعة من كتل الرياضيات. الفئات المذكورة أعلاه هي المفتاح للعمل مع معادلات PowerPoint الرياضية عبر Aspose.Slides API.
دعنا نرى كيف يمكننا إنشاء المعادلة الرياضية التالية عبر Aspose.Slides API:

لإضافة تعبير رياضي إلى الشريحة، أولاً أضف شكلًا سيحتوي على النص الرياضي:
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 نصًا رياضيًا — العنصر الأساسي لكل البُنى الرياضية. قد يمثل النص الرياضي المت operands والoperators والمتغيّرات وأي نص خطي آخر.
مثال: 𝑎=𝑏+𝑐
فئة MathFraction
تحدد فئة MathFraction كائن الكسر، المكوّن من بسط ومقام مفصولين بشريط كسر. يمكن أن يكون شريط الكسر أفقيًا أو مائلًا حسب خصائص الكسر. يُستخدم كائن الكسر أيضًا لتمثيل دالة المكدس، التي تُضع عنصرًا فوق آخر دون شريط كسر.
مثال:

فئة MathRadical
تحدد فئة MathRadical دالة الجذر الرياضي، المكوّن من قاعدة ودرجة اختيارية.
مثال:

فئة MathFunction
تحدد فئة MathFunction دالة ذات معامل. تحتوي على الخصائص: getName — اسم الدالة وgetBase — معامل الدالة.
مثال:

فئة MathNaryOperator
تحدد فئة MathNaryOperator كائنًا رياضيًا N-ary، مثل الجمع والتكامل. يتكوّن من عامل، قاعدة (أو operand)، وحدود علوية وسفلية اختيارية. تشمل أمثلة المشغلات N-ary: الجمع، الاتحاد، التقاطع، التكامل.
هذه الفئة لا تشمل المشغلات البسيطة مثل الجمع والطرح، حيث يتم تمثيلها بعنصر نصي واحد — MathematicalText.
مثال:

فئة MathLimit
تُنشئ فئة MathLimit الحد العلوي أو السفلي. تحدد كائن الحد، المكوّن من نص على الخط القاعدي ونص أصغر حجما فوقه أو تحته مباشرة. لا تتضمن هذه الفئة كلمة “lim”، بل تسمح بوضع النص في أعلى أو أسفل التعبير. لذلك، يُنشأ التعبير التالي:

باستخدام مزيج من فئتي MathFunction وMathLimit كما يلي:
MathLimit funcName = new MathLimit(new MathematicalText("lim"), new MathematicalText("𝑥→∞"));
MathFunction mathFunc = new MathFunction(funcName, new MathematicalText("𝑥"));
فئات MathSubscriptElement و MathSuperscriptElement و MathRightSubSuperscriptElement و MathLeftSubSuperscriptElement
- MathSubscriptElement
- MathSuperscriptElement
- MathRightSubSuperscriptElement
- MathLeftSubSuperscriptElement
تحدد هذه الفئات مؤشرًا سفليًا أو علويًا. يمكنك ضبط الحرف سفليًا وعلويًا في الوقت ذاته على الجانب الأيسر أو الأيمن من المعامل، لكن يُدعم الحرف السُفلي أو العلوي المفرد فقط على الجانب الأيمن. يمكن أيضًا استخدام MathSubscriptElement لتعيين درجة رياضية لعدد.
مثال:

فئة MathMatrix
تحدد فئة MathMatrix كائن المصفوفة، المكوّن من عناصر فرعية مرتبة في صفوف وأعمدة متعددة. تجدر الإشارة إلى أن المصفوفات لا تحتوي على محددات مدمجة؛ لوضع المصفوفة داخل أقواس يجب استخدام كائن المحدد — IMathDelimiter. يمكن تمرير معاملات فارغة لإنشاء فجوات في المصفوفات.
مثال:

فئة MathArray
تحدد فئة MathArray مصفوفة رأسية من المعادلات أو أي كائنات رياضية أخرى.
مثال:

تنسيق العناصر الرياضية
-
فئة MathBorderBox: تُرسم حدودًا مستطيلة أو أشكالًا أخرى حول IMathElement.
مثال:

-
فئة MathBox: تحدد تغليفًا منطقيًا للعنصر الرياضي. على سبيل المثال، يمكن أن يُستعمل كعامل محاكي مع أو بدون نقطة محاذاة، أو لتحديد كسر سطر، أو لتجميع بحيث لا يُسمح بكسور سطر داخله. مثال، يجب تغليف عامل “==” لمنع كسر السطر.
-
فئة MathDelimiter: تحدد كائن المحدد، المكوّن من أحرف افتتاحية وإغلاقية (مثل الأقواس، الأقواس المدورة، الأقواس المربعة، أو الشرطات العمودية) وعنصر (عناصر) رياضية داخله مفصولة بحرف محدد.
مثال:

-
فئة MathAccent: تحدد دالة التشكيل، المكوّنة من قاعدة وعلامة إِضافة صوتية.
مثال: 𝑎́.
-
فئة MathBar: تحدد دالة الشريط، المكوّنة من معامل أساسي وشريط فوقي أو سفلي.
مثال:

-
فئة MathGroupingCharacter: تحدد رمز تجميع فوق أو تحت التعبير، عادةً لتسليط الضوء على العلاقات بين العناصر.
مثال:

العمليات الرياضية
كل عنصر رياضي وتعبير رياضي (عبر MathBlock) ينفّذ واجهة IMathElement. تسمح لك باستخدام عمليات على الهيكل الحالي وتكوين تعبيرات رياضية أكثر تعقيدًا. جميع العمليات لها مجموعتا معلمات: إما IMathElement أو سلسلة كوسائط. تُنشأ كائنات فئة MathematicalText ضمنيًا من السلاسل عند استخدامها كوسائط. العمليات المتاحة في Aspose.Slides مذكورة أدناه.
طريقة Join
تنضم عنصرًا رياضيًا وتشكل كتلة رياضية. مثال:
IMathElement element1 = new MathematicalText("x");
IMathElement element2 = new MathematicalText("y");
IMathBlock block = element1.join(element2);
طريقة Divide
- divide(String)
- divide(IMathElement)
- divide(String, MathFractionTypes)
- divide(IMathElement, MathFractionTypes)
ينشئ كسرًا من النوع المحدد باستخدام هذا البسط والمقام المحدد. مثال:
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
- asArgumentOfFunction(String)
- asArgumentOfFunction(IMathElement)
- asArgumentOfFunction(MathFunctionsOfOneArgument)
- asArgumentOfFunction(MathFunctionsOfTwoArguments, IMathElement)
- asArgumentOfFunction(MathFunctionsOfTwoArguments, String)
تأخذ الدالة المحددة باستخدام المثيل الحالي كوسيط. يمكنك:
- تحديد سلسلة كاسم للدالة، مثل “cos”.
- اختيار أحد القيم المحددة مسبقًا من تعداد MathFunctionsOfOneArgument أو MathFunctionsOfTwoArguments، مثال MathFunctionsOfOneArgument.ArcSin.
- اختيار مثيل من IMathElement.
مثال:
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
- setSubscript(String)
- setSubscript(IMathElement)
- setSuperscript(String)
- setSuperscript(IMathElement)
- setSubSuperscriptOnTheRight(String, String)
- setSubSuperscriptOnTheRight(IMathElement, IMathElement)
- setSubSuperscriptOnTheLeft(String, String)
- setSubSuperscriptOnTheLeft(IMathElement, IMathElement)
تضبط الحرف السفلي والعلوي. يمكنك ضبطهما معًا على الجانب الأيسر أو الأيمن من المعامل، لكن الحرف السفلي أو العلوي المفرد يُدعم فقط على الجانب الأيمن. يمكن أيضًا استخدام Superscript لتعيين درجة رياضية لعدد.
مثال:
IMathLeftSubSuperscriptElement script = new MathematicalText("y").setSubSuperscriptOnTheLeft("2x", "3z");
طريقة Radical
تحدد الجذر الرياضي للدرجة المعطاة من المعامل المحدد.
مثال:
IMathRadical radical = new MathematicalText("x").radical("3");
طرق SetUpperLimit و SetLowerLimit
تأخذ الحد العلوي أو السفلي. هنا يُشير العلوي والسفلي فقط إلى موقع المعامل بالنسبة للقاعدة.
لنأخذ مثالًا:

يمكن إنشاء مثل هذه التعبيرات من خلال دمج فئتي MathFunction وMathLimit والعمليات على IMathElement كما يلي:
IMathFunction mathExpression = new MathematicalText("lim").setLowerLimit("x→∞").function("x");
طرق Nary و 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)
كلاّ الطريقتين nary و integral تنشئ وتُعيد المشغّل N-ary المُمثَّل بنوع IMathNaryOperator. في طريقة nary، يحدد تعداد MathNaryOperatorTypes نوع المشغّل: جمع، اتحاد، إلخ، ولا تشمل التكاملات. في طريقة Integral، يُستخدم النوع المتخصص 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();
الأسئلة المتكررة
كيف يمكن إضافة معادلة رياضية إلى شريحة PowerPoint؟
لإضافة معادلة رياضية، تحتاج إلى إنشاء كائن شكل رياضي، والذي يحتوي تلقائيًا على جزء رياضي. بعد ذلك، تستخرج MathParagraph من MathPortion وتضيف كائنات MathBlock إليه.
هل يمكن إنشاء تعبيرات رياضية متداخلة معقدة؟
نعم، يسمح Aspose.Slides بإنشاء تعبيرات رياضية معقدة عن طريق تعشيق MathBlocks. كل عنصر رياضي ينفّذ واجهة IMathElement التي تسمح بتطبيق عمليات (Join، Divide، Enclose، إلخ) لدمج العناصر في هياكل أكثر تعقيدًا.
كيف يمكن تحديث أو تعديل معادلة رياضية موجودة؟
لتحديث معادلة، يجب الوصول إلى MathBlocks الحالية عبر MathParagraph. ثم، باستخدام أساليب مثل Join، Divide، Enclose، وغيرها، يمكنك تعديل عناصر المعادلة الفردية. بعد التحرير، احفظ العرض التقديمي لتطبيق التغييرات.