إضافة معادلات رياضية إلى عروض PowerPoint التقديمية في С++

نظرة عامة

في PowerPoint، يمكن كتابة معادلة أو صيغة رياضية وعرضها في العرض التقديمي. لتحقيق ذلك، يتم تمثيل رموز رياضية مختلفة في PowerPoint ويمكن إضافتها إلى النص أو المعادلة. لهذا يستخدم مُنشئ المعادلات الرياضية في PowerPoint، والذي يساعد على إنشاء صيغ معقدة مثل:

  • كسر رياضي
  • جذر رياضي
  • دالة رياضية
  • الحدود والدوال اللوغاريتمية
  • عمليات N-ary
  • مصفوفة
  • عوامل كبيرة
  • دوال Sin, cos

لإضافة معادلة رياضية في PowerPoint، يتم استخدام قائمة Insert -> Equation :

todo:image_alt_text

سوف ينشئ هذا نصًا رياضيًا بصيغة XML يمكن عرضه في PowerPoint كما يلي:

todo:image_alt_text

يدعم PowerPoint العديد من الرموز الرياضية لإنشاء المعادلات. ومع ذلك، غالبًا ما لا ينتج عن إنشاء معادلات رياضية معقدة في PowerPoint نتيجة جيدة ومظهر احترافي. يلجأ المستخدمون الذين يحتاجون إلى إنشاء عروض تقديمية رياضية بشكل متكرر إلى حلول طرف ثالث للحصول على صيغ رياضية ذات مظهر جيد.

باستخدام Aspose.Slide API، يمكنك التعامل مع المعادلات الرياضية في عروض PowerPoint برمجياً بلغة C++. أنشئ تعبيرات رياضية جديدة أو عدل ما تم إنشاؤه مسبقًا. كما أن تصدير الهياكل الرياضية إلى صور مدعوم جزئيًا.

كيفية إنشاء معادلة رياضية

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

دعنا نرى كيف يمكن إنشاء المعادلة الرياضية التالية عبر Aspose.Slides API:

todo:image_alt_text

لإضافة تعبير رياضي على الشريحة، أضف أولاً شكلًا سيحتوي على النص الرياضي:

auto pres = System::MakeObject<Presentation>();
auto mathShape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddMathShape(0.0f, 0.0f, 720.0f, 150.0f);

بعد الإنشاء، سيحتوي الشكل بالفعل على فقرة واحدة بها جزء رياضي بشكل افتراضي. فئة MathPortion هي جزء يحتوي على نص رياضي داخل. للوصول إلى المحتوى الرياضي داخل MathPortion، استخدم متغيّر MathParagraph:

 auto mathParagraph = (System::AsCast<MathPortion>(mathShape->get_TextFrame()->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)))->get_MathParagraph();

تسمح فئة MathParagraph بقراءة، إضافة، تعديل وحذف كتل الرياضيات (MathBlock)، التي تتكون من مجموعة من العناصر الرياضية. على سبيل المثال، أنشئ كسرًا وضعه في العرض التقديمي:

auto fraction = System::MakeObject<MathematicalText>(u"x")->Divide(u"y");
mathParagraph->Add(System::MakeObject<MathBlock>(fraction));

كل عنصر رياضي يُمثَّل بفئة تطبيق IMathElement . توفر هذه الواجهة العديد من الطرق لإنشاء تعبيرات رياضية بسهولة. يمكنك إنشاء تعبير رياضي معقد بخط واحد. على سبيل المثال، تبدو نظرية فيثاغورس هكذا:

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"));

يُطبق عمليات الواجهة IMathElement على أي نوع من العناصر، بما في ذلك MathBlock.

الكود الكامل:

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);

أنواع العناصر الرياضية

تُكوَّن التعبيرات الرياضية من سلاسل من العناصر الرياضية. تمثل سلسلة العناصر الرياضية كتلة رياضية، وتُكوِّن معاملات العناصر الرياضية شجرة متداخلة.

هناك العديد من أنواع العناصر الرياضية التي يمكن استخدامها لإنشاء كتلة رياضية. كل عنصر يمكن تضمينه داخل عنصر آخر، أي أن العناصر هي في الواقع حاويات لتكوين بنية شجرية. أبسط نوع هو العنصر الذي لا يحتوي على عناصر أخرى من النص الرياضي.

كل نوع من العناصر الرياضية يطبق الواجهة IMathElement مما يسمح باستخدام مجموعة مشتركة من العمليات الرياضية على أنواع مختلفة.

فئة MathematicalText

فئة MathematicalText تمثل نصًا رياضيًا – العنصر الأساسي لكل التركيبات الرياضية. قد يمثل النص الرياضي عوامل، مشغلات، متغيرات، أو أي نص خطي آخر.

مثال: 𝑎=𝑏+𝑐

فئة MathFraction

فئة MathFraction تُحدد كائن الكسر، المكوَّن من البسط والمقام مفصولين بشريط كسر. يمكن أن يكون الشريط أفقيًا أو قطريًا حسب خصائص الكسر. يُستخدم كائن الكسر أيضًا لتمثيل دالة الستاك التي تضع عنصرًا فوق آخر بدون شريط كسر.

مثال:

todo:image_alt_text

فئة MathRadical

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

مثال:

todo:image_alt_text

فئة MathFunction

فئة MathFunction تُحدد دالة لها وسيط. تحتوي على طريقتين: get_Name() – اسم الدالة و get_Base() – وسيط الدالة.

مثال:

todo:image_alt_text

فئة MathNaryOperator

فئة MathNaryOperator تُحدد كائنًا رياضيًا N-ary مثل المجموع والتكامل. يتكون من مشغل، قاعدة (أو عامل)، وحدود علوية وسفلية اختيارية. أمثلة على المشغلات N-ary: Summation, Union, Intersection, Integral.

هذه الفئة لا تشمل المشغلات البسيطة مثل الجمع والطرح؛ فهي تُمثل بنص MathematicalText.

مثال:

todo:image_alt_text

فئة MathLimit

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

مثال يُظهر باستخدام مزيج من MathFunction و MathLimit:

auto funcName = System::MakeObject<MathLimit>(System::MakeObject<MathematicalText>(u"lim"), System::MakeObject<MathematicalText>(u"𝑥→∞"));
auto mathFunc = System::MakeObject<MathFunction>(funcName, System::MakeObject<MathematicalText>(u"𝑥"));

فئات MathSubscriptElement, MathSuperscriptElement, MathRightSubSuperscriptElement, MathLeftSubSuperscriptElement

تحدد الفئات التالية مؤشرًا سفليًا أو علويًا. يمكنك تعيين كل من الفهرس السفلي والعلوي في الوقت نفسه على اليسار أو اليمين، بينما يُدعم الفهرس الفردي فقط على اليمين. يمكن أيضًا استخدام MathSubscriptElement لتعيين درجة عددية.

مثال:

todo:image_alt_text

فئة MathMatrix

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

مثال:

todo:image_alt_text

فئة MathArray

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

مثال:

todo:image_alt_text

تنسيق العناصر الرياضية

  • فئة MathBorderBox ترسم حدودًا مستطيلة أو شكلًا آخر حول IMathElement.
    مثال: todo:image_alt_text

  • فئة MathBox تحدد تجميعًا منطقيًا للعنصر الرياضي. على سبيل المثال، يمكن استخدام كائن مُغلق كمحاكٍ للمشغل مع أو بدون نقطة محاذاة، أو لتحديد عدم السماح بانكسارات الأسطر داخل التجميع.

  • فئة MathDelimiter تحدد كائن المحدد، المكوَّن من أحرف افتتاحية وإغلاقية (مثل الأقواس أو الأقواس المعقوفة أو الأقواس المربعة أو الشرطيات الرأسية) وعنصر أو أكثر داخلها.

    مثال: todo:image_alt_text

  • فئة MathAccent تحدد دالة الـ accent، المكوَّنة من قاعدة وعلامة تشكيلية مدمجة.
    مثال: 𝑎́.

  • فئة MathBar تحدد دالة الـ bar، المكوَّنة من وسيط أساسي وشريط علوي أو سفلي.
    مثال: todo:image_alt_text

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

عمليات رياضية

كل عنصر رياضي وتعبير رياضي (عبر MathBlock) يطبق الواجهة IMathElement. يتيح ذلك استخدام عمليات على الهيكل الحالي وتكوين تعبيرات رياضية أكثر تعقيدًا. لكل عملية مجموعتان من المعاملات: إما [IMathElement] أو String. تُنشأ كائنات [MathematicalText] ضمنيًا من السلاسل النصية عند استخدام سلاسل كمعاملات. تُدرج عمليات الرياضيات المتاحة في Aspose.Slides أدناه.

طريقة Join

تدمج عنصرًا رياضيًا وتكوِّن كتلة رياضية. مثال:

auto element1 = System::MakeObject<MathematicalText>(u"x");
    
auto element2 = System::MakeObject<MathematicalText>(u"y");

auto block = element1->Join(element2);

طريقة Divide

ينشئ كسرًا من النوع المحدد باستخدام هذا البسط والمقام المحدد. مثال:

auto numerator = System::MakeObject<MathematicalText>(u"x");
auto fraction = numerator->Divide(u"y", MathFractionTypes::Linear);

طريقة Enclose

تُحاط العنصر بأحرف محددة مثل الأقواس أو أي حرف آخر كإطار.

/// <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;

مثال:

auto delimiter = System::MakeObject<MathematicalText>(u"x")->Enclose(u'[', u']');
auto delimiter2 = System::ExplicitCast<IMathElement>(System::MakeObject<MathematicalText>(u"elem1")->Join(u"elem2"))->Enclose();

طريقة Function

تأخذ دالة ذات وسيط باستخدام الكائن الحالي كاسم الدالة.

/// <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;

مثال:

auto func = System::MakeObject<MathematicalText>(u"sin")->Function(u"x");

طريقة AsArgumentOfFunction

تأخذ الدالة المحددة باستخدام الكائن الحالي كوسيط. يمكنك:

  • تحديد سلسلة كاسم الدالة، مثال “cos”.
  • اختيار إحدى القيم المعرفة مسبقًا في تعداد [MathFunctionsOfOneArgument] أو [MathFunctionsOfTwoArguments]، مثال MathFunctionsOfOneArgument.ArcSin.
  • اختيار كائن [IMathElement].

مثال:


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");

طرق SetSubscript, SetSuperscript, SetSubSuperscriptOnTheRight, SetSubSuperscriptOnTheLeft

تحدد الفهارس السفلية والعليا. يمكنك تعيين الفهرس السفلي والعلوي معًا على اليمين أو اليسار، بينما يُدعم الفهرس الوحيد فقط على اليمين. يمكن أيضًا استخدام Superscript لتعيين درجة عددية.

مثال:

auto script = System::MakeObject<MathematicalText>(u"y")->SetSubSuperscriptOnTheLeft(u"2x", u"3z");

طريقة Radical

تحدد جذرًا رياضيًا من الدرجة المحددة للوسيط المعيَّن.

مثال:

auto radical = System::MakeObject<MathematicalText>(u"x")->Radical(u"3");

طرق SetUpperLimit و SetLowerLimit

تُحدد حدًا علويًا أو سفليًا. يشير الحد العلوي والسفلي ببساطة إلى موقع الوسيط بالنسبة للقاعدة.

مثال تعبيري:

auto mathExpression = System::MakeObject<MathematicalText>(u"lim")->SetLowerLimit(u"x→∞")->Function(u"x");

طرق Nary و Integral

كلا الطريقتين Nary و Integral تنشئ وتعيد مشغلًا N-ary مُمثَّلًا بنوع IMathNaryOperator. في طريقة Nary، يحدد تعداد [MathNaryOperatorTypes] نوع المشغل: جمع، اتحاد، إلخ، ولا تشمل التكاملات. في طريقة Integral، يُستخدم تعداد [MathIntegralTypes] لتحديد نوع التكامل.

مثال:

auto baseArg = System::MakeObject<MathematicalText>(u"x")->Join(System::MakeObject<MathematicalText>(u"dx")->ToBox());
auto integral = baseArg->Integral(MathIntegralTypes::Simple, u"0", u"1");

طريقة ToMathArray

تضع العناصر في مصفوفة رأسية. إذا استُدعِيت لهذه الطريقة على كائن MathBlock، فستُوضع جميع العناصر الفرعية في المصفوفة المرجعة.

مثال:

auto arrayFunction = System::MakeObject<MathematicalText>(u"x")->Join(u"y")->ToMathArray();

عمليات تنسيق: Accent, Overbar, Underbar, Group, ToBorderBox, ToBox

  • طريقة Accent تضيف علامة تشديد (حرف فوق العنصر).
  • طريقة Overbar و Underbar تضيف شريطًا أعلى أو أسفل العنصر.
  • طريقة Group تجمع العنصر باستخدام رمز تجميع مثل القوس المعقوف السفلي أو غيره.
  • طريقة ToBorderBox توضع العنصر في صندوق حدود.
  • طريقة ToBox توضع العنصر في صندوق منطقي غير مرئي.

أمثلة:

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();

الأسئلة المتكررة

كيف يمكن إضافة معادلة رياضية إلى شريحة PowerPoint؟

لإضافة معادلة رياضية، تحتاج إلى إنشاء كائن شكل رياضي، والذي يحتوي تلقائيًا على جزء رياضي. ثم تستخرج MathParagraph من MathPortion وتضيف كائنات MathBlock إلىه.

هل يمكن إنشاء تعبيرات رياضية معقدة متداخلة؟

نعم، تسمح Aspose.Slides بإنشاء تعبيرات رياضية معقدة عن طريق تعشيق MathBlocks. كل عنصر رياضي يطبق واجهة IMathElement التي تتيح تطبيق عمليات (Join, Divide, Enclose, …) لتكوين هياكل أكثر تعقيدًا.

كيف يمكن تحديث أو تعديل معادلة رياضية موجودة؟

لتحديث معادلة، يمكنك الوصول إلى MathBlocks ال vorhandenen MathParagraph. بعد ذلك، باستخدام طرق مثل Join, Divide, Enclose وغيرها، يمكنك تعديل عناصر المعادلة. بعد التعديل، احفظ العرض التقديمي لتطبيق التغييرات.