如何在 IPython Notebook 中编写 LaTeX?
Posted
技术标签:
【中文标题】如何在 IPython Notebook 中编写 LaTeX?【英文标题】:How to write LaTeX in IPython Notebook? 【发布时间】:2012-10-23 21:11:06 【问题描述】:如何在 IPython Notebook 中显示 LaTeX 代码?
【问题讨论】:
@duffymo 不管你如何看待 LaTeX,这是一个很好的问题。 Take a look 实际上是 IPython 笔记本。如果我告诉你它有点像 'roids 上的 orgmode 可能会有所帮助(但不幸的是没有一个好的编辑器,并且使用 Markdown 而不是 LaTeX,因此是 OP 的问题)。 我不知道,感谢康拉德的指导。 而且,为了清楚起见,我喜欢 LaTeX。 (我用它来排版我的论文。)没有异议;只是没能理解问题。 就像 Jupyter 中的任何东西一样,这取决于您是想在带有固定文本的降价单元格中显示 Latex(Latex 就在$
之间)还是使用像 display
或 print
这样的指令的代码单元格显示计算文本。这里的答案针对任一单元格,但不能同时针对两个单元格,this one 除外,它应该是选定的答案,但由于使用了各种字体和大小,也更难阅读。
【参考方案1】:
当您想要控制文档序言时的另一种解决方案。写一个完整的文档,发送到系统latex,将pdf转成png,使用IPython.display
加载显示。
import tempfile
import os.path
import subprocess
from IPython.display import Image, display
with tempfile.TemporaryDirectory(prefix="texinpy_") as tmpdir:
path = os.path.join(tmpdir, "document.tex")
with open(path, 'w') as fp:
fp.write(r"""
\documentclass[12pt]standalone
\begindocument
\LaTeX
\enddocument
""")
subprocess.run(["lualatex", path], cwd=tmpdir)
subprocess.run(["pdftocairo", "-singlefile", "-transp", "-r", "100", "-png", "document.pdf", "document"], cwd=tmpdir)
im = Image(filename=os.path.join(tmpdir, "document.png"))
display(im)
【讨论】:
【参考方案2】:我在this article.this article.写了如何在 Jupyter Notebook 中编写 LaTeX
您需要将它们括在美元 ($) 符号中。
要向左对齐,请使用单个美元 ($) 符号。$P(A)=\fracn(A)n(U)$
$$P(A)=\fracn(A)n(U)$$
将\limits
用于\lim
、\sum
和\int
,为每个标志的顶部和底部添加限制。
使用反斜杠转义 LaTeX 特殊词,例如数学符号、拉丁词、文本等。
试试这个。
$$\overlinex=\frac\sum \limits _i=1 ^k f_i x_in \text, where n=\sum \limits _i=1 ^k f_i $$
矩阵
分段函数
$$
\beginalign
\textProbability density function:\\
\begincases
\frac1b-a&\textfor $x\in[a,b]$\\
0&\textotherwise\\
\endcases
\\
\textCumulative distribution function:\\
\begincases
0&\textfor $x<a$\\
\fracx-ab-a&\textfor $x\in[a,b)$\\
1&\textfor $x\ge b$\\
\endcases
\endalign
$$
上面的代码会创建这个。
如果您想知道如何为方程式添加编号和对齐方程式,请阅读this article for details。
【讨论】:
【参考方案3】:我开发了prettyPy,它提供了一种打印方程式的好方法。不幸的是,它性能不佳,需要测试。
例子:
当然,sympy 是一个很好的选择,虽然 prettyPy 不允许评估表达式,但不需要变量初始化。
【讨论】:
我的意思是暗示我开发了这个包。我调整了答案以明确说明这一点。 感谢将代码放入公共领域。我将删除我(现在)过时的评论。【参考方案4】:我正在使用 Jupyter 笔记本。 我不得不写
%%latex
$sin(x)/x$
获取 LaTex 字体。
【讨论】:
这在您处于编码模式时有效。如果您处于 Markdown 模式,那么您可以摆脱 %%latex【参考方案5】:直接在 Markdown 单元格中使用 LaTeX 语法对我有用。我正在使用 Jypiter 4.4.0。
我不必使用%%latex
魔法命令,我坚持,只是一个降价单元:
\beginalign
\nabla \times \vec\mathbfB -\, \frac1c\, \frac\partial\vec\mathbfE\partial t & = \frac4\pic\vec\mathbfj \\
\nabla \cdot \vec\mathbfE & = 4 \pi \rho \\
\nabla \times \vec\mathbfE\, +\, \frac1c\, \frac\partial\vec\mathbfB\partial t & = \vec\mathbf0 \\
\nabla \cdot \vec\mathbfB & = 0
\endalign
呈现给:
【讨论】:
这确实是最简单、最干净的方法。【参考方案6】:有一天我在使用 colab 时遇到了这个问题。我发现最轻松的方法就是在打印之前运行这段代码。那时一切都像魅力一样。
from IPython.display import Math, html
def load_mathjax_in_cell_output():
display(HTML("<script src='https://www.gstatic.com/external_hosted/"
"mathjax/latest/MathJax.js?config=default'></script>"))
get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)
import sympy as sp
sp.init_printing()
结果如下:
【讨论】:
【参考方案7】:LaTeX 参考资料:
Udacity 的博客有我见过的 Best LaTeX Primer:它清楚地展示了如何以易于阅读和易于记忆的方式使用 LaTeX 命令! 强烈推荐。
This Link has Excellent Examples 显示代码和渲染结果! 您可以使用此站点通过示例快速学习如何编写 LaTeX。
还有,这是一个快速的Reference for LaTeX 命令/符号。
总结:在 Jupyter/IPython 中表示 LaTeX 的各种方法:
Examples 用于 Markdown 单元:
内联,换行:$
The equation used depends on whether the the value of
$Vmax$ is R, G, or B.
阻止,换行:$$
$$H← 0 + \frac30(G−B)Vmax−Vmin , if Vmax = R$$
阻止,换行:\beginequation
和 \endequation
\beginequation
H← 60 + \frac30(B−R)Vmax−Vmin , if Vmax = G
\endequation
阻止,换行:\beginalign
和 \endalign
\beginalign
H←120 + \frac30(R−G)Vmax−Vmin , if Vmax = B
\endalign
Examples 用于代码单元:
LaTex Cell: %%latex
魔法命令将整个单元格变成一个LaTeX Cell
%%latex
\beginalign
\nabla \cdot \vec\mathbfE & = 4 \pi \rho \\
\nabla \times \vec\mathbfE\, +\, \frac1c\, \frac\partial\vec\mathbfB\partial t & = \vec\mathbf0 \\
\nabla \cdot \vec\mathbfB & = 0
\endalign
数学对象传入一个原始 LaTeX 字符串:
from IPython.display import Math
Math(r'F(k) = \int_-\infty^\infty f(x) e^2\pi i k dx')
乳胶类。注意:您必须自己包含分隔符。这允许您使用其他 LaTeX 模式,例如 eqnarray
:
from IPython.display import Latex
Latex(r"""\begineqnarray
\nabla \times \vec\mathbfB -\, \frac1c\, \frac\partial\vec\mathbfE\partial t & = \frac4\pic\vec\mathbfj \\
\nabla \cdot \vec\mathbfE & = 4 \pi \rho \\
\nabla \times \vec\mathbfE\, +\, \frac1c\, \frac\partial\vec\mathbfB\partial t & = \vec\mathbf0 \\
\nabla \cdot \vec\mathbfB & = 0
\endeqnarray""")
Docs for 原始细胞:
(对不起,这里没有例子,只是文档)
原始单元格 原始单元格提供了一个可以直接写入输出的地方。笔记本不评估原始单元格。当通过
nbconvert
时,原始单元以未修改的目标格式到达。例如,这允许您将完整的 LaTeX 输入到原始单元格中,只有在nbconvert
转换后才能由 LaTeX 呈现。
其他文档:
对于 Markdown 单元,引用自 Jupyter Notebook docs:
在 Markdown 单元格中,您还可以使用标准 LaTeX 表示法以简单的方式包含数学:$...$ 用于内联数学 和 $$...$$ 用于显示数学。执行 Markdown 单元格时,LaTeX 部分会自动在 HTML 输出中呈现为具有高质量排版的方程式。这是由 MathJax 实现的,它支持大部分 LaTeX 功能
由 LaTeX 和 AMS-LaTeX(amsmath 包)定义的标准数学环境也可以工作,例如 \beginequation...\endequation 和 \begin 对齐...\end对齐。可以使用标准方法定义新的 LaTeX 宏,例如 \newcommand,方法是将它们放在 Markdown 单元格中数学分隔符之间的任何位置。然后,这些定义将在 IPython 会话的其余部分中可用。
【讨论】:
Udacity 页面的链接失效了。【参考方案8】:minrk 给出的答案(为了完整性而包含在内)很好,但还有另一种我更喜欢的方式。
您还可以通过在文本单元格的第一行输入%%latex
将整个单元格呈现为LaTeX
。这很有用,如果你
minrk的回答:
IPython notebook 使用MathJax 进行渲染 html/markdown 中的 LaTeX。只需将您的 LaTeX 数学运算放入
$$
。$$c = \sqrta^2 + b^2$$
或者您可以显示来自 Python 的 LaTeX / Math 输出,如下所示 notebook tour的结尾:
from IPython.display import display, Math, Latex display(Math(r'F(k) = \int_-\infty^\infty f(x) e^2\pi i k dx'))
【讨论】:
【参考方案9】:如果您的主要目标是做数学运算,SymPy 会为看起来很棒的函数式乳胶表达式提供 an excellent approach。
【讨论】:
【参考方案10】:因为,即使在使用 %%latex 关键字或 $..$ 限制器后,我也无法在 Code 中使用所有 Latex 命令,因此我安装了 nbextensions,通过它我可以在 Markdown 中使用 latex 命令。按照此处的说明进行操作:https://github.com/ipython-contrib/IPython-notebook-extensions/blob/master/README.md 然后重新启动 Jupyter,然后重新启动 localhost:8888/nbextensions,然后激活“Jupyter 的乳胶环境”,我可以运行许多乳胶命令。示例在这里:https://rawgit.com/jfbercher/latex_envs/master/doc/latex_env_doc.html
\sectionFirst section
\textbfHello
$
\beginequation
c = \sqrta^2 + b^2
\endequation
$
\beginitemize
\item First item
\item Second item
\enditemize
\textbfWorld
如您所见,我仍然无法使用 usepackage。但也许以后会改进。
【讨论】:
latex_envs 笔记本扩展不能使用外部 LaTeX 包或样式;它不包括编译器,而只是识别一些关键字、结构并进行适当的 html 替换。感谢您使用它。现在使用 pip 安装 ipython-contrib 笔记本扩展更加容易。【参考方案11】:这出现在我刚刚进行的搜索中,通过更多搜索找到了一个更好的解决方案,IPython 笔记本现在有一个 %%latex
魔法,可以使整个单元格 Latex 没有 $$
包装每一行。
请参阅笔记本浏览Rich Display System
【讨论】:
在 Jupyter 中,它在 markdown 单元格中不起作用,但在代码单元格中起作用。 现在正在研究木星。我将 %%latex 放在一个单元格中,然后导入from IPython.display import Latex
。之后,Jupyter notebook 会识别 Latex 表示法。【参考方案12】:
IPython notebook 使用MathJax 在 html/markdown 中渲染 LaTeX。只需将您的 LaTeX 数学运算放入 $$
。
$$c = \sqrta^2 + b^2$$
或者您可以显示来自 Python 的 LaTeX / Math 输出,如 notebook tour 末尾所示:
from IPython.display import display, Math, Latex
display(Math(r'F(k) = \int_-\infty^\infty f(x) e^2\pi i k dx'))
【讨论】:
我认为 OP 希望使用 LaTeX 而不是 Markdown,而不仅仅是用于方程式。我对这个请求表示同情——就像我喜欢 Markdown 一样,对于复杂的文档,我总是使用 LaTeX。 明白了。现在最好的解决方案是使用“原始”单元格而不是降价,然后像你一样输入 LaTeX。然后使用nbconvert 将 ipynb 转换为 TeX(代码、图形和所有),并运行 Latex 将其渲染为 PDF 等。您不会像使用 MathJax / Markdown 那样在浏览器中获得实时渲染的 TeX,但是您仍然在一个文档中包含 TeX / 代码。 同样的问题,但在 qtconsole 中 并使用单 $(而不是双 $$)来保持等式一致。 ***.com/q/19412644/1224255 您还可以通过在文本单元格的第一行输入%%latex
将整个单元格呈现为LaTeX
。【参考方案13】:
您可以选择一个要降价的单元格,然后编写由 mathjax 解释的乳胶代码,正如上面一位响应者所说。
另外,iPython notebook 教程的 Latex 部分很好地解释了这一点。
你可以这样做:
from IPython.display import Latex
Latex(r"""\begineqnarray
\nabla \times \vec\mathbfB -\, \frac1c\, \frac\partial\vec\mathbfE\partial t & = \frac4\pic\vec\mathbfj \\
\nabla \cdot \vec\mathbfE & = 4 \pi \rho \\
\nabla \times \vec\mathbfE\, +\, \frac1c\, \frac\partial\vec\mathbfB\partial t & = \vec\mathbf0 \\
\nabla \cdot \vec\mathbfB & = 0
\endeqnarray""")
或者这样做:
%%latex
\beginalign
\nabla \times \vec\mathbfB -\, \frac1c\, \frac\partial\vec\mathbfE\partial t & = \frac4\pic\vec\mathbfj \\
\nabla \cdot \vec\mathbfE & = 4 \pi \rho \\
\nabla \times \vec\mathbfE\, +\, \frac1c\, \frac\partial\vec\mathbfB\partial t & = \vec\mathbf0 \\
\nabla \cdot \vec\mathbfB & = 0
\endalign
更多信息可在此link
【讨论】:
您的链接现在已损坏 这里有很好的例子:jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/…【参考方案14】:如果您希望数学显示在一行中,请使用 $$,例如,
$$a = b + c$$ (line break after the equation)
如果您在数学运算后不需要换行符,请使用单个美元符号 $,例如,
$a = b + c$ (no line break after the equation)
【讨论】:
以上是关于如何在 IPython Notebook 中编写 LaTeX?的主要内容,如果未能解决你的问题,请参考以下文章