`arc` + space + trig name is not merged

オープン
#957 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
1〜2日
初心者へのやさしさ
45/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
rust

調査の方向性

Start in src/canonicalize.rs at merge_arc_trig and read the existing canonicalization tests around clean_up_arc_lookalike_mrow. Run the proposed clean_up_arc_mspace case to check how the spaced MathML is canonicalized. Done means arc plus a space and trig name merges correctly while arc followed by a cosine function stays separate; the Spanish workaround in Rules/Languages/es/SharedRules/general.yaml can then be removed.

索引モデルが issue の本文から書いたものです。

説明

babel (Spanish) writes \arcsen as arc\,sen, and arc\,cos gives the same in English:

<math><mi>arc</mi><mi>cos</mi><mi>x</mi></math>
<math><mi>arc</mi><mspace width="0.167em"/><mi>cos</mi><mspace width="0.167em"/><mi>x</mi></math>
  • without space: arccos of x
  • with space: arc of cosine x

merge_arc_trig runs while the mspace is still a sibling. Skipping whitespace before checking the next sibling should fix it. Spanish has a temporary rule for this in general.yaml (from #945), to be removed once fixed.

Proposed patch (tested: cargo test passes; adds the test clean_up_arc_mspace):

diff --git a/src/canonicalize.rs b/src/canonicalize.rs
index 00a5165b..4f34bfd8 100644
--- a/src/canonicalize.rs
+++ b/src/canonicalize.rs
@@ -1793,12 +1793,21 @@ impl CanonicalizeContext {
 				return None;
 			}
 
+			// skip whitespace between "arc" and the trig name (e.g., babel writes \arcsen as arc\,sen)
 			let following_siblings = leaf.following_siblings();
-			if following_siblings.is_empty() {
-				return None;
+			let mut whitespace = Vec::new();
+			let mut following_sibling = None;
+			for &child in &following_siblings {
+				let child = as_element(child);
+				let child_name = name(child);
+				if child_name == "mspace" || (child_name == "mtext" && as_text(child).trim().is_empty()) {
+					whitespace.push(child);
+				} else {
+					following_sibling = Some(child);
+					break;
+				}
 			}
-
-			let following_sibling = as_element(following_siblings[0]);
+			let following_sibling = following_sibling?;
 			let following_sibling_name = name(following_sibling);
 			if !(following_sibling_name == "mi" || following_sibling_name == "mo" || following_sibling_name == "mtext") {
 				return None;
@@ -1811,6 +1820,7 @@ impl CanonicalizeContext {
 					let new_text = "arc".to_string() + as_str!(following_text);
 					set_mathml_name(leaf, "mi");
 					leaf.set_text(&new_text);
+					whitespace.iter().for_each(|ws| ws.remove_from_parent());
 					following_sibling.remove_from_parent();
 					return Some(leaf);
 				}
@@ -6207,6 +6217,14 @@ mod canonicalize_tests {
         are_strs_canonically_equal_result(test_str, target_str, &[])
 	}
 
+	#[test]
+    fn clean_up_arc_mspace() -> Result<()> {
+        // babel writes \arcsen as arc\,sen
+        let test_str = "<math><mi>arc</mi><mspace width='0.167em'/><mi>cos</mi><mspace width='0.167em'/><mi>x</mi></math>";
+        let target_str = "<math><mrow data-changed='added'><mi>arccos</mi><mo data-changed='added'>&#x2061;</mo><mi data-previous-space-width='0.167'>x</mi></mrow></math>";
+        are_strs_canonically_equal_result(test_str, target_str, &[])
+	}
+
 	#[test]
     fn clean_up_arc_lookalike_mrow() -> Result<()> {
         // Frown over two capital identifiers is rewritten to the arc operator (U+2312)

With this, the Spanish workaround in Rules/Languages/es/SharedRules/general.yaml (the three arc-trig-separado* rules) can be removed. I have that change ready too: one Spanish test changes a pause (arco tangente; → arco tangente,, now the same as arctg), and if the Spanish navigation PR is merged first, zoom_in_all_babel_arc should expect acercado al máximo; arco seno instead of …; arc.

主要言語
Rust
スター
130
フォーク
96
平均マージ
1日 1時間
マージ済み PR(30日)
84

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

daisy/MathCAT のほかの issue

daisy/MathCAT の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。