如何在Jupyter Notebooks中使用编程方式生成Markdown输出?

168
我想在Jupyter笔记本中撰写报告。我希望能够计算一些东西,生成一些结果并将它们包含在Markdown中。我能否将单元格的输出设置为解释为Markdown呢?
我希望这样的命令:print '$\phi$'可以生成phi符号,就像在Markdown中一样。
换句话说,我想要一个模板,在Markdown中插入笔记本程序生成的值。重新计算笔记本应该生成新的结果和新的Markdown,并插入这些新值。在这个软件中是否可能实现这一点,还是需要手动替换这些值?
8个回答

272

你需要的函数在IPython.display模块中。

from IPython.display import display, Markdown, Latex
display(Markdown('*some markdown* $\phi$'))
# If you particularly want to display maths, this is more direct:
display(Latex('\phi'))

2
非常感谢,我想这应该会对我有很大帮助。如果可以的话,有没有一种方法可以隐藏代码单元格?我的意思是,当我“编译”Markdown单元格时,“代码”消失了,只有编译后的Markdown输出可见。我希望能够重复这个过程,但使用display_markdown函数。 - fulaphex
2
很抱歉,你的代码对我来说不起作用,它没有产生任何输出。 - fulaphex
2
现在它确实可以工作了,谢谢。是否有一个命令可以隐藏单元格,这样我就可以生成这个Markdown并且它会像普通的Markdown单元格一样运行? - fulaphex
2
前面评论中的链接已经失效了,现在可以在以下网址找到该扩展程序:https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/master/src/jupyter_contrib_nbextensions/nbextensions/hide_input - BioGeek
3
我得到的是对象,而不是输出:<IPython.core.display.Markdown object> - loretoparisi
显示剩余7条评论

40

你基本上在询问两件不同的事情:

  1. Markdown 单元格输出代码结果。

    我想要计算一些东西,生成一些结果并将它们包含在 markdown 中。[...] 我希望在笔记本中有一个markdown 模板和插入程序生成的值

  2. 代码单元格输出 markdown

    我想要这样的命令:print '$\phi$' 生成 phi 符号,就像在 markdown 中一样。

由于第二个已经被另一个答案涵盖(基本上:使用从IPython.display导入的Latex()Markdown()),因此我将专注于第一个问题:


1. 插入变量的Markdown模板

使用Jupyter扩展Python Markdown,实际上可以做到您所描述的事情。

安装说明可以在nbextensions的github页面上找到。确保您使用jupyter命令扩展配置器启用python markdown扩展。

使用这个扩展,变量通过{{var-name}}访问。这样一个markdown模板的例子可能是这样的:

Markdown单元格中的Python代码

变量a是{{a}}

您还可以嵌入LateX:{{b}}!

甚至可以嵌入图片:{{i}}

自然地,所有变量或图片 a, b, i 应该在之前的代码中设置。当然,您也可以使用 Markdown-Latex 样式表达式(如 $\phi$)而无需使用打印命令。此图像来自扩展的维基,展示了其功能。

example from wiki


关于此功能被整合到ipython/jupyter中的更多信息,请参阅ipythonjupyter的问题跟踪器。


这个在 Jupyter Lab 中可用吗? - BND
我没有使用过那个,因此没有经验。但是我在 jupyter-lab 扩展列表中找不到 "Python Markdown":https://github.com/topics/jupyterlab-extension?q=&unscoped_q= - 因此,可能不支持? - Honeybear
这个能用于 nbconvert --to markdown 吗?还是只能在网页浏览器中使用?我似乎无法让它工作。 - Adam
此扩展不适用于 Jupyter 版本 >= 6.x。 - undefined

11
作为对Thomas回答的补充,另一种更简单的方法是使用IPython.display模块中的display_markdown函数来渲染Markdown标记。
from IPython.display import display_markdown

display_markdown('''## heading
- ordered
- list

The table below:

| id |value|
|:---|----:|
| a  |  1  |
| b  |  2  |
''', raw=True)

以下是输出:

enter image description here

使用示例可以在Google Colab笔记本上找到


display_markdown(thing)display(Markdown(thing))在实质上有什么不同吗? - Robert Jacobson
不是的。displaydisplay_markdown两个函数都调用了内部函数display_functions.display - feeeper

2
另一个选择是使用Rich进行Markdown渲染,使用UnicodeIt进行符号处理。它有一些限制,因为Rich使用的是CommonMark,例如不支持表格。但是Rich有其他方法来呈现表格;这在文档中有详细说明。
以下是一个示例:
from rich.markdown import Markdown
import unicodeit

alpha = unicodeit.replace('\\alpha')
epsilon = unicodeit.replace('\\epsilon')
phi = unicodeit.replace('\\phi')

MARKDOWN = f"""
# This is an h1

Rich can do a pretty *decent* job of rendering markdown.

1. This is a list item
2. This is another list item

## This is an h2

List of **symbols**:

- alpha: {alpha}
- epsilon: {epsilon}
- phi: {phi}

This is a `code` snippet:

```py
# Hello world
print('Hello world')
```

This is a blockquote:

> Rich uses [CommonMark](https://commonmark.org/) to parse Markdown.

---

### This is an h3

See [Rich](https://github.com/Textualize/rich) and [UnicodeIt](https://github.com/svenkreiss/unicodeit) for more information.
"""

Markdown(MARKDOWN)

... 会产生以下输出:

Rich + UnicodeIt output


0
from tabulate import tabulate
from IPython.display import Markdown
A2 = {
    'Variable':['Bundle Diameter','Shell Diameter','Shell Side Cross Flow area','Volumetric Flowrate','Shell Side Velocity'],
    'Result':[3.4, 34, 78.23, 1.0 ,  2.0],
    'Unit' : ['$in$', '$in$', '$ft^2$', '$ft^{3}s^{-1}$', '$fts^{-1}$']}
temp_html=tabulate(A2, headers='keys', tablefmt='html')
Markdown(temp_html.replace('<table>','<table style="width:50%">'))

.replace() 的使用不会破坏 LaTeX 代码并避免列过度拉伸。这样就可以动态生成带有 LaTeX 的表格。


0
我创建了一个简单的IPython内核,其中所有代码单元格都只返回Markdown。非常适合教学/展示Markdown语法。 你可以在这里查看

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

0
还有一个选择。有一个开源框架可以将Jupyter笔记本转换为Web应用程序,它被称为Mercury。它有一个名为Markdown的函数,可以将任何字符串显示为Markdown格式。这里是一个文档
下面是一个动态显示Markdown的示例笔记本:
import mercury as mr

slider = mr.Slider(label="Favorite number", value=5)

name = "Piotr"

mr.Markdown(f"""# Hello {name}

## Your variable is {slider.value}
""")

notebook with markdown

使用Mercury创建的笔记本和Web应用程序。它具有动态Markdown功能: 带有Markdown的笔记本和应用程序

0
有一个有趣的实验室扩展叫做jupyterlab-myst,它将笔记本中的标准markdown渲染器替换为mystjs渲染器。
这意味着您可以在markdown单元格中呈现更多不仅限于标准commonmark markdown的内容,包括直接将变量值插入到markdown中。这些变量可以是简单的变量、图像、单元格输出甚至是ipywidgets。
这为您在笔记本中将代码单元格中的计算结果与markdown内容交织在一起提供了更多可能性。当重新执行笔记本时,markdown中的插值值将被更新。
还有其他对报告撰写有帮助的功能,也可以帮助OP的使用情况。

Example of ipywidgets rendered in a markdown cell


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