【问题标题】:How to left align certain equations in MathJax如何在 MathJax 中左对齐某些方程
【发布时间】:2020-12-03 00:31:47
【问题描述】:

所以,默认情况下 MathJax 方程是居中的,但我想左对齐某些方程。我知道如何使所有方程与 MathJax.Hub.Config 对齐,但这不是我想要的。

我尝试了网上找到的其他代码,例如:

<script type="text/javascript">
  MathJax.Hub.Queue(function () {
      MathJax.Hub.Config({displayAlign:"left"});
      MathJax.Hub.Typeset(["leqn"]);
    });
 </script>

然后用 id 为 leqn 的方程包裹一个 div,如下所示:

<div id="leqn">$$e^{\pi i} - 1 = 0$$</div>

这不起作用,我对 MathJax 甚至 JS 的了解还不够,无法知道我做错了什么。有什么想法吗?

【问题讨论】:

    标签: javascript mathjax


    【解决方案1】:

    您最初的方法不起作用的原因是,在 MathJax 执行的初始排版过程中,方程已经排版,并且您对 MathJax.Hub.Typeset() 的调用不会重新排版现有的数学,而只是排版 new 数学。所以数学保持原样。

    相反,您可以使用MathJax.Hub.Rerender(["leqn"]) 使用新的displayAlign 设置重新渲染数学。

    话虽如此,Peter 的方法更好,因为它不需要排版两次数学。我在下面对他的方法进行了一些改进。您可以将leqn 添加到被忽略的类中,然后在第二次排版之前再次将其删除,而不是使用tex2jax_ignore 并且必须返回并从具有该类的所有元素中删除它。代码如下:

    MathJax = {
      tex2jax: {ignoreClass: "tex2jax_ignore|leqn"},
      AuthorInit: function() {
        MathJax.Hub.Register.StartupHook("End",function () {
          MathJax.Hub.Queue(function () {
            MathJax.Hub.Config({
              tex2jax: {ignoreClass: "tex2jax_ignore"},
              displayAlign: "left"
            });
            return MathJax.Hub.Typeset();
          });
        });
      }
    };
    
    (function(d, script) {
      script = d.createElement('script');
      script.type = 'text/javascript';
      script.src = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML-full';
      d.getElementsByTagName('head')[0].appendChild(script);
    }(document));
    $$e^{\pi i} - 1 = 0$$
    <span class="leqn">$$e^{\pi i} - 1 = 0$$</span>
    $$e^{\pi i} - 1 = 0$$

    编辑:这是另一种对 TeX 输入 jax 使用后过滤器的方法,它根据父元素的类设置底层 MathML 的 indentalign 属性(您也可以使用 ID,但请记住 ID 必须是唯一的,因此您必须为每个方程式使用不同的 ID,这就是为什么类更好)。

    MathJax = {
      AuthorInit: function() {
        MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () {
          MathJax.InputJax.TeX.postfilterHooks.Add(function (data) {
            if (data.script.parentNode.className === "leqn")
              data.math.root.indentalign = "left";
          });
        });
      }
    };
    
    (function(d, script) {
      script = d.createElement('script');
      script.type = 'text/javascript';
      script.src = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML-full';
      d.getElementsByTagName('head')[0].appendChild(script);
    }(document));
    $$e^{\pi i} - 1 = 0$$
    <span class="leqn">$$e^{\pi i} - 1 = 0$$</span>
    $$e^{\pi i} - 1 = 0$$

    也可以向 TeX 输入 jax 添加一个宏,允许您指定 indentalign 属性,但这需要更多的工作。

    【讨论】:

    • 请注意,他正在使用 id 来表示 leqn
    • 没错,但是要使用我们的任何一种方法,他都必须使用一个类。我应该指出这一点,谢谢。
    • 不用担心。但是你的答案排在我之前是完全不公平的;-)
    • 我认为投票相同的答案是随机排序的。当我离开并稍后重新加载页面时,它似乎发生了变化。我会投票支持你打破平局。
    • 感谢@DavideCervone 的加入。两种解决方案都运行良好......但多么丑陋!出于好奇,为什么做这么简单的事情就这么难?这是 MathJax 还是 TeX 排版的限制?
    【解决方案2】:

    使用 TeX 输入没有优雅的方法可以做到这一点。该方法将因用例而异。在这里,您似乎能够将 HTML 包裹在您想要左对齐的那些方程式周围。为此,您通常走在正确的轨道上。以下是需要解决的问题:

    • 使用正确的方式连接到 MathJax 的内部
    • 通过添加class="tex2jax_ignore"让MathJax忽略第一轮排版中的相关方程
    • 删除该类,更改配置,然后让 MathJax 排版其余部分

    以下是执行此操作的一种方法。

    • 您可以配置其他类名,see the docs
    • 由于 SO 对 sn-ps 中外部资源的限制(不允许查询字符串,所以我“手动”注入它),它有点复杂——在您的页面中,只需使用 window.MathJax 部分并加载它在加载 MathJax.js 之前。

          window.MathJax = {
            AuthorInit: function() {
              MathJax.Hub.Register.StartupHook("Begin", function() {
                MathJax.Hub.Queue(function() {
                  var elements = document.getElementsByClassName('tex2jax_ignore');
                  for (var i = 0; i < elements.length; i++) {
                    elements[i].classList.remove('tex2jax_ignore');
                  }
                  MathJax.Hub.Config({
                    displayAlign: "left"
                  });
                  MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
                });
              });
            }
          };
    
          (function(d, script) {
            script = d.createElement('script');
            script.type = 'text/javascript';
            script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML-full';
            d.getElementsByTagName('head')[0].appendChild(script);
          }(document));
    $$e^{\pi i} - 1 = 0$$
    <span class="tex2jax_ignore">$$e^{\pi i} - 1 = 0$$</span>
    $$e^{\pi i} - 1 = 0$$

    【讨论】:

      【解决方案3】:

      覆盖 css 样式可能会起作用:

      <style>
          mjx-container {text-align: left !important;}
      </style>
      

      【讨论】:

        猜你喜欢
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多