2013-04-14 73 views
12

我想在數學Scala代碼的Scaladoc文檔中輸入數學公式。在Java中,我發現了一個叫LatexTaglet庫,可以在乳膠做的正是本作的Javadoc,通過寫公式: http://latextaglet.sourceforge.net/有沒有辦法在Scaladoc中包含數學公式?

而且它似乎與Maven(一個POM的報告/插件部分)很好地集成。是否有一個Scaladoc的等效庫?如果沒有,我怎樣才能把這個庫與SBT整合?

我也考慮過使用MathML(http://www.w3.org/Math/),但看起來過於冗長。你有推薦的編輯嗎? MathML與Scaladoc完美結合了嗎?

謝謝你的幫助!

回答

5

簡短的回答是:沒有。 LaTeXTaglet由JavaDoc Taglet API提供。在Scaladoc中沒有等價物,因此沒有乾淨的解決方案。

不過,我可以認爲這可能是很容易做一個黑客:

有一個叫MathJax庫,它會在一個HTML頁面的LaTeX風格的數學公式和動態渲染到位。我以前用過它,這很不錯;你所要做的就是包含腳本。所以,你可以做兩件事情:

  1. 編輯和重建Scaladoc源包括MathJax,或...
  2. 寫一點後處理器抓取所有Scaladoc的HTML輸出的它運行後,並注入到MathJax每個文件。

這樣,你可以直接在你的Scala評論中編寫LaTeX公式,它們應該在瀏覽器中呈現。當然,如果你想要一個非哈克的解決方案,我建議你創建一個Scaladoc Taglet的類似API)

+0

非常感謝你的答案添加到目標/ API文件夾!也許對於一個SIP的想法? – Choucri

+0

是有可能做SBT(DOC)的crowling,和如果是的話如何? –

7

要遵循@mergeconflict answer,這裏是我是如何做到的

至於有沒有妥善的解決辦法,我就是這樣做是實現解析所有生成的html文件履帶式,並更換任何發現「進口標籤」(見下面的代碼),由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]() 
    } 
} 

正如你可以看到,此爬蟲任務已附加到文檔任務,由自動完成。

這裏是文檔的一個例子,將與式現在

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

被渲染,這將是可能的,以改善該代碼。例如:

  • 添加腳本導入的HTML頭部分
  • 避免讀取整個文件(可能增加,進口標籤應該是在第幾行的規則
  • 添加腳本到SBT包,並使用一些適合的任務
+0

未來的注意事項:cdn.mathjax.org即將到期,查看https://www.mathjax.org/cdn-shutting-down/獲取遷移提示。 –

+0

@Choucri這應該是選擇正確的答案,因爲它告訴你,它可以完成,如何完成。 –

相關問題