4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaTeXでmonkey patching

Last updated at Posted at 2015-03-20

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}

出力結果は以下のようになります。

result.png

2番目だけ、abcが青く表示されます。

参考

4
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?