かすみん日記

暇なときに何か喋ります

【LaTeX】句読点を自動置換

目的

句読点は 、。 で入力するけど、出力のPDFでは全角カンマ・ピリオド ,. にしたい。

制約

  • とにかく楽したい
  • OSのシステム設定で句読点をカンマ・ピリオドにするのはヤダ
  • エディタの一括置換は毎回やるのだるい
  • 外部プログラムで自動置換は、latexmk コマンド以外打ちたくない
  • なんならファイル上では 、。 のままでいてほしい

実装

、。 の文字を、,. の文字を返すようなコマンドにする。

例えば、~ 一文字で改行禁止のスペースの意味になるような感じ。

和文文字はそのままではアクティブ(コマンド化)にはできないので、そのカテゴリーコードを変更する。

\kcatcode"3001=15 とすると、(U+3001)が属するUnicodeブロックに含まれる文字のカテゴリーコードが全て15に変更される。

カテゴリーコードが 15 の文字であれば \ から始めなくても文字単体でコマンド名とすることができる。

例えば \def、{,} のような感じでコマンドが定義できる。

すると、文中で単に と書いている読点は、全角のカンマ に置き換わることになる。

問題点

と同じUnicodeブロックに含まれる文字のカテゴリーコードが全て 15 に変更されたが、カテゴリーコード 15 の文字が文書中に現れるとタイプセットエラーになる。

が属するUnicodeブロックには、普段からよく使うカギ括弧 「」 やにょろ なども含まれるが、これらの文字が文書中で使えないことになってしまう。

なので置換する句読点 、。 以外の文字は、元の文字をそのまま返すコマンドとして再定義してやらないといけない。

\def「{「} と書いてしまうと無限ループになってしまうので、Unicodeの番号で \def「{\char"300C} のようにして再定義する。

まだ他にも副作用があるのかもしれないが、一応はこれで大丈夫なはず。

あとは一応、和文の句読点 、。 が使いたいときには使えるように適当にコマンドを用意しておいてやればいいかなと。

\newcommand\読点{\char"3001}
\newcommand\句点{\char"3002}

サンプルコード

uplatex 用のサンプルコードを置いておきます。

%% Typeset: uplatex
\documentclass[uplatex,a6paper,papersize]{jsarticle}

%% 句読点(、。)を含むUnicode Blockのカテゴリーコードを15に変更
\kcatcode"3000=15

%% Unicode文字を再定義
\usepackage{newunicodechar}
%% CJK Symbols and Punctuation
%% Range: 3000—303F
%% Quantity of characters: 64
\newunicodechar{ }{\char"3000}
\newunicodechar{}{\char"FF0C}% <- 3001
\newunicodechar{}{\char"FF0E}% <- 3002
\newunicodechar{}{\char"3003}
\newunicodechar{}{\char"3004}
\newunicodechar{}{\char"3005}
\newunicodechar{}{\char"3006}
\newunicodechar{}{\char"3007}
\newunicodechar{}{\char"3008}
\newunicodechar{}{\char"3009}
\newunicodechar{}{\char"300A}
\newunicodechar{}{\char"300B}
\newunicodechar{}{\char"300C}
\newunicodechar{}{\char"300D}
\newunicodechar{}{\char"300E}
\newunicodechar{}{\char"300F}
\newunicodechar{}{\char"3010}
\newunicodechar{}{\char"3011}
\newunicodechar{}{\char"3012}
\newunicodechar{}{\char"3013}
\newunicodechar{}{\char"3014}
\newunicodechar{}{\char"3015}
\newunicodechar{}{\char"3016}
\newunicodechar{}{\char"3017}
\newunicodechar{}{\char"3018}
\newunicodechar{}{\char"3019}
\newunicodechar{}{\char"301A}
\newunicodechar{}{\char"301B}
\newunicodechar{}{\char"301C}
\newunicodechar{}{\char"301D}
\newunicodechar{}{\char"301E}
\newunicodechar{}{\char"301F}
\newunicodechar{}{\char"3020}
\newunicodechar{}{\char"3021}
\newunicodechar{}{\char"3022}
\newunicodechar{}{\char"3023}
\newunicodechar{}{\char"3024}
\newunicodechar{}{\char"3025}
\newunicodechar{}{\char"3026}
\newunicodechar{}{\char"3027}
\newunicodechar{}{\char"3028}
\newunicodechar{}{\char"3029}
\newunicodechar{〪}{\char"302A}
\newunicodechar{〫}{\char"302B}
\newunicodechar{〬}{\char"302C}
\newunicodechar{〭}{\char"302D}
\newunicodechar{〮}{\char"302E}
\newunicodechar{〯}{\char"302F}
\newunicodechar{}{\char"3030}
\newunicodechar{}{\char"3031}
\newunicodechar{}{\char"3032}
\newunicodechar{}{\char"3033}
\newunicodechar{}{\char"3034}
\newunicodechar{}{\char"3035}
\newunicodechar{}{\char"3046}
\newunicodechar{}{\char"3047}
\newunicodechar{}{\char"3038}
\newunicodechar{}{\char"3039}
\newunicodechar{}{\char"303A}
\newunicodechar{}{\char"303B}
\newunicodechar{}{\char"303C}
\newunicodechar{}{\char"303D}
\newunicodechar{}{\char"303E}
\newunicodechar{}{\char"303F}

%% 元の句読点を退避
\newcommand\読点{\char"3001}
\newcommand\句点{\char"3002}

\begin{document}\huge

やあ,こんにちは.

やあ、こんにちは。

やあ\読点 こんにちわ\句点

\end{document}

github にも置いておきます。

参考

zrbabbler.hatenablog.com

en.wikipedia.org

unicode-table.com