Есть ли способ включить математические формулы в Scaladoc?

Я хотел бы ввести математические формулы в документацию Scaladoc математического кода Scala. В Java я нашел библиотеку под названием LatexTaglet, которая может сделать именно это для Javadoc, написав формулы в Latex: http://latextaglet.sourceforge.net/

И, похоже, он хорошо интегрируется с Maven (раздел отчетов/плагинов POM). Есть ли эквивалентная библиотека для Scaladoc? Если нет, как я могу интегрировать эту библиотеку с SBT?

Я также рассматривал использование MathML (http://www.w3.org/Math/), но выглядит слишком много. Есть ли редактор, который вы бы порекомендовали? MathML хорошо интегрируется с Scaladoc?

Благодарим за помощь!

Ответ 1

Короткий ответ: нет. LaTeXTaglet становится возможным благодаря API JavaDoc Taglet. В Scaladoc нет эквивалента, поэтому нет чистого решения.

Однако я могу думать о хаке, который может быть достаточно простым:

Там есть библиотека под названием MathJax, которая ищет математические формулы в стиле LaTeX на странице HTML и динамически отображает ее на месте. Я использовал его раньше, это довольно хорошо; все, что вам нужно сделать, это включить script. Таким образом, вы могли бы сделать две вещи:

  • Отредактируйте и перестройте источник Scaladoc, чтобы включить MathJax или...
  • Запишите небольшой постпроцессор, сканирующий весь вывод HTML-кода Scaladoc после его запуска, и добавьте MathJax в каждый файл.

Таким образом, вы можете просто написать формулы LaTeX непосредственно в своих комментариях Scala, и они должны отображаться в браузере. Конечно, если вы хотите не-хакерское решение, я бы предложил вам создать теглет-подобный API для Scaladoc;)

Ответ 2

Чтобы следить за @mergeconflict answer, вот как я это сделал

Поскольку нет правильного решения, я сделал для реализации искателя, который анализирует все сгенерированные html файлы и заменяет любой найденный "тег импорта" (см. код ниже), путем импорта MathJax script:

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]()
  }
}

Как вы могли видеть, эта задача искателя прикрепляется к задаче doc, она выполняется автоматически с помощью sbt doc.

Вот пример документа, который будет отображаться с помощью формулы

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

Теперь можно было бы улучшить этот код. Например:

  • добавьте импорт script в раздел html head
  • не читать все файлы (возможно, добавить правило, что тег импорта должен быть в первых нескольких строках
  • добавьте script в пакет sbt и добавьте его в папку target/api с помощью подходящей задачи

Ответ 3

В готовящейся scala3, известной как Dotty, есть встроенная поддержка уценки, которая позволяет отображать простые математические формулы с использованием подмножества Latex.