Я пытаюсь написать динамическую c веб-страницу для детализации пользователя по арифметике c. Мое намерение состоит в том, чтобы кусок JavaScript сгенерировал арифметическую проблему c, собрал и представил узел MathML DOM, чтобы представить его пользователю, а затем обработал его ответ.
Я ожидаю рукописный текст Элемент MathML должен отображаться точно так же, как и «тот же» JavaScript -генерированный элемент. Но это не то, что я получаю со своим сценарием.
Вот рукописная версия:
body {
font: medium/1.5 sans-serif;
margin: 0;
position: absolute;
height: 100%;
width: 100%;
display: table;
}
math { font-family: sans-serif; }
#history {
width: 16em;
background: silver;
display: table-cell;
}
#present {
font-size: 3em;
text-align: center;
vertical-align: middle;
display: table-cell;
}
input {
font-size: inherit;
width: 4em;
text-align: center;
display: block;
margin: auto;
}
<html>
<head>
<meta charset="UTF-8"/>
<title>Automatic Arithmetic Drill</title>
</head>
<body>
<div id="present"><math id="problem"><mrow><mn>5</mn><mo>+</mo><mn>5</mn></mrow></math><input id="answer"></input></div>
<div id="history">
</div>
</body>
</html>
Для меня это выглядит как Firefox 68.4.1esr (32-bit) в Debian, например: ![Usual spacing between elements.](https://i.stack.imgur.com/6vMvZ.png)
Вот версия Dynamic c:
function update_problem(left, infix, right) {
var problem = document.createElement("math");
var problem_row = document.createElement("mrow");
var problem_left = document.createElement("mn");
var problem_infix = document.createElement("mo");
var problem_right = document.createElement("mn");
var problem_left_text = document.createTextNode(left);
var problem_infix_text = document.createTextNode(infix);
var problem_right_text = document.createTextNode(right);
problem_left.appendChild(problem_left_text);
problem_infix.appendChild(problem_infix_text);
problem_right.appendChild(problem_right_text);
problem_row.appendChild(problem_left);
problem_row.appendChild(problem_infix);
problem_row.appendChild(problem_right);
problem.appendChild(problem_row);
var old_problem = document.getElementById("problem");
old_problem.replaceWith(problem);
problem.id = "problem";
}
update_problem(5, "+", 5);
body {
font: medium/1.5 sans-serif;
margin: 0;
position: absolute;
height: 100%;
width: 100%;
display: table;
}
math { font-family: sans-serif; }
#history {
width: 16em;
background: silver;
display: table-cell;
}
#present {
font-size: 3em;
text-align: center;
vertical-align: middle;
display: table-cell;
}
input {
font-size: inherit;
width: 4em;
text-align: center;
display: block;
margin: auto;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Automatic Arithmetic Drill</title>
</head>
<body>
<div id="present"><math id="problem"></math><input id="answer"></input></div>
<div id="history">
</div>
</body>
</html>
Для меня это выглядит так:
![No spacing between elements.](https://i.stack.imgur.com/gF7xP.png)
As Вы можете видеть, что в случае stati c существует интервал MathML по умолчанию между элементами mn
, mo
и mn
, но в случае динамического c интервал отсутствует. Я хочу, чтобы сгенерированная версия выглядела точно так же, как и версия stati c.
Думая, что динамически сгенерированные узлы не имеют своих атрибутов по умолчанию, я попытался добавить
problem_infix.setAttribute("lspace", (5.0 / 18.0).toString() + "em");
problem_infix.setAttribute("rspace", (5.0 / 18.0).toString() + "em");
, но это сделало без разницы.
Я не могу найти никаких ресурсов по этому поводу; MathML, похоже, не находит широкого применения.
Как я могу исправить интервал для сгенерированного JavaScript узла?