Оценка математики латекс в Javascript - программирование

Оценка математики латекс в Javascript

Я работаю над калькулятором на основе html, и я хочу отобразить выражение, а затем оценить его, и все это должно быть сделано в Javascript. Я бы предпочел, чтобы выражение было написано в LaTeX, и для него можно было бы редактировать отображаемое выражение в интерактивном режиме, но могли работать другие языки.

То, что я пробовал раньше, - это визуализировать выражение в интерактивном режиме с помощью MathQuill, а затем оценить его с помощью MathJS. Однако это работает в некоторой степени, поскольку два пакета разработаны с различными целями (MathQuill отображает LaTeX, в то время как MathJS имеет собственный математический синтаксис), он работает не очень хорошо (например, если пользователь вводит \frac{5}{17*x} и предполагает, что это правильный синтаксис, затем оценивает его и получает ошибку от MathJS).

В настоящее время я вижу три способа продолжения:

  • Продолжайте с тем, что у меня есть (или, возможно, переключитесь на MathJax - что лучше?).
  • Найдите инструмент, который выполняет как рендеринг, так и оценку (будь то в латекс или какой-либо другой язык)
  • Найдите два инструмента для рендеринга и оценки с помощью синтаксиса close (если не тот же)
  • Напишите мой собственный инструмент для рендеринга и оценки, как рекомендовано здесь. Я бы предпочел не делать этого, потому что это кажется утомительным, и я не хочу изобретать велосипед.

Каким образом можно сделать это?

Обновление 1:. Просмотрев список альтернативных языков, доступных в altJS, я думаю, что мог бы использовать Python, Ruby или Basic в качестве языка ввода для пользователя. Если бы я это сделал, у него появилось бы так много возможностей для его рендеринга (технически это не "рендеринг", а просто подумайте о том, сколько синтаксических маркеров там есть). Однако я не хочу, чтобы пользователи имели доступ к более продвинутым элементам этих языков, потому что это добавило бы путаницу моим пользователям, а также может быть небезопасным (например, с помощью eval). Я хочу, чтобы пользователи могли использовать математические операции, переменные (только те, которые я указываю, что они могут, а также созданные пользователем) и функции (только те, которые я указываю, что они могут, а также определяемые пользователем). Есть ли способ ограничить подмножество языка, который можно использовать?

Обновление 2: Я просмотрел еще немного на странице altJS и понял, что почти все языки предназначены для компиляции языка XYZ в JavaScript, а затем запускают JavaScript на странице, а не запущен язык XYZ на странице. Я не рассматривал каждый из них, но большинство из них похоже на это. Другие, такие как Brython, похоже, предназначены для запуска языка XYZ в браузере, но как замена/дополнение к JavaScript, а не как язык ввода для пользователя. Есть ли способ обхода, поэтому я могу использовать эти методы в качестве входных данных?

Обновление 3: Благодарим @SpaceDog за эту информацию и за указание, что я не был конкретным в том, что пользователи могут достичь. Итак, вот функциональность, которую я хочу достичь:

  • Основные операции (сложение, вычитание, умножение, деление/фракции, возведение в степень, корни, модуль)
  • Функции (тригонометрические функции, журналы и т.д.)
  • Константы (e, pi и т.д.)
  • Переменные (назначение, переназначение и их использование)
  • Пользовательские функции

LaTeXCalc, похоже, отвечает всем этим требованиям, за исключением последнего. Кроме того, он, похоже, не находится в Javascript.

Это подводит меня к другой идее, о которой я подумал: используйте что-то вроде MathJax для презентации, затем используйте Wolfram Alpha API, чтобы фактически обрабатывать вычисление. Преимущества заключаются в том, что он будет иметь гораздо более расширенные параметры как для ввода, так и для вывода. Однако приложение будет бесполезно (почему бы просто не использовать wolframalpha.com, если калькулятор практически является клоном?), Он стоит денег, и приложение не будет работать в автономном режиме (это настольное приложение, написанное в формате HTML/CSS/JS). Мысли об этом?

4b9b3361

Ответ 1

Кажется, вы хотите сделать две отдельные вещи, красиво отобразить уравнение и оценить его. Поэтому вам нужен инструмент, который делает то и другое. Латекс больше ориентируется на презентацию, а не на оценку, хотя ее можно оценить (см. Этот ответ: Есть ли калькулятор с синтаксисом LaTeX?) по крайней мере для подмножество.

Многое зависит от того, насколько сложным вы хотите сделать калькулятор - какие операции вы хотите разрешить. Если вы используете небольшое подмножество (и это похоже на вас), было бы довольно легко написать конвертер вручную. Я бы рассмотрел MathML, который имеет как презентационную, так и смысловую разметку - и многие доступные инструменты. Однако это может быть не самым простым для ваших пользователей.

Если пользователи знакомы с латексом, а подмножество включенных символов мало, тогда было бы достаточно просто проанализировать латекс в формате, который может быть непосредственно оценен.

Я думаю, вам нужно точно определить, что вы разрешаете пользователю, чтобы кто-нибудь мог дать лучший пример того, что является "лучшим".

EDIT - в ответ на ваше обновление

Ну, вы опасно близки к написанию полного языка программирования (все, что вам нужно, это условия и циклы - или метки). Поэтому изобретать колесо не кажется отличной идеей. В этом случае я определенно не думаю, что вы хотите, чтобы LaTeX был вашим языком ввода, в идеале вам нужно что-то более знакомое вашим пользователям.

Следующее - это то, что я сделал бы и где бы я начал, если бы я собирался это сделать, это не окончательный ответ, и я бы сделал намного больше исследований, прежде чем начинать убеждаться, что я не дублирую усилия.

Я бы построил парсер, который принимает подмножество JavaScript, этот анализатор выполнил бы две вещи (или два парсера), чтобы преобразовать код в LaTeX или MathML, а второй - для оценки/выполнения код.

Выполняя это в автономном режиме, я перехожу к Lex и Yacc (или Flex и Bison и т.д.), и быстрый Google показывает там эквивалент Javascript: Jison. Это даст вам основу синтаксического анализатора для языка, и вы можете изменить его.

Альтернативно начать с существующего парсера JS может помочь, попробуйте этот ответ: JavaScript-парсер в JavaScript. Т

После того, как у вас есть синтаксическая разборка, вы можете сохранить ее простой вначале - перевод на отображаемый язык должен быть довольно простым, и для оценки вы рискуете просто использовать eval - потому что парсер уже обеспечит, чтобы входной сигнал использует только то, что вы разрешаете. Однако я бы посоветовал это сделать в производственной версии (это хорошо для теста), и не нужно много дополнительной работы, чтобы сопоставить маркеры с внутренними функциями.

После этого вы можете посмотреть на улучшение отображаемого вывода, возможно, вы захотите попробовать и упростить ввод или изменить порядок, чтобы иметь больше смысла. Для этого потребуется взять внутреннее представление из вашего парсера и сделать некоторые умные вещи на нем. Но сначала сделайте первые шаги.

Вы хотите, чтобы это работало в автономном режиме, поэтому другая идея сервера, на котором размещены некоторые другие примеры программ, которые вы цитируете, не будет работать (и использование Wolfram Alpha или Google - хороший вариант там, но, поскольку вы скажем, какая точка программы тогда). Но вы также можете подумать, не лучше ли начать писать на другом базовом языке, хотя я предполагаю, что вы хотите переносимость HTML/JS/CSS.

Другими вещами, которые вы связываете, являются все другие возможные идеи, я просто думаю, что вы получите больше преимуществ, имея собственный собственный парсер, вместо того, чтобы полагаться на сторонний код для каждого приложения. С помощью собственного анализатора вы можете легко добавить функциональность или языковые функции позже.

Заключительная мысль, вы не обязательно ограничиваете Javascript как вход с этим методом. Если вы считаете, что ваши пользователи справятся с Reverse Polish Notation, тогда легко написать парсер вручную - но вам нужно будет сделать некоторые работайте над его форматированием для вывода.