如何 运行 HTML 包含带有转义字符的 LaTeX 公式的脚本作为 Jupyter Notebook 中的代码

How to run HTML script that contains LaTeX formulas with escape characters as code in Jupyter Notebook

我正在尝试 运行 Jupyter Notebook 中的一些 HTML 模板来帮助我组织数学证明。

如果我在文本单元格中 运行 我的 HTML sript 它将显示我预期的输出。例如,

<ul>
    <li>EN: this is a $\triangle ABC$</li>
    <li>LT: čia yra $\triangle ABC$ </li>
</ul>

显示

我有很多 HTML 这样的模板,所以我想 运行 在代码单元格中使用它们,如下所示:

from IPython.display import display, HTML
template = \
'''<ul>
    <li>EN: this is a $\triangle ABC$</li>
    <li>LT: čia yra $\triangle ABC$ </li>
</ul>'''
display(HTML(template))

不幸的是,它删除了我的 LaTeX 脚本中的转义字符:

如何解决这个问题?


请注意,修复它的一个技巧是在 template 中添加额外的 \ 个字符:

template = \
'''<ul>
    <li>EN: this is a $\triangle ABC$</li>
    <li>LT: čia yra $\triangle ABC$ </li>
</ul>'''

但是,我不想修改我的 template 变量脚本,因为我想以与在 LaTeX 中相同的方式键入我的公式,而不需要额外关心转义字符。

至少对于提供的示例,您希望文档字符串被视为原始的,因此您的第一个代码块应该如下所示:

from IPython.display import display, HTML
template = \
r'''<ul>
    <li>EN: this is a $\triangle ABC$</li>
    <li>LT: čia yra $\triangle ABC$ </li>
</ul>'''
display(HTML(template))

不同的是docstring前面的r。参见 here or here

"Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and treat backslashes as literal characters." [SOURCE]

然后 \t 不会被视为制表符,也不需要转义。

可以实现一些逻辑,以简单的方式识别数学模式并转义其中的 unicode:

def fix_mathmode(text):
    text_asbytearray = bytearray(text, 'utf-8')
    dollar_positions = [i for i, b in enumerate(text_asbytearray) if b==ord('$')]
    math_groups = tuple(zip(dollar_positions[0::2], dollar_positions[1::2]))

    for start, end in reversed(tuple(math_groups)):
        formula = text_asbytearray[start:end+1]
        formula_asbytearray = formula.decode().encode('unicode_escape')
        text_asbytearray[start:end+1] = formula_asbytearray
    return str(text_asbytearray, 'utf-8').expandtabs(4)

template = '''<ul>
\t<li> EN: this is a $\triangle ABC$ </li>
\t<li> LT: čia yra $\triangle ABC$ </li>
</ul>'''

>>> print(fix_mathmode(template))  
<ul>
    <li> EN: this is a $\triangle ABC$ </li>
    <li> LT: čia yra $\triangle ABC$ </li>
</ul>

>>> print(template.expandtabs(4))
<ul>
    <li> EN: this is a $    riangle ABC$ </li>
    <li> LT: čia yra $  riangle ABC$ </li>
</ul>

但是,它只适用于简单的情况($...$ 而不是 $$...$$)。我不确定一般情况下是否有一种简单的方法可以做到这一点,所以我同意@Wayne 的解决方案。