数学記号をUnicodeで入力するIME追加辞書
2023-11-26 12:11:58 追加辞書はTSVじゃないとだめっぽい excelでtsvに保存し直すか。
12:18:51 excelだとshift JISで読み込まれてしまうので文字化けする
変換方法はあるけど、めんどいな
JSを書こう
code:download.js
const csv = await res.text();
const blob = new Blob(
{ type: "text/plain" },
);
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.download = "dict.txt";
a.href = url;
document.body.append(a);
a.click();
a.remove();
2025-03-25 22:43:42 おかしい、ファイルを読み込めない
メモ帳とかでUTF-8からUTF-16LEに変換すれば読み込めるけど
code:for-microsoft-ime.js
import { convert } from "npm:encoding-japanese@2";
const csv = await res.text();
const blob = new Blob(
[new Uint8Array(convert(
new TextEncoder().encode(
csv.replaceAll(",", "\t").replaceAll("記号", "名詞"),
),
"UTF16LE",
))],
{ type: "text/plain" },
);
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.download = "dict.txt";
a.href = url;
document.body.append(a);
a.click();
a.remove();
いくつか記号を足している
table:chars
{ { 記号
} } 記号
| ∥ 記号
aleph ℵ 記号
Alpha Α 記号
alpha α 記号
amalg ⨿ 記号
approx ≈ 記号
ast ∗ 記号
asymp ≍ 記号
backslash ∖ 記号
Beta Β 記号
beta β 記号
beth ℶ 記号
bigcap ⋂ 記号
bigcirc ◯ 記号
bigcup ⋃ 記号
bigtriangledown ▽ 記号
bigtriangleup △ 記号
bot ⊥ 記号
bowtie ⋈ 記号
box □ 記号
bullet ∙ 記号
cap ∩ 記号
cdot ⋅ 記号
cdots ⋯ 記号
Chi Χ 記号
chi χ 記号
circ ∘ 記号
cong ≅ 記号
crossproduct ⨯ 記号
cup ∪ 記号
dagger † 記号
dashv ⊣ 記号
ddagger ‡ 記号
ddots ⋱ 記号
Delta Δ 記号
delta δ 記号
diamond ⋄ 記号
div ÷ 記号
doteq ≐ 記号
dotproduct ∙ 記号
dots … 記号
downarrow ↓ 記号
downarrow ⇓ 記号
ell ℓ 記号
emptyset ∅ 記号
Epsilon Ε 記号
epsilon ϵ 記号
equiv ≡ 記号
Eta Η 記号
eta η 記号
eth ð 記号
exists ∃ 記号
forall ∀ 記号
frown ⌢ 記号
Gamma Γ 記号
gamma γ 記号
geq ≥ 記号
gets ← 記号
gg ≫ 記号
gimel ℷ 記号
hbar ℏ 記号
iddots ⋰ 記号
iff ⟺ 記号
iff ↔ 記号
implies ⟹ 記号
implies → 記号
in ∈ 記号
isinvb ⋸ 記号
increment ∆ 記号
infty ∞ 記号
Iota Ι 記号
iota ι 記号
Kappa Κ 記号
kappa κ 記号
Lambda Λ 記号
lambda λ 記号
land ∧ 記号
langle ⟨ 記号
laplacian ∆ 記号
lceil ⌈ 記号
ldots ... 記号
leftarrow ← 記号
leftrightarrow ↔ 記号
leftrightarrow ⇔ 記号
leq ≤ 記号
lfloor ⌊ 記号
ll ≪ 記号
lor ∨ 記号
mapsto ↦ 記号
mid ∣ 記号
models ⊨ 記号
mp ∓ 記号
Mu Μ 記号
mu μ 記号
nabla ∇ 記号
neg ¬ 記号
neq ≠ 記号
nexists ∄ 記号
ni ∋ 記号
notin ∉ 記号
nparallel ∦ 記号
Nu Ν 記号
nu ν 記号
odot ⊙ 記号
Omega Ω 記号
omega ω 記号
Omicron Ο 記号
omicron ο 記号
ominus ⊖ 記号
oplus ⊕ 記号
oslash ⊘ 記号
otimes ⊗ 記号
parallel ∥ 記号
partial ∂ 記号
perp ⊥ 記号
Phi Φ 記号
phi ϕ 記号
Pi Π 記号
pi π 記号
pm ± 記号
prec ≺ 記号
preceq ⪯ 記号
prod ∏ 記号
propto ∝ 記号
Psi Ψ 記号
psi ψ 記号
rangle ⟩ 記号
rceil ⌉ 記号
rfloor ⌋ 記号
Rho Ρ 記号
rho ρ 記号
rightarrow → 記号
rightarrow ⇒ 記号
setminus ∖ 記号
Sigma Σ 記号
sigma σ 記号
sim ∼ 記号
simeq ≃ 記号
smile ⌣ 記号
sqcap ⊓ 記号
sqcup ⊔ 記号
sqsubset ⊏ 記号
sqsubseteq ⊑ 記号
sqsupset ⊐ 記号
sqsupseteq ⊒ 記号
star ⋆ 記号
subset ⊂ 記号
subset ⊂ 記号
subseteq ⊆ 記号
succ ≻ 記号
succeq ⪰ 記号
sum ∑ 記号
supset ⊃ 記号
supset ⊃ 記号
supseteq ⊇ 記号
Tau Τ 記号
tau τ 記号
Theta Θ 記号
theta θ 記号
times × 記号
to → 記号
top ⊤ 記号
triangleleft ◃ 記号
triangleright ▹ 記号
uparrow ↑ 記号
uparrow ⇑ 記号
uplus ⊎ 記号
Upsilon Υ 記号
upsilon υ 記号
varepsilon ε 記号
varkappa ϰ 記号
varnothing ∅ 記号
varphi φ 記号
varpi ϖ 記号
varrho ϱ 記号
varsigma ς 記号
vartheta ϑ 記号
vdash ⊢ 記号
vdots ⋮ 記号
vee ∨ 記号
wedge ∧ 記号
wp ℘ 記号
wr ≀ 記号
Xi Ξ 記号
xi ξ 記号
Zeta Ζ 記号
zeta ζ 記号
Microsoft IME用変換コード
code:ts
import { CsvParseStream } from "jsr:@std/csv@1/parse-stream";
import { convertTexToYomi } from "./convertTexToYomi.js";
const dict =
(await Array.fromAsync(
(await fetch(
))
.body!
.pipeThrough(new TextDecoderStream())
.pipeThrough(new CsvParseStream())
))
.sort((a, b) => a.localeCompare(b)) .map((code, a) => ¥${convertTexToYomi(code.toLowerCase())}\t${a}\t名詞) .join("\n");
const url = URL.createObjectURL(
new Blob(dict, { type: "text/plain" }) );
const a = document.createElement("a");
a.download = "dict.txt";
a.href = url;
document.body.append(a);
a.click();
a.remove();
code:js
import { convertTexToYomi } from "./convertTexToYomi.js";
console.log(convertTexToYomi("exists"));
code:convertTexToYomi.js
/**
* TeXコマンドをMicrosoft IME用の「読み」の形式に変換します。
* 例: '\forall' -> '¥ふぉらll', '\dots' -> '¥どts'
* @param {string} tex - 変換したいTeXコマンド (例: '\\alpha')
* @returns {string} 変換後の文字列
*/
export function convertTexToYomi(tex) {
if (!tex) return "";
// ローマ字とひらがなの対応表。長いものを先に定義することが重要。
const romaMap = {
// 4文字
'ltsu': 'っ', 'ltsu': 'っ',
// 3文字
'kya': 'きゃ', 'kyi': 'きぃ', 'kyu': 'きゅ', 'kye': 'きぇ', 'kyo': 'きょ',
'gya': 'ぎゃ', 'gyi': 'ぎぃ', 'gyu': 'ぎゅ', 'gye': 'ぎぇ', 'gyo': 'ぎょ',
'sha': 'しゃ', 'shi': 'し', 'shu': 'しゅ', 'she': 'しぇ', 'sho': 'しょ',
'sya': 'しゃ', 'syi': 'しぃ', 'syu': 'しゅ', 'sye': 'しぇ', 'syo': 'しょ',
'zya': 'じゃ', 'zyi': 'じぃ', 'zyu': 'じゅ', 'zye': 'じぇ', 'zyo': 'じょ',
'cha': 'ちゃ', 'chi': 'ち', 'chu': 'ちゅ', 'che': 'ちぇ', 'cho': 'ちょ',
'cya': 'ちゃ', 'cyi': 'ちぃ', 'cyu': 'ちゅ', 'cye': 'ちぇ', 'cyo': 'ちょ',
'tha': 'てゃ', 'thi': 'てぃ', 'thu': 'てゅ', 'the': 'てぇ', 'tho': 'てょ',
'tya': 'ちゃ', 'tyi': 'ちぃ', 'tyu': 'ちゅ', 'tye': 'ちぇ', 'tyo': 'ちょ',
'tsa': 'つぁ', 'tsi': 'つぃ', 'tsu': 'つ', 'tse': 'つぇ', 'tso': 'つぉ',
'dha': 'でゃ', 'dhi': 'でぃ', 'dhu': 'でゅ', 'dhe': 'でぇ', 'dho': 'でょ',
'dya': 'ぢゃ', 'dyi': 'ぢぃ', 'dyu': 'ぢゅ', 'dye': 'ぢぇ', 'dyo': 'ぢょ',
'nya': 'にゃ', 'nyi': 'にぃ', 'nyu': 'にゅ', 'nye': 'にぇ', 'nyo': 'にょ',
'hya': 'ひゃ', 'hyi': 'ひぃ', 'hyu': 'ひゅ', 'hye': 'ひぇ', 'hyo': 'ひょ',
'bya': 'びゃ', 'byi': 'びぃ', 'byu': 'びゅ', 'bye': 'びぇ', 'byo': 'びょ',
'pya': 'ぴゃ', 'pyi': 'ぴぃ', 'pyu': 'ぴゅ', 'pye': 'ぴぇ', 'pyo': 'ぴょ',
'mya': 'みゃ', 'myi': 'みぃ', 'myu': 'みゅ', 'mye': 'みぇ', 'myo': 'みょ',
'rya': 'りゃ', 'ryi': 'りぃ', 'ryu': 'りゅ', 'rye': 'りぇ', 'ryo': 'りょ',
'vya': 'ヴゃ', 'vyi': 'ヴぃ', 'vyu': 'ヴゅ', 'vye': 'ヴぇ', 'vyo': 'ヴょ',
'wha': 'うぁ', 'whi': 'うぃ', 'whu': 'う', 'whe': 'うぇ', 'who': 'うぉ',
'wyi': 'ゐ', 'wye': 'ゑ',
'ltu': 'っ', 'xtu': "っ",
'lya': 'ゃ', 'lyi': 'ぃ', 'lyu': 'ゅ', 'lye': 'ぇ', 'lyo': 'ょ',
'xya': 'ゃ', 'xyi': 'ぃ', 'xyu': 'ゅ', 'xye': 'ぇ', 'xyo': 'ょ',
// 2文字
'ka': 'か', 'ki': 'き', 'ku': 'く', 'ke': 'け', 'ko': 'こ',
'ca': 'か', 'ci': 'し', 'cu': 'く', 'ce': 'せ', 'co': 'こ',
'ga': 'が', 'gi': 'ぎ', 'gu': 'ぐ', 'ge': 'げ', 'go': 'ご',
'sa': 'さ', 'si': 'し', 'su': 'す', 'se': 'せ', 'so': 'そ',
'za': 'ざ', 'zi': 'じ', 'zu': 'ず', 'ze': 'ぜ', 'zo': 'ぞ',
'ta': 'た', 'ti': 'ち', 'tu': 'つ', 'te': 'て', 'to': 'と',
'da': 'だ', 'di': 'ぢ', 'du': 'づ', 'de': 'で', 'do': 'ど',
'na': 'な', 'ni': 'に', 'nu': 'ぬ', 'ne': 'ね', 'no': 'の',
'ha': 'は', 'hi': 'ひ', 'hu': 'ふ', 'he': 'へ', 'ho': 'ほ',
'ba': 'ば', 'bi': 'び', 'bu': 'ぶ', 'be': 'べ', 'bo': 'ぼ',
'pa': 'ぱ', 'pi': 'ぴ', 'pu': 'ぷ', 'pe': 'ぺ', 'po': 'ぽ',
'ma': 'ま', 'mi': 'み', 'mu': 'む', 'me': 'め', 'mo': 'も',
'ya': 'や', 'yi': 'い', 'yu': 'ゆ', 'ye': 'いぇ', 'yo': 'よ',
'ra': 'ら', 'ri': 'り', 'ru': 'る', 're': 'れ', 'ro': 'ろ',
'wa': 'わ', 'wi': 'うぃ','wu': 'う', 'we': 'うぇ', 'wo': 'を',
'fa': 'ふぁ', 'fi': 'ふぃ', 'fu': 'ふ', 'fe': 'ふぇ', 'fo': 'ふぉ',
'va': 'ヴぁ', 'vi': 'ヴぃ', 'vu': 'ヴ', 've': 'ヴぇ', 'vo': 'ヴぉ',
'ja': 'じゃ', 'ji': 'じ', 'ju': 'じゅ', 'je': 'じぇ', 'jo': 'じょ',
'la': 'ぁ', 'li': 'ぃ', 'lu': 'ぅ', 'le': 'ぇ', 'lo': 'ぉ',
'xa': 'ぁ', 'xi': 'ぃ', 'xu': 'ぅ', 'xe': 'ぇ', 'xo': 'ぉ',
// 1文字
'a': 'あ', 'i': 'い', 'u': 'う', 'e': 'え', 'o': 'お'
};
// 促音に変換する子音のリスト
const sokuonConsonants = 'kstpcgbm';
// マップのキーを長い順にソート(処理効率化のため)
const sortedRomaKeys = Object.keys(romaMap).sort((a, b) => b.length - a.length);
// 半角英数を全角に変換する内部関数
const toZenkaku = (str) => {
return str.replace(/A-Za-z0-9/g, s => String.fromCharCode(s.charCodeAt(0) + 0xFEE0)); };
let yomi = '';
let input = tex;
// 1. 先頭の'\'を'¥'に変換
if (input.startsWith('\\')) {
yomi += '¥';
input = input.substring(1);
}
let i = 0;
while (i < input.length) {
// 2. 促音の処理 (例: 'kappa' -> 'かっぱ')
// 指定した子音が連続する場合に「っ」を追加
if (i + 1 < input.length && inputi === inputi + 1 && sokuonConsonants.includes(inputi.toLowerCase())) { yomi += 'っ';
i++;
continue;
}
// 3. 撥音 'n' の処理
// nの次が子音(y以外)、文末、またはnが続く場合に「ん」に変換
if (inputi.toLowerCase() === 'n' && (i + 1 === input.length || !"aiueoy".includes(inputi + 1.toLowerCase()))) { yomi += 'ん';
i++;
continue;
}
// 4. ローマ字変換 (長いキーから優先的にマッチ)
let matched = false;
for (const key of sortedRomaKeys) {
if (input.substring(i).toLowerCase().startsWith(key)) {
i += key.length;
matched = true;
break;
}
}
// 5. マッチしなかった場合 (子音単体など) は全角に変換
if (!matched) {
yomi += toZenkaku(inputi); i++;
}
}
return yomi;
}
例:\forall→¥ふぉらll