在Django中渲染乳胶/ mathjax方程

时间:2019-12-12 07:26:03

标签: python django python-3.x latex mathjax

我想做的第一件事是足够,感谢所有花时间阅读本文的人。该帖子看起来很长,但这主要是因为我用要点格式对其进行了格式化,并且我希望尽可能详细,并提供一个最小的工作示例。这是我第一次从事独立的编码项目,也是我第一次在Stack Exchange上发表文章,因此即使我检查不违反任何规则,也可能错过了一些东西。

我正在做我的第一个django项目(应该是一个简单的博客),我想我遇到了许多未知的未知数。 我想要: -在我使用的文章模板中渲染[; \ LaTeX]样式的数学公式。该模板是一个HTML文件,可以找到源代码here。它扩展了this base template

我尝试过

在这一点上,我感到绝望。然后,我尝试了:

  • django-tex
  • django-latexify
  • I read this stack exchange post and it almost made sense
  • this post in /r/django which does say to use mathjax, but I unfortunately have been failing at this so far 基于所有这些,我有一些问题希望大家能帮助我。
    1. 假设您想在python中做某事。您在github上发现了一个随机软件包,声称可以为您完成此操作,但是您从未听说过它,并且两年内都没有更新。你相信吗如果项目/目标要求使用的软件包不是您知道可以信任的规范软件包(例如numpy)之一,那么如何为项目/目标选择软件包?
    2. 为什么MathJax是将乳胶样式方程式合并到网站/ HTML / CSS的最佳方法
    3. 我觉得第一个软件包应该有用,也许我在虚拟环境中犯了一个错误。有没有办法确认这一点(对不起,我知道这很模糊)
    4. 最重要:鉴于我已经尝试了很多不同的东西,但没有一个起作用,我该如何确定下一步是什么。我的模板是HTML文件这一事实是否应该指导我?
    5. 如果我的困境的答案在MathJax文档或Django文档中,我将如何有效地进行搜索?

2 个答案:

答案 0 :(得分:1)

恭喜您发表了第一篇SO帖子。我想说的是,您是在提问题的时候钉上钉子的。 nitpick,我将内联代码。

很不幸,main mirror that mathjax advertises from Cloudflare似乎现在无法访问(给我一个403),所以可能是造成您的问题。

Django模板呈现HTML,最终您只是呈现HTML页面。尝试在浏览器中本地运行以下HTML文件。它应该工作。 Django使用模板所做的所有工作都是动态注入我在此处进行硬编码的正文:本质上,您只需要呈现一个字符字段(而不是硬编码),就可以了。

<html>
<head>
  <script type="text/javascript" id="MathJax-script" async
    src="https://cdn.jsdelivr.net/npm/mathjax@3.0.0/es5/tex-mml-chtml.js">
  </script>
</head>
<body>
  $$x=\frac{-b+\sqrt{b^2-4ac}}{2a}$$
</body>
</html>

  

您在github上找到了一个随机软件包,声称可以为您完成此操作,但是您从未听说过它,并且两年内都没有更新。你相信吗

这实际上是一个棘手的问题,如果有人出现并给出明确的答案,我将感到惊讶。我会视具体情况而定。在这种情况下,如果您深入研究源代码,则基本上整个库就是这个one file。该库实际上只是注入mathjax脚本。因此,简而言之,在这种情况下,我不会理会该库。

答案 1 :(得分:1)

我将冒险在一方面扩展模板文件。 Django没有通用的基本模板可能很可惜,如果它不能满足需要,就必须积极地替换它。早晚都需要一个,如果安装Django给了您一个规范的典范,并且所有初学者教程都使用了它,那将是一个很好的选择。

无论如何,以肯特·志摩(Kent Shikama)的回答为例,我网站的生成其html的模板看起来像

{% extends "myproject/base.html" %}

{% block extrascripts %}
  <script type="text/javascript" id="MathJax-script" async
    src="https://cdn.jsdelivr.net/npm/mathjax@3.0.0/es5/tex-mml-chtml.js">
  </script>
{% endblock extrascripts %}

{% block content %}
$$x=\frac{-b+\sqrt{b^2-4ac}}{2a}$$
{% endblock content %}

关于base.html可能是什么,一个简单的将产生该答案中的html以及一些HTML注释的

<html>
<head>
{% block scripts %}
<!-- put here any scripts (such as JQuery ) that you want to be loaded 
     UNLESS the specific template requires otherwise 
     by overriding this block. Add scripts via extrascripts below. 
-->
{% endblock scripts}
{% block extrascripts %}{%endblock extrascripts%}

{% block css %}
<!-- put here any CSS styling you want to be loaded 
     UNLESS the specific template requires otherwise, 
     by overriding this block. Add extra styling via extracss below. 
-->
{% endblock css %}
{% block extracss %}{% endblock extracss %}

</head>

<body> 
  {% block content %}{% endblock content %}
</body>
</html>

如果这是一个数学博客项目,则可以将MathJax脚本从该单个模板提升为base.html中的块scripts。这样,您的模板将仅包含一个content块,并可以自由使用MathJax。

关键是,您的特定页面模板只需要包含与项目中每个页面使用的脚本和样式不同的脚本和样式。然后,只需更改该基本html,即可重新设置整个网站的样式。

在现实世界中,扩展base.html并依次由单个页面模板扩展的中间级别的模板很常见,因此可以指定整个页面类别而无需重复。