如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?

Posted

技术标签:

【中文标题】如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?【英文标题】:How to Enable MathJax Upgreek in jupyter/ipython notebook? 【发布时间】:2021-12-27 12:14:12 【问题描述】:

我已经查看了各种相关问题,包括

How do I get MathJax to enable the mhchem extension in ipython notebook IPython (Jupyter) MathJaX preamble

但我无法让它工作......

我的测试用例很简单

from IPython.display import display, html, Math, Latex    
display(Math(r'\uppi'))

期待直立 $\pi$,但目前只恢复原始的 '\uppi'。

我已经尝试了以下使用细胞魔法

%%javascript
<script type="text/Javascript">
MathJax.Hub.Config(
  loader: load: ['[tex]/upgreek'],
  tex: packages: '[+]': ['upgreek']
);
</script>

生成Javascript Error: Unexpected token '&lt;'

%%javascript
MathJax.Hub.Config(
  loader: load: ['[tex]/upgreek'],
  tex: extensions: ['require.js'], packages: '[+]': ['upgreek']
);

没有抛出错误但似乎没有任何效果

%%javascript
window.MathJax = 
  loader: load: ['[tex]/upgreek'],
  tex: packages: '[+]': ['upgreek']
;

这似乎也没有达到预期的效果

问题:我不想在笔记本之外修改配置/javascript 文件。如何在 jupyter notebook 中动态启用 MathJax upgreek?

(目前在jupyterlab 3.2.2,windows 10下python 3.8.10)

【问题讨论】:

【参考方案1】:

这并没有解决 OP 的基本问题,该问题与在 jupyter 中安装 MathJax 扩展的控制有关,但它确实解决了目标:改变希腊符号的呈现外观(但可以应用于其他字体-相关需求)

更新 以下将为所有大写和小写希腊字符创建 TeX 宏,如果可以安装,Upgreek 中也可以使用。

from IPython.display import display, Math

# Using codes from https://unicode-table.com/en/sets/greek-symbols/, create dictionaries of unicodes keyed by character names
grLcUpChars = [rf'\unicodecode' for code in range(0x3B1, 0x3CA) if code != 0x3C2]  # omit 'final sigma'
grUcUpChars = [rf'\unicodecode' for code in range(0x391, 0x3AA) if code != 0x3A2]  # omit omitted code for 'final sigma' in uppercase
grCharNames = ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta', 'theta', 'iota', 'kappa', 'lambda',
               'mu', 'nu', 'xi', 'omicron', 'pi', 'rho', 'sigma', 'tau', 'upsilon', 'phi', 'chi', 'psi', 'omega']

zipIt = zip(grCharNames, grLcUpChars)
grLcUpDict = dict(zipIt)
zipIt = zip(grCharNames, grUcUpChars)
grUcUpDict = dict(zipIt)

# Generate the MathJax code to create 'macro' definitions for upright greek characters
# See e.g. https://docs.mathjax.org/en/latest/input/tex/macros.html
# Paste output text from $ to $ inclusive into a markdown cell and execute it
print('$')
for grCharName in grCharNames:
    print(fr'    \def\UpgrCharNamegrLcUpDict[grCharName]')

for grCharName in grCharNames:
    print(fr'    \def\UpgrCharName.title()grUcUpDict[grCharName]')

print('$')

为 Markdown 单元生成 TeX 宏:

$
    \def\Upalpha\unicode945
    \def\Upbeta\unicode946
    \def\Upgamma\unicode947
    \def\Updelta\unicode948
    \def\Upepsilon\unicode949
    \def\Upzeta\unicode950
    \def\Upeta\unicode951
    \def\Uptheta\unicode952
    \def\Upiota\unicode953
    \def\Upkappa\unicode954
    \def\Uplambda\unicode955
    \def\Upmu\unicode956
    \def\Upnu\unicode957
    \def\Upxi\unicode958
    \def\Upomicron\unicode959
    \def\Uppi\unicode960
    \def\Uprho\unicode961
    \def\Upsigma\unicode963
    \def\Uptau\unicode964
    \def\Upupsilon\unicode965
    \def\Upphi\unicode966
    \def\Upchi\unicode967
    \def\Uppsi\unicode968
    \def\Upomega\unicode969
    \def\UpAlpha\unicode913
    \def\UpBeta\unicode914
    \def\UpGamma\unicode915
    \def\UpDelta\unicode916
    \def\UpEpsilon\unicode917
    \def\UpZeta\unicode918
    \def\UpEta\unicode919
    \def\UpTheta\unicode920
    \def\UpIota\unicode921
    \def\UpKappa\unicode922
    \def\UpLambda\unicode923
    \def\UpMu\unicode924
    \def\UpNu\unicode925
    \def\UpXi\unicode926
    \def\UpOmicron\unicode927
    \def\UpPi\unicode928
    \def\UpRho\unicode929
    \def\UpSigma\unicode931
    \def\UpTau\unicode932
    \def\UpUpsilon\unicode933
    \def\UpPhi\unicode934
    \def\UpChi\unicode935
    \def\UpPsi\unicode936
    \def\UpOmega\unicode937
$

为了清晰和测试,在另一个单元格中,这将列出定义的宏名称并显示大小写字母

grLcAlphabetMathJax = [fr'\UpgrCharName' for grCharName in grCharNames]
grUcAlphabetMathJax = [fr'\UpgrCharName.title()' for grCharName in grCharNames]
display(grLcAlphabetMathJax)
display(grUcAlphabetMathJax)
display(Math(''.join(grLcAlphabetMathJax)))
display(Math(''.join(grUcAlphabetMathJax)))

从而有效地复制Upgreek;跳过列表它的输出是:

αβγδεζηθικλμνξοπρστυφχψω ΑΒΓΔΕZΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ

取代原来的 解决方法:参考this excellent MathJax/TeX documentation,我们找到了 MathJax 的 \unicode 指令,并通过 this site 找到了竖立 Pi 符号的代码(例如)。

这将允许在笔记本单元格中,from IPython.display import display, HTML, Math, Latex 之后进行以下操作

display(Math(r'\unicode[Segoe UI]x03C0'))

生成π

display(Math(r'\unicode[familySTIXMathJax_Normal-italic]x03C0'))

生成斜体?(尝试切换到familySTIXMathJax_Normal 似乎没有影响!?)

而普通的display(Math(r'\pi'))生成?

【讨论】:

以上是关于如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?的主要内容,如果未能解决你的问题,请参考以下文章

如何重置Jupyter / IPython输入提示编号?

如何将 python3 内核添加到 jupyter (IPython)

如何重置 Jupyter/IPython 输入提示编号?

在笔记本中组合jupyter / ipython内核

在 jupyter/iPython notebook 脚本和类方法之间同步代码

window下安装jupyter,ipython的方法