2013-11-15 21 views
10

Tôi đang làm việc trên máy tính dựa trên html và tôi muốn hiển thị biểu thức, sau đó đánh giá nó và tất cả điều này phải được thực hiện bằng Javascript. Tôi muốn biểu thức được viết trong LaTeX và để có thể chỉnh sửa biểu thức được hiển thị tương tác, nhưng các ngôn ngữ khác có thể hoạt động.Đánh giá Toán Latex trong Javascript

Điều tôi đã thử trước đây là biểu hiện biểu thức, tương tác với MathQuill và sau đó đánh giá nó bằng MathJS. Tuy nhiên, điều này có thể được thiết kế với các mục tiêu khác nhau (MathQuill ám LaTeX, trong khi MathJS có cú pháp toán tùy chỉnh), nó không hoạt động tốt (ví dụ: nếu người dùng nhập \frac{5}{17*x} và giả định rằng đó là cú pháp chính xác, sau đó đánh giá nó và nhận được một lỗi từ MathJS).

Hiện nay, tôi thấy ba cách để tiến hành: (? Hoặc có thể chuyển sang MathJax- mà là tốt hơn)

  • Tiếp tục với những gì tôi có.
  • Tìm một công cụ nào cả vẽ và đánh giá (cho dù đó là trong mủ hoặc một số ngôn ngữ khác)
  • Tìm hai công cụ cho dựng hình và đánh giá với gần (nếu không giống nhau) cú pháp
  • Viết vẽ của riêng tôi và công cụ đánh giá, như được đề xuất here. Tôi không muốn làm điều này, bởi vì nó có vẻ tẻ nhạt, và tôi không muốn phát minh lại bánh xe.

Cách bast để làm điều này là gì?

Cập nhật 1: Sau khi xem qua danh sách các ngôn ngữ thay thế có sẵn tại altJS, tôi nghĩ tôi có thể sử dụng Python, Ruby hoặc Basic làm ngôn ngữ cho người dùng nhập. Nếu tôi đã làm điều đó, nó sẽ mở ra rất nhiều khả năng để hiển thị nó (về mặt kỹ thuật, nó không phải là "dựng hình", nhưng chỉ cần nghĩ về số lượng tô sáng cú pháp có trên mạng). Tuy nhiên, tôi không muốn người dùng có quyền truy cập vào các phần tử nâng cao hơn của các ngôn ngữ này, bởi vì nó sẽ thêm nhầm lẫn cho người dùng của tôi và cũng có thể không an toàn (như sử dụng eval). Tôi chỉ muốn người dùng có thể sử dụng phép toán, biến (chỉ những thao tác mà tôi chỉ định là có thể, và cũng do người dùng tạo) và chức năng (chỉ những người mà tôi chỉ định họ có thể và cũng do người dùng xác định). Có cách nào để hạn chế tập con của ngôn ngữ có thể được sử dụng không?

Cập nhật 2: Tôi nhìn xung quanh một số chi tiết trên trang altJS, và nhận ra rằng hầu hết các ngôn ngữ được thiết kế để biên dịch ngôn ngữ XYZ JavaScript, sau đó chạy JavaScript trên trang web, thay vì ngôn ngữ chạy XYZ trên trang. Tôi đã không xem xét từng cái một, nhưng hầu hết chúng dường như giống như thế này. Những người khác, như Brython, dường như được thiết kế để chạy ngôn ngữ XYZ trong trình duyệt, nhưng như là một sự thay thế/bổ sung cho JavaScript thay vì là một ngôn ngữ đầu vào cho người dùng. Có cách giải quyết nào để tôi có thể sử dụng các phương thức này làm đầu vào không?

Cập nhật 3: Cảm ơn bạn @SpaceDog về thông tin đó và chỉ ra rằng tôi chưa cụ thể về những gì người dùng có thể đạt được. Vì vậy, đây là chức năng mà tôi muốn đạt được:

  1. cơ bản hoạt động (cộng, trừ, nhân, chia/phân số, lũy thừa, rễ, mô đun)
  2. Chức năng (hàm lượng giác, các bản ghi, vv)
  3. Constants (e, pi, vv)
  4. biến (chuyển nhượng, phân công lại, và sử dụng chúng)
  5. Người dùng xác định chức năng

LaTeXCalc dường như đáp ứng tất cả các yêu cầu này, trừ trường cái cuối cùng. Ngoài ra, nó không xuất hiện trong Javascript.

Điều này đưa tôi đến một ý tưởng khác mà tôi đã nghĩ đến: sử dụng một cái gì đó như MathJax để trình bày, sau đó sử dụng Wolfram Alpha API để thực sự xử lý tính toán. Những lợi ích là nó sẽ có nhiều tùy chọn nâng cao hơn cho cả đầu vào và đầu ra. Tuy nhiên, ứng dụng sẽ trở nên vô ích (tại sao không sử dụng wolframalpha.com, nếu máy tính thực tế chỉ là một bản sao?), Nó tốn tiền và ứng dụng sẽ không hoạt động ngoại tuyến (nó là ứng dụng dành cho máy tính để bàn, được viết bằng HTML/CSS/JS). Suy nghĩ về điều đó?

+0

Có lẽ câu trả lời của tôi cho [this] (http://stackoverflow.com/a/42232776) câu hỏi tương tự có thể hữu ích. – Jeff

Trả lời

5

Có vẻ như bạn muốn làm hai việc riêng biệt, hiển thị độc đáo phương trình và đánh giá nó. Vì vậy, bạn cần một công cụ làm cả hai. Latex tập trung nhiều hơn vào bài thuyết trình hơn là đánh giá, mặc dù có thể đánh giá nó (xem câu trả lời này: Is there a calculator with LaTeX-syntax?) ít nhất là cho một tập hợp con.

Rất nhiều điều này phụ thuộc vào mức độ phức tạp mà bạn muốn thực hiện máy tính - những hoạt động bạn muốn cho phép. Nếu bạn đang sử dụng một tập con nhỏ (và nó có vẻ như bạn đang có) nó sẽ được khá dễ dàng để viết trình chuyển đổi bằng tay. Tôi sẽ xem xét MathML có cả đánh dấu trình bày và ngữ nghĩa - và nhiều công cụ có sẵn. Tuy nhiên nó có thể không dễ dàng nhất cho người dùng của bạn nắm bắt.

Nếu người dùng quen thuộc với mủ cao su, và tập hợp con các biểu tượng được bao gồm nhỏ thì sẽ dễ dàng phân tích latex thành định dạng có thể được đánh giá trực tiếp.

Tôi nghĩ bạn cần xác định chính xác những gì bạn cho phép người dùng truy cập để mọi người có thể cung cấp ví dụ tốt hơn về 'tốt nhất'.

EDIT - để đáp ứng với bản cập nhật của bạn

Vâng, bạn gần một cách nguy hiểm để viết một ngôn ngữ lập trình đầy đủ (tất cả bạn cần là điều kiện và vòng lặp - hoặc nhãn). Vì vậy, phát minh lại bánh xe không có vẻ như một ý tưởng tuyệt vời. Trong trường hợp này tôi chắc chắn không nghĩ rằng bạn muốn LaTeX là ngôn ngữ đầu vào của bạn, lý tưởng là bạn muốn một cái gì đó quen thuộc hơn với người dùng của bạn.

Sau đây là những gì tôi sẽ làm và nơi tôi sẽ bắt đầu nếu Tôi sẽ thực hiện điều này, đó không phải là câu trả lời dứt khoát và tôi sẽ nghiên cứu nhiều hơn trước khi bắt đầu đảm bảo rằng tôi không nhân đôi nỗ lực .

Tôi muốn xây dựng một trình phân tích cú pháp lấy một tập hợp con JavaScript, trình phân tích cú pháp này sẽ thực hiện hai thứ (hoặc sẽ có hai trình phân tích cú pháp) để dịch mã sang LaTeX hoặc MathML và thứ hai sẽ là đánh giá/thực thi mã.

Thực hiện việc này ngoại tuyến, trong C, tôi sẽ chuyển sang Lex và Yacc (hoặc Flex và Bison, v.v.) và Google tiết lộ nhanh có một tương đương Javascript: Jison. Điều đó sẽ cung cấp cho bạn xương sống của trình phân tích cú pháp cho ngôn ngữ và bạn có thể sửa đổi nó.

Hoặc bắt đầu bằng trình phân tích cú pháp JS hiện có có thể hữu ích, hãy thử câu trả lời sau: JavaScript parser in JavaScript.T

Một khi bạn có xương sống phân tích cú pháp bạn có thể giữ cho nó đơn giản lúc đầu - dịch sang một ngôn ngữ thể hiển thị nên được khá dễ dàng và để đánh giá bạn thể nguy cơ chỉ sử dụng eval - bởi vì phân tích cú pháp sẽ có đã đảm bảo rằng đầu vào chỉ sử dụng những gì bạn cho phép. Tuy nhiên tôi sẽ khuyên bạn nên chống lại điều đó trong một phiên bản sản xuất (nó là tốt cho thử nghiệm) và nó không mất nhiều công việc thêm để ánh xạ các thẻ để chức năng nội bộ.

Sau đó bạn có thể muốn xem xét cải thiện đầu ra được hiển thị, có lẽ bạn muốn thử và đơn giản hóa đầu vào hoặc sắp xếp lại nó để có ý nghĩa hơn. Điều đó sẽ yêu cầu lấy các đại diện nội bộ từ phân tích cú pháp của bạn và làm một số công cụ thông minh trên đó. Nhưng hãy thực hiện các bước đầu tiên trước tiên.

Bạn muốn tính năng này hoạt động ngoại tuyến, vì vậy ý ​​tưởng khác của tôi về máy chủ lưu trữ một số chương trình mẫu khác mà bạn trích dẫn sẽ không hoạt động (và sử dụng Wolfram Alpha hoặc Google là một tùy chọn tốt ở đó) bạn nói, điểm của chương trình là gì). Nhưng bạn cũng có thể cân nhắc xem bạn có bắt đầu viết tốt hơn bằng ngôn ngữ cơ sở khác không - mặc dù tôi đoán bạn muốn tính di động của HTML/JS/CSS.

Những thứ khác bạn liên kết là tất cả các ý tưởng khác có thể, tôi chỉ nghĩ bạn sẽ nhận được nhiều lợi ích hơn khi có trình phân tích cú pháp của riêng bạn thay vì dựa vào mã của bên thứ ba cho mỗi ứng dụng. Với trình phân tích cú pháp của riêng bạn, bạn có thể dễ dàng thêm các tính năng ngôn ngữ hoặc chức năng sau này.

Suy nghĩ cuối cùng, bạn không nhất thiết phải hạn chế Javascript làm đầu vào với phương pháp này. Nếu bạn nghĩ rằng người dùng của bạn sẽ đối phó với Reverse Polish Notation thì thật dễ dàng để viết một trình phân tích cú pháp bằng tay - nhưng bạn sẽ phải thực hiện một số công việc về định dạng nó độc đáo cho đầu ra.

+1

MathJax là JavaScript và làm việc với MathML, vâng tôi cũng muốn viết phân tích cú pháp trực tiếp trong JS. – SpaceDog

Các vấn đề liên quan