というわけで、本記事では「TeX 言語のコード(LaTeX 文書のソースも含む)を記号と数字のみ を含む(チョット読みにくい🎄)コードに変換する」ための具体的な手順について解説します。
※対象とするコードはASCII文字のみを含むものに限ります。TeX エンジンの種類には依存しません。
キホン的知識
なんと、インタァーネットには「チョット読みにくいTeX 言語のキホン」 を解説したスバラシイ記事があります。チョット読みにくいTeX 言語初心者はまずこれを読みましょう。
ここで紹介する手順では上記記事の「サーカムフレックスメソッド」(ソース上の文字を代用する^^ab
形式の文字コード 表記)を利用します。
※本記事では「サーカムフレックスメソッド」のことを(例によって1 )「TeX エス ケープ」 と呼びます。
英字をグッバイする手順
ASCII文字からなるコードを「記号と数字だけ」にするには英字(A~Z、a~z)を除去する必要があります。このため「英大文字 を除去する」「英小文字 を除去する」という2つのステップを順に実行することで実現します。
英大文字をグッバイする話
最初のステップとしてASCII文字のコードを「英大文字を含まないもの2 」に変換します。これは機械的 に処理できず個別に対処する必要がありますが、それほど難しい作業ではありません。元々、TeX 言語の「プログラムっぽいコード」では大文字はほとんど使われません。TeX のプリミティブ名やキーワードは全て小文字であり、フォーマットが提供する制御綴名も大部分が小文字のみからなるからです。
このため、英大文字が出現する箇所の多くは「文字を出力する部分」 になり、これについては\uppercase
を使うと対処できます。次のようなコードを考えてみましょう。
\documentclass { article }
\begin{document}
Hello, ZR world!
\end{document}
\uppercase
を利用することで大文字を消すことができます。
[example-1a.
tex ](英大文字を除去した)
\documentclass { article }
\begin{document}
\uppercase { h} ello, \uppercase { zr} world!
\end{document}
もちろん、時には大文字を含む名前の制御綴 が使われることもあり、これの対処は厄介です。
\documentclass { article }
\begin{document}
Hello, { \TeX } world!
\end{document}
この場合は\csname~\endcsname
と\uppercase
を駆使して対処することになります。
[example-2a.
tex ](英大文字を除去した)
\documentclass { article }
\begin{document}
\def\smalle { e}
\uppercase { h} ello, \uppercase { \csname t\smalle x\endcsname } world!
\end{document}
少し技巧的なので補足しておきます。\uppercase
は文字トーク ンだけに作用して制御綴は変化させないので、
\uppercase { \csname t\smalle x\endcsname }
↓実行
\csname T\smalle X\endcsname
↓展開(ここで \smalle も展開)
\TeX
となり結果的に\TeX
が実行されます。注意すべきなのは「\uppercase
は展開可能でない」(そして\csname~\endcsname
の中は展開で処理される)ということで、このため\csname\uppercase{t}e\uppercase{x}\endcsname
とは書けません。
もう少し“機械的 に処理”したいという場合は「大文字に変換する完全展開可能な マクロ(\upcase
)を作成3 する」という手法が有効でしょう。
[example-2b.
tex ](英大文字を除去した)
\documentclass { article }
\makeatletter
\def\upcase #1{ \@nameuse{ my@uc/#1}}
\def\my @uc@a#1 { \uppercase { \my@uc@b #1}}
\def\my @uc@b#1 #2{ \@namedef { my@uc/#2 }{ #1}}
\@tfor\my@x :=abcdefghijklmnopqrstuvwxyz\do {
\expandafter \my@uc@a\my@x\my@x }
\makeatother
\begin{document}
\upcase { h} ello, { \csname\upcase { t} e\upcase { x} \endcsname } world!
\end{document}
この\upcase
を使うことで変換がかなり楽になります。
英小文字をグッバイする話
先のステップで英大文字を除去したので残っている英字は小文字だけになります。これは「英小文字をTeX エス ケープ形式に変換する」ことで機械的 に除去できます。英小文字(a~z)のASCIIコードは0x61~7Aであるため、単文字(^^X
)のTeX エス ケープ形式に直した場合のX
の部分の文字コード は0x21~3Aとなり、この範囲の文字は全て記号と数字になるわけです。
変換前: abcdefghijklmnopqrstuvwxyz
変換後: !"#$%&'()*+,-./0123456789:
ただしこの中の「p~y」の範囲については少し注意が必要です。例えば「w3
」という文字列の英小文字部分を上記の規則に従ってTeX エス ケープに変換すると^^73
となりますが、これは16進法のTeX エス ケープの形式に合致しているためs
という異なる文字列に解釈されてしまいます。
この問題を回避するため、「p~y」の範囲の文字は単文字のTeX エス ケープ(^^0~^^7
)の代わりに16進法のTeX エス ケープ(^^70~^^79
)に変換することにします。するとw3
の変換結果は^^773
となり、別の文字列に解釈されることはなくなります4 。
まとめると、以下の手順により英小文字を除去できます。
まず「p~y」を16進法TeX エス ケープ(^^70~^^79
)に変換する。
残りの英小文字(a~z)を単文字TeX エス ケープ(^^!~^^:
)に変換する。
次のような(英大文字を含まない)コードを考えてみましょう。
\catcode `\@=1 1
\newcount \my@n
\my@n =42
先の手順に従って変換すると英小文字を含まないコードが得られます。
[example-3a.
tex ](英小文字を除去した)
\^^#^^!^^74^^#^^/^^$^^%`\@=11
\^^.^^%^^77^^#^^/^^75^^.^^74\^^-^^79@^^.
\^^-^^79@^^.=42
このexample-3a.tex はTeX の字句解析の規則の下ではexample-3.tex と全く同一のコードと解釈されるわけです。
ここまで説明した2つのステップを順に実行することで、どんなTeX 言語コード でも「記号と数字だけのコード」に変換できます。例として、“hello world ”のLaTeX 文書を「記号と数字だけのコード」に変換してみましょう。
\documentclass { article }
\begin{document}
Hello, { \TeX } world!
\end{document}
これは前節で例にあげたexample-2.tex と同じものです。従ってここから「英大文字を除去」した結果のコード(の一例)がexample-2a.tex となります。ただし変換後のコードは横に長くなるので、改行を多めに入れておくことにします。
[example-4a.
tex ](英小文字を含む)
\documentclass { article }
\begin{document}
\def\smalle { e}
\uppercase { h} ello,
\uppercase { \csname
t\smalle x\endcsname }
world!
\end{document}
あとはこのコードを“TeX エス ケープ変換”して「英小文字を除去」すれば「数字と記号だけのコード」が完成します。
[example-4b.
tex ](英字を除去した)
\^^$^^/^^#^^75^^-^^%^^.^^74^^#^^,^^!^^73^^73{^^!^^72^^74^^)^^#^^,^^%}
\^^"^^%^^'^^)^^.{^^$^^/^^#^^75^^-^^%^^.^^74}
\^^$^^%^^&\^^73^^-^^!^^,^^,^^%{^^%}
\^^75^^70^^70^^%^^72^^#^^!^^73^^%{^^(}^^%^^,^^,^^/,
\^^75^^70^^70^^%^^72^^#^^!^^73^^%{\^^#^^73^^.^^!^^-^^%
^^74\^^73^^-^^!^^,^^,^^% ^^78\^^%^^.^^$^^#^^73^^.^^!^^-^^%}
^^77^^/^^72^^,^^$!
\^^%^^.^^${^^$^^/^^#^^75^^-^^%^^.^^74}
まるで解読不能 なのでトッテモ素敵😍
実際にLaTeX で処理してみましょう。
example-4bの出力
元のコードと同じ出力が得られました😊
まとめ
というわけで、「TeX 言語🤮はカンタンだからツマラナイ🙁」という人はぜひ、使う文字を制限する 🎄ことに挑戦してみましょう!💁(えっ)