質問: LaTeXの文書中で(つまりエディタやコンパイル時に前処理などをしないで)文字を置換することを考えています。調べると、次のようなものが見つかりました。 * `\newunicodechar`を用いる方法 ``` \documentclass{article} \usepackage{newunicodechar} \newunicodechar{あ}{い} \begin{document}あ←「い」と出力させたい\end{document} ``` 次のエラーとなりました: ``` Package newunicodechar Error: ASCII character requested. ``` * `\DeclareUnicodeCharacter`を用いる方法 ``` \documentclass{article} \usepackage[utf8]{inputenc} \DeclareUnicodeCharacter{3042}{い} \begin{document}あ←「い」と出力させたい\end{document} ``` コンパイルはできましたが、置換が起きませんでした。 .texソースはutf8で書いています。これが原因であれば、sjis等にすることもできます。 何か実現する方法はないでしょうか。 コマンド: ``` > platex -shell-escape -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 -kanji=utf8 test.tex ``` バージョン情報: ``` This is e-pTeX, Version 3.14159265-p3.8.2-190131-2.6 (utf8.sjis) (TeX Live 2019/W32TeX) (preloaded format=platex) ```
回答: `\newunicodechar` あるいは `\DeclareUnicodeCharacter` は「欧文扱いされる文字」に対してだけ適用できる方法であり,「和文扱いされる文字」に対しては使えません。さらに言うと,和文文字を他の文字に置換することは,マクロレベルでは(少なくとも私は)不可能だと思います。 エディタで置換するのが最もたやすいと思いますが,「仮想フォント (VF; Virtual font) を作ってフォントの側で置換する」という方法を紹介します。ただし,下で使う makejvf というプログラムは,かなり新しいもの(TeX Live 2018 は可,2017 は不可)が必要です。 (技術的には pTeX の中・上級者レベルの話になります。また,特に「他の人とファイル交換する」ようなことがあれば,min10.vf が他人とは異なることも頭に入れておかないと,思わぬ事故の原因になります。) 以下,pLaTeX + dvipdfmx を使っていると仮定します。また,ご提示のファイルが `\documentclass{article}` で始まっているので,pLaTeX 標準の「min10」が使われていると仮定します(もし jsarticle クラスを使っていれば「min10」を「jis」に読み替えてください)。 まず,お使いの TeX システムから min10.tfm というファイルを探して,ソースと同じ場所に置いておいてください。次に,下記のファイルを a-to-i.cnf として同じ場所に保存します。 ``` % パーセントで始まるものはコメント。 % REPLACE で置換前と置換後の文字コードを 16 進数で指定する。 % 「あ」は JIS で 0x2422,「い」は 0x2424 % 以下の行の空白はタブに置き換えてください。 REPLACE 2422 2424 ``` ターミナル(Windows ならコマンドプロンプトや PowerShell)を起動し,ファイルが保存してある場所で以下のコマンドを実行します。 ``` makejvf -t a-to-i.cnf min10 rml ``` すると,min10.vf と rml.tfm が得られるはずです(このうち min10.vf が文字「あ」を「い」に置換する情報を含むものです)。 出来たら,普段通り platex と dvipdfmx を実行してみてください。「あ」が「い」に置き換わっているはずです。 以下,注意点です。 * DVI ファイル自体は普通のものと同じです。dvipdfmx が「今回作った特殊な VF」を読み取って文字を置換します。 * そのため,本来「あ」が出力されようとする場所は全て「い」に置換されます。 * ゴシック体も置換したい場合は,コマンドの min10 を goth10 に置き換えたものを別途実行する必要があります。