LaTeX の機能を拡張したり,新たな機能を追加したりするために用いるのが「パッケージ」です*1. パッケージの基本的な使い方は LaTeX 入門の項目の一つとしてまとめられていますので,参照してください.
この項では,より進んだ「パッケージの作成法」や「パッケージのカスタマイズ方法」を説明します.
TeX Live には相当数のパッケージが含まれていますし,最近の W32TeX には通常用途には十分なほどのパッケージが含まれるようになりました. これらのディストリビューションに含まれている便利なパッケージ,あるいはそのほかに入手可能な優れたパッケージを目的別パッケージ簡易リファレンスにまとめました.
パッケージファイルは自分で作ることもできますので,作った場合は CTAN などで世界中に配布してもよいでしょう. 基本的なマクロの書き方は LaTeX入門/LaTeXマクロの作成 および TeX入門/マクロの作成 にありますので,これをパッケージ化する際に注意すべき点をまとめます.
\ProvidesPackage{sample}[2018/01/01 v1.0]
% 要加筆.プリアンブルにマクロを書くのと異なる点などがあれば.
既存のパッケージが自分の利用目的にぴったり合えばよいですが,時にはパッケージの提供する機能を少し変更して利用したいこともあるかもしれません. ここでは,既存のパッケージの機能をカスタマイズする方法を説明します.
パッケージの中で定義されるマクロなどを,パッケージ読み込み後に再定義するという方法です.
例えば,パッケージ foo.sty の中で \newcommand\bar{... 10pt ...} のような定義があって,この中の “10pt” を “20pt” にしたいとします. \newcommand は LaTeX で「新しいマクロを定義する」という意味で,定義済みのマクロを再定義するには \renewcommand を使います. 例の場合,読み込み側のファイルで
\usepackage{foo} \renewcommand\bar{... 20pt ...}
のようにすれば良いわけです.
また,再定義するマクロの名前や再定義の内容に @ が現れる場合は,次のように再定義全体を \makeatletter と \makeatother で挟んでおく必要があります.
\usepackage{foo} \makeatletter \renewcommand\bar{... 20pt ...} \makeatother
パッケージの実体はテキストファイルであって LaTeX の命令が書いてあるだけですから,その気になれば一部を書き換えたりすることも可能です. しかし安易に書き換えるのはいけません. 書き換えたパッケージファイルがインターネットなどを通じて他の多くのユーザーの手に渡って混乱が生じたことも過去にあります*2.
やむを得ずパッケージファイルを直接書き換える場合は,ファイル名も変更して元のものと区別がつくようにする必要があります. \usepackage で読み込むところでも変更後の名前で読み込むようにします.
また,当然ながらパッケージの書き換えの可否は製作者の意向に従う必要があります. 詳しくはパッケージに付属の文書(readme.txt など)を調べてください. 安全な「プリアンブルで再定義する方法」がほんとうに不可能かどうか,まずは検討してみてください.
LaTeX ユーザがパッケージ利用時に出くわすことがあるトラブルへの対処法は,以下が参考になります。
また,パッケージを利用する際によくある LaTeX のエラーメッセージとしては以下が挙げられます:
これらのエラーへの対処法は LaTeX のエラーメッセージの当該項目を参照してください。
TeX で読み込まれるパッケージのファイルの場所は,kpathsearch ライブラリを使って探すことができます.
$ kpsewhich graphics.sty /usr/local/texlive/2019/texmf-dist/tex/latex/graphics/graphics.sty
Unix のシェルでは,バッククォートでコマンドを括ると,その出力を引数として別のコマンドに渡すことができます.このことを用いて,grep を利用すれば次のようにしてパッケージのバージョンを出力することができます.
$ grep -C1 \\ProvidesPackage `kpsewhich graphics.sty` \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{graphics} [2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR)]
次の 6 行からなるファイルを作って,例えば pkgver.tex という名前で保存します:
\documentclass[dvipdfmx]{article} \listfiles \typein[\pkgverPkgName]{^^JEnter package name(s):} \usepackage{\pkgverPkgName} \begin{document} \end{document}
この pkgver.tex をプロンプトで latex で処理すると,読み込まれたクラスファイルのパスの表示の後に,
Enter package name(s):
\pkgverPkgName=
と促されるので,例えば,
\pkgverPkgName=graphics,color
のようにパッケージ名を入力すると,\usepackage で読み込まれたファイル (や,更にそれらが読み込んでいるファイル群) のパス一覧が表示され,最後に,読み込まれたファイルすべての *File List* が表示されます.
(注意 1)ドライバは dvipdfmx の決め打ちにしているため,ドライバ指定の要らないパッケージの場合には,
LaTeX Warning: Unused global option(s): [dvipdfmx].
という Warning が出ます.
(注意 2)上では 「latex で処理すると」 と書きましたが,pLaTeX を前提にしているパッケージの場合には,
! LaTeX Error: This file needs format `pLaTeX2e' but this is `LaTeX2e'.
というエラーになりますので,その場合は platex で処理する必要があります.
(注意 3)このような作業をせずとも,普通に \usepackage するだけでも,log のほうにはちゃんと,パスもバージョンも出力されていますので,それを参照するという手もあります.
インストールした TeX ディストリビューションにどんなパッケージが入っているのか知りたい場合は、以下を参照してください。