2013-04-14 23 views
12

Tôi muốn nhập các công thức toán học vào tài liệu Scaladoc của mã Scala toán học. Trong Java, tôi tìm thấy một thư viện có tên là LatexTaglet có thể thực hiện chính xác điều này cho Javadoc, bằng cách viết công thức trong Latex: http://latextaglet.sourceforge.net/Có cách nào để bao gồm các công thức toán học trong Scaladoc không?

Và nó có vẻ tích hợp tốt với Maven (phần báo cáo/bổ trợ của POM). Có một thư viện tương đương cho Scaladoc? Nếu không, làm thế nào tôi có thể tích hợp thư viện này với SBT?

Tôi cũng xem xét việc sử dụng MathML (http://www.w3.org/Math/), nhưng trông quá chi tiết. Có một trình soạn thảo bạn muốn giới thiệu không? MathML có tích hợp tốt với Scaladoc không?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

5

Câu trả lời ngắn gọn là: không. LaTeXTaglet có thể được thực hiện bởi API JavaDoc Taglet. Không có tương đương trong Scaladoc, do đó không có giải pháp sạch.

Tuy nhiên, tôi có thể nghĩ đến một hack mà có thể đủ dễ dàng để làm:

Có một thư viện gọi MathJax, trông cho các công thức toán học LaTeX-phong cách trong một trang HTML và tự động làm cho nó tại chỗ. Tôi đã sử dụng nó trước đây, nó khá đẹp; tất cả những gì bạn phải làm là bao gồm tập lệnh. Vì vậy, bạn có thể làm hai việc:

  1. Chỉnh sửa và xây dựng lại các nguồn Scaladoc bao gồm MathJax, hoặc ...
  2. Viết một chút bò hậu xử lý tất cả các đầu ra HTML Scaladoc sau khi nó chạy, và tiêm MathJax vào mỗi tệp.

Bằng cách đó, bạn chỉ có thể viết công thức LaTeX trực tiếp trong nhận xét Scala của bạn và chúng sẽ được hiển thị trong trình duyệt. Tất nhiên nếu bạn muốn có một giải pháp phi hacky, tôi muốn đề nghị bạn tạo một API taglet giống như cho Scaladoc;)

+0

Cảm ơn bạn đã trả lời câu hỏi! Có thể có ý tưởng cho SIP? – Choucri

+0

là có thể làm việc với sbt (doc), và Nếu có, làm thế nào để? –

7

Để theo trên @mergeconflict answer, đây là cách tôi đã làm nó

Như có không có giải pháp thích hợp, những gì tôi đã làm là để thực hiện một bánh xích mà phân tích tất cả các file html tạo ra, và thay thế bất kỳ tìm thấy "tag nhập khẩu" (xem mã bên dưới), bởi việc nhập khẩu của kịch bản MathJax:

lazy val mathFormulaInDoc = taskKey[Unit]("add MathJax script import in doc html to display nice latex formula") 

mathFormulaInDoc := { 
    val apiDir = (doc in Compile).value 
    val docDir = apiDir // /"some"/"subfolder" // in my case, only api/some/solder is parsed 
    // will replace this "importTag" by "scriptLine 
    val importTag = "##import MathJax" 
    val scriptLine = "<script type=\"text/javascript\" src=\"https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"> </script>" 
    // find all html file and apply patch 
    if(docDir.isDirectory) 
    listHtmlFile(docDir).foreach { f => 
     val content = Source.fromFile(f).getLines().mkString("\n") 
     if(content.contains(importTag)) { 
      val writer = new PrintWriter(f) 
      writer.write(content.replace(importTag, scriptLine)) 
      writer.close() 
     } 
    } 
} 

// attach this task to doc task 
mathFormulaInDoc <<= mathFormulaInDoc triggeredBy (doc in Compile) 

// function that find html files recursively 
def listHtmlFile(dir: java.io.File): List[java.io.File] = { 
    dir.listFiles.toList.flatMap { f => 
    if(f.getName.endsWith(".html")) List(f) 
    else if(f.isDirectory)   listHtmlFile(f) 
    else       List[File]() 
    } 
} 

Như bạn có thể thấy, nhiệm vụ trình thu thập thông tin này được đính kèm với tác vụ doc, được thực hiện tự động bởi sbt doc.

Dưới đây là một ví dụ về doc mà sẽ được trả lại với công thức

/** 
* Compute the energy using formula: 
* 
* ##import MathJax 
* 
* $$e = m\times c^2$$ 
*/ 
def energy(m: Double, c: Double) = m*c*c 

Bây giờ, nó sẽ có thể để cải thiện mã này.Ví dụ:

  • thêm kịch bản nhập trong phần đầu html
  • tránh đọc toàn bộ file (có thể thêm một quy tắc rằng thẻ nhập khẩu nên trong vài dòng đầu tiên
  • thêm đoạn mã vào gói sbt và thêm nó vào thư mục target/api bằng cách sử dụng một số tác vụ phù hợp
+0

Lưu ý từ tương lai: cdn.mathjax.org sắp kết thúc, kiểm tra https://www.mathjax.org/cdn-shutting-down/ để biết các mẹo di chuyển. –

+0

@Choucri Đây phải là câu trả lời đúng, vì nó cho bạn biết rằng nó có thể được thực hiện và làm thế nào nó có thể được thực hiện. –

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