Ipython: 笔记本中的方程式编号。

创建于 2013-08-26  ·  45评论  ·  资料来源: ipython/ipython

IPython 的内联 LaTeX 不包括方程编号。 如果通常编号的 LaTeX 序列(即 \begin{equation} ... \end{equation} 块)得到(可选?)数字,那就太好了。 如果我们可以附加对方程式的引用并在文本的后面以某种方式引用它们,那将是一个灌篮。

notebook

最有用的评论

这已经解决了还是我应该为此+1?

所有45条评论

+1
对于任何类型的数学文档来说,这都是一个相当重要的特征。
我相信 MathJax 已经具备这种能力:

http://docs.mathjax.org/en/latest/tex.html#automatic -equation-numbering

就引用而言,我认为开发具有统一语法的通用交叉引用系统至关重要,而不是特定于 LaTeX 方程(和 LaTeX 后端)的交叉引用系统。

我同意必须有通用的交叉引用系统,但补充说它也应该能够与 python 代码交互。 这将允许降价中的乳胶参考代码中产生的数字。

这可能必须等到可以使用从 markdown 单元访问 python 变量的系统,因为它可能会使用类似的系统。

请参阅https://github.com/ipython/ipython/pull/2517#issuecomment -9884544 并发表评论。

@ahmadia为什么方程式不能默认编号的问题是什么? 无法编号和参考方程是目前非常烦人的事情。

+1。 似乎实施 #5921 可以轻松实现这一点。

+1。 希望这能很快实施

+1

+1。
我正在使用 ipython 笔记本来补充大学初级电磁学课程的课程材料,并以此作为测试案例,以确定是否在整个本科课程中推动广泛的 ipython 笔记本实施。 在笔记本或笔记本的各个部分中缺乏一致的方程编号是一个严重的限制,以及在文本中引用方程编号的能力。 我很满意这样的编号特定于笔记本的 LaTeX 部分,特别是如果尝试更通用的方法意味着需要更长的等待时间才能获得此功能。

+1。
同样在这里,我正在使用 ipython 为数值微积分课程写笔记,并且确实缺少参考编号。

+1

这是阻止我使用 iPython Notebooks 作为主要文档编写工具的唯一原因(除了缺乏实时协作,但这并不重要)。 相反,我必须在这里草拟草稿,然后将它们移植到 LaTeX 编辑器中。

+1:+1:我们正在使用它来上课,这个功能是绝对必要的!

好的,我终于尝试了本文中描述的“解决方案”,您可以在其中修改 mathjaxutils.js。 只要您在对包含乳胶的降价单元格进行更改后刷新 ipython 笔记本网页,方程式编号就会显示并以正确的顺序显示。 刷新页面还修复了标签,当重新运行定义它们的单元格时(即 shift-enter),这些标签将无法解析。 但是,当笔记本在 nbviewer.ipython.org 中呈现时,方程式编号完全丢失,并且标签未解析,因此它们被替换为“???” 在降价文本单元格中引用它们的位置。 最重要的是,对于大多数用例来说,这并不是一个解决方案,尽管我很高兴原始发帖人提出了这个问题并想出了这么多。

我想对代码单元返回的方程进行编号。
这就是我使用的:http: //nbviewer.ipython.org/github/MalteJin/Manual-equation-numbering/blob/branch/Manual%20equation%20numbering.ipynb

^ 这是目前推荐的解决方案吗?

撞。 我正在使用 Jupyter 笔记本作为我的课程笔记,这是一个严重的问题。 手动编号方程的方便语法会是一个不错的折衷方案吗?

手动编号方程的方便语法会是一个不错的折衷方案吗?

这是一个好主意@poulson, MathJaX中有\tag语法支持这一点。
Jupyter Notebook 示例中的手动 MathJax 方程标签。 相同的限制(如果您不刷新浏览器,重新执行 Markdown 单元将导致 MathJaX 中断),但至少您不必重新配置笔记本即可。

@ahmadia谢谢! 重新执行破坏单元格肯定有点令人沮丧,但这是\begin{equation}不标记的巨大进步!

@ahmadia是否预计方程式引用不会在您的链接或实时笔记本中解析(即使在刷新后)?

尝试刷新然后执行所有单元格。 我认为这些链接在 GitHub 中不起作用
因为 GH 会去除 URL。

2015 年 10 月 3 日星期六,Jack Poulson [email protected]写道:

@ahmadia https://github.com/ahmadia是否期望方程
引用无法在您的链接或实时笔记本中解析(即使在
清爽)?


直接回复此邮件或在 GitHub 上查看
https://github.com/ipython/ipython/issues/4113#issuecomment -145305340。

这对我不起作用,但由于一切都是硬编码的,我认为没有任何理由坚持使用\ref 。 因此,我对参考文献的方程式编号进行了硬编码,并生成了可以在此处看到的最终产品: http ://web.stanford.edu/class/math53/notebooks/Week2.html

感谢@poulson推动这一点。 我一次又一次地受到这个打击,硬编码方程数字非常糟糕,但是可以做什么...... IPython应该对此提供原生支持。

迄今为止最好的解决方法,谢谢大家!

如果包含代码:

MathJax.Hub.Config({
  TeX: { equationNumbers: { autoNumber: "AMS" } }
});

在 javascript 扩展中,甚至在笔记本中的 javascript 输出中,将打开自动等式编号。 默认情况下,它会存在阻止我们这样做的所有问题,主要是 mathjax 方程编号是按渲染时间排序的,而不是页面上的位置,因此编号只会在第一页加载时正确。

实际上,您可以重置方程式编号并重新渲染笔记本中的方程式。

我做了一个简单的笔记本扩展来做到这一点:
https://github.com/ipython-contrib/IPython-notebook-extensions/pull/335

@juhasch太棒了! 鉴于在大多数情况下等式编号的体验非常差,我认为默认关闭是最好的选择。 但是将其设置为带有重新编号操作的前端配置选项会很棒(工具栏按钮可能太宝贵的空间无法用于它,但菜单操作会很好)。

我想在创建笔记本时经常使用重新渲染/重新编号,所以我会投票给工具栏按钮,或者,如果它进入菜单,至少是正常模式的热键。

@lucasb-eyer 我认为对于@juhasch提供的扩展程序来说这是一件好事,但默认情况下我们可能不会这样做,因为默认的键盘快捷键和工具栏空间都非常宝贵。 但是可以通过 custom.js 或 nbextension 添加一个或两个。

@minrk :可以使用 nbextensions 服务器扩展轻松激活/停用扩展并重新打开/关闭:
clipboard01

如果按button工具栏按钮,方程式编号被重置/重新渲染。

@juhasch感谢您的工作!这是向前迈出的一大步。

@minrk根据您的经验,您会提出什么作为方程编号的长期正确解决方案? @juhasch的扩展现在只是一种解决方法。我不是要你实现它,只是概述解决方案应该是什么。我认为有很多人真的对此感到困扰,如果我们知道正确的前进方向是什么,我们可以尝试试一试。

作为方程编号的长期适当解决方案,您会提出什么建议?

你不能拥有它。 MathJax 假定它在执行等式编号时可以访问整个页面,而 IPython 会逐个单元格地呈现 Markdown,对于大型笔记本来说,这是唯一明智的做法。 它需要在 MathJax 方面进行工作/实施,而不是笔记本。

大多数人(包括我)只想要等式编号。 我认为我们不太关心它在技术上是如何实现的。 所以我可以看到几种可能的前进方式,例如向 MathJax 添加一些补丁,允许笔记本在没有访问整个页面的情况下告诉它方程编号,或者另一种解决方案是只使用 MathJax 来呈现没有数字的方程,然后由笔记本本身渲染数字。 可能还有更多选择。 但我想得到一些官方的祝福,哪种方式是最好的,因为我不精通内部。

作为方程编号的长期适当解决方案,您会提出什么建议?

现在,我基本上会做@juhasch对他的扩展所做的事情,如果合并到 master 中,会进行以下更改:

  1. 默认关闭
  2. 在前端配置中存储切换,因此您只需打开一次
  3. 添加重新编号操作,因此可以绑定到键盘快捷键
  4. 将用于重新编号的默认 UI 放在菜单中而不是工具栏中

基本上,对于那些优先考虑这一点的人来说,我会让它比扩展稍微差一些,因为这作为默认设置没有意义。 但是,一旦操作可用,添加快捷方式和工具栏按钮之类的东西就变成了对那些有不同优先级的人的简单定制。

我不知道总是正确的编号是多么可行,因为这意味着在 Markdown 单元格或 HTML 输出的_any_ 渲染中,需要重置编号,并且_all_ markdown 单元格和 HTML 输出需要重新渲染,每一次。

鉴于文档,这对作为用户的我来说听起来是一个合理的计划。 :+1:

@minrk :作为用户,我也会发现这是一个可用的解决方案。 重新渲染所有 Markdown 和 HTML 输出会有多麻烦?

@gregnordin这将取决于笔记本的大小,并且随着笔记本的大小而无限增长。 这意味着每次编辑降价单元格时,渲染时间可能与首次打开笔记本时加载整个笔记本时相似。 对于默认行为绝对不行,但是如果扩展想要尝试尝试一下,欢迎他们尝试。

+1

+1 此功能。 我正在为学生准备物理讲座,方程式编号是必不可少的。

另一个选项允许更新方程式编号,而无需重新渲染所有内容,它是一种 javascript,它在 HTML 输出中搜索具有方程式或引用的元素,并用适当的值替换它们的文本。

要获得完整的功能,需要在 MathJax 中进行一些修改,为需要更新的元素设置额外的属性,以便脚本可以识别它们。

目前没有支持,但以下解决方法可以解决问题

  • 使用\tag{labelname}创建方程编号。 注意这里的标签是标签
  • 使用原始 html 代码在 markdown 中引用它<span class=reference data-target=labelname></span>这是必要的,因为 \ref 或 \eqref 的 HTML 输出不包含标签名。

例如

$$
\begin{equation}
  A = 1 \tag{eq:sample}
\end{equation}
$$

The amazing result in <span class=reference data-target="eq:sample"></span> can ...blah..blah

以下脚本更新方程式编号。 它需要在呈现新的方程式编号或引用后运行。 现在,您可以将脚本放在单独的单元格中,并在需要时手动运行它。 完整的解决方案需要某种机制来在适当的时间触发重新运行。

%%javascript

// find all equation numbers (tags) that have no data-label attribute and set
// it to the tag text
$("span.mtd[id|='mjx-eqn']").not("[data-label]").each(
    function (index)
    {
        $(this).attr("data-label", $(this).text().slice(1,-1));
    }
);

// loop over all equation numbers and set the text 
$("span.mtd[id|='mjx-eqn']").each(
    function (index)
    {
        $(this).text("(" + (index+1) + ")");
    }
);

// loop over all references and resolve them by finding the
// equation number with a matching data-label attribute
$("span.reference").each(
    function (index)
    {
        var target = $(this).attr("data-target");
        var eqn = $("span.mtd[id|='mjx-eqn'][data-label='" + target + "']").text()
        $(this).text(eqn)
    }
);

请注意,脚本仅更新数字,保留所有布局。 让 MathJax 重新渲染所有内容应该更有效。

@basvandertol感谢您的示例,但我看不出这有什么用,因为结果仅在当前屏幕上可见:它们未保存,无法打印,无法在 nbviewer 中查看,也无法查看在任何输出(PDF、HTML 等)中,我认为这不是一种解决方法。 我误会你了吗? 或者这只是解决方案的一部分?

感谢@dsblank 的反馈。 这确实只是部分解决方案,特别是针对在编辑笔记本时更新方程式编号而不重新渲染所有内容的问题。 我正在尝试使用 HTML 数据属性来实现这一点。 后来我发现 nbconvert 使用类似的方法来处理 Latex 引用。 http://nbconvert.readthedocs.io/en/latest/latex_citations.html

目前 MathJax 没有为 HTML 输出添加足够的属性来解析渲染后的引用。 这就是为什么我使用这些骇人听闻的标签和引用来获得我需要的 HTML 输出。 使用这些标签,到 Latex -> pdf 的正常转换被破坏。

我现在正在熟悉 MathJax 源代码,看看是否有一些简单的方法可以将 HTML 属性添加到普通标签和引用中。

下一步是在 nbconvert 中添加支持以识别这些 HTML 属性,就像它已经对引用所做的那样。 如果 nbconvert 还可以扫描具有这些属性的 HTML 代码段的输出,则可以将 HTML 标题/标签添加到代码生成的图形中,并且 nbconvert
可以生成正确的 Latex 输出。 然后可以在标记单元格中引用图形。

它只是对 ipython 笔记本中引用的完全支持方法的概述。 这对我来说似乎是可行的,但如果有人现在已经看到了展示者,请告诉我。 我对 ipython notebook 的内部结构知之甚少。 这似乎是一个有趣的项目,可以了解更多信息,但现在我无法监督所有影响。

刚刚发现这个(长)线程......

可能这可能是有趣的:我尝试了一些东西来支持 LaTeX 环境的渲染,包括文档范围内方程式和环境的_自动编号和更新_。
它使用了一个刷新按钮,但现在使用的想法类似于上面@basvandertol提到的想法。

当然,所有这些都增加了一些负担,但这在很大程度上对我来说是可以接受的,即使对于很长的文档也是如此。 可以将笔记本导出为 html 和 LaTeX 文档;

您可以在此处或在Pypi上查看扩展。 最好的。

+1 用于将某些版本的建议解决方案集成到 master 中。

这已经解决了还是我应该为此+1?

此页面是否有帮助?
0 / 5 - 0 等级