如何为iPython笔记本配置mathjax?

10

我正在尝试找到一种方法,使得Mathjax在我的iPython笔记本中用不使用STIX字体来渲染公式。而是我更喜欢使用“TeX”字体。根据Mathjax的文档,我应该使用:

MathJax.Hub.Config({
  "HTML-CSS": {
    preferredFont: "TeX"
  }
});

话虽如此,我不确定该把这个放在哪儿。我已经尝试将这一大块代码放入我的自定义.js文件中,涉及到我的特定ipython配置文件,但它不起作用。理想情况下,我想为MathJax进行ipython配置文件的特定调整。

6个回答

11

我最近遇到了同样的问题。我不太喜欢默认的STIX-Web字体来呈现方程式。经过一段时间的尝试后,我找到了一种方法来更改Jupyter Notebook中的MathJax字体。我的Jupyter Notebook版本是4.3.1,附带在Anaconda中。我假设其他版本的解决方案应该类似。

我尝试编辑custom.js,分别在/notebook/static/custom/custom.js~/.jupyter/custom/custom.js中。都没有起作用。我还尝试编辑mathjaxutils.js。它什么也没做。最后我看到了这篇文章https://github.com/jupyter/help/issues/109。我意识到Jupyter使用main.min.js来读取MathJax配置。所以这里是解决方案:

  • Github(https://github.com/mathjax/MathJax)下载MathJax
  • 解压MathJax文件并进入文件夹
    • jax/output/HTML-CSS/fonts/TeX复制到目录../notebook/static/components/MathJax/jax/output/HTML-CSS/fonts/
    • fonts/HTML-CSS/TeX复制到目录../notebook/static/components/MathJax/fonts/HTML-CSS/
  • 打开../notebook/static/notebook/js/main.min.js,搜索availableFonts。它应该在第14894行左右。将其更改为

    ...
    availableFonts: ["STIX-Web","TeX"],
    imageFont: null;
    preferredFont: "TeX",
    webFont: "TeX"
    ...
    
  • 刷新笔记本电脑。

1
我点了赞,但这只是一个猴子补丁答案,而不是正确答案(似乎未知)。 - Jason S
说句闲话,MathJax不再具有这种结构了;您需要运行 git checkout legacy-v2 来访问 MathJax v2 源代码。 - Jason S

4
Jupyter自带一个较小的MathJax版本,因此无法找到(Computer Modern)“TeX”字体 - 只有STIX字体。要解决这个问题,可以按照以下步骤进行操作:1.下载MathJax 2.7并复制jax目录;2.将复制的jax目录替换为Jupyter的jax目录:对于默认环境:~/anaconda3/lib/python3.7/site-packages/notebook/static/components/MathJax/jax;对于不同的环境:~/anaconda3/envs//lib/python3.7/site-packages/notebook/static/components/MathJax/jax;3.重新启动Jupyter,在数学公式上右键单击,切换“Math Renderer”为SVG。

如果您的Python版本不是3.7,请在路径中进行调整;如果您使用的是Miniconda,则路径应为~/opt/miniconda3/lib/...


3

一个简单的测试来确保你得到了正确的配置是将 preferredFont: "TeX" 更改为 scale: 200。然后保存并重新加载笔记本。数学公式应该比以前明显更大。所以假设这个操作成功了,那么它意味着你的 config.js 已经按照需要进行了配置。

现在,更重要的是,尝试添加另一行使你的配置看起来像

MathJax.Hub.Config({
  "HTML-CSS": {
    availableFonts: ["TeX"],
    preferredFont: "TeX",
  }
});

请注意,在保存后,请务必完全刷新笔记本页面。这会覆盖(我猜测的是)可用字体变量 availableFonts 的默认值,如果mathjax找不到TeX,则允许使用STIX。我不确定为什么它似乎忽略了首选字体,但这似乎更像是一个mathjax问题而不是ipython问题。
因此,如果它仍然不是TeX字体(mathjax似乎称之为MathJax_Math-Italic.otf或类似),我猜测mathjax只是找不到该字体,并可能退回到其他东西。如果是这种情况,则您的mathjax安装存在问题。

1
config.js应该放在哪里? - Jason S
1
如果在 ~/.jupyter/custom/custom.js 中它不起作用,请返回已翻译的文本。 - Jason S
我猜有些东西已经改变了。你可以通过在~/.jupyter/custom/custom.js文件中放置一些console.log消息来验证它确实被读取了。但是MathJax配置似乎没有任何效果。他们似乎每隔几分钟就会改变配置方式。这非常令人沮丧。 - Mike
是的,据我所知,问题不在于配置,而在于 TeX 字体实际上默认情况下并不存在(请参见我的答案和 Stefan Shi 的答案)。 - Jason S
我认为不仅仅是这个原因,因为其他配置也无法正常工作,即使它们不依赖于字体。例如,我有一个 TeX: {Macros: {}} 部分,但是所定义的宏都不可用。日志中没有任何关于此的消息... - Mike

2

我稍微修改了@Stefan Shi的答案,使其更加简单易懂,至少在你安装了命令行svn工具的情况下。

  • Put the following into a script file called install_tex_fonts (install_tex_fonts.bat in Windows-land):

    svn export https://github.com/mathjax/MathJax/trunk/fonts/HTML-CSS/TeX/woff fonts/HTML-CSS/TeX/woff
    svn export https://github.com/mathjax/MathJax/trunk/jax/output/HTML-CSS/fonts/TeX jax/output/HTML-CSS/fonts/TeX
    
  • Move the script file into {PYTHON}/Lib/site-packages/notebook/static/components/MathJax where {PYTHON} is the root directory where you installed Python

  • Open a shell (command prompt) in this directory
  • Run the script by typing install_tex_fonts (or ./install_tex_fonts on *nix systems; I guess you also have to chmod a+x it)
  • Add the following section in your ~/.jupyter/custom/custom.js file (the $([IPython.events]).on('app_initialized.NotebookApp') line should already be there):

    $([IPython.events]).on('app_initialized.NotebookApp', function(){
    
      MathJax.Hub.Config({
        "HTML-CSS": {
            availableFonts: ["TeX"],
            preferredFont: "TeX",
            webFont: "TeX"
        }
       });
    

2

0

根据 @Ian 的信息,您可以使用以下代码从 Python 获取初始的 HTML-CSS MathJax 配置(demjson 是一个软要求,允许我们在 JavaScript 文件中部分处理 json:pip install demjson):

import sys
from pathlib import Path

MathJax_cfg_pth = (
    Path(sys.executable).parents[0] /
    # below path may differ
    'Lib/site-packages/notebook/static/components/MathJax/jax/output/HTML-CSS/config.js'
)
with open(MathJax_cfg_pth, 'r') as f:
    MathJax_cfg = f.read()

import demjson
start_cfg = MathJax_cfg.find("config:{") + 7
open_braces = 0
for i, c in enumerate(MathJax_cfg[start_cfg:]):
    if c == '{':
        open_braces += 1
    elif c == '}':
        if open_braces == 0:
            break
        open_braces -= 1
initial_configuration = demjson.decode(
    MathJax_cfg[
        start_cfg : start_cfg + i
    ].replace("(", "'(").replace(")", ")'")
)

如果您想在不重新启动笔记本内核的情况下撤消任何更改,拥有这将是有帮助的。对于好奇心,我的initial_configuration在这里:https://pastebin.com/JkatcrAC

接下来,我们可以通过显示包含短脚本的HTML来更新当前运行时的HTML-CSS MathJax设置。如果您想要更新HTML-CSS显示的大小,可以使用以下函数:

from IPython.core.display import HTML
MathJax_scale_script = """
<script>
    MathJax.Hub.Config({
        "HTML-CSS": {
            scale: %s
        }
    });
</script>
"""
def update_Math_size(size):
    # 100 is default
    display(HTML(MathJax_scale_script%size))

例如,update_Math_size(200) 可以将尺寸加倍,而update_Math_size(100) 可以恢复默认设置。

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