'Missing $ inserted' 使用 nbconvert 将 jupyter notebook 转换为 pdf 时出现错误消息

'Missing $ inserted' error message when converting jupyter notebook to pdf with nbconvert

尝试使用以下命令将 jupyter notebook 转换为 pdf 时:

jupyter nbconvert --to pdf "Search and Other Content Finding Features.ipynb"

我收到一条错误消息:

! Missing $ inserted.
<inserted text>
                $
l.380 ... Other Content Finding Features_10_0.png}

?
! Emergency stop.
<inserted text>
                $
l.380 ... Other Content Finding Features_10_0.png}

我发现了一些关于那是什么的讨论 here

但是,我在我的代码中找不到这些字符。会不会是其他原因?

这种情况下的问题似乎是由我笔记本的文件名引起的。我不完全理解导致问题的原因,但上面的错误消息包含对某些文本的引用:

... Other Content Finding Features_10_0.png}

该文本包含可能导致此错误的 _。我认为发生的情况是,在转换脚本的某处,如果文件名中有空格,则会生成一个带有下划线的文件,如图所示,然后触发错误。 (这对我来说有点像一个错误,或者至少是一个弱点)。

对我有用的修复方法只是更改 jupyter notebook 的文件名,使其不包含任何空格。然后转换运行顺利

对我来说,这是另一个相关问题:下划线。我假设原因是标记为原始文本的单元格中的文本将直接传递给 LaTeX,在那里它可以被解释为 LaTeX 代码本身。也许你的人物名字中的下划线?

  • 在某些时候,我有一个带有三个下划线 ___ 的原始单元格,然后导致转换中断。临时解决方案是将单元格转换为降价,而不是原始(而不是 运行 它)出现在 pdf 中。

为了找出错误,我使用了以下转换 (:

jupyter nbconvert thenotebook.ipynb --to latex
  • 另一个相关错误是由 link 包含下划线引起的:
[text](https://en.wikipedia.org/wiki/Python_(programming_language))

这也是在原始文本单元格中,我将其转换为 markdown 以生成 pdf。不过,格式(颜色,links)不同。

  • 最后说明:我的文件名也包含空格,但这根本不是问题!

对我来说,这是由 LaTeX 和 MathJax 之间的显着差异引起的。例如 cases 环境可以使用 MathJax 在数学模式之外呈现,这是 jupyter notebook 的默认选择。但是,它会导致在 LaTeX 中显示 "missing $ insert" 的错误。更正 Markdown 单元格中的语法后错误消息消失。

一个非常常见的陷阱可能如下:

nbconvert 使用的 pandoc 扩展 tex_math_dollars 中不允许前导或尾随空格。

这意味着,这行不通:

$ \epsilon  \gt 0 $

我们看到错误信息:

! Missing $ inserted.
<inserted text> 
                $
l.364     $ \epsilon
                       \gt 0 $
? 
! Emergency stop.
<inserted text> 
                $
l.364     $ \epsilon
                       \gt 0 $
No pages of output.
Transcript written on notebook.log.

没有空格的正确公式工作正常:

$\epsilon  \gt 0$

这似乎是 bug in Jupyter nbconvert

pandoc 文档表明,对于 pandoc,这是设计允许使用没有转义序列的美元符号:

Anything between two $ characters will be treated as TeX math. The opening $ must have a non-space character immediately to its right, while the closing $ must have a non-space character immediately to its left, and must not be followed immediately by a digit. Thus, ,000 and ,000 won’t parse as math. If for some reason you need to enclose text in literal $ characters, backslash-escape them and they won’t be treated as math delimiters.