【问题标题】:Suppress code in NBConvert? IPython禁止 NBConvert 中的代码? IPython
【发布时间】:2025-12-14 12:05:01
【问题描述】:

我已经知道如何抑制大型代码块出现在最终的 NB 转换 (PDF) 输出中。

通过将 LaTex 命令放在“我不想在最终输出中包含的代码之前的原始单元格”中

\iffalse

最后在原始单元格中跟随此

\fi

但是当我需要显示数字等时,这仍然给我留下了一些难看的代码,而笔记本的基本目的是显示带有结果的代码,有时对于非技术观众,我们只需要输出......任何想法?

如果有人受到启发,这有点相关.. 有什么方法可以在降价单元格中包含 python 变量,这样就可以得到带有计算结果的动态文本?对于第二个问题,我很抱歉,但出于某种奇怪的原因,我不确定我是否想单独问这个问题。

【问题讨论】:

  • 你想只抑制部分代码块还是全部?
  • 关于第二个问题(称为 Literate programming),@Carreau 有一个 PR 参见 github.com/ipython/ipython/pull/2592,但还没有决定语法。跨度>
  • 我可以忍受要么全部抑制或选择性地抑制......选择性更好,但实际上目前的情况对所有都很好......
  • 遗憾的是,拉取请求似乎陷入了困境,因为它似乎实现了......
  • PR 将被重新启动(这是我的)我们需要先修复一些架构。

标签: python ipython ipython-notebook


【解决方案1】:

要抑制代码单元(仅输入),可以使用自定义模板。类似于this question 中讨论的模板,例如latex_nocode.tplx 必须使用以下内容创建(在工作目录中)(对于 IPython 1.x)

((*- extends 'latex_article.tplx' -*))
% Disable input cells
((* block input_group *))
((* endblock input_group *))

使用此模板
ipython nbconvert --to=latex --template=latex_nocode.tplx --post=pdf file.ipynb

也许我应该补充一点,这样输入块只是被一个空白块替换(实际上是输入单元格被禁用的乳胶注释)。
在检查预定义的乳胶模板时,可以识别各个块(代码、降价、标题等),并且可以设置相应的自定义模板以根据需要设置输出样式。

编辑

正如 user1248490 指出的那样,从 IPython 2.0 开始,要扩展的乳胶模板被称为 article.tplxreport.tplxbase.tplx。因此上面的例子应该是这样的

((*- extends 'article.tplx' -*))
% Disable input cells
((* block input_group *))
((* endblock input_group *))

【讨论】:

  • 使用 IPython 2,这可以使用 article.tplx 而不是 latex_article.tplx
  • 参数 --to=latex 已被弃用,取而代之的是 --to=pdf。它接受相同的选项,因此除了更改它并删除 --post=pdf 参数外,命令保持不变。
  • 这对我有用,但不幸的是也阻止了所有输出......禁用输入单元是否实际上禁用它们被执行并产生输出?
【解决方案2】:

如果您是从 Anaconda 上 Windows 上的 IPython 3.2.0 偶然发现的(我不明白为什么这在 unix 系统或常规 ipython 安装上不起作用,但我自己没有测试过这些场景) -这种方法对我有用。使用 TorokLev 的乳胶模板(比如 pdf_nocode.tplx),然后创建一个 python 文件(比如 pdf_nocode.py)并粘贴以下内容:

c = get_config()

#Export all the notebooks in the current directory to the sphinx_howto format.
c.NbConvertApp.notebooks = ['*.ipynb']
c.NbConvertApp.export_format = 'pdf'
c.TemplateExporter.template_path = ['.', r"C:\your\path\to\tplx\folder"]
c.Exporter.template_file = 'pdf_nocode'

最后,你的命令是:

ipython nbconvert --to=pdf --config C:\your\path\to\pdf_nocode.py

这也将生成图像作为支持文件,如果您想抑制该输出(我主要使用绘图,因此这可能不适用于所有人),您可以修改

site-packages\IPython\nbconvert\exporters\pdf.py

通过添加此代码:

...
def from_notebook_node(self, nb, resources=None, **kw):
...
        # convert output extension to pdf
        # the writer above required it to be tex
        resources['output_extension'] = '.pdf'

        #The following suppresses the support files, so you may
        #end up removing other useful files you wanted to include
        del resources['outputs']
...

或通过从 pdf.py 继承 PDFExporter 并将您的导出器添加到 exporter_map 到:

site-packages\IPython\nbconvert\exporters\export.py

如果您将其子类化,您可以将自己的条目添加到笔记本菜单中:

site-packages\IPython\html\static\notebook\js\menubar.js

【讨论】:

    【解决方案3】:

    对以上答案的更正:

    1) 更正上面latex文件中的文档类名

    你应该换行

    ((*- extends 'article.tplx' -*))
    % Disable input cells
    ((* block input_group *))
    ((* endblock input_group *))
    

    2) 将本地目录添加到 nbconvert config as

    sudo gedit /usr/local/lib/python2.7/dist-packages/jupyter_core/tests/dotipython/profile_default/ipython_nbconvert_config.py

    添加一行 c.TemplateExporter.template_path = ['.'] 到文件

    3) 调用转换器为

    ipython nbconvert --to=pdf --template=latex_nocode.tplx tested_notebook.ipynb

    或者如果您想执行报告的所有单元格,例如:

    ipython nbconvert --to=pdf --template=latex_nocode.tplx --ExecutePreprocessor.enabled=True tested_notebook.ipynb

    【讨论】: