Оценка Latex Math в Javascript
Я работаю над калькулятором на основе html, и я хочу отобразить выражение, а затем оценить его, и все это должно быть сделано в Javascript. Я бы предпочел, чтобы выражение было написано в LaTeX, и чтобы можно было редактировать отображаемое выражение в интерактивном режиме, но другие языки могут работать.
то, что я пробовал раньше, - это интерактивное отображение выражения с помощью MathQuill, а затем оценить его с помощью MathJS. Это работает, в некоторой степени, однако, так как два пакеты разработаны с разными целями (MathQuill отображает LaTeX, в то время как MathJS имеет пользовательский синтаксис математики), он не работает отлично (например, если пользователь вводит frac{5}{17*x}
и предполагает, что это правильный синтаксис, затем оценивает его и получает ошибку от MathJS).
В настоящее время я вижу три способа продолжить:
- продолжайте с тем, что у меня есть (или, может быть, переключитесь на MathJax - что лучше? ).
- найдите инструмент, который выполняет как рендеринг, так и оценку (будь то латекс или какой-либо другой язык)
- найдите два инструмента для рендеринга и оценки с близким (если не одинаковым) синтаксисом
- напишите мой собственный инструмент рендеринга и оценки, как рекомендуется здесь. Я бы предпочел не делать этого, потому что это кажется утомительным, и я не хочу изобретать колесо.
каков способ сделать это?
обновление 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). Мысли об этом?
1 ответов
Кажется, вы хотите сделать две отдельные вещи, красиво отобразить уравнение и оценить его. Поэтому вам нужен инструмент, который делает и то, и другое. Latex больше ориентирован на презентацию, а не на оценку, хотя ее можно оценить (см. Этот ответ:есть ли калькулятор с LaTeX-синтаксисом?), по крайней мере, для поднабора.
многое из этого зависит от того, насколько сложным вы хотите сделать калькулятор -- какие операции вы хотите разрешить. Если вы используете небольшое подмножество (и это похоже, что вы) было бы довольно легко написать конвертер вручную. Я бы заглянул в MathML который имеет как презентационную, так и семантическую разметку - и многие доступные инструменты. Однако это может быть не самым простым для ваших пользователей, чтобы понять.
если пользователи знакомы с latex, а подмножество включенных символов мало, тогда было бы достаточно легко разобрать latex в формат, который может быть непосредственно оценен.
Я думаю, вам нужно точно определить, что вы предоставление пользователю доступа для того, чтобы кто-либо мог предоставить лучший пример того, что является "лучшим".
EDIT -- в ответ на ваше обновление
Ну, вы опасно близки к написанию полного языка программирования (все, что вам нужно, это условия и циклы-или метки). Так что изобретение колеса не кажется хорошей идеей. В этом случае я определенно не думаю, что вы хотите LaTeX в качестве языка ввода, в идеале вы хотите что-то более знакомое для вашего пользователи.
далее следует то, что я бы сделал и с чего бы начал, если я собирались сделать это, это не окончательный ответ, и я бы сделал гораздо больше исследований, прежде чем начать убеждаться, что я не дублирую усилия.
Я бы построил парсер, который принимает подмножество JavaScript, этот парсер будет делать две вещи (или будет два парсера), один из которых будет переводить код в LaTeX или MathML, а второй-оценивать / выполнять код.
делая это в автономном режиме, в C, я бы обратился к Lex и Yacc (или Flex и Bison и т. д.), и быстрый Google показывает, что есть эквивалент Javascript: Jison. Это даст вам основу синтаксического анализатора для языка, и вы можете изменить его.
альтернативно начните с существующего синтаксического анализатора JS, попробуйте этот ответ:синтаксический анализатор JavaScript в JavaScript. T
после разбора позвоночника вы можете сохранить его простым на первый -- перевод на отображаемый язык должен быть довольно простым и для оценки вас может риск просто с помощью eval
-- потому что парсер уже гарантировал, что вход использует только то, что вы разрешаете. Однако я бы посоветовал против этого в производственной версии (это нормально для теста), и не требуется много дополнительной работы для сопоставления токенов с внутренними функциями.
после этого вы можете захотеть взглянуть на улучшение вывода, возможно вы хотите попробуйте упростить ввод или переупорядочить его, чтобы иметь больше смысла. Для этого потребуется взять внутреннее представление из вашего парсера и сделать некоторые умные вещи на нем. Но Сначала сделайте первые шаги.
вы хотите, чтобы это работало в автономном режиме, поэтому моя другая идея сервера, на котором размещаются некоторые другие примеры программ, которые вы цитируете, не будет работать (и использование Wolfram Alpha или Google-хороший вариант, но, как вы говорите, в чем смысл программы). Но вы также можете рассмотреть если бы вы лучше начали писать это на другом базовом языке , хотя я предполагаю, что вам нужна переносимость HTML/JS/CSS.
другие вещи, которые вы связываете, - это все другие возможные идеи, я просто думаю, что вы получите больше пользы, имея свой собственный парсер внутри, а не полагаясь на сторонний код для каждого приложения. С помощью собственного парсера вы можете легко добавить функциональность или языковые функции позже.
последняя мысль, вы не обязательно ограничиваете в JavaScript в качестве входных данных с помощью этого метода. Если вы думаете, что ваши пользователи справятся с Обратная Польская Нотация тогда легко написать парсер вручную Для -- но вам придется сделать некоторую работу по форматированию его красиво для вывода.