搜尋

首頁  >  問答  >  主體

簡化數學符號輸入,讓你在網路上更輕鬆

有沒有一個React函式庫的解決方案,讓使用者可以輕鬆輸入數學符號,並在後端將其轉換為LaTeX?我的意思是,像一個用戶友好的編輯器,可能帶有可點擊的按鈕?然後在後端將這些元素轉換為LaTeX。

P粉057869348P粉057869348562 天前711

全部回覆(1)我來回復

  • P粉637866931

    P粉6378669312023-09-15 11:44:19

    您可以嘗試使用MathJax。版本3是最新版本,非常強大。

    根據這個問題,它是最好的JavaScript LaTeX渲染器。

    在下面的範例中,您可以將現有內容渲染為LaTeX,或動態新增元素。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    const expressions = [

      '\frac{a}{b}',

      '\(V = {4 \over 3} \pi^3 \)'

    ];

     

    document.querySelectorAll('.expression').forEach(el => {

      el.replaceWith(MathJax.tex2chtml(el.textContent));

    });

     

    expressions.forEach(expression => {

      document.body.append(MathJax.tex2chtml(expression));

    });

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    html, body {

      width: 100%;

      height: 100%;

      margin: 0;

      padding: 0;

    }

     

    body {

      display: flex;

      justify-content: space-around;

      align-items: center;

    }

     

    body > * {

      border: thin solid grey;

      padding: 1rem;

    }

    1

    2

    <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>

    <div class="expression">(\int_{a}^{b} x^2 \,dx)</div>

    將中綴表達式解析為LaTeX

    ##如果您想解釋表達式並將其轉換為LaTeX,可以嘗試以下內容:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    const form = document.forms['latex-add'];

    const container = document.querySelector('#expression-list');

    const expressions = ['\frac{a}{b}', '\frac{{(25 \cdot 5)}}{6}'];

     

    const main = () => {

      form.elements.expression.value = '(25*5)/b';

      form.addEventListener('submit', handleAdd);

      renderExpressions();

    };

     

    const handleAdd = (e) => {

      e.preventDefault();

      const expression = e.target.elements.expression.value.trim();

      const tex = texFromExpression(expression);

      console.log(tex);

      expressions.push(tex);

      renderExpressions();

      e.target.reset();

    };

     

    const renderExpressions = () => {

      container.innerHTML = '';

      expressions.forEach(expression => {

        const wrapper = document.createElement('div');

        wrapper.classList.add('expression');

        const tex = document.createElement('div');

        tex.classList.add('tex');

        tex.textContent = expression;

        wrapper.append(tex);

        wrapper.append(MathJax.tex2chtml(expression));

        container.append(wrapper);

      });

    };

     

    // Credit: https://stackoverflow.com/a/57449164/1762224

    const texFromExpression = (str) => {

      let pos = -1, ch;

     

      const nextChar = () => {

        ch = (++pos < str.length) ? str.charAt(pos) : -1;

      };

     

      const eat = (charToEat) => {

        while (ch == ' ') nextChar();

        if (ch == charToEat) {

          nextChar();

          return true;

        }

        return false;

      };

     

      const parse = () => {

        nextChar();

        const x = parseExpression();

        if (pos < str.length) throw new Error(`Unexpected: ${ch}`)

        return x;

      };

     

      const parseExpression = () => {

        let x = parseTerm();

        while (true) {

          if (eat('+')) x = `${x} + ${parseTerm()}` // addition

          else if (eat('-')) x = `${x} - ${parseTerm()}` // subtraction

          else return x;

        }

      };

     

      const parseTerm = () => {

        var x = parseFactor();

        while (true) {

          if (eat('*')) x = `${x} \cdot ${parseTerm()}`; // multiplication

          else if (eat('/')) x = `\frac{${x}}{${parseTerm()}}`; // division

          else return x;

        }

      };

     

      const parseFactor = () => {

        if (eat('+')) return parseFactor(); // unary plus

        if (eat('-')) return `-${parseFactor()}`; // unary minus

        let x;

        const startPos = pos;

        if (eat('(')) { // parentheses

          x = `{(${parseExpression()})}`

          eat(')');

        } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers

          while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();

          x = str.substring(startPos, pos);

        } else if (ch >= 'a' && ch <= 'z') { // variables

          while (ch >= 'a' && ch <= 'z') nextChar();

          x = str.substring(startPos, pos);

          if (x.length > 1) {

            x = `\${x} {${parseFactor()}}`;

          }

        } else {

          throw new Error(`Unexpected: ${ch}`);

        }

        if (eat('^')) x = `${x} ^ {${parseFactor()}}` // superscript

        if (eat('_')) x = `${x}_{${parseFactor()}}`;

        return x;

      }

      return parse();

    }

     

    main();

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    #expression-list {

      display: flex;

      flex-direction: row;

      justify-content: center;

      align-items: center;

      gap: 0.5rem;

    }

     

    .expression {

      padding: 0.5rem;

      border: thin solid grey;

    }

     

    .tex {

      font-family: monospace;

      font-size: smaller;

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>

    <form name="latex-add" autocomplete="off">

      <label for="expression">Expression:</label>

      <input type="text" id="expression" name="expression"

             value="" placeholder="Expression..." />

      <button type="submit">Add</button>

    </form>

    <hr />

    <div id="expression-list"></div>

    回覆
    0
  • 取消回覆