76

我有一个 Jekyll 博客,我想使用 MathJax,因为我希望能够输入类似

$$\sum_{n=1}^\infty 1/n^2 = \frac{\pi^2}{6}$$

在我的降价文件中,并使用 MathJax 生成正确的 LaTeX 表达式,其方式与在math.stackexchange中的完成方式类似。

最简单的方法是什么?目前我的目录中有文件jsmath.js (GitHub gist),我想我可以mathjs在我的_includes目录中有一个简单的文件命名为

<script src="path/to/jsmath.js></script>

并将其包含在每个帖子中

{% include mathjs %}

但这似乎不起作用 - 当我运行jekyll --server页面时生成,但没有任何内容可见。

我会以正确的方式解决这个问题吗?有没有更好的方法将 MathJax 与 Jekyll 一起使用?

4

8 回答 8

53

当然,您可以将 mathjax 与 Jekyll 一起使用。要使其正常工作,请确保

  1. 如果你用 markdown 写你的文章,你的 markdown 解释器不会敲击你的 mathjax 输入。我发现保护它的最好方法是始终将显示数学放在<div>元素中,将内联数学放在<span>元素中,大多数降价解释器都会不理会。
  2. javascript 行是否在 html 源代码中正确显示?我发现指向 mathjax CDN 比提供我自己的副本更容易、更快捷。尝试使用该行

    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

(这些配置选项允许您使用更多的 tex 表示法来启动您的数学环境,例如\begin{equation}等)。

jsmath.js也许您的脚本有问题;CDN 版本会更快,可能更可靠。(我在每个页面的页脚中都加载了 javascript,但是如果您不想在不需要的时候加载 javascript,那么使用 include 的策略当然是有意义的。)

如果您给我们一个指向您博客的链接,我们可以提供更多帮助吗?您可以在我的博客上看到一些示例(如果有帮助,也可以在 github 上链接到 Jekyll 设置)。

于 2012-06-19T01:37:53.900 回答
51

如果您对发布过程有足够的控制权(例如,您自己运行 Jekyll),一个简单的解决方案是将 markdown 解析器切换到支持 TeX 的解析器。例如,使用kramdown

gem install kramdown

markdown将行更改_config.yml

markdown: kramdown

并添加类似

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

_layouts/default.html. 现在您可以简单地用 标记您帖子中的任何数学$$

于 2013-11-20T19:31:32.713 回答
11

如果您将kramdown其用作降价风格,那很容易。Kramdown 内置了对mathjax.

  1. </head>在默认布局中的标记之前添加它。

    <script type="text/javascript" async 
    src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?
    config=TeX-AMS-MML_HTMLorMML"></script>
    
  2. _config.yml在行之后将其设置为 true markdown: kramdown

    mathjax: true
    
  3. 完毕。用于渲染 Mathjax

    • 内联,使用\( ... \)
    • 阻止,使用\[ ... \]

      唯一需要注意的是使用 markdown 时反斜杠的转义,因此分隔符分别变为\\( ... \\)\\[ ... \\]联和块数学。

  4. 这是MathJax 内联渲染的示例\\( 1/x^{2} \\),这里是块渲染: \\[ \frac{1}{n^{2}} \\]

我在我的博客上使用它。

于 2017-09-21T16:46:55.640 回答
6

不久前我写了一篇关于设置 MathJax 的博客文章:Latex Math Magic

本质上,您必须阻止 Markdown与 MathJax混淆。

我最终使用了代码块,这对我来说很好。因此,在你写东西之前至少使用 4 个空格或使用锐角符号:`; 不幸的是,MathJax<code>默认跳过标签,因为它不想转换它不应该转换的代码。

因此,您必须在主布局文件的某处添加一些 javascript 代码:

MathJax.Hub.Config({
  tex2jax: {
    skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
  }
});

此外,我们必须告诉 MathJax 忽略非乳胶代码块或普通代码块:

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
    }
});

在他看来,我们所有的乳胶代码块都将在其类名中包含 has-jax 字符串。因此,我们可以在我们的 CSS 表单中应用一些简单的样式来赋予它自己的样式。

code.has-jax {font: inherit; font-size: 100%; background: inherit; border: inherit;}

可能不是最好的方法,但它在过去几年中对我的博客有用,而且我从未遇到任何进一步的问题。

于 2013-06-26T09:02:48.563 回答
2

你可以试试我的静态博客生成器:Jekyde。Jekyde 类似于 Jekyll,但它很好地处理了 Markdown 文件中的 LaTeX。您只需要将公式放入 $...$ 和 $$...$$ 中。Jekyde 还包含一个带有 LaTeX 预览的浏览器中的降价编辑器。

于 2013-06-01T01:17:33.043 回答
2

Jekyll 使用 kramdown 作为 2.0+ 的默认降价转换器。而且它不支持mathjax等,我认为下面的内容可以帮助你。

jekyll-spaceship - 一个 Jekyll 插件,为 table、mathjax、plantuml、youtube、vimeo、dailymotion 等提供强大的支持。

https://github.com/jeffreytse/jekyll-spaceship

将您的数学表达式放在 $...$ 内

$\LaTeX{}$
$\Pi$
$ a * b = c ^ b $
$ 2^{\frac{n-1}{3}} $
$ \int\_a^b f(x)\,dx. $

上面的代码将被解析为:

在此处输入图像描述

于 2019-12-30T03:48:58.097 回答
0

在尝试以下任一选项之前的一些注意事项

即使在大多数情况下,选项0也会增加构建时间,--incremental而且实际上选项1可能会被使用,但是,如果您在客户端可能无法访问 CDN 的网络上进行部署,那么这以及占用的额外空间可能值得付出代价。

这两个选项都已在私有服务器上进行了测试,并在项目文件中设置kramdown了降价解释器;请参阅Soham Bhattacharyya的回答步骤及其前言,以及Caramdir的前两个代码块,了解这些位的操作方法。mathjax: true_config.yml2

选项0下载并复制解压后的源码到project-name

  1. 下载源
cd ~
mkdir -p git/hub && cd git/hub
git clone --depth 1 https://github.com/mathjax/MathJax.git
  1. 在您的项目中创建一个目录路径并将文件复制MathJax/unpacked到该路径
cd ~
mkdir -p git/lan/project-name/assets/JS_3rd_Party/MathJax
cp -r git/hub/MathJax/unpacked/* git/lan/project-name/assets/JS_3rd_Party/MathJax/
  1. 将源添加到git跟踪
cd git/lan/project-name/
git add assets/JS_3rd_Party/MathJax
git commit -m 'Added MathJax.js unpacked source to git tracking'
  1. 编写包含文件
tee ./_includes/MathJax.html 1>/dev/null <<EOF
{%- if jekyll.environment == 'production' and site.mathjax == true -%}
  <script type="text/javascript" src="{{'/assets/javascripts/JS_3rd_Party/latest.js?config=TeX-AMS-MML_HTMLorMML' | relative_url}}"></script>
{%- elsif jekyll.environment != 'production' and site.mathjax == true -%}
  <script type="text/javascript" src="{{'/assets/javascripts/JS_3rd_Party/MathJax.js?config=TeX-AMS-MML_HTMLorMML' | relative_url}}"></script>
{%- endif -%}
EOF

私有服务器构建将使用MathJax.jswhere 作为生产环境 (GitHub) 将使用latest.js上述 Liquid if... elsif...endif语句。

  1. 写个帖子测试一下
tee ./_posts/$(date +'%Y-%d-%m')-math-tests.markdown 1>/dev/null <<EOF
---
layout: post
title:  "Math Tests"
date:   $(date +'%Y-%d-%m %H:%M:%S %z')
categories: math
---
{%- include MathJax.html -%}

<span>

for $x,y,z \in \{1, 2,\dots 9\}$
</span>

<span>

$$
\sum_{i=1}^n X_n
$$
</span>
EOF

我没有尝试过没有<span>s 因为cboettig的建议似乎完全可以解决问题。span此外, s 中的额外换行符没有错误,没有它们,渲染输出仍然存在问题。

  1. 将这些最新文件添加到git跟踪
git add _posts/$(date +'%Y-%d-')math-tests.markdown
git add _includes/MathJax.html
  1. 在本地构建,或在远程服务器上推送和构建
bundle exec jekyll build --destination /tmp/www/project-name --config _config.yml --incremental

仅用于使用 CDN(内容交付网络)的选项1复制latest.js

  1. Option 0步骤1.

  2. 为第三方 JavaScript 创建一个目录路径并复制MathJax/unpacked/latest.js到那里

cd ~
mkdir -p git/lan/project-name/assets/JS_3rd_Party/MathJax
cp git/hub/MathJax/unpacked/latest.js git/lan/project-name/assets/JS_3rd_Party/MathJax/
  1. 编写包含文件
cd git/lan/project-name
tee ./_includes/MathJax.html 1>/dev/null <<EOF
<script type="text/javascript" src="{{'/assets/javascripts/JS_3rd_Party/latest.js?config=TeX-AMS-MML_HTMLorMML' | relative_url}}"></script>
EOF
  1. Option 0步骤5.

  2. 将这三个文件添加到git跟踪中

git add _includes/MathJax.html
git add _posts/$(date +'%Y-%d-')math-tests.markdown
git add assets/JS_3rd_Party/MathJax
git commit -m 'Added `MathJax.html`, `latest.js`, and a test post to git tracking'
  1. 请参阅本地构建Option 0步骤7.

对于任何一个选项

如果部署在私有服务器上,您可能还需要baseurl在项目_config.yml文件中进行定义,尤其是在模拟username.tld/project-nameGitHub 在您的私有服务器上使用的 URL 方案时。

如果同时部署到私有服务器和 GitHub,最好使用单独的配置文件并在构建问题时--config _config.yml,_config_baseurl.yml,例如...

# Write the special config file
tee ./_config_baseurl.yml 1>/dev/null <<EOF
baseurl: "project-name"
EOF

# Build with extra config
bundle exec jekyll build --destination /tmp/www/project-name --config _config.yml,_config_baseurl.yml --incremental

希望这有助于通过包含加载资产。

于 2019-03-26T07:52:21.943 回答
0

对我来说,将它添加到我的默认 _layout 或 head _include 作品中(结合前端的 _page 或 _post 变量):

---
mathjax: yes
---
    <!-- mathjax -->
    {% if page.mathjax %}
        <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/MathJax.js?config=TeX-MML-AM_CHTML">
            MathJax.Hub.Config({
                tex2jax: {
                    inlineMath: [["$", "$"], ["\\(", "\\)"]],
                    processEscapes: true
                }
            });
        </script>
    {% endif %}

工作示例

于 2021-03-24T21:59:30.533 回答