monkey patchとは、既存のコードの挙動を後からすげ替えて変更するもので、一部の動的型付け言語方面で多用されているものです。うまくやると効果が大きいものの、変更が局所的にならずに大域的に影響したりすることもあって、要注意な技術でもあります。
さてLaTeXでも同様に、既存のcommandを変更したいことがあります。そこでLaTeXでmonkey patchを試してみます。
monkey patchの実現方法
monkey patchを実現するには、
- 既存のcommandのコピー
- コピーを変更しない再定義
の2つができれば実現できます。
LaTeXの場合、前者は\let
が使えます。
\let\newcomm\oldcomm
また後者については、\renewcommand
を使うと、\let
でコピーしたコマンドを消さずに、新しい挙動を定義できます。
\renewcommand{\foo}{%
%% いろいろ
\oldfoo %% \letで作ったコピー
%% あれこれ
}
これを使って、\texttt
の挙動を差し替えてみます。
元の\texttt
は\origtexttt
で参照できるようにします。
\documentclass{jsarticle}
\usepackage{xcolor}
\begin{document}
%%commandの差し替え
\let\origtexttt\texttt
%%コピーできていることの確認
\texttt{abc}
\origtexttt{ABC}
%%commandの再定義(コピーは変更されない)
\renewcommand{\texttt}[1]{\origtexttt{\color{blue}#1}}
%%入れ替わっている && オリジナルへの参照も残っている
\texttt{abc}
\origtexttt{ABC}
%%戻すこともできる
\renewcommand{\texttt}[1]{\origtexttt{#1}}
%%戻っているのを確認
\texttt{abc}
\origtexttt{ABC}
\end{document}
出力結果は以下のようになります。
2番目だけ、abc
が青く表示されます。