如何更改 jupyter notebook / jupyterlab 中单个单元格的背景颜色?

How to change the background color of a single cell in a jupyter notebook / jupyterlab?

我设计了一个笔记本,以便用户可以更改的变量在整个笔记本中分组到不同的单元格中。我想用不同的背景颜色突出显示那些单元格,以便用户可以清楚地看到旋钮的位置。

我怎样才能做到这一点?

注意: 是关于 static 代码突出显示(对于手册)和接受的答案建议基本上将所有内容都放在标记注释中。就我而言,我希望突出显示的代码位于 可运行单元格 .

给你(假设你使用Python内核):

from IPython.display import HTML, display

def set_background(color):    
    script = (
        "var cell = this.closest('.jp-CodeCell');"
        "var editor = cell.querySelector('.jp-Editor');"
        "editor.style.background='{}';"
        "this.parentNode.removeChild(this)"
    ).format(color)
    
    display(HTML('<img src onerror="{}" style="display:none">'.format(script)))

然后像这样使用它:

set_background('honeydew')

这个解决方案有点老套,我很乐意看到一个更优雅的解决方案。 演示:

使用 JupyterLab 0.32.1 在 Firefox 60 和 Chrome 67 中测试。

编辑让它成为细胞魔法,你可以简单地做:

from IPython.core.magic import register_cell_magic

@register_cell_magic
def background(color, cell):
    set_background(color)
    return eval(cell)

并像这样使用它:

%%background honeydew
my_important_param = 42

的小补充(试图将其添加为评论但无法使格式正常工作)。

from IPython.core.magic import register_cell_magic
from IPython.display import HTML, display

@register_cell_magic
def bgc(color, cell=None):
    script = (
        "var cell = this.closest('.jp-CodeCell');"
        "var editor = cell.querySelector('.jp-Editor');"
        "editor.style.background='{}';"
        "this.parentNode.removeChild(this)"
    ).format(color)

    display(HTML('<img src onerror="{}">'.format(script)))

这样你既可以把它当作魔术来使用,也可以通过普通的函数调用来使用:

bgc('yellow')
bla = 'bla'*3

%%bgc yellow
bla = 'bla'*3

如果只需要改变nbconvert转换的单元格的颜色, 在您的文件夹中创建模板 mytemplate.tpl 并添加:

{% extends 'full.tpl'%}
{% block any_cell %}
{% if 'highlight' in cell['metadata'].get('tags', []) %}
    <div style="background:lightpink">
        {{ super() }}
    </div>
{% else %}
    {{ super() }}
{% endif %}
{% endblock any_cell %}

(改编自官方docs

.. 然后将标签 "highlight" 添加到您的单元格。在 Jupyter 实验室中,您可以在左侧为选定的单元格执行此操作:

现在,使用模板使用 nbconvert 转换笔记本:

jupyter nbconvert --to html 'mynb.ipynb' --template=mytemplate.tpl

生成的 HTML 将如下所示:

我发现这适合向读者突出显示特定单元格。

以下是在 jupyter-notebook (v6.3.0) 和 jupyter-nbconvert --to=html (v6.0.7) 中对我有用的内容。

它与@krassowski 和@Gabe 的回答有两点不同:

  1. 交互式笔记本使用 class 名称 .cell.input_area,但 nbconvert HTML 使用 .jp-CodeCell.jp-Editor.highlight。此代码处理所有这些。

  2. 我更喜欢“线魔术”而不是“单元魔术”,因为线魔术不会改变单元格其余部分的计算。

from IPython.core.magic import register_line_magic
from IPython.display import HTML, display
import json

@register_line_magic
def bg(color, cell=None):    
    script = (
        "var n = [this.closest('.cell,.jp-CodeCell')];"
        "n = n.concat([].slice.call(n[0].querySelectorAll('.input_area,.highlight,.jp-Editor')));"
        f"n.forEach(e=>e.style.background='{color}');"
        "this.parentNode.removeChild(this)"
    )
    display(HTML(f'<img src onerror="{script}" style="display:none">'))  

%bg yellow