朱莉娅语言:文档字符串和LaTeX

3
Julia具有docstrings功能,其文档在此处记录https://docs.julialang.org/en/stable/manual/documentation/。我认为它支持LaTeX代码,但我不确定LaTeX代码是否应该像代码一样或像解释一样呈现。在下面的示例中,LaTeX代码有些混乱(例如,请参见rho),并且未被解释(rho看起来不像ρ)。我做错了什么吗? 有没有办法让LaTeX代码看起来像解释的形式? 我的意思是类似于https://math.stackexchange.com/上所做的那样。
文档说明说,LaTeX代码应该用双反引号包裹,并且希腊字母应该键入为ρ而不是\rho。但这有点违背了包含LaTeX代码的目的,不是吗?
注意:版本0.5.2在Juno / Atom控制台中运行。
"""

Module blabla

The objective function is:
``\max \mathbb{E}_0 \int_0^{\infty} e^{-\rho t} F(x_t) dt``

"""
module blabla
end

如果我执行模块和查询,则会得到以下结果:

enter image description here

使用三个引号时,美元符号会消失,但公式将以深色背景打印:

enter image description here

编辑 根据David P. Sanders的建议,使用Documenter.jl包进行后续处理。

    using Documenter
    doc"""
    Module blabla

    The objective function is:
    $\max \mathbb{E}_0 \int_0^{\infty} e^{-\rho t} F(x_t) dt$
    """
    module blabla
    end

给出如下结果:LaTeX代码似乎可以正确打印,但是未被解释(ρ显示为\ rho)。我遵循以下建议:https://juliadocs.github.io/Documenter.jl/stable/man/latex.html

enter image description here


1
使用双反引号是否有效?这是我的印象。 - StefanKarpinski
@StefanKarpinski,感谢您的关注。我已编辑问题以澄清双引号和三引号之间的区别。 - PatrickT
3
我认为问题只是Juno/Atom不支持渲染LaTeX。 编辑:请参见https://github.com/JunoLab/atom-julia-client/issues/329。 - mbauman
1
@MattB.,谢谢你是对的。我不理解当我点击它时的问题329:对我来说很深奥。哪个IDE支持“Julia”和“LaTeX”文档字符串?谢谢。 - PatrickT
2个回答

7
渲染 LaTeX 代码成为实际的方程式必须由呈现您文件字符串的任何软件支持。因此,为什么在 Juno 中没有看到任何渲染的方程式的简短答案是,Juno 当前不支持 LaTeX 渲染(正如 Matt B. 指出的那样,这方面存在一个问题)。 doc""字符串字面值/宏的存在是为了解决另一个问题。反斜杠和美元符号通常在字符串字面值中具有特殊含义--分别是转义序列变量插值(例如,\n被替换为换行符,$(variable)variable的值插入到字符串中)。这当然与普通的LaTeX命令和定界符(例如,\frac$...$)冲突。因此,为了在字符串中实际使用反斜杠和美元符号,您需要用反斜杠对它们进行转义,例如:
julia> "\$\\frac{x}{y}\$" |> print
$\frac{x}{y}$

不这样做将会产生错误:

julia> "$\frac{x}{y}$" |> print
ERROR: syntax: invalid interpolation syntax: "$\"

或在生成的字符串中包含无效字符:
julia> "``\e^x``" |> print
``^x``

当编写文档字符串时,不断地需要转义所有内容会变得很烦人。因此,正如David所指出的那样,您可以使用doc字符串宏/非标准字符串字面量来解决这个问题。在doc字面量中,所有标准转义序列都被忽略,因此未转义的LaTeX字符串不会引起任何问题:

julia> doc"$\frac{x}{y}$" |> print
$$
\frac{x}{y}
$$

注意:doc还会解析字符串中的Markdown,并实际返回一个Base.Markdown.MD对象,而不是一个字符串,这就是为什么打印出来的字符串与输入有点不同的原因。
最后,您可以像使用普通docstring一样使用这些doc文本,但您可以自由地使用LaTeX语法,无需担心转义所有内容。
doc"""
$\frac{x}{y}$
"""
function foo end

这个也在Documenter's manual中有记录,尽管它实际上并不特定于 Documenter。

双反引号 vs 美元符号。 Julia docstrings 或文档中标记 LaTeX 的首选方式是使用双反引号```math,正如手册中所述。美元符号支持向后兼容。

注意:Documenter 手册和 Julia 中 Markdown 对象的 show 方法需要更新以反映此更改。


1
感谢您提供详细的答案!我有一个后续问题和一条评论。1. 如果 Julia 控制台和 Juno IDE 不支持将 LaTeX docstrings 显示为 math,那么我应该使用哪个 IDE 才能获得 Documenter.jl 包的好处?2. 我希望美元符号继续得到支持,因为能够从 LaTeX 文章中复制粘贴方程块到 Julia docstrings 中,而不必重新输入整个内容,这是非常有益的。我正在处理大型矩阵和数组。美元符号万岁! - PatrickT
具体取决于您的意思:如果您想在IDE中使用方程式,则IJulia(Jupyter的Julia内核)可以实现,但是该IDE与Juno的理念非常不同。但是,为了澄清,Documenter在这里无关紧要-- Documenter的唯一目的是生成独立于IDE的HTML页面如此类 - mortenpi
关于反引号和美元符号的选择 - 在Markdown中,有很多理由更喜欢使用反引号。而且你只需要改变分隔符,方程式的其余部分就可以无问题地复制。应该在Commonmark讨论论坛和一些Julia或Documenter PRs中进行一些讨论,尽管我不能立即找到参考资料。 - mortenpi
2
不知道反引号现在是推荐的解决方案,谢谢。如果你习惯于编写 LaTeX 符号,这有点不幸。我猜在 Jupyter Notebook 的 Markdown 中不能使用吧? - David P. Sanders
感谢mortenpi提供这些澄清。这个页面(https://juliadocs.github.io/Documenter.jl/latest/)的前几段没有明确提到“Documenter”是用于创建“html”页面,而是提到了“Julia”文档doc页面,导致对Documenter的真正目的产生了困惑。我可以看出,“IJulia”非常适合博客、教学和教程,但如果你有一篇用“LaTeX”和“Julia”代码编写的科学文章需要复制,那么它就是多余的,在我看来,特别是如果你需要重新输入所有的反引号。无论如何,非常感谢您的帮助! - PatrickT
3
不,据我所知,Jupyter 只使用美元符号。我认为最初 Mike H. 从学术 Markdown(http://scholarlymarkdown.com/Scholarly-Markdown-Guide.html#math)中得到了反引号的想法。在 Markdown 中使用美元符号的问题是它已经有其他确定的含义与之冲突。对此有更多讨论可参考对应的 CommonMark 论坛帖子(https://talk.commonmark.org/t/mathjax-extension-for-latex-equations/698)。 - mortenpi

2

谢谢。我已经编辑了我的问题,并提供了一个尝试使用“Documenter.jl”的示例。我没有看到手册中的解释方程式。我正在使用“Atom”,这可能是个问题吗?我需要安装其他软件包吗?谢谢! - PatrickT
使用doc""",您只需在内部使用标准的LaTeX符号,例如$。 - David P. Sanders
谢谢David。所以我在上面的代码中用美元符号替换了双引号,并得到了与第三张图片中相同的输出。有什么想法吗?谢谢。 - PatrickT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接