* パッケージ [#x72e7695] [[LaTeX]] の機能を拡張したり,新たな機能を追加したりするために用いるのが「パッケージ」です((しばしば「マクロパッケージ」という用語と混同されますが,マクロパッケージは単に「TeX のマクロ集」すなわちフォーマットを指します.)). パッケージの基本的な使い方は [[LaTeX 入門の項目の一つ>LaTeX入門/各種パッケージの利用]]としてまとめられていますので,参照してください. この項では,より進んだ「パッケージの作成法」や「パッケージのカスタマイズ方法」を説明します. // 入門の一項目から,入門としてとりあげるほどでない内容を移転しました. -- アセトアミノフェン (2015-05-01) ---- #contents ---- ** 便利なパッケージ一覧 [#yf0b6704] [[TeX Live]] には相当数のパッケージが含まれていますし,最近の [[W32TeX]] には通常用途には十分なほどのパッケージが含まれるようになりました. これらのディストリビューションに含まれている便利なパッケージ,あるいはそのほかに入手可能な優れたパッケージを[[目的別パッケージ簡易リファレンス]]にまとめました. ** パッケージの作り方 [#m096a9bd] パッケージファイルは自分で作ることもできますので,作った場合は [[CTAN]] などで世界中に配布してもよいでしょう. 基本的なマクロの書き方は [[LaTeX入門/LaTeXマクロの作成]] および [[TeX入門/マクロの作成]] にありますので,これをパッケージ化する際に注意すべき点をまとめます. - \ProvidesPackage でパッケージを宣言します.パッケージ名は普通スタイルファイルの名前と一致させます.オプション引数にリリース日やバージョン番号を書くこともできます. \ProvidesPackage{sample}[2000/1/1 v1.0] - 内部的に使用する命令については,なるべく名前空間を分離しましょう.例えば,sample.sty で \hoge という命令を定義してしまうと他のパッケージ等で定義される命令と衝突するおそれがあるので,\smpl@hoge などの名前で定義しておくと衝突の可能性を格段に低く抑えられます. - 例外処理を記述しましょう.パッケージで定義した命令は「その命令の仕様や実装に詳しくない人」が使用する可能性が高いので,なるべく丁寧なエラーメッセージを表示するのが望ましいです. - ソースのプリアンブルにマクロを書く場合,“@” は命令の名前に含めることが(\makeatletter と \makeatother で挟まない限り)できませんが,\usepackage で読み込むパッケージ中では “@” も使うことができます(自動的に \makeatletter 有効扱いされるため).このことを利用して,パッケージの内部処理のみにかかわる命令は @ を使いつつ名前空間の分離に努め,ユーザが実際に使用する命令は @ を使わないわかりやすい名前にするという工夫ができます. % 要加筆.プリアンブルにマクロを書くのと異なる点などがあれば. // ちなみに,TeX 入門の中身の「マクロの作成」は, // 他項目の内容が LaTeX 向けであることに合わせて LaTeX マクロ作成に絞り, // TeX マクロは新規項目に移すことを検討中. // あるいは,TeX/LaTeX の混同を避ける目的で「TeX 入門」全体を「LaTeX 入門」に名称変更する. // 名称変更作業済み (2015-05-23) ** パッケージのカスタマイズ [#ef28e4ed] 既存のパッケージが自分の利用目的にぴったり合えばよいですが,時にはパッケージの提供する機能を少し変更して利用したいこともあるかもしれません. ここでは,既存のパッケージの機能をカスタマイズする方法を説明します. *** プリアンブルで再定義する方法 [#ca904922] パッケージの中で定義されるマクロなどを,パッケージ読み込み後に再定義するという方法です. 例えば,パッケージ foo.sty の中で \newcommand\bar{... 10pt ...} のような定義があって,この中の “10pt” を “20pt” にしたいとします. \newcommand は LaTeX で「新しいマクロを定義する」という意味で,定義済みのマクロを再定義するには \''re''newcommand を使います. 例の場合,読み込み側のファイルで \usepackage{foo} \renewcommand\bar{... 20pt ...} のようにすれば良いわけです. また,再定義するマクロの名前や再定義の内容に @ が現れる場合は,次のように再定義全体を \makeatletter と \makeatother で挟んでおく必要があります. \usepackage{foo} \makeatletter \renewcommand\bar{... 20pt ...} \makeatother *** パッケージファイルを直接書き換える方法 [#tee3be98] パッケージの実体はテキストファイルであって LaTeX の命令が書いてあるだけですから,その気になれば一部を書き換えたりすることも可能です. しかし''安易に書き換えるのはいけません''. 書き換えたパッケージファイルがインターネットなどを通じて他の多くのユーザーの手に渡って混乱が生じたことも過去にあります((かつて epsf.sty などで[[混乱が生じた>arXiv#p6c5ac8a]]ことがあります.http://www2u.biglobe.ne.jp/~simtak/nenga/graphic.html も参照.)). やむを得ずパッケージファイルを直接書き換える場合は,''ファイル名も変更''して元のものと区別がつくようにする必要があります. \usepackage で読み込むところでも変更後の名前で読み込むようにします. また,当然ながらパッケージの書き換えの可否は製作者の意向に従う必要があります. 詳しくはパッケージに付属の文書(readme.txt など)を調べてください. 安全な「プリアンブルで再定義する方法」がほんとうに不可能かどうか,まずは検討してみてください. *** パッケージ利用時のトラブル対処法 [#k382b95e] LaTeX ユーザがパッケージ利用時に出くわすことがあるトラブルへの対処法は,以下が参考になります。 -[[LaTeX でパッケージが衝突したときは(1):http://acetaminophen.hatenablog.com/entry/2015/05/23/172512]], [[(2):http://acetaminophen.hatenablog.com/entry/2015/05/24/124431]] -[[Memoir のマニュアル>CTAN:macros/latex/contrib/memoir/memman.pdf]] の “19.1 Class/package name clash” --このマニュアルは texdoc memman で読むことができます。 ** パッケージのバージョン確認 [#k1782eb2] *** 一つ目の方法 [#ze2d59ac] // バージョンだけを拾うわけではないですが,例えば以下でどうでしょうか? -- kmaeda // 簡潔で良いと思います.ありがとうございます. -- アセトアミノフェン TeX で読み込まれるパッケージのファイルの場所は,kpathsearch ライブラリを使って探すことができます. $ kpsewhich graphics.sty /usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphics.sty Unix のシェルでは,バッククォートでコマンドを括ると,その出力を引数として別のコマンドに渡すことができます.このことを用いて,grep を利用すれば次のようにしてパッケージのバージョンを出力することができます. $ grep -C1 \\ProvidesPackage `kpsewhich graphics.sty` \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{graphics} [2014/10/28 v1.0p Standard LaTeX Graphics (DPC,SPQR)] // % Unix では,!! で直前に実行したコマンドを取得できます. // cat を実行するとファイルの内容全体が表示されます. // 端的にバージョン情報だけを取得したい場合は grep を実行するのがよさそうです. // //-TeX の kpathsearch ライブラリを使って探す場合 // // $ kpsewhich graphics.sty // /usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphics.sty // $ cat `!!` // : // : // \ProvidesPackage{graphics} // [2014/10/28 v1.0p Standard LaTeX Graphics (DPC,SPQR)] // : // //-Unix 系のコマンド find を使って探す場合 // // $ find /usr/local/texlive -name graphics.sty -print // /usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphics.sty // $ cat `!!` // : // : // \ProvidesPackage{graphics} // [2014/10/28 v1.0p Standard LaTeX Graphics (DPC,SPQR)] // : *** 二つ目の方法 [#m9842684] // ちょっと面倒かもしれませんけれど,こういうのもどうでしょうか (単に \listfiles を使っているだけです.こんなことをせずとも,普通に \usepackage するだけでも,log のほうにはちゃんと,パスもバージョンも出力されているのですが…). 次の 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 のほうにはちゃんと,パスもバージョンも出力されていますので,それを参照するという手もあります.