إضافة معادلات رياضية إلى عروض PowerPoint التقديمية في Java
نظرة عامة
في PowerPoint، يمكن كتابة معادلة رياضية أو صيغة وعرضها في العرض التقديمي. للقيام بذلك، يتم تمثيل رموز رياضية مختلفة في PowerPoint ويمكن إضافتها إلى النص أو المعادلة. لهذا يتم استخدام منشئ المعادلات الرياضية في PowerPoint، الذي يساعد على إنشاء صيغ معقدة مثل:
- كسر رياضي
- جذر رياضي
- دالة رياضية
- حدود وظائف اللوغاريتم
- عمليات N-ary
- مصفوفة
- عوامل كبيرة
- دوال جيب وجيب تمام
لإضافة معادلة رياضية في 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 نصًا رياضيًا – العنصر الأساسي لجميع التركيبات الرياضية. يمكن أن يمثل النص الرياضي معاملات ومشغِّلات ومتغيّرات وأي نص خطي آخر.
مثال: 𝑎=𝑏+𝑐
فئة MathFraction
تمثل الفئة MathFraction كائن الكسر، المكوّن من بسط ومقام مفصولين بخط كسر. يمكن أن يكون خط الكسر أفقيًا أو قطريًا حسب خصائص الكسر. يُستَخدم كائن الكسر أيضًا لتمثيل الدالة المكدسة التي تضع عنصرًا فوق آخر دون خط كسر.
مثال:

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

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

فئة MathNaryOperator
تمثل الفئة MathNaryOperator كائنًا رياضيًا N-ary، مثل الجمع أو التكامل. يتكوّن من مشغِّل، قاعدة (أو معامل)، ودرجات علوية وسفلية اختيارية. أمثلة على المشغِّلات 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. يمكن استخدام قيم null لإنشاء فراغات داخل المصفوفات.
مثال:

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

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

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

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

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

العمليات الرياضية
كل عنصر أو تعبير رياضي (عبر MathBlock) يطبق واجهة IMathElement. تتيح لك هذه الواجهة إجراء عمليات على البنية الحالية وتكوين تعابير رياضية أكثر تعقيدًا. جميع العمليات لها مجموعتين من المعاملات: إما IMathElement أو سلسلة نصية كمعاملات. تُنشأ كائنات MathematicalText ضمنيًا من السلاسل النصية عند استخدامها.
طريقة 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، تُستَخدم عملية التكامل مع تعداد أنواع التكامل 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 وغيرها، يمكنك تعديل عناصر المعادلة الفردية. بعد التحرير، احفظ العرض التقديمي لتطبيق التغييرات.