使用LaTeX自定义日期和标题格式将(Jupyter Notebook) nbconvert为PDF

5
我正在使用Jupyter Notebook撰写很多代码和LaTeX的报告。 我希望更改它们的标题、日期和格式。 具体而言,我想所有文本都以较小的字体呈现,最大为12到14像素。
我已经花费了几天时间尝试创建自定义的*.tplx文件进行nbconvert。 无论我使用哪个文件,标题和日期都不会改变。 实际上,当我使用自定义.tplx时,似乎什么也没有改变。
我发现其他一些人也在询问这个问题,他们提供了关于模板的信息以及如何在使用nbconvert时调用模板。 每一个完整的解决方案都涉及导出为".tex",然后手动进行更改。 这不是理想的,因为我经常每天创建多个文档,这会让我变慢,而不是一次性地解决问题。
有任何建议吗?
2个回答

5

好的,我已经拼凑出一些代码来完成了日期部分。(受到这篇博客的极大帮助。)类似的编辑也可以用来更改标题和/或作者。我不确定这有多健壮,但它确实起到了作用。

基本上,您需要编辑/nbconvert/templates/latex目录中的tplx文件。具体而言,我编辑了base.tplx。在它原本的位置:

 ((* block date *))((* endblock date *))

我将此更改为:

我把这个改成了


    ((* block date *))  
    ((*- if nb.metadata["latex_metadata"]: -*))  
    ((*- if nb.metadata["latex_metadata"]["date"]: -*))  
        \date{((( nb.metadata["latex_metadata"]["date"] )))}  
    ((*- endif *))  
    ((*- endif *))  
    ((* endblock date *))  

然后在笔记本元数据中,我添加了以下内容:

  "latex_metadata": {  
      "date": "CUSTOM DATE HERE"  
  },  

如果它是元数据结构的最后一行,则最后一个,取决于它是否是。如果没有latex_metadata标签,则将日期留空,latex将替换为当前日期。

我无法解决的唯一问题是,当我通过LaTeX运行Download as -> PDF时,它不总是重新运行LaTeX生成器(有时它只会给我上次创建的LAST pdf,而不是新的pdf)。我无法弄清楚为什么它有时会运行,而有时不会。

*编辑* 我在jupyter笔记本中的确切元数据部分现在看起来像这样(我使用日期字段显示我的学生的截止日期):

{
  "anaconda-cloud": {},
  "kernelspec": {
    "name": "python3",
    "display_name": "Python 3",
    "language": "python"
  },
  "language_info": {
    "name": "python",
    "version": "3.7.9",
    "mimetype": "text/x-python",
    "codemirror_mode": {
      "name": "ipython",
      "version": 3
    },
    "pygments_lexer": "ipython3",
    "nbconvert_exporter": "python",
    "file_extension": ".py"
  },
  "latex_metadata": {
    "date": "Due April 7 at 11:59pm"
  }
}

对于可能会遇到这个答案的任何人...在某个时间点更新了nbconvert之后,我发现它不再使用base.tplx。现在它使用位于anaconda安装下的share/jupyter/nbconvert/templates/latex中的base.tex.j2。尽管如此,与上述相同的解决方案仍然有效。 - Seth
这个黑科技对你还管用吗?我已经搜索了一整天,按照你在这里列出的步骤操作,但它仍然不起作用 :-/ - microhaus
是的,在更新为修改base.tex.j2而不是已弃用的base.tplx之后,它完美地工作了。(实际上,我原始帖子中关于不重新运行LaTeX生成器的最后一行不再是问题,因为每次都可以完美地工作。) - Seth
你能否编辑你的回答并在新笔记本上发布你的Jupyter元数据是什么样子的,你有代码片段之后?我已经完全按照你的帖子操作了,但它没有起作用,所以我猜测可能是我在.json语法方面犯了错误,而我对此一窍不通。如果不行,我猜想可能是由于我的设置有些特殊。目前我正在使用Jupyter另存为.tex,然后手动编辑,这并不理想。 - microhaus
感谢您抽出时间编辑您的答案,非常感谢。我会再试一次。 - microhaus

0
感谢您提供有用的建议。同样的操作也可以用于自定义标题作者。我已经在base.tex.j2中编辑了相应的部分,并在日期字段下方添加了适当的字段。
((* block title -*))
((*- if nb.metadata["latex_metadata"]: -*))  
((*- if nb.metadata["latex_metadata"]["title"]: -*))  
    \title{((( nb.metadata["latex_metadata"]["title"] )))}  
((*- endif *))  
((*- endif *))  
((*- endblock title *))
((* block date *))  
((*- if nb.metadata["latex_metadata"]: -*))  
((*- if nb.metadata["latex_metadata"]["date"]: -*))  
    \date{((( nb.metadata["latex_metadata"]["date"] )))}  
((*- endif *))  
((*- endif *))  
((* endblock date *))  
((* block author *))
((*- if nb.metadata["latex_metadata"]: -*))  
((*- if nb.metadata["latex_metadata"]["author"]: -*))  
    \author{((( nb.metadata["latex_metadata"]["author"] )))}  
((*- endif *))  
((*- endif *))  
((* endblock author *))

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