📋

LaTeX のスタイルファイルを自作する

2021/04/13に公開
3

スタイルファイルとは、LaTeXのマクロパッケージのことで、ドキュメントクラス(.cls)やパッケージ(.sty)もその一種です。スタイルファイルを使うことで、同じコマンドを複数の文書で使い回せるようになります。

書き方

jsclasses[1]などは、DOCSTRIP というプログラムを使って、

  1. コードに説明が付いた.dtxファイルを作成
  2. .dtxファイルをコンパイルして、説明付きPDFと.styファイルを出力

のようにして作成されています。しかし、このやり方は複雑なので、.styファイルを直に書く方法を紹介します。

スタイルファイルの中身はプリアンブルと同じように書くことができますが、\makeatletter\makeatotherを書く必要はありません。

以上の事を踏まえたスタイルファイルは次のようになります。

mypkg.sty
% パッケージの読み込み
\usepackage{graphicx}

% jlreqの見出しをカスタマイズ
\NewBlockHeading{section}{1}{%
    font={\normalfont\fontsize{32Q}{32H}\bfseries},
    before_space=0mm,
    after_space=8mm,
    align=left
}

このスタイルファイルをパッケージとして呼ぶには、このスタイルファイルを使いたいソースのプリアンブルに、

\usepackage{mypkg}

のように書きます。

スタイルファイル向けのコマンド

スタイルファイルで使うと便利、もしくは使われてるのを見かけるコマンドです。

  • \NeedsTeXFormat{LaTeX2e}[2]
    必要なLaTeXの形態としてLaTeX2eを指定します。LaTeX2eの代わりにpLaTeX2eなどを指定することもできます。
  • \ProvidesPackage{<パッケージ名>}[<日付>]
    パッケージの名前を定義します。<日付>よりLaTeXのバージョンが古い場合に警告を出すことができます。<日付>は、2020/12/28のように指定します。
  • \ProvidesClass{<クラス名>}[<日付>]
    クラスの名前を定義します。他は\ProvidesPackageと同じです。
  • \LoadClass[<オプション>]{<クラス名>}
    クラスを読み込みます。自分用のクラスを作る時に便利で、これを使うと最初の例は以下のようになります。
    mycls.cls
    \LoadClass{jlreq}
    \RequirePackage{graphicx}
    \NewBlockHeading{section}{1}{%
        font={\normalfont\fontsize{32Q}{32H}\bfseries},
        before_space=0mm,
        after_space=8mm,
        align=left
    }
    
    \documentclass{mycls}
    
  • \endinput
    この命令よりも後の記述を無視します。

さらに詳しい内容を知りたい方は、クラス・パッケージ作者のためのLaTeX 2ε(抄訳)を読んでみてください。

TeX Liveに認識させる

スタイルファイルを作っただけでは、そのディレクトリ[3]以外で使うことが出来ません。そこで、TeX Liveに認識させます。

TeX Liveでユーザーのスタイルファイルを入れるディレクトリは$TEXMFLOCAL/tex/latex/、すなわちtexlive/texmf-local/tex/latex/です[4]。手順は以下のようになります。

  1. 前述のディレクトリにファイルを保存もしくはシンボリックリンクを作成
  2. コマンドラインにてmktexlsrを実行(管理者権限が必要[5]

参考資料


この記事は以下のシリーズの一部です。

https://zenn.dev/hirospark/scraps/549a0863ca408d

脚注
  1. jsarticlejsbookなどの「pLaTeX2e新ドキュメントクラス」のことです。 ↩︎

  2. 2021/04/14 誤植の指摘を受け修正しました。 ↩︎

  3. いわゆるフォルダのことです(厳密には少し違います)。 ↩︎

  4. スタイルファイルを入れることのできるディレクトリは他にもあります。詳細はTeX Liveガイドを参照してください。 ↩︎

  5. Windowsなら管理者権限でコマンドプロンプトを起動してから実行してください。Unix系ならsudoを頭につけて実行してください。 ↩︎

Discussion

hidarumahidaruma

<del>\ProvideTeXFormat{<バージョン>}</del><ins>NeedsTeXFormat{<バージョン>}</ins>でしょうか。

初めての方にむけてということはわかるんですが、ここで「バージョン」とするのもあまりよくなくて、
具体的に「LaTeX2e」などを記述した例を載せておいて、他に「pLaTeX2e」なども有り得る、程度にして良いのではないかと思います。この段階でゼネラルなことを書こうとすると脱線が激しくなると思うので。
(丁度よい代案はないのですが)たとえば美文書であればこの箇所入る文字列については「形態」と紹介していますね。

HiroSparkHiroSpark

<del>\ProvideTeXFormat{<バージョン>}</del>
<ins>NeedsTeXFormat{<バージョン>}</ins>でしょうか。

その通りです。ありがとうございます。

この段階でゼネラルなことを書こうとすると脱線が激しくなると思うので。

確かにそうですね。変更します。

hidarumahidaruma

<日付>よりLaTeXのバージョンが古い場合に警告を出すことができます。

\ProvidesPackageのこれはパッケージの要求バージョンですね。

LaTeX(LaTeX2e)のバージョン警告は\NeedsTeXFormat{LaTeX2e}[<日付>]とした場合で、こんな感じになります。

% my.sty
\NeedsTeXFormat{LaTeX2e}[2030/01/01]
\ProvidesPackage{my}[1970/04/01]
\documentclass{article}
\usepackage{my}[2021/04/14]
$ lualatex tes.tex
...
LaTeX Warning: You have requested release `2030/01/01' of LaTeX,
               but only release `2020-10-01' is available.

)

LaTeX Warning: You have requested, on input line 2, version
               `2021/04/01' of package my,
               but only version
               `1970/04/01'
               is available.