npm パッケージ
tate-chu-yoko
日本語の縦組み本文で、半角英数字を自動的に「縦中横」として組版する軽量ライブラリ。書き手はプレーンテキストのままで、組版はライブラリに任せましょう。
第1章 2026年4月、Webの縦書きは進化した。
解決したいこと
新聞や書籍の縦組みでは、半角英数字を横並びのまま正立させる「縦中横」が当たり前に使われてきました。CSS には text-combine-upright: all があるものの、どの文字をまとめるかは開発者が明示しなければなりません。結果として、書き手が原稿の中で <span class="tcy"> を毎回書く羽目になりがちです。tate-chu-yoko はこの組版処理を自動化し、書き手を組版の都合から解放します。
5つの配布物
中心にあるのは framework-agnostic なトークナイザー @love-rox/tcy-core。スタックに合わせて好みのアダプタを1つ(または複数)選んでください。core は依存として自動的に引き込まれます。
アダプタ
@love-rox/tcy-react
React コンポーネント
React 17+ で動く <Tcy> コンポーネント。SSR で決定性のある DOM を出力します。
@love-rox/tcy-vue
Vue 3 コンポーネント
Vue 3 向けの <Tcy>。React 版と同じオプション・同じ挙動。
@love-rox/tcy-rehype
rehype プラグイン
unified の HAST パイプラインに組み込んで、build 時に縦中横を適用。クライアントランタイム不要。
@love-rox/tcy-astro
NEWAstro インテグレーション + コンポーネント
Astro 4+ の Markdown / MDX パイプラインに rehype プラグインを自動登録。.astro 用の <Tcy> コンポーネントも同梱。
共通の CSS
どのアダプタを使っても、生成される <span class="tcy"> には同じ CSS を当ててください。Safari の歴史的経緯から -webkit-text-combine を併記しておくと安心です。
.tcy {
-webkit-text-combine: horizontal;
text-combine-upright: all;
}全体に共通する性質
<em>12</em>34のように要素境界をまたぐ文字列は連結されず、別々のスパンになります。- 全角英数字(
A〜Z/0〜9)は既定で対象外。縦組みでも既に正立して表示されるためです。 - React / Vue / Astro
<Tcy>のいずれも SSR-safe で、サーバーとクライアントで同じ DOM を生成します。 - rehype プラグイン(および Astro インテグレーション内部)は冪等です。同じ HAST に2回適用しても出力は変わりません。
maxLength/excludeWordsで対象外になった run はプレーンテキストに戻り、隣接するテキストと自動的にマージされます。
ブラウザ対応
writing-mode: vertical-rl と text-combine-upright: all は主要なモダンブラウザで動作します。Safari では歴史的に -webkit-text-combine: horizontal を併記しておくと安心です。
バージョンの揃え方
5 つのパッケージはバージョン番号を @love-rox/tcy-core に揃えてリリースしています。「core は 0.3 だけど react は 0.2.5」のような不整合で迷わないよう、どれか一つでも変更があれば他もまとめて同じ番号に上がる運用です。
ライセンス
MIT License。個人・法人問わず自由に利用できます。
触ってみる
設定を変えながらブラウザ上で挙動を確認できるデモを用意しました。
デモページを開く