漢直ネタは今年やる予定の漢直Advent Calendarにとっておこうと思ったのですが, とにかく日記のネタもないので,もうあまり気にせず出せるものは出そうということで, 漢直ネタの日記を書きました。
はじめに
T-Codeの打鍵を表す方法としては,
- ストローク表(木を見て森を見る方式)
- 橋田表
- 橋田ニーモック
がありますが,EELLL.js のUIとかを見ると, 一般的に利用されているのは2. の橋田表のような気がします。
確かに入力する時はこれでよくて,T-Codeは「無意識で入力できる」まで習達して始めて 役に立つ,という目的に達した後は特に問題はないと思うのですが, 他の文字のストロークとの比較とかをしたい時や,一覧性についてなかなかハードルが高いです。
また,T-Code Laboratoryのストローク表の見方にある ストローク表は次のようなものです。
説明文があれば分かるのですが,T-codeを知らない人が見てこれでどうやって入力するのかは今一つ分からないと思います。

そこで,T-codeを知らない人が見ても何となく分かるストローク表を作ってみたというのが今回の記事です。
tcode.stの読み込み
ストローク表のテキストファイルは次のような内容です。
ストローク表のテキストファイルの内容
LL * * * * * * * * * * * * * * * * * * * * * * * * * ヮヰヱヵヶ 丑臼宴縁曳 鬼虚狭脅驚 孤誇黄后耕 奉某貌卜* ゎゐゑ* * 於汚乙穏* 奇既菊却享 巧克懇困昏 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ヲ哀暇啓把 ゥ逢牙掲伐 ヴ宛壊携避 ヂ囲較劇卑 ヅ庵寒賢藩 果告策首農 概買詳由死 武残両在! 風階能論増 細古利ペゃ 報紙館夜位 音王放々応 案曲情引職 横興刺側覚 崎白ぐ官球 欠夏彼妻善 財針裏居差 従骨厚顔量 適類御宇推 母奥因酒伸 ぱ慰我兼菱 ぴ為掛嫌紐 ぷ陰敢顕描 ぺ隠甘牽憤 ぽ胃患厳弊 収際太園船 若雄査ふ賞 指氏丸続ェ ぎ格次習火 思術広門聞 種岡結進真 宅熟待取科 料土活ね参 受予切育池 英ボ加室少 ヒ江別考権 及久蔵早造 投義算半県 込沢軍青清 転空性使級 ぁ* 瓦* * ぃ* * * * ぅ* * * * ぇ* * * * ぉ* * * * 徳渡守登退 械刊訪融雨 帝始了極熱 読鈴恐督況 族丁未才返 件友卒初慣 宮伊求技写 局頭配黒院 向府富直倉 割ぶ番望元 ヨ誤証含% 判規感値ギ 済吉ゆ器照 説週号葉派 休省央福毎 LR * * * * * * * * * * * * * * * * * * * * * * * * * 湖礼著移郷 端飾郵塩群 刷寿順危砂 震扱片札乞 弘痛票訴遺 償欧努底亜 紅傷豪維脱 舗充喫腕暴 輪倒操柄魚 則存倍牛釈 禁硝樹句礎 絹被源願臨 批慶渉竜併 就駐揮丹鮮 綱潟創背皮 簡徴触宗植 承章候途複 快否歯筆里 包納頼逃寝 唱暮憲勉罪 害賃整軽評 撃折追隊角 浴秀糸春幸 積程断低減 故鉱提児敷 服声任検豊 変審改昇芸 限研労統役 逆企精ざ印 令違装然確 爆仲茶率比 陽構旅施曜 ァ導認健尾 殺負何履般 券悪秋非便 朱遅甲致汎 陣鶴鹿貨絡 眼繁誌招季 執紹夢卸阿 岳刑弱雲窓 病終起路越 常張薬防得 寺質づ港条 停領容玉右 河置供試席 勢必講愛管 輸形助* 流 基好味宝争 足草築観言 婦段衛額渋 素兵専親寮 毛永申袋良 等浅頃落命 板客師税飛 伝庭課着坂 欲巣茂述朗 迫災恋脳老 留列刻豆看 替沼? 辞献 還更占箱矢 帰庁昨跡ゲ 監寄裁達芝 竹注介具失 ゅ修究答養 志抜航層深 億録赤想消 色貸販編仕 左態花栄ザ ぬ展警型誰 根様独止堂 図挙険ゼ波 之末ぼ街免 州払乗庫状 例満津準遊 字材過諸単 RL * * * * * * * * * * * * * * * * * * * * * * * * * 請境系探象 尚賀岸責漁 舎喜幹丘糖 布苦圧恵固 姿絶密秘押 盛革突温捕 益援周域荒 康徒景処ぜ 邦舞雑漢緊 衆節杉肉除 依繊借須訳 織父枚乱香 譲ヘ模降走 激干彦均又 測血散笑弁 酸昼炭稲湯 貿捜異隣旧 攻焼闘奈夕 盤帯易速拡 汽換延雪互 歩回務島開 キせ区百木 や出タ手保 コ山者発立 ナ金マ和女 給員ど代レ 分よル千ア 7か( トれ きっ日国二 上く8え年 相家的対歴 付プばュ作 内工八テ見 九名川機チ サ建パ第入 桜瀬鳥催障 典博筋忠乳 採謡希仏察 君純副盟標 犯余堀肩療 中スもお定 わラ東生ろ う4) 十リ あこ6学月 本さら高シ 3と〇てる ーした一が い、の51 。* 0・2 ではになを ッ人三京ち ロク万方フ んまンつ四 けイす電地 業時「長み 呼幅歓功盗 紀破郡抗幡 房績識属衣 去疑ぢ綿離 秒範核影麻 店持町所ほ 全じ自議明 バ部六経動 後間場ニ産 問ム七住北 行ド円小ジ 通カ社野同 だり—め大 新」9子五 事田会前そ 海道ず西げ 当理メウグ 不合面政オ 委化ビ目市 気売下都株 RR * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 星析遷宣 庶粧丈称蒸 * 乃如尼帳 欄龍略慮累 * * * * * 鼠曹奏尊* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 索射濁慢 * 冊需詑迷 * 皿輯蓄戻 * 賛瞬貯羊 * * 盾虫* 佐法数郎談 接備最急験 記朝知ワ送 モ資士費ィ 無石屋解募 美題井洋実 宿制集安画 セ運ツ特谷 神び打勤ャ 優公品語演 昔短岩巨敗 遠ォ将ぞ塚 序振練念働 耳授版効視 示即難普辺 * 衰滋沈己 * 趨湿添已 * 垂甚徹巳 * 粋* 爪巴 * 寸瞳陶* む南原駅物 ケ式戦関男 話座線ダ橋 べ民ソ点遇 期ゾ歳強係 要設水藤有 連鉄教力ベ デ現エ他度 車成天世文 主映書可へ ホ共ブ平楽 私ゴ来信午 村ガ製校ご ノ完重約各 近外米ョ光 * * * * * * * * * * * * * * * * * * * * * * * * * 洗羽個医静 響忘討史環 司迎華許補 復並浦ユ冷 担陸巻競護 支協用表正 先多商ハ交 調混ポ決ミ 組選党択体 銀以ヌ営治 ヤ心界意今 再ネ~口台 団計夫食総 戸ひょ価与 身ピ勝反ズ
LL,LR,RL,RRが先頭にある行の後に4×5の文字グループが4×5ある形式です。
T-codeの場合,1行10キーを4段使うので合計40キーになります。
T-codeは一つの文字入力に対して2打建固定であるので,40×40の行列を確保しておくと
良さそうです。
上記のテキストファイルから40×40文字列の行列を読み込む関数を実装してみます。
function read_tcode_st(tcode_st, escape="*") str_lines = split(replace(read(tcode_st, String), " " => "")) str_ar = ["LL", "LR", "RL", "RR"] lr_idx0 = [findfirst(isequal(x), str_lines) for x in str_ar] res = Matrix{String}(undef, 40, 40) tmp_dic = Dict() for t in 1:4 tmp_dic[str_ar[t]] = Matrix{String}(undef, 16, 25) for k in 1:16 _strs = replace.(split(str_lines[lr_idx0[t] + k], ""), escape => "") tmp_dic[str_ar[t]][k, 1:25] .= _strs end end c1, c2 = repeat(1:5, 5), repeat(1:5, inner=5) r1, r2 = repeat(0:10:30, 4), repeat(0:10:30, inner=4) for (tbl_key, r_shift, c_shift) in zip(str_ar, (0, 5, 0, 5), (0, 0, 5, 5)) for r in eachindex(r1), k in eachindex(c1) res[r2[r] + c2[k] + r_shift, r1[r]+c1[k] + c_shift] = tmp_dic[tbl_key][r, k] end end res end
tmp_dicの中間テーブルを惜しみもなく作成する富豪プログラミングです。
作成した行列はなぜか tbl[第2打キー,第1打キー]の順番です。
Julia言語は1,2,3,4,...と増加させると行方向に移動することを意識したものですが,
後述の通り木を見て森を見るだと第1打を変化させる感じになるので,
むしろ素直にtbl[第1打キー,第2打キー]にすれば良かったと後悔しています。
Luxor.jlを用いたpdfファイルの出力
悪名高いJulia言語のグラフ出力ライブラリと違い,公式のドキュメントとか充実している 評価の高い2Dグラフィック出力ライブラリLuxor.jlを今回利用します。
cairoライブラリの高級なラッパーといった感じの仕組みになっているようです。
と言っても,次のような感じで,...のところにtext関数の羅列(実際はプログラムで色々書く)にするだけです。
テキスト表示以外は今回何も使っていません。
Drawing(横幅, 縦幅, ファイル名.pdf) # pdfのサイズ・ファイル名を指定 origin() # 座標系のリセット sethue("black") # 色の指定 fontsize(12) # フォントサイズ指定 text(...) # テキストの表示 ... finish() # pdfの書き込み
打鍵文字の出力
RL,RR,LL,LR毎にテーブルの参照場所を変えて,順に表示していく
簡単なお仕事だということに,下記実装を見て初めて気が付きました。
実際はRLの表示を位置とか増分とか決めて試行錯誤で実装して,
それに対してその他のテーブルで変えないといけない部分を変えられるようにした感じです。
一応,左上の基準ポイントを変えるとそのまま移動する感じで実装しています。
function draw打鍵(tbl::Matrix{String}, pt0::Point, face=:RL) fontsize(12) sethue("black") x₀, y₀ = pt0.x, pt0.y ri_dict = Dict(:RL => (6:10:40, 1:10:40), :RR => (6:10:40, 6:10:40), :LL => (1:10:40, 1:10:40), :LR => (1:10:40, 6:10:40)) rᵢ₁, rᵢ₂ = get(ri_dict, face, ri_dict[:RL]) for (sr₂, y₂) in zip(rᵢ₂, 0:3) for (k₂, x₂) in zip(sr₂:sr₂ + 4, 0:4) for (sr₁, y₁) in zip(rᵢ₁, 0:3) for (k₁, x₁) in zip(sr₁:sr₁+4, 0:4) pt = Point(x₀ + x₂ * 85 + x₁ * 14, y₀ + y₂ * 70 + y₁ * 14) 文字 = tbl[k₂, k₁] != "" ? tbl[k₂, k₁] : "☒" text(文字, pt, halign=:left, valign=:center, angle=0) end end end end nothing end
説明文字列の出力
第一打は木を見て森をの木の部分で,それぞれ一行・一列毎のガイドが必要です。
第二打は木を見て森をの森の部分で,大きなグループ単位でのガイドで十分です。
横書だと左上から右下に読んでいくイメージだと思うので, 左上側に第一打,右下側に第二打の説明用文字を追加します。
説明用文字列出力の実装
function draw第一打説明(pt0::Point, face=:RL; color="black") x₀, y₀ = pt0.x, pt0.y 指₁ = [ "", "人差し指", "中指", "薬指", "小指"] (face in [:LL, :LR]) && reverse!(指₁) x指₀, y指₀ = x₀ + 11, y₀ - 15 sethue(color) fontsize(9) for x₂ in 0:4, x₁ in 0:4 x = x指₀ + x₂ * 85 + x₁ * 14 text(指₁[x₁ + 1], Point(x, y指₀), halign=:left, valign=:bottom, angle=1.5π) end 上下 = ["最上段", "上段", "中段", "下段"] for y₂ in 0:3, y₁ in 0:3 y = y₀ + y₂ * 70 + y₁ * 14 text(上下[y₁ + 1], Point(x₀ - 5, y), halign=:right, valign=:center, angle=0) end dic_1st = Dict( :RL => "右", :RR => "右", :LL => "左", :LR => "左") fontsize(15) text("第一打: $(get(dic_1st, face, "右"))手", Point(x₀ - 20, y₀ - 60), halign=:left, valign=:bottom, angle=0) nothing end function draw第二打説明(pt0::Point, face=:RL; color="black") x₀, y₀ = pt0.x, pt0.y 指₂ = [ "小 指", "薬 指", "中 指", "人差し指", ""] (face in [:LR, :RR]) && reverse!(指₂) sethue(color) fontsize(13) y₂0 = y₀ + 3 * 70 + 3.5 * 14 for x₂ in 0:4 x = x₀ + x₂ * 85 + 14 * 2.5 text(指₂[x₂ + 1], Point(x, y₂0), halign=:center, valign=:top, angle=0) end x₂0 = x₀ + 5 * 85 - 10 上下 = ["最 上 段", "上 段", "中 段", "下 段"] for y₂ in 0:3 y = y₀ + y₂ * 70 + 1.2 * 14 text(上下[y₂ + 1], Point(x₂0, y), halign=:center, valign=:bottom, angle=0.5π) end dic_2nd = Dict( :RL => "左", :RR => "右", :LL => "左", :LR => "右") fontsize(15) text("第二打: $(get(dic_2nd, face, "右"))手", Point(x₂0, y₂0 + 20), halign=:right, valign=:top, angle=0) nothing end function draw説明(pt0::Point, face=:RL; color1="black", color2="black") draw第一打説明(pt0, face; color=color1) draw第二打説明(pt0, face; color=color2) sethue("black") fontsize(20) text(string(face), Point(pt0.x + 85*2.5, pt0.y - 70), halign=:center, valign=:bottom, angle=0) nothing end
pdfの作成
上記の関数をまとめてpdfを作成する関数を作成します。 一枚のpdfに二種類のテーブルを描きます。
function make_stroke_pdf(tbl::Matrix{String}, path_pdf::AbstractString, no1 = :RL, no2 = :RR) color_tbl = Dict( :RL => ("orchid1", "deepskyblue"), :RR => ("orchid1", "orange"), :LL => ("deepskyblue", "lightgreen"), :LR => ("deepskyblue", "orchid1"), ) x_0, y_0 = -70mm, -110mm x_1, y_1 = x_0, y_0 + 140mm Drawing(210mm, 297mm, path_pdf) origin() fontsize(12) for (no, x, y) in zip([no1, no2], [x_0, x_1], [y_0, y_1]) 色1, 色2 = get(color_tbl, no, color_tbl[:RL]) draw打鍵(tbl, Point(x, y), no) draw説明(Point(x, y), no; color1=色1, color2=色2) end finish() end
最後に実際にpdfを作成するコードです。
tbl = read_tcode_st("tcode.st") make_stroke_pdf(tbl, "stroke_tbl_rl_rr.pdf", :RL, :RR) make_stroke_pdf(tbl, "stroke_tbl_ll_lr.pdf", :LL, :LR)
pngファイルに変換したものを次に示します。 変換方法はinkscapeを使って次のように変換しました。
inkscape -b white --export-type=png --pdf-poppler -o stroke_rl_rr.png stroke_tbl_rl_rr.pdf inkscape -b white --export-type=png --pdf-poppler -o stroke_ll_lr.png stroke_tbl_ll_lr.pdf


注意点
文字のフォントの指定をしていないので,OSのデフォルト表示のフォントで描画されます。 従ってOSやディストリビューションによって結果は異なります。英語でセットアップしているOSとかだと英語フォントがデフォルトで日本語が文字化けする可能性もあるので注意して下さい。まぁ他の人にニーズがあるとは思えませんが。
また,これらの実装の断辺をつなぎ合わせて実行させる時は,最初にusing Luxorを忘れないようにして下さい。
さらにその前にはパッケージモードでadd Luxorもしくはusing Pkg; Pkg.add("Luxor")でLuxorパッケージの
インストールがあらかじめ必要です。
まとめ
とりあえず,他に何も説明なくてもt-codeの打鍵が分かるストローク表をJulia言語のLuxorを使って 描画した例を紹介しました。
自分の場合はごちゃごちゃ線を引くと逆に見づらくなるので今回はシンプル(というか線を引くのが面倒臭い)な実装にしました。
これで「T-codeをやりたい」という人を絶望の淵にたたきおとすネット上のサンプルができました。
なお,今回用いたtcode.stはtc.el由来だと思うのですが,現在のレポジトリにはファイルが存在せず,
出所は不明です。
また,ネットに現存するhasida-tableにあるtcode.stは
JIS(iso-2022-jp)コードでまた,帳のストロークが存在せず,tc.elや手持ちのtcode.stは帳のストロークが存在するということが,
手持ちのtcode.stがtc.el由来と判断した理由です。
一応,漢直を知らない人が見ても「どうやってT-codeを入力するか」が分かるものになったのではないかと思います。
同時に老眼で見づらくなった橋田表に頼らなくても打鍵が確認できるようになったのは大きな進展(20年も使っているのに今さら!)です。
ネタが無くなったら今年やる予定の漢直Advent Calendarの記事になると思いますが, ご容赦下さい。
追記[2025-07-08]
Google Colabで動くかもしれないサンプルを作成してみました。