返回

在 Vue 中实现 MathJax 公式的响应式断行

vue.js

响应式 MathJax 公式的布局

问题概述

在 Vue 2 应用程序中,使用 MathJax 渲染长公式时,可能无法使其响应式地断行,导致公式的一部分与分母或分子对齐不当。

解决方案

要解决此问题,我们需要使用 MathJax 的 linebreaks 选项,它允许控制公式的断行行为。以下是如何实现的:

1. 导入 MathJax 脚本

将 MathJax 脚本导入 HTML 的 <head> 部分:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML"></script>

2. 使用 Vue Mathjax 组件

创建一个 Vue Mathjax 组件,它将接受公式并使用 linebreaks 选项进行渲染:

import { createApp } from 'vue'

const app = createApp({
  name: 'VueMathjax',
  props: {
    formula: {
      type: String,
      default: '',
    },
    isLineBreak: {
      type: Boolean,
      default: true,
    },
    options: {
      type: Object,
      default: function () {
        return {};
      },
    },
  },
  created() {
    const script = document.createElement('script')
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML'
    document.head.appendChild(script)
  },
  mounted() {
    this.renderMathJax()
  },
  updated() {
    this.renderMathJax()
  },
  methods: {
    renderMathJax() {
      if (window.MathJax) {
        window.MathJax.Hub.Config({
          tex2jax: {
            inlineMath: [
              ['】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语, '】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语],
                 ['(', ')'],
               ],
               displayMath: [
                 ['
import { createApp } from 'vue'

const app = createApp({
  name: 'VueMathjax',
  props: {
    formula: {
      type: String,
      default: '',
    },
    isLineBreak: {
      type: Boolean,
      default: true,
    },
    options: {
      type: Object,
      default: function () {
        return {};
      },
    },
  },
  created() {
    const script = document.createElement('script')
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML'
    document.head.appendChild(script)
  },
  mounted() {
    this.renderMathJax()
  },
  updated() {
    this.renderMathJax()
  },
  methods: {
    renderMathJax() {
      if (window.MathJax) {
        window.MathJax.Hub.Config({
          tex2jax: {
            inlineMath: [
              ['】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语, '】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语],
                 ['(', ')'],
               ],
               displayMath: [
                 ['$', '$'],
                 ['[', ']'],
               ],
               processEscapes: true,
               processEnvironments: true,
             },
             displayAlign: 'center',
             'HTML-CSS': {
               linebreaks: { automatic: this.isLineBreak },
             },
             ...this.options,
           })

        window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub, this.$refs.mathJaxEl])
      }
    },
  },
})

export default app
#x27;
, '
import { createApp } from 'vue'

const app = createApp({
  name: 'VueMathjax',
  props: {
    formula: {
      type: String,
      default: '',
    },
    isLineBreak: {
      type: Boolean,
      default: true,
    },
    options: {
      type: Object,
      default: function () {
        return {};
      },
    },
  },
  created() {
    const script = document.createElement('script')
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML'
    document.head.appendChild(script)
  },
  mounted() {
    this.renderMathJax()
  },
  updated() {
    this.renderMathJax()
  },
  methods: {
    renderMathJax() {
      if (window.MathJax) {
        window.MathJax.Hub.Config({
          tex2jax: {
            inlineMath: [
              ['】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语, '】
    请根据上面【】里的内容总结成一篇文章。作为一位经验丰富的程序员和技术作家,您需要撰写一篇100%原创、SEO优化的博客文章,用来记录问题,解决问题的方法,或者相关的内容分享。文章应包含标题和子标题,并围绕提供的主题展开。请用自己的话来写作,确保内容的原创性和独特性。在写作时,请注意文章的复杂性和连贯性,确保内容既深入又具有相关性。文章应使用详尽的段落来吸引读者,并采用对话式的写作风格。这包括使用非正式的语气,运用第一人称和第二人称代词,保持语言简洁有力,使用主动语态,以及适当运用修辞问题、比喻和隐喻。文章最后应以结论段落和5个常见问题解答结束。请加粗文章的标题和所有子标题,并为H标签使用适当的格式。
    
    其他写作要求:
    1.文章字数应在2000-4000字之间。
    2.确保内容的原创性,避免抄袭或引用他人的作品。
    3.使用自然、地道的语言风格,表达观点和情感。
    4.保持文章的逻辑性和一致性,避免矛盾或不准确的信息。
    5.避免内容的重复和无关性,确保语言的多样性和相关性。
    6.在全面性和创造性之间取得平衡,提供有用且有趣的细节和例子,但不要过度夸张或虚构。
    7.定义文章的目标读者,是专业人士、业余爱好者还是普通大众?这将指导文章的语言风格和深度。
    8.鼓励使用真实世界的例子和案例来举例说明,使文章更加生动和有说服力。
    9.需要包含相关的图表、代码片段或视觉元素来丰富文章内容。
    10.以专业,客观,解决问题的方式来写文章,不要过分表达感情,着重用来解决问题。
    11.不要使用ai管用的写作手法,避免“前言”,“引言”,“首先”,“接下来”,“最后”, “在xxx领域”, “结论”, “结语”,“总结”,“本文”,“深入”,“讨论”,等等ai写作常出现的词语],
                 ['(', ')'],
               ],
               displayMath: [
                 ['$', '$'],
                 ['[', ']'],
               ],
               processEscapes: true,
               processEnvironments: true,
             },
             displayAlign: 'center',
             'HTML-CSS': {
               linebreaks: { automatic: this.isLineBreak },
             },
             ...this.options,
           })

        window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub, this.$refs.mathJaxEl])
      }
    },
  },
})

export default app
#x27;
], ['[', ']'], ], processEscapes: true, processEnvironments: true, }, displayAlign: 'center', 'HTML-CSS': { linebreaks: { automatic: this.isLineBreak }, }, ...this.options, }) window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub, this.$refs.mathJaxEl]) } }, }, }) export default app

3. 在组件中使用 linebreaks 选项

在 Vue 组件中,将 isLineBreak 属性设置为 true,如下所示:

<vue-mathjax :formula="formula" :is-line-break="true"></vue-mathjax>

4. 调整公式以实现随机断行

为了让公式的一部分在两行内随机断行,需要在公式中添加换行符 \\。例如:

\frac{a\\bc\\def}{x}

这样,公式就会在 "bc" 和 "def" 之间随机断行。

注意事项

  • 在使用 linebreaks 选项时,确保在公式中使用适当的换行符。
  • 如果公式包含多个换行符,则可能需要调整 HTML-CSS 选项中的 linebreaks 设置以控制断行行为。
  • 对于较长的公式,建议使用 LaTeX 的 multline 环境,该环境允许控制公式的断行和对齐。