Đến nội dung

Hình ảnh

Một trình biên dịch Tex

- - - - -

  • Please log in to reply
Chủ đề này có 11 trả lời

#1
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Chào các bạn trên diễn đàn!
Mình có một ý tưởng nhưng không biết nên post vào đâu nên đành cho vào đây vậy. Tất nhiên nó không cao siêu như các vẫn đề đã có ở trên này vì vậy nếu đọc xong bác mod nào thấy không hợp thì cứ xóa thẳng cho (hoặc nếu thương tình chuyển vào .. thùng rác cũng được )

Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#2
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Vấn đề 1 :
Nội dung : Xây dựng một trình soạn thảo Tex đa năng với các chức năng chính :

+ Phân biệt được các lệnh (bằng màu sắc các lệnh)

+ Có tổ hợp phím tắt, shortcut key ...

+ Mặc định sẵn một vài kiểu trình bày văn bản, thiết lập sẵn các thông số để trình bày tiếng Việt. Có hệ thống từ điển tra cứu lệnh

+ Có một vài chức năng thông minh chẳng hạn với các bài có tính đối xứng vòng quanh chỉ cần nhập một cái rôi thiết lập thông số đơn giản là nó tự hoàn thành

+ Duyệt lỗi

+ Chức năng auto : Trước hết là xây dựng từ điển lệnh ,rồi khi bạn gõ một lệnh (Mở đầu bằng phím "\") chương trình sẽ giúp đỡ bạn. Chẳng hạn muốn viết
"\dfrac{}{}" thì trình tự soạn thảo như sau:
- Khi bạn nhấn phím "\" trình soạn thảo sẽ hiển thị \abc
- Tiếp đó bạn nhấn phím "f" trình soạn thảo sẽ hiển thị \fab
- Khi bạn nhấn phím "r" trình soạn thảo sẽ hiển thị \frab
- Khi bạn nhấn phím "a"trình soạn thảo sẽ hiển thị \frab
- Khi bạn nhấn phím "c" trình soạn thảo sẽ hiển thị \dfrac{}{}
Trong đó mình giả sử \abc,\fab,\frab,\dfrac là các lệnh nào đó.
Hơn nữa sau đó con trỏ soạn thảo sẽ tự động nhảy vào vị trí \dfrac{_}{}
* Có nghiã là nó nó sẽ dò tìm từ gần giống nhất (ưu tiên thứ tự a,b,c)
+ Chương trình còn lưu nhớ trạng thái chẳng hạn khi bạn đã soạn thảo xong trong {} rồi khi ấn enter nó sẽ chuyển sang {} tiếp theo ( Tương tự cho (),[] )

Tác dụng
Đây là việc chúng ta cần phải quan tâm. Vì nếu xây dựng một chương trình hoàn chỉnh mà nó không có tác dụng hoặc tác dụng không nhiều thì nó là công cốc. Tuy nhiên theo thiển ý của mình nếu chương trình này được hoàn thiện thì nó sẽ giúp ích nhiều trong việc soạn thảo Tex.

Tính khả thi
Tất nhiên chứng ta cũng cần quan tam đến tính khả thi cảu dự án. Về phần lập trình thì vì nội dung không đòi hỏi những ứng dụng quá cao siêu nên theo mình có thể lập trình bằng Pascal được. Rất tiếc do trình độ hạn chế mình chỉ có thể lập trình Pascal, nhưng các bạn yên tâm nếu đã có mục đích và gải thuật hợp lý thì mình tin rằng chắc chắn sẽ làm được. Còn nếu bạn là cao thủ lập trình thì hoàn toàn có thể sử dụng VB,C,C++ ... để lập trình nó.

Vấn đề dành cho các bạn
Xây dựng giải thuật hợp lý, xây dựng thêm chức năng cho chương trình. Tất cả không qua cao siêu, bạn chỉ cần đưa ra các góp ý, nêu lên các tình huống có thể xảy ra trong thực tế và các khó khăn. Chẳng hạn mình xin bắt đầu :

Vấn đề Auto
Để thực hiện chức năng này yêu cầu của chúng ta là :
+ Có một cơ sở dữ liệu : Từ điển lệnh. Từ điển này cần sắp xếp theo thứ tự a,b,c..
+ Sau khi kí tự "\" được đánh chương trình auto sẽ bắt đầu hoat động. Nó kiểm tra tất cả các kí tự được đánh vào. Đầu tiên theo mặc định nó sẽ hiển thi lệnh đầu tiên \abc. Sau đó nếu bạn gõ chữ "f" chẳng hạn, một trình tìm kiếm sẽ tìm đến tất cả các lệnh bắt đầu bằng chữ "f" rồi tìm từ đầu tiên để hiển thị mà ở đây là \fab. Tương tự như vậy sẽ lần lượt cho \frab rồi đến khi bạn gõ nốt chữ "c"
thì no"từ cấm" xác định lệnh duy nhấy trong từ điển nên chắc chắn sẽ là \dfrac{}{}

Mong các bạn trao đổi thêm. Hôm sau mình sẽ Up lên chương trình mô phỏng tính năng auto để mọi người tham khảo (Viết bằng Turbo Pascal, chuyển file .exe nhờ TPX)

Bài viết đã được chỉnh sửa nội dung bởi math123: 16-07-2005 - 19:23

Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#3
tk14nkt

tk14nkt

    Đồi gió hú

  • Thành viên
  • 358 Bài viết
Một vấn đề rất hấp dẫn.
Theo mình nên dựa trên bộ mã nguồn của TeX.
Mình có một vốn liếng kha khá về assembler, c*rack. Mình có thể Việt hoá các thanh công cụ, còn vấn đề như bạn đề cập thì khá khó.
Mà làm thế nào để kô vi phạm bản quyền nhỉ?

Bài viết đã được chỉnh sửa nội dung bởi phuc_nkht: 16-07-2005 - 19:02

Trying not to break

#4
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Chương trình của chúng ta đâu có vi phạm bản quyền. Hơn nữa nếu có vi phạm và bị phạt "không được phép nhập khẩu vào Mĩ" thì chúng ta cũng sẵn sàng chấp nhận :geq

Các bạn hãy chia ra thành các vấn đề nhỏ rồi giải quyết.
Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#5
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Vấn đề 2
Xây dựng một trình biên dịch kí hiệu tự do sang kí hiệu Tex

Các định nghĩa:

Kí hiệu tự do (KHTD): Là kí hiệu mà mọi người thường hay sử dụng để biểu diễn một biểu thức Toán học khi chưa dùng Tex
VD :
a/b+b/c+c/a

Kí hiệu Tex (KHT): Là kí hiệu chuẩn của Latex
VD: Với công thức trên sẽ được viết lại là
\dfrac{a}{b}+\dfrac{b}{c}+\dfrac{c}{a}
và khi chuyển qua Tex ta sẽ được
http://dientuvietnam.net/cgi-bin/mimetex.cgi?\dfrac{a}{b}+\dfrac{b}{c}+\dfrac{c}{a}

Vấn đề đặt ra:
Xây dựng một trình biên dịch từ KHTD sang KHT. Yêu cầu : Nhập một file văn bản có các công thức dùng KHTD hãy chuyển sang KHT

Các bạn hãy góp ý để xây dựng được một chương trình như vậy bằng cách đặt ra các vấn đề con để giải quyết.

Chẳng hạn :
+Xây dựng cơ sở dữ liệu hoàn chỉnh cho KHTD (dù sao thì tự do vẫn phải trong khuân khổ)

Ta xây dựng các yếu tố cơ bản ban đầu :
+Nhóm cơ bản : Gồm các lệnh không chứa dấu +,-,*,/
Như vậy trình biên dịch (TBD) cần phải có khả năng nhận ra các Nhóm cơ bản trước để chuyển đổi. Một lệnh có thể có nhiều nhóm cơ bản, nhưng các nhóm cơ bản là độc lập nhau.
+Từ điển : Gồm Từ điển tự do và Từ điển Tex
+Các qui định sử dụng KHTD
* Không có dấu cách : VD
a^3/(b+c) ---Đúng
a^3 /(b+c) ---Sai

+Trình biên dịch cần một giải thuật để nhận diện đúng công thức cần chuyển đổi

Đây là một vấn đề mở rất cần trí tưởng tượng và óc sáng tạo. Hy vọng các bạn quan tâm.

Bài viết đã được chỉnh sửa nội dung bởi math123: 16-07-2005 - 21:36

Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#6
tk14nkt

tk14nkt

    Đồi gió hú

  • Thành viên
  • 358 Bài viết
Cái này rất giống trong maple.
Ví dụ: a/b -> http://dientuvietnam.net/cgi-bin/mimetex.cgi?\dfrac{a}{b}
Nếu mà có mã nguồn của maple để nghiên cứu thì tốt, nếu không chúng ta sẽ phải decompiler toàn bộ maple về mã asm và ngồi liên tục hàng tháng để nghiên cứu (hơi khó khăn). Hay là liên hệ với các chương trình tương tự nhưng open source nhỉ? Cái này có lẽ khó khăn. Nhưng tôi tin rằng với một nhóm khoảng 15 người thì sẽ thành công (mỗi nhóm 1 công việc và cuối cùng tổng hợp lại). Chuyện này khá tốn kém, nhưng không phải là không làm được.
Trying not to break

#7
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Vấn đề này không phải là lập trình nên việc nghiên cứu mã là không cần thết.Hơn nữa đây là một vấn đề có phạm vi áp dụng nhỏ, em hoàn toàn tin chúng ta có thể làm được. Chỉ cần một giải thuật tốt còn lập trình trên ngôn ngữ nào cũng được.

Các câu hỏi đặt ra:
1.Làm thế nào để máy có thể nhận ra một KHTD
2.Các KHTD nào cần ưu tiên trước và theo thứ tự nào VD ưu tiên "^" , "_"
.................................................................


Mong mọi người đưa ra các đề xuất thú vị !
Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#8
Alligator

Alligator

    Sĩ quan

  • Founder
  • 428 Bài viết
Khó khăn chủ yếu khi sử dụng TeX là thiếu tính trực quan, việc ghi nhớ các lệnh tương ứng cho từng công thức toán gây khó khăn.
Nếu có thể thì nên làm chương trình có giao diện nhập vào trực quan như Equation trong MS Word.
<span style='color:blue'>Roses are red,
violets are blue,
Fermat is dead,
but his theorem is true.
</span>

#9
nguyen_hung

nguyen_hung

    Đại lãn

  • Thành viên
  • 299 Bài viết
Khi sử dụng Equation như MS Word chúng ta đều nhận thấy sự bất tiện là không gõ liên tục được mà phải chọn từng kí hiệu.
Khi dùng Maple thì sẽ nhận thấy những điểm thuận lợi như là khi thuộc cấu trúc lệnh có thể gõ liền mạch bằng hệ thống kí hiệu riêng của nó, khi mới bắt đầu làm quen thì có thể nhập công thức theo kiểu của Equation. Sự chuyển đổi giữa 2 cách nhập công thức rất thuận tiện và nhanh chóng.
Như vậy nếu chương trình của chúng ta có thể chuyển đổi nhanh chóng từ công thức TEX sang công thức trực quan và ngược lại thì rất tốt.
Tuy nhiên để decompiler Maple là chuyện không thể, cũng có thể được tuy nhiên nếu chỉ để xem cách chuyển đổi giữ các công thức mà phải decompiler một chương trình đồ sộ như vậy thì phí công.

#10
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Hic
Nhưng ý mình là chúng ta có thể tự làm cơ sao lại không được cơ chứ. Chỉ cần một thuật toán đúng đắn là ổn thôi mà. Chẳng hạn ta có thể dùng chương trình đệ qui để xử lí các kí hiệu, sau khi thoát khỏi vòng lặp đệ qui (khi đã làm xong) thì nó lại trở lại tiếp tục dòng lệnh bên ngoài
Tất cả còn rất mơ hồ thế nên chúng ta rất cần ý tưởng còn lập trình thì bất cứ ngôn ngữ nào cũng được. Một chương trình như vậy nếu viết bằng Pascal dịch sang file thực thi chắc chỉ khoảng 20kb thôi. Các KHTD viết như thể ở máy tính CASIO Fx500 ý các bác ạ
Bây giờ các bác hãy đề xuất ý tưởng chẳng hạn chúng ta sẽ quét lần lượt theo cách sau :
+Với dòng văn bản cần chuyển đổi ta sẽ tìm một nhóm cơ bản rồi chuyển đổi sau đó đánh dấu đầu nhóm cơ bản này bằng một kí tự (VD ♥) và kết thúc bằng một kí tự khác (VD ♣). Như vậy sau lần này nhóm cơ bản này biến mất (nó mất tiêu chuẩn là một nhóm cơ bản giá trị của nó bây giờ chỉ là một biến số). Như vậy sau vòng lặp sau ( nó sẽ quay lại từ đầu chừng nào chưa xong )nó sẽ lại nằm trong nhóm cơ bản khác, nhóm này sẽ lại được ta chuyển mã. Vì số nhóm là hữu hạn nên sau một số lần chạy ta sẽ đưa về được dạng sau (Chú ý trong trường hợp tổng quát thì tốc độ của máy tính rất cao nên chương trình chạy sẽ không mất đến 1 giây)
VD
(can(ab))/c ==> ♥\dfrac{♥\sqrt{ab}♣}{c}♣

Với dòng mã trên đầu tiên chương trình chạy để xác định tiêu chuẩn của một nhóm cơ bản và thực hiện việc chuyển đổi này cho nhóm lệnh can(ab) ở đây can được xem như là một từ khóa
Sau lần chạy đầu tiên ta thu được kết quả
(♥\sqrt{ab}♣)/c
Đến đây thì chương trình sẽ coi ♥\sqrt{ab}♣ chỉ như là một biến số vì vậy nó lại thao tác với nhóm cơ bản tiếp theo đó là nhóm ()/() chỉ phân số

Cuối cùng ta thu được ♥\dfrac{♥\sqrt{ab}♣}{c}♣

Sau cùng chỉ cần xóa đi các kí tự này là ta được dòng mã Tex cần chuyển đổi.

(Ta cần có một thủ tục để nó coi một cặp ♥ ♣ là một biến số chẳng hạn nếu gặp một kí hiệu ♥ thì nó sẽ đếm tất cả các kí hiệu ♥ mà nó gặp rồi sau đó bỏ qua từng ấy kí hiệu ♣ tiếp theo sau kí hiệu cuối cùng thì mới bắt đầu tiếp tục chương trình xác định nhóm cơ bản)

Vấn đề còn lại là phải xác định một tiêu chuẩn đúng đắn cho nhóm cơ bản đảm bảo "không giết nhầm nhưng cũng không bỏ sót"
Đề có thể đưa ra một tiêu chuẩn truớc hết ta phải phân hoạch nhóm lệnh ra thành các nhóm con khác nhau. Với một lệnh ta có thể xây dựng nó trở thành một Object với các thành phần đặc trưng
VD : Object ()/() tương ứng với \dfrac{}{} có hai thành phần cơ bản là tử số () và mẫu số ()
Để xác định xem nó có là nhóm cơ bản hay không ta cần xem xét tử số có chứa nhóm lệnh nào khác không và mẫu số có chứa nhóm lệnh nào khác hay không

Nhóm cơ bản là nhóm mà trong thành phần của nó không chứa bất cứ một lệnh nào khác. Trong đó một lệnh được khai báo trong từ điển lệnh, các phép toán +,- không phải là lệnh (Với nhân và chia ta cũng cần phải chuyển sang mã Tex cho đúng qui cách vì vậy nó là lệnh)

Mong mọi người tiếp tục trao đổi . Chúng ta cố gắng tránh việc lệ thuộc vào bất cứ chương trình nào khác trước đó. Mình tin là việc này hoàn toàn có thể thực hiện được. Sẽ là một chương trình nhỏ có chức năng chuyển KHTD sang KHT

@ Để tìm mọt nhóm cơ bản ta sẽ đi vào tất cả các Object của một lệnh (Bằng trình đệ qui - Nếu không xác định được nó sẽ tự động chuyển sang vòng lặp ngoài hoặc mọt vòng lặp tương đương)

Bài viết đã được chỉnh sửa nội dung bởi math123: 21-07-2005 - 11:55

Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt

#11
Alligator

Alligator

    Sĩ quan

  • Founder
  • 428 Bài viết
math123 đừng lầm là mọi người có ý muốn dùng chương trình khác thay vì viết chương trình này như bạn đề xuất đâu. Cá sấu thấy ý tưởng về chương trình dịch này của bạn rất hay và khả thi, nhưng vấn đề quan trọng nhất khi bắt đầu là xác định được dạng input/output, còn các chi tiết kỹ thuật của phần thực thi (implementation) bên trong chương trình như thế nào thì để sau một chút cũng được. Như vậy gọi là top-down design (thiết kế chương trình từ trên xuống), đi từ tổng thể tới chi tiết.

Nói cụ thể hơn là như vầy: giả sử mọi người đã thống nhất với nhau là program có input là string, output cũng là string

- output string có dạng TeX chuẩn thì không có gì phài bàn

- input string nên có dạng như thế nào là điều cần suy nghĩ, và cần bàn.

* Nhược điểm chính của mã TeX là rất khó nhớ đối với người chưa quen. Vậy thì input string cần có đặc điểm dễ gợi nhớ hơn nhiều (nếu không thì cần gì chương trình dịch này nữa :D )

* Input string phải vạn năng, tức là có thể dùng thể hiện được tất cả biểu thức toán học có thể có, nhưng lại phải tự nhiên và dễ nhớ hơn TeX đối với người sử dụng. Cái mà math123 gọi là ký hiệu tự do (KHTD) chỉ có thể diễn tả một nhóm nhỏ biểu thức, như là phân số, phép cộng... khi biểu thức toán phức tạp lên thì mỗi người sẽ viết KHTD một kiểu theo ý mình và chương trình dịch sẽ... bó tay.

* Có bạn đề nghị "mượn" cách biểu diễn biểu thức toán theo Maple, đây là một ý hay, vì trong thực tế quy ước input của Maple biểu diễn được tất cả biểu thức toán học, tuy nhiên chưa chắc cách này đã dễ dàng cho các bạn chưa từng có kinh nghiệm với Maple. (Nhân tiện nói thêm, ý tưởng "dịch ngược" Maple của bạn nào nói ở trên rất là... không tưởng :in ) Dù sao ý tưởng "mượn" cách ký hiệu của Maple cho input string cũng là một ý đáng xem xét.

* Đề xuất của math123 thực chất cũng chính là "mượn" cách ký hiệu input của CASIO Fx500, về căn bản cũng như mượn ký hiệu input của Maple vậy, chưa nói là khả năng diễn tả biểu thức toán của CASIO Fx500 sẽ có hạn chế bởi khả năng của một calculator.

* Cá sấu đề nghị cách nhập input trực quan, hình thức tương tự như Equation trong MS Word, hay là như các ký hiệu làm sẵn trong bảng smilies bên trái khung trả lời của diễn đàn vì nghĩ rằng đó là cách tốt nhất (dĩ nhiên là sẽ phải thêm đoạn lập trình phức tạp hơn). Suy nghĩ của cá sấu là: nếu thay vì gõ một chuỗi ký tự dài ngoằng và phức tạp, ta lại thay bằng một chuỗi ký tự khác cũng dài ngoằng và phức tạp không kém thì tác dụng của việc này là ở đâu?

Kết luận: hoàn toàn trân trọng nỗ lực của math123 và không hề muốn làm bạn thoái chí, cá sấu chỉ muốn nêu lên rắng việc quyết định quy ước input của program ngay từ đầu là cực kỳ quan trọng và có nhiều phương án cần cân nhắc. Việc hiện thực hóa chương trình dịch bên trong tuy cần nhiều thời gian nhưng không khó, một khi quy ước của input data đã được xác định rõ ràng.
<span style='color:blue'>Roses are red,
violets are blue,
Fermat is dead,
but his theorem is true.
</span>

#12
math123

math123

    Thượng sĩ

  • Thành viên
  • 207 Bài viết
Thực sự tất cả mình cũng chỉ coi là một thách thức còn mình cũng không dám nghĩ đến một chương trình hoàn thiện có thể giúp ích nhiều
Thực sự mình thấy rằng có nhiều cách viết thật đấy nhưng kí hiệu tự do chỉ là tên gọi cho một cách viết không chính qui (điều này mình đã gặp khi chưa học Tex). Không biêt tại sao chứ mình thấy cách viết này khá giống nhau trên diễn đàn mình rất nhiều chỉ khổ các bác Mod phải đi sửa hoài, dặc điểm chung là : Rất khó chịu !
Còn về chuyện biên dịch được một chương trình chuyển đổi mọi dạng thì là không thể, mình tin là vậy. Tất cả các kí hiệu chỉ gói gọn trong các nội dung hay sử dụng và mình chỉ muốn trao đổi về một nội dung nhỏ này. Không ai dám chắc rằng chương trình này có giúp ích nhiều hay không (ngay từ đầu mình đã nhắc các bạn là nó đi ngược lại chính sách sử dụng Tex)

Lúc đầu mình không hiểu rõ ý mọi người xin lỗi nhé. Còn việc Input như thế nào mình nghĩ rằng chúng ta nên học tập các chương trình khác như Maple... Mình tin rằng cách giải quyết của họ chắc cũng là một lựa chọn tốt rồi.

Theo ý mình chúng ta có thể chia ra 2 hướng chính như sau :

1.Lập trình từ mã kí tự:

Ta sẽ qui ước một kiểu viết nào đó mà tiện lợi hơn Tex. Tất cả sẽ có sự xê dịch tương đối ví dụ cùng một công thức Tex nhưng sẽ có một vài cách viết khác nhau.Nếu làm theo kiểu này chương trình sẽ hỗ trợ các phím nóng cần thiết và phím nóng theo xây dựng của người sử dụng. Như vậy việc chính của hướng này là Xây dựng một từ điển lệnh khá uyển chuyển chẳng hạn nếu có thể nó sẽ hiểu được và sửa các lỗi thường hay gặp của người sử dụng

2.Lập trình trực quan:

Thực chất của việc này mình thấy nó khá giống trong MathType và ta hoàn toàn có thể làm được. Mình thấy rằng việc này đơn giản hơn so với đi theo hướng một. Lý do là có công thức trực quan thì người sử dụng đã bị chương trình theo dõi ngầm (do phải hoàn thiện rồi mới chuyển tiếp sang công thức sau) như vậy chương trình rất dễ để biên dịch (gần như trực tiếp luôn). Ngược điểm của nó là ta phải làm trực tiếp không thể làm từ Notepad ...

Mình muốn nó khả thi và mình rất muốn mọi người trao đổi để đúc kết được những ý kiến quí báu.Cảm ơn mọi người

@ A mình muốn cho mọi người xem thử cái này, nghiệp dư thật đấy nhưng mà đó là giải pháp của mình để hiện ảnh 16 màu trong Pascal - Những bức ảnh tự chế. Chắc chắn nó còn rất nhiều thiếu sót vì mình cũng chưa làm xong mong mọi người góp ý thêm.

Download

Bài viết đã được chỉnh sửa nội dung bởi math123: 21-07-2005 - 18:53

Offline hết tháng 8. Có gì nhắn vào YM : vietanhlt




0 người đang xem chủ đề

0 thành viên, 0 khách, 0 thành viên ẩn danh