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

时间:2018-11-04 19:45:59

标签: javascript canvas katex

我在理解如何从画布元素中现有的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" 

是。 ... 那就是我的问题。也许存在另一种在画布区域中实现数学功能的方法,但是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>

1 个答案:

答案 0 :(得分:-1)

将我的评论升级为答案。

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

回到KaTeX pull request 251时,为了像CindyJS中那样与this demo集成,我做了一些工作使KaTeX的个人分支渲染到画布上。

直接绘制到画布的主要好处是它可以与修改画布的其他内容很好地集成在一起,包括剪切,分层,转换,多个处理步骤,将整个内容保存为单个图像等。而且,垂直对齐HTML到定义良好的基线非常困难。

自从我发布请求以来,我一直没有跟踪有关讨论的讨论。最后,我知道有一些计划开发一些中间表示,可以在各种后端上进行布局,包括HTML + CSS和Canvas。不确定该进行了多少努力。我的PR已过时,已经关闭。