2013-11-15 2 views
10

में लेटेक्स मैथ का मूल्यांकन करना मैं एक HTML- आधारित कैलक्यूलेटर पर काम कर रहा हूं, और मैं एक अभिव्यक्ति प्रस्तुत करना चाहता हूं, फिर इसका मूल्यांकन करना चाहता हूं, और यह सब जावास्क्रिप्ट में किया जाना चाहिए। मैं लाटेक्स में अभिव्यक्ति को लिखना पसंद करूंगा, और इसके लिए प्रस्तुत अभिव्यक्ति को अंतःक्रियात्मक रूप से संपादित करना संभव है, लेकिन अन्य भाषाएं काम कर सकती हैं।जावास्क्रिप्ट

जो मैंने पहले कोशिश की है वह अभिव्यक्ति को प्रस्तुत करना है, अंतःक्रियात्मक रूप से, MathQuill के साथ, और फिर इसे MathJS के साथ मूल्यांकन करना है। यह कुछ हद तक काम करता है, हालांकि, दोनों पैकेज अलग-अलग लक्ष्यों के साथ डिजाइन किए गए हैं (MathQuill LaTeX प्रस्तुत करता है, जबकि MathJS में कस्टम गणित वाक्यविन्यास है), यह पूरी तरह से अच्छी तरह से काम नहीं करता है (उदाहरण के लिए यदि कोई उपयोगकर्ता \frac{5}{17*x} में टाइप करता है और मानता है कि यह सही वाक्यविन्यास है, फिर इसका मूल्यांकन करता है और MathJS से एक त्रुटि प्राप्त करता है)।

वर्तमान में, मैं तीन तरीके आगे बढ़ने के लिए देखें: (? या हो सकता है MathJax- जो बेहतर है के लिए स्विच)

  • मैं क्या है के साथ आगे बढ़ें।
  • वाक्य रचना के लिए एक उपकरण है कि
  • प्रतिपादन और करीब से मूल्यांकन के लिए दो उपकरण का पता लगाएं (चाहे वह लेटेक्स या कुछ अन्य भाषा में है) (अगर एक ही नहीं) दोनों प्रतिपादन और मूल्यांकन करता है का पता लगाएं
  • अपने ही प्रतिपादन लिखें और मूल्यांकन उपकरण, जैसा कि here अनुशंसित है। मैं ऐसा नहीं करना पसंद करूंगा, क्योंकि यह बहुत कठिन लगता है, और मैं पहिया को फिर से शुरू नहीं करना चाहता हूं।

ऐसा करने का सबसे अच्छा तरीका क्या है?

अद्यतन 1:altJS पर विकल्प उपलब्ध भाषाओं की सूची के माध्यम से देखने के बाद, मुझे लगता है मैं उपयोगकर्ता इनपुट के लिए एक भाषा के रूप में अजगर, रूबी, या मूल इस्तेमाल कर सकते हैं लगता है। अगर मैंने ऐसा किया है, तो यह इसे प्रस्तुत करने के लिए कई संभावनाएं खुलता है (तकनीकी रूप से, यह "प्रतिपादन" नहीं है, लेकिन केवल इस बारे में सोचें कि वहां कितने वाक्यविन्यास हाइलाइटर्स हैं)। हालांकि, मैं नहीं चाहता कि उपयोगकर्ताओं को इन भाषाओं के अधिक उन्नत तत्वों तक पहुंच प्राप्त हो, क्योंकि यह मेरे उपयोगकर्ताओं को भ्रम जोड़ देगा, और यह असुरक्षित भी हो सकता है (eval का उपयोग करना)। मैं केवल उपयोगकर्ताओं को गणित संचालन, चर (केवल वे जिन्हें मैं निर्दिष्ट करता हूं, और उपयोगकर्ता द्वारा निर्मित) का उपयोग करने में सक्षम होना चाहता हूं, और फ़ंक्शंस (केवल वे जिन्हें मैं निर्दिष्ट करता हूं, और उपयोगकर्ता द्वारा परिभाषित किया गया)। क्या भाषा का सबसेट प्रतिबंधित करने का कोई तरीका है जिसका उपयोग किया जा सकता है? 2

अद्यतन: मैं चल रहा है भाषा के बजाय altJS पृष्ठ पर और अधिक कुछ चारों ओर देखा, और महसूस किया है कि लगभग सभी भाषाओं के, जावास्क्रिप्ट को भाषा XYZ संकलित करने के लिए तो पेज पर JavaScript चला डिजाइन किए गए थे, XYZ पृष्ठ पर। मैंने हर एक को नहीं देखा है, लेकिन उनमें से ज्यादातर इस तरह लगते हैं। ब्रितन की तरह अन्य, ब्राउज़र में भाषा XYZ चलाने के लिए डिज़ाइन किए गए हैं, लेकिन उपयोगकर्ता के लिए इनपुट भाषा के बजाय जावास्क्रिप्ट के प्रतिस्थापन/पूरक के रूप में। क्या कुछ कामकाज है इसलिए मैं इनपुट के रूप में इन विधियों का उपयोग कर सकता हूं?

अद्यतन 3: उस जानकारी के लिए @ स्पेसडॉग पर धन्यवाद, और यह इंगित करने के लिए कि मैं विशिष्ट नहीं हूं कि उपयोगकर्ताओं को क्या हासिल करने में सक्षम होना चाहिए।

  1. बेसिक संचालन (इसके अलावा, घटाव, गुणा, विभाजन/भिन्न, घातांक, जड़ें, मापांक)
  2. कार्य (त्रिकोणमितीय कार्यों, लॉग, आदि: तो, यहाँ कार्यक्षमता है कि मैं प्राप्त किया जा करना चाहते हैं)
  3. स्थिरांक (ई, अनुकरणीय, आदि)
  4. चर (काम, रीअसाइनमेंट, और उन्हें प्रयोग)
  5. उपयोगकर्ता परिभाषित कार्यों

LaTeXCalc इन सभी आवश्यकताओं को पूरा करने के लिए लगता है, के अलावा आखरी। साथ ही, यह जावास्क्रिप्ट में प्रतीत नहीं होता है।

यह मुझे एक और विचार में लाता है जिसके बारे में मैंने सोचा है: प्रस्तुति के लिए MathJax जैसे कुछ का उपयोग करें, फिर गणना को संभालने के लिए Wolfram Alpha API का उपयोग करें। लाभ यह है कि इनपुट और आउटपुट दोनों के लिए इसमें अधिक उन्नत विकल्प होंगे। हालांकि, आवेदन बेकार किया जाएगा (क्यों नहीं wolframalpha.com का उपयोग करें, अगर कैलकुलेटर व्यावहारिक रूप से केवल एक क्लोन है?), यह पैसा खर्च करता है, और ऐप ऑफ़लाइन काम नहीं करेगा (यह एक डेस्कटॉप ऐप है, जो एचटीएमएल में लिखा गया है/सीएसएस/जे एस)। उस पर विचार?

+0

शायद मेरा जवाब [यह] (http://stackoverflow.com/a/42232776) इसी तरह का प्रश्न मदद कर सकता है। – Jeff

उत्तर

5

ऐसा लगता है कि आप दो अलग-अलग चीजें करना चाहते हैं, अच्छी तरह से समीकरण प्रदर्शित करें और इसका मूल्यांकन करें। तो आपको एक उपकरण की आवश्यकता है जो दोनों करता है। लेटेक्स मूल्यांकन के बजाय प्रस्तुति पर अधिक ध्यान केंद्रित करता है, हालांकि कम से कम एक सबसेट के लिए इसका मूल्यांकन करना संभव है (इस उत्तर को देखें: Is there a calculator with LaTeX-syntax?)।

इस पर बहुत कुछ इस बात पर निर्भर करता है कि आप कैलकुलेटर को कितना जटिल बनाना चाहते हैं - आप कौन से संचालन की अनुमति देना चाहते हैं। यदि आप एक छोटे से सबसेट का उपयोग कर रहे हैं (और यह आपके जैसा लगता है) तो हाथ से कनवर्टर लिखना बहुत आसान होगा। मैं MathML में देखता हूं जिसमें प्रस्तुति और अर्थपूर्ण मार्कअप दोनों हैं - और कई उपलब्ध टूल। हालांकि यह आपके उपयोगकर्ताओं को समझने के लिए सबसे आसान नहीं हो सकता है।

यदि उपयोगकर्ता लेटेक्स से परिचित हैं, और शामिल प्रतीकों का सबसेट छोटा है तो लेटेक्स को प्रारूप में पार्स करने के लिए पर्याप्त आसान होगा जिसका सीधे मूल्यांकन किया जा सकता है।

मुझे लगता है कि आपको किसी भी व्यक्ति को 'सर्वश्रेष्ठ' के रूप में बेहतर उदाहरण प्रदान करने के लिए उपयोगकर्ता को किस प्रकार पहुंचने की अनुमति दे रही है, उसे परिभाषित करने की आवश्यकता है।

संपादित करें - अपने अद्यतन

खैर के जवाब में, आप खतरनाक तरीके से एक पूर्ण प्रोग्रामिंग भाषा लिख ​​करने ही वाले हैं (आप सभी की जरूरत हैं की स्थिति और लूप - या लेबल)। तो पहिया को फिर से शुरू करना एक महान विचार की तरह नहीं लगता है। इस मामले में मुझे निश्चित रूप से नहीं लगता कि आप अपनी इनपुट भाषा के रूप में लाटेक्स चाहते हैं, आदर्श रूप से आप अपने उपयोगकर्ताओं के लिए कुछ और परिचित चाहते हैं।

क्या इस प्रकार मैं क्या कर सकता है और मैं कहां से शुरू होता अगर मैं यह करने के लिए जा रहे थे, यह एक निश्चित जवाब नहीं है और मुझे यकीन है कि मैं डुप्लिकेट नहीं कर रहा हूँ प्रयास करने के लिए शुरू करने से पहले एक बहुत अधिक शोध करना होता है ।

मैं एक पार्सर बनाना चाहता हूं जो जावास्क्रिप्ट का सबसेट लेता है, यह पार्सर दो चीजें करेगा (या दो पार्सर्स होंगे) कोड को लाटेक्स या मैथएमएल में अनुवाद करना होगा और दूसरा मूल्यांकन/कोड निष्पादित करें।

इसे ऑफ़लाइन करना, सी में, मैं लेक्स और वाईएसी (या फ्लेक्स और बायसन इत्यादि) की ओर रुख करूंगा और एक त्वरित Google से पता चलता है कि जावास्क्रिप्ट समतुल्य है: Jison। इससे आपको भाषा के लिए पार्सर की रीढ़ की हड्डी मिल जाएगी और आप इसे संशोधित कर सकते हैं।

वैकल्पिक रूप से मौजूदा जेएस पार्सर से शुरू करने में मदद मिल सकती है, इस उत्तर को आजमाएं: JavaScript parser in JavaScript।टी

एक बार जब आप पार्स रीढ़ आप इसे पहले सरल रख सकते है - क्योंकि पार्सर होगा पहले से ही यह सुनिश्चित किया कि - एक प्रदर्शन योग्य वाली भाषा में अनुवाद काफी आसान है और आप के मूल्यांकन के लिए जोखिम सिर्फ eval का उपयोग कर सकता है किया जाना चाहिए इनपुट केवल वही है जो आप अनुमति दे रहे हैं। हालांकि मैं इसके खिलाफ उत्पादन संस्करण में सलाह दूंगा (यह परीक्षण के लिए ठीक है) और यह टोकन को आंतरिक कार्यों में मैप करने के लिए बहुत अधिक काम नहीं करता है।

उसके बाद आप प्रदर्शित आउटपुट में सुधार करना चाहते हैं, शायद आप इनपुट को आजमाएं और सरल बनाना चाहते हैं या अधिक समझने के लिए इसे पुन: व्यवस्थित करना चाहते हैं। इसके लिए आपके पार्सर से आंतरिक प्रतिनिधित्व लेने और उस पर कुछ चालाक सामान करने की आवश्यकता होगी। लेकिन पहले काम करने वाले पहले कदम प्राप्त करें।

आप इसे ऑफ़लाइन काम करना चाहते हैं, इसलिए आपके द्वारा उद्धृत अन्य उदाहरण प्रोग्रामों को होस्ट करने वाले सर्वर का मेरा अन्य विचार काम नहीं करेगा (और वोल्फ्राम अल्फा या Google का उपयोग करना एक अच्छा विकल्प है - लेकिन, जैसा कि आप कहते हैं, तो कार्यक्रम का बिंदु क्या है)। लेकिन आप यह भी विचार कर सकते हैं कि क्या आप एक बेहतर आधार प्राप्त करेंगे, इसे एक अलग आधार भाषा में लिखना शुरू करें - हालांकि मुझे लगता है कि आप एचटीएमएल/जेएस/सीएसएस की पोर्टेबिलिटी चाहते हैं।

अन्य चीजें जिन्हें आप लिंक करते हैं, वे सभी अन्य संभावित विचार हैं, मुझे लगता है कि आपको प्रत्येक एप्लिकेशन के लिए तृतीय पक्ष कोड पर भरोसा करने के बजाय आंतरिक रूप से अपने स्वयं के पार्सर होने का अधिक लाभ मिलेगा। अपने स्वयं के पार्सर के साथ आप आसानी से कार्यक्षमता या भाषा सुविधाओं को आसानी से जोड़ सकते हैं।

अंतिम विचार, आप जावास्क्रिप्ट को इस विधि के साथ इनपुट के रूप में प्रतिबंधित नहीं कर रहे हैं। यदि आपको लगता है कि आपके उपयोगकर्ता Reverse Polish Notation से सामना करेंगे तो हाथ के लिए एक पार्सर लिखना आसान है - लेकिन आपको आउटपुट के लिए इसे अच्छी तरह प्रारूपित करने पर कुछ काम करना होगा।

+1

MathJax जावास्क्रिप्ट है और MathML के साथ काम करता है, हां, मैं सीधे जेएस में भी पार्स लिखूंगा। – SpaceDog

संबंधित मुद्दे