2016-02-29 61 views
0

我尝试创建一个自定义乳胶模板来从jupyter笔记本创建PDF输出。我想以特殊方式标记单元格时取消单元格输出。例如,让说我编辑给定单元元数据(从笔记本/“编辑元数据”),并添加该子JSON:从jinja2模板访问单元格元数据

[...] 
"tpl": { 
    "view_in": true, 
    "view_out": false 
}, 
[...] 

于是,我试图通过使用cell变量导出模板,如http://nbconvert.readthedocs.org/en/latest/customizing.html#Templates-that-use-cell-metadata所示简单:

% ((*- extends 'report.tplx' -*)) 
% Disable input cells 
((* block input_group *)) 
((* endblock input_group *)) 
% disable output if required from metadata 
((* if cell['metadata'].get('tpl', {}).get('view_out', True) == true *)) 
    ((* block output_group *)) 
    ((* endblock output_group *)) 
((* endif *)) 

但Jinja2的抱怨,当我试图生成我的PDF:

$ jupyter nbconvert --to pdf C4_RevD.ipynb --template=tpl.tpl 
    [...] 
    jinja2.exceptions.UndefinedError: 'cell' is undefine 

如何从一个Jinja2的细胞metdata一个访问模板?

[编辑]使用版本:

Python: 2.7.6 
jupyter: 4.0.6 
jupyter notebook: 4.1.0 
jinja2: 2.8 
+0

'cell'变量只能在'any_cell'块和块内部的块中使用。因此,他们添加的代码已经在里面了 - 您需要检查'output_group'块中的元数据,并决定是否给它内容。 –

+0

@ThomasK:感谢您的提示,它的工作原理。如果你会写出正确的答案,我会将其标记为解决方案。 – Nic

回答

1

细胞变量仅在那些(template structure docs)内any_cell块和块可用。因此,他们添加的代码已经过时了 - 您需要检查output_group块内的元数据,并决定是否提供内容。例如:

((* block output_group *)) 
    ((* if cell['metadata'].get('tpl', {}).get('view_out', True) == true *)) 
     ((* super() *)) 
    ((* endif *)) 
((* endblock output_group *))