如何在 <canvas> javascript 中绑定 <span> 以获得数学公式

how to bind an <span> in an <canvas> javascript to get mathematic formulas

我有一个小问题,无法理解如何从 canvas 元素中的现有 KaTex Js 文件中实现一个公式,以获得与

相同的符号
<span id="mykatex1">...</span>
<script>
  katex.render("f(a,b,c) = (a^2+b^2+c^2)^3", mykatex1);
</script>

。但我想要

的位置
ctx.fillText( "-A", p_index_a, p_index_a );

扇区,其中

 "-A" 

是。 ... 这就是我的问题。也许它存在另一种方式如何在 canvas 区域中实现数学函数,但 atm 我有点困惑并且没有计划如何处理它。顺便一提。那是一个功能齐全的空白动态图。免费使用。一个解决方案会很酷,因为计划是在图形区域中也实现相同的符号。谢谢

<!DOCTYPE html>
<html lang="de">
<head>
  <title>Simple guide to using KaTeX</title>
  <link rel="stylesheet" href="css/js_formeln__katex.min.css">
  <script src="js/katex.min.js"></script>
  <style type="text/css">
    canvas {
      border: 1px solid black;
      font: 1.2em "Fira Sans", sans-serif;
    }
  </style>
</head>
<body>
  <p><span id="mykatex1">...</span></p>
  <script>
    katex.render("f(a,b,c) = (a^2+b^2+c^2)^3", mykatex1);
  </script>
  <body onload="draw();">
  <canvas id="canvas" width="2000" height="1000" ></canvas>
</body>

<script>
  function draw() {
    var canvas = document.getElementById('canvas');
    if (canvas.getContext) {

    var ctx = canvas.getContext('2d');
    var b_x = 300, b_y = 300;
    var b_x_erweitern_um = 600;
    var b_y_erweitern_um = 100;
    var x = 0, y = 0;
    var grid_breite_x_y = 10;
    var linewidth_1 = 0.1 , linewidth_2 = 1;
    var freier_oberer_rand = 10;
    var nach_links_verkleinern = 0;
    var nach_rechts_verkleinern = 500;
    var d_in = 0.5;

    for ( x ; x <= b_x - freier_oberer_rand - nach_links_verkleinern - 
      nach_rechts_verkleinern + b_x_erweitern_um ; x += grid_breite_x_y ) {
      ctx.moveTo( d_in + x + freier_oberer_rand + nach_rechts_verkleinern , freier_oberer_rand );
      ctx.lineWidth = linewidth_1;
      ctx.lineTo( d_in + x + freier_oberer_rand + nach_rechts_verkleinern , b_x + b_y_erweitern_um);
    }

    // horizontale Linien
    for ( y + freier_oberer_rand ; y <= b_y - freier_oberer_rand + b_y_erweitern_um ; y += grid_breite_x_y ) {
      ctx.moveTo( freier_oberer_rand + nach_rechts_verkleinern , d_in + y + freier_oberer_rand);
      ctx.lineWidth = linewidth_1;
      ctx.lineTo( b_x - nach_links_verkleinern + b_x_erweitern_um , d_in + y + freier_oberer_rand );
    }
    ctx.strokeStyle = "black";
    ctx.stroke();

    // Pfeile für x
    ctx.beginPath();
    ctx.fillStyle = 'black';
    ctx.moveTo( b_x - nach_links_verkleinern + b_x_erweitern_um + 10, b_y + b_y_erweitern_um );
    ctx.lineTo( b_x - nach_links_verkleinern + b_x_erweitern_um + 5, b_y + b_y_erweitern_um - 2 );
    ctx.lineTo( b_x - nach_links_verkleinern + b_x_erweitern_um + 5, b_y + b_y_erweitern_um + 2 );
    ctx.lineTo( b_x - nach_links_verkleinern + b_x_erweitern_um + 10, b_y + b_y_erweitern_um );
    ctx.fill();
    // Pfeile für y
    ctx.beginPath();
    ctx.moveTo( freier_oberer_rand + nach_rechts_verkleinern , freier_oberer_rand - 10 );
    ctx.lineTo( freier_oberer_rand + nach_rechts_verkleinern + 2 , freier_oberer_rand - 5 );
    ctx.lineTo( freier_oberer_rand + nach_rechts_verkleinern - 2 , freier_oberer_rand - 5 );
    ctx.lineTo( freier_oberer_rand + nach_rechts_verkleinern , freier_oberer_rand - 10 );
    ctx.fill();

    // Bezeichnung x und y
    ctx.beginPath();
    ctx.font = '10pt Calibri';
    ctx.fillStyle = 'black';

    ctx.fillText( "y", freier_oberer_rand + nach_rechts_verkleinern - 10, freier_oberer_rand + 2 );
    ctx.fillText( "x", b_x - nach_links_verkleinern + b_x_erweitern_um , b_y + b_y_erweitern_um + 10 );

    var h_font      = 30;
    var p_index_a   = 30;
    var p_index_b   = 90;
    var omega       = "0x03A9";
    var test        = "\frac{d}{dx}\left[\int_a^xf(t)dt\right]=f(x)";
    var test2       = encodeURIComponent("\frac{d}{dx}\left[\int_a^xf(t)dt\right]=f(x)");

    ctx.beginPath();
    ctx.font = '30px Helvetica, Arial, sans-serif';
    ctx.fillStyle = 'lime';
    ctx.fillText( "-A", p_index_a, p_index_a );
    ctx.fillText( "Aufprallfläche der Teilchen", p_index_b, p_index_a );
    ctx.fillStyle = 'red';
    ctx.fillText( "-V", p_index_a, p_index_a*2 );
    ctx.fillText( "Volumen bei d. Impulsion", p_index_b, p_index_a*2 );
  }
  else {
    alert("Dein Browser unterstützt das <canvas> Element nicht");
  }
}
draw();
</script>

将我的评论提升为答案。

此答案并未按所述回答您的问题,而是为您实际尝试实现的目标提供了替代方案。

回到 KaTeX pull request 251 I had done some work to make my personal fork of KaTeX render to canvas, for the sake of integration with CindyJS as in this demo

直接绘制到 canvas 的主要好处是它可以与修改 canvas 的其他东西很好地集成,包括裁剪、分层、转换、多个处理步骤,将整个东西保存为单个图像,和类似的。此外,垂直对齐 HTML 到明确定义的基线非常困难。

自发布以来,我就忘记了围绕我的拉取请求进行的讨论。最后我知道有一些计划开发一些可以在各种后端布局的中间表示,包括 HTML+CSS 和 Canvas。不确定这项努力取得了多大进展。我的 PR 已被关闭,因为它已经过时了。