お手軽「自分専用パッケージ」のすすめ (OBSOLETED)

古い方法・見解 この記事に対して,私はすでに新たな方法・見解を持っています1。この記事は,過去の記録として残しているものです。現在の方法・見解については,次をご覧ください。

なお,これらはいずれもフォルダを指定していますが,「TeX から見える場所」に置けばファイル名の指定のみで済みます4


本稿は TeX and LaTeX Advent Calendar 20175 の 5 日目です。4 日目は abenori 氏6でした。6 日目は trueroad 氏7です。


やや長めの文書となりました。ご興味のある部分をお読みください。

投稿ののち,いくつかの大変有益なコメントを頂戴いたしました8。本稿の内容は,初心者がひとまず自分なりに実践したことの紹介であり,必ずしも最善のものではないことをご留意の上,お読みください。詳細は記事の最後に載せています。

この記事のような運用のためには,パッケージよりも \input を用いて外部の .tex ファイルをインクルードするほうが適切です9。この記事そのものを取り下げることも考えましたが,反省の意味も込めて残しておきます。具体的手法は timestalker 氏「TeX: プリアンブルの外部化」Time Stalker: てきとーろぐ10などをご覧ください。

文書目次

  1. ご挨拶と趣旨: 自己紹介と本稿の趣旨を述べました。
  2. 数学科教員志望のかたへ: 本題を逸れて,数学科教員志望のかたへ向けての LaTeX へのお誘いです。 本稿の他の部分は一般向けに書いております。
  3. お手軽「自分専用パッケージ」のすすめ: 長いプリアンブルをコンパクトにまとめる「自分専用パッケージ」の効用を,私自身のプリアンブルを例にとりお伝えします。
  4. お手軽「自分専用パッケージ」の作りかた (1): 本稿の主題です。お手軽「自分専用パッケージ」を実際に作り,短いプリアンブルになった .tex ファイルをコンパイルしてみましょう。基本的な部分のみを解説しています。
  5. お手軽「自分専用パッケージ」の作りかた (2): 保守性や今後の使いやすさを考えて手を加え,「自分専用パッケージ」をワンランク上のものにしましょう。
  6. 深淵への誘い: 完成度向上を目指したり好みの組版結果を追求したりしているうちに,楽しくなってきます。
  7. 謝辞: このページにご来訪いただきありがとうございます。

ご挨拶と趣旨

日下部幽考と申します。高等学校で数学科教諭をしており,講義資料作成にあたって LaTeX を楽しく利用しています。LaTeX を楽しみはじめたのはごく最近でまだ詳しいことは理解しておらず,これから勉強しようと思っています。

本稿では,LaTeX を快適に使うための手軽なカスタマイズを紹介いたします。実作業時間は 10 分程度で済むかと存じます。仮想読者は以下としました。

  • 卒業論文のために LaTeX をひとまず使ったけれど,今後どうしようか悩んでいるかた
  • 長らく LaTeX からは離れているものの,今使っているソフトウェアの仕上がりに不満があるかた

LaTeX を用いた中身のある文書を作った経験は前提としますが,それ以上のことは前提としません。なお,LaTeX のご経験がない場合は,TeX Wiki / はじめての方へ11TeX Wiki / TeX入手法12などの記事をお読みください。

知識不足のため,不適切であったり冗長であったりする内容が含まれるかもしれません。ご容赦ください。ご指摘いただけましたら随時修正いたします。上級者のかたにおかれましては,初心者が学んでゆく様子をご覧いただき「それならこんなことでも記事にしておこうか」と思っていただければ恐悦至極に存じます。

数学科教員志望のかたへ

数学科教員志望のかたは,本題に入る前によろしければ少しだけ現在の状況と願いをお聞きください。

私は数学の授業をするにあたって講義資料が必要な場合に LaTeX を用いています。 個人的には,少し手をかければ綺麗な出力が得られるため,とても満足しています。

残念なことに,同僚に聞いてみても LaTeX ユーザは少数派(2017年度の職場環境では私のみ,2020年度の職場環境では私ともうひとり13)です。大学時代は使ったがそれ以後はまったく,という声が多いように感じます。周りでは,以下のソフトウェアがよく使われています。

いずれのソフトウェアも,講義資料を作成するにあたって十分な機能を備えており操作は直観的です。しかし,出力の細かな部分はソフトウェアの仕様に合わせねばならず,こうしたい・ああしたいといった欲求にはあまり応えてくれません。また,自分好みの表記を実現するには毎回の手間が大きくなります。

一方で LaTeX は,WYSIWYG16 なソフトウェアではないため,初めに少々の勉強や準備を要することは確かです。しかし,一度自分好みの設定を作り上げてしまえば以後は手軽に高品質な出力が得られます。また,工夫すれば文書の保守性も高いものとなります(たとえば gfngfn 氏の解説記事17があります)。企業の今後の動向に左右されないことも強みといえるでしょう。

このように同僚に LaTeX を表現力やマクロの手軽さを宣伝したことはあるのですが,どうにもハードルが高く見えるようです。また,先に挙げた 2 つのソフトウェアにはいわゆる「問題データ集」が販売されており,そのために使っているという意見もありました。寡聞にして,高校数学向けの .tex ファイルを集約したウェブサイトをあまり存じ上げません。

LaTeX を用いて高校数学の講義資料を作成する仲間が増え,互いのファイルを公開し利用しあう文化が生まれれば有意義であろうと考えています。入試問題や問題集においては著作権の問題がありますが,オリジナルの講義資料や練習問題の交流を図ることができれば,負担を軽減しつつ質の良い問題を知る機会になるでしょう。

そこで,現在大学の講義で LaTeX を使っていたり,論文執筆のために LaTeX を使っている数学科教員志望のみなさんにお願いいたします。教員になられてからも LaTeX と仲良くしていただければ,そして講義資料や作成された問題を WWW 上で公開していただければ,たいへん嬉しく存じます。

お手軽「自分専用パッケージ」のすすめ

ここからが本題です。自分自身の成長過程を下敷きに,お手軽「自分専用パッケージ」の有用性を述べます。

LaTeX を用いて文書を作成するにあたって,必要なパッケージやよく使う命令をプリアンブル(\begin{document} の前)に記述することとなります。私が教員になったばかりの頃のプリアンブルはこの様子でした(実際にはコメント行あり)。

\documentclass[11pt,b5paper,papersize,uplatex]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{indentfirst}
\usepackage{mathrsfs}
\usepackage{ulem}
\usepackage{amscd}
\usepackage{fancyhdr}
\usepackage{lastpage}
\usepackage{eclbkbox}
\usepackage{theorem}
\makeatletter
\gdef\th@breakindent{\normalfont\itshape
\def\@begintheorem##1##2{%
\item[\hskip\labelsep \theorem@headerfont ##1\ ##2]\quad\newline\indent}%
\def\@opargbegintheorem##1##2##3{%
\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ \, \textmd{(##3)}]\quad\newline\indent}}%
%\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3)]\quad\newline\indent}}%
\makeatother
\theoremstyle{breakindent}
\theorembodyfont{\normalfont}
\newtheorem{dfn}{Definition}[subsection]
\newtheorem{thm}[dfn]{Theorem}
\newtheorem{prop}[dfn]{Proposition}
\newtheorem{lem}[dfn]{Lemma}
\newtheorem{cor}[dfn]{Corollary}
\newtheorem{rem}[dfn]{Remark}
\newtheorem{eg}[dfn]{e.g}
\makeatletter
\gdef\th@breakindentproof{\normalfont\itshape
\def\@begintheorem##1##2{%
\item[\hskip\labelsep ##1\ ##2]\quad\newline\indent}%
\def\@opargbegintheorem##1##2##3{%
\item[\hskip\labelsep ##1\ ##2\ \, (##3)]%
\quad\newline\indent}}%
\makeatother
\theoremstyle{breakindentproof}
\newtheorem{pf}{Proof.}
\renewcommand{\thepf}{}
\newtheorem{welldef}{Well-definedness.}
\renewcommand{\thewelldef}{}
\newtheorem{view}{Point of View.}
\renewcommand{\theview}{}
\newtheorem{ans}{Answer.}
\renewcommand{\theans}{}
\newtheorem{note}{Note.}
\renewcommand{\thenote}{}
\renewcommand{\thesubsection}{\arabic{subsection}}
\usepackage{enumitem}
\numberwithin{equation}{section}
\renewcommand{\labelenumi}{(\arabic{enumi})}
\newcommand{\QED}{\textbf{Q.E.D.}}
\newcommand{\set}[1]{\left{ \, #1\, \right} }
\newcommand{\setcolon}{\, ;\, }
\setlength{\textheight}{\paperheight}
\setlength{\topmargin}{4.6truemm}
\addtolength{\topmargin}{-\headheight}
\addtolength{\topmargin}{-\headsep}
\addtolength{\textheight}{-60truemm}
\setlength{\textwidth}{\paperwidth}
\setlength{\oddsidemargin}{-0.4truemm}
\setlength{\evensidemargin}{-0.4truemm}
\addtolength{\textwidth}{-50truemm}
\pagestyle{fancy}
\lhead{タイトル}
%\chead{\title}
\rhead{\thepage{}/{}\pageref{LastPage}}
\cfoot{}

パッケージの読み込み・定理環境のカスタマイズ・余白の設定などをしています。自分なりに理解して書いた部分と検索して得られたものをコピーした部分が入り交じり,それなりの長さです。これを,LaTeX 文書を書くたびに毎回コピーアンドペーストしていました。 一方現在は,当時よりもはるかに使用しているパッケージも増え独自の命令も増えているにもかかわらず,プリアンブルはこの長さになりました。

\documentclass[11pt,b5j,twoside,fleqn,papersize,dvipdfmx,uplatex]{jsarticle}
\usepackage{jphsbase20171205}
\usepackage{jphshand20171205}
\jphstitle{タイトル}

プリアンブルが長いと .tex ファイルが読みづらくなるばかりか,置換などを行う場合にも思わぬ箇所に影響が及びます。この短いプリアンブルを実現してくれるのが「自分専用パッケージ」です。

「自分専用パッケージ」とは,もともと書いていたプリアンブルを単に外部の .sty ファイルにそのまま押し付けたものです。たったそれだけですが,プリアンブルはとてもシンプルになります。WWW 上で公開されている殆どのパッケージは何らかの新たな機能を提供するためのものですから,パッケージを作るというと難しく聞こえたかもしれません。しかし,本稿における「自分専用パッケージ」は LaTeX の文書を作成することのできた人であれば誰にでも作れます。ご安心ください。

お手軽「自分専用パッケージ」の作りかた (1)

パッケージの作りかたについては TeX Wiki にも解説があります18が,この記事は新たな機能を提供するパッケージを想定しているように思われます。今回はそうではなく,ただプリアンブルを短くする目的のみですので極めて単純です。作りかたは以下です。

  1. プリアンブルが長くなってしまった .tex ファイルを開きます。
  2. 「名前をつけて保存」します。その際,ファイル名を mypreamble20171205.sty とします(名前は自由ですが,日付を入れる意味は後程述べます19)。拡張子が .sty になってくれない場合,生成された mypreamble20171205.sty.tex から .tex を削除し,拡張子を .sty に変更してください。なお TeXWorks では,保存形式のプルダウンメニューから「スタイルファイル (*.sty)」を選ぶことができます。
  3. 改めて mypreamble20171205.sty を開き,1 行目すなわち \documentclass[...]{...}\begin{document} 以降の行(\begin{document} を含む)をすべて削除し上書き保存します。 ただし \title\author\date を使用している場合はその部分も消してください。

これで「自分専用パッケージ」が完成しました。お手軽でしたね。早速,「自分専用パッケージ」を使ってみましょう。

  1. 先程の .tex ファイル(心配ならばコピー)を開きます。
  2. 1 行目すなわち \documentclass[...]{...} を残して,2 行目から \begin{document} の直前までを削除します。ただし \title\author\date を使用している場合はその部分は消さずに残してください。要するに,先程消した部分と残した部分を逆にします。
  3. 2 行目に \usepackage{mypreamble20171205} と書き加えます。

mypreamble20171205.sty」を .tex ファイルと同じフォルダに置き,コンパイルしてみてください。これまでと同じ出力が得られたことでしょう。

さて,このままでは毎度 .tex ファイルと同じフォルダに mypreamble20171205.sty を置き続けなければなりません。最後に,TeX がよく分かる場所に mypreamble20171205.sty を置いてそれを使ってもらうことにしましょう。TeX Wiki の解説20が参考になります。蛇足ながら,私の環境(Windows 10,TeX Live 2017)の例を挙げておきます。環境により異なりますのでご注意ください。

  1. まず,フォルダ C:\texlive\texmf-local\tex\latex を開きます(2017 などに入れてしまうと,TeX Live を更新したときに引き継いでくれません)。
  2. mypreamble という名前のフォルダを作ります。
  3. mypreamble フォルダの中に mypreamble20171205.sty を置きます。
  4. コマンドプロンプト(管理者)を起動します(Windows 10 の場合,スタートメニュを右クリックすると出てきます)。
  5. コマンドプロンプトに mktexlsr と打ち込み enter キーを押します。
  6. しばらく待つと Done. と表示されます。終わりです。

これで,以後プリアンブルには以下のみ(と必要に応じて \title\author\date)を書けば済むこととなります。

\documentclass[...]{...}
\usepackage{mypreamble20171205}

長いプリアンブルからは解放されました。快適なプリアンブルで素敵な LaTeX ライフをお過ごしください!

お手軽「自分専用パッケージ」の作りかた (2)

さて,私はしばらくの間直前で述べたような「自分専用パッケージ」で満足していました。しかし,講義資料の体裁をより自分好みにしようと奮闘するうち「自分専用パッケージ」の完成度がアレであることに気付きはじめました。結局,使う中で不満な点を見つけては勉強(検索ないし試行錯誤)し,また次に使うときに……を繰り返し,「自分専用パッケージ」は成長してゆきます。個人的な好みや使いたいマクロの内容は省き,一般的に起きるであろう問題に絞って振り返ると,以下のような修正を繰り返しています。

  • パッケージの基本的な体裁を成していなかった。TeX Wiki の解説21を読みながら,「自分専用パッケージ」の 1 行目に \ProvidesPackage{...}[...]\NeedsTeXFormat{pLaTeX2e} と書き入れてみた。
  • 内部で使用するためのマクロ名が短く,衝突の危険があった。@を使いつつ名前空間の分離に努めるとよいとの記載がある22が,何故か上手くいかなかったためひとまず長いマクロ名としてみた。その後,何故か解決し,現在は @ を使い名前空間を分離している23
  • 他のパッケージで置き換えたために使っていなかったパッケージを読み込み続けていたことに気付き,削除した。
  • 是非とも使いたい 2 つのパッケージが衝突した。回避しようと試みたが成功しなかった。しかし,一方は講義資料のため・一方は試験のために使う目的であったことから,講義資料用と試験用のパッケージを分離した。
  • タイプが楽になるようマクロ名に中途半端な略称を用いていたが,思い出しづらくなった。結局,タイプする時間の差は1秒程度に過ぎないため分かりやすいマクロ名に変更した。ただし,極めて頻繁に使用するマクロに限り略称を残した(私はこの段階で既に「自分専用パッケージ」の公開をしていたため,マクロ名は暫定的に併存させている)。

ここで,組版結果に影響を与えるような修正を加えたりマクロ名を変更したりすると,過去の文書をコンパイルできなくなって(または仕上がりが変わって)しまいます。そこで,修正した .sty ファイルには新しく mypreamble20171206.sty と名前を付けておくと混乱が防げます(TeX の分かる場所に置き,mktexlsr しておきましょう)。新たな機能を提供するパッケージでは,大がかりな修正を安易に行うと混乱を招く可能性があります。しかし,「自分専用パッケージ」なのですから気楽に考えましょう。

パッケージをアレな完成度から素敵な完成度にするにはまだまだ遠い道程に思われます。私の「自分専用パッケージ」には色々とアレな点が残っています。致命的な点だけでも次の具合です。

  • 依存パッケージが多すぎる。せめて,独自の命令と \RequirePackage の海は分離して柔軟性を持たせたい。
  • 不明な条件下で別行建て数式の余白が短くなる。暫定的にその場合の余白を埋めるマクロを定義しておいたが,本質的には解決していない。
  • \abs などの衝突の危険性が高いマクロ名が残っている。また,中途半端に略したマクロ名が残っている。
  • 原則として意味によるマークアップをしたい(有名な集合 - LaTeX コードを高い保守性の下で記述する例24)が,不完全である。
  • 保守性に欠けた部分が残っている(微分の $d$ など)。
  • \mathchoice の闇25に魅入られている。

当然,細かな修正点は枚挙に暇がありません。それでも完璧でないからと足踏みしていても仕方がありません。応急処置を施しながら使い,今後も少しずつ手を入れてより良いものにしたいと考えています。しかし,これ以上のことは本稿の趣旨を外れますので立ち入りません。WWW 上の各種情報や,既にある有名なパッケージの中身を眺めて勉強することになるでしょう。興味の湧いたかたがいらしたら,互いに頑張りましょう。

深淵への誘い

「自分専用パッケージ」の完成度向上を目指したり,好みの組版結果を追求したりしているうちに,楽しくなってきます。.tex ファイル作成の手間が少なく済むようにマクロを工夫したり・保守性を高めたり・既存のパッケージにはないマクロを色々と組み込んだりしはじめます。実装しようとしてはエラー,検索,試行錯誤……を繰り返すうちに,少しずつ理解できる部分が増えてゆきます。

こうなると,私にとっては講義資料を作るための作業であったはずの「自分専用パッケージ」が趣味の様相を呈してきます。組版結果はもちろん内部の書きかたにもこだわりはじめます。そして,折角だから誰か一人でも役に立てばという気持ちが湧きはじめ,「自分専用パッケージ」だったものを公開してしまうようになります。このパッケージは,高等学校数学科教員向けに講義資料・定期試験においてよく使いそうな体裁をまとめたものです。もとが「自分専用パッケージ」ですから,依存しているスタイルファイルが極めて多く褒められたものではありませんが,高校数学の講義資料を LaTeX で作る仲間を増やしたい気持ちで公開しています。現在はまだ程度の低いものですが,少しずつ改善してゆきたいと考えています。

最終的にどの点に着地するかは人それぞれですが,ともかくお手軽「自分専用パッケージ」を利用して快適な LaTeX ライフをお過ごしください。

謝辞

本稿は,TeX and LaTeX Advent Calendar 201726 に参加してみようという好奇心によって書きあげました。「とっておき」という言葉の意味については考えないこととします。重点テーマは「TeX でつくるアレ」ですが,「TeX でつくるアレな完成度のパッケージ」で回収したことといたします。主宰の zr_tex8r 氏27に深く感謝申しあげます。また,公開されている多数の記事に(許可も得ず)リンクをしています。有益な記事を公開なさっているみなさまに厚くお礼申しあげます。 そして,本稿をお読みいただきましたみなさま,誠にありがとうございました。

投稿ののち,いくつかの大変有益なコメントを頂戴いたしました28

これらをもとに,自作パッケージを改めて作り直してみようと考えています。以下のようなことを検討しています。

  • 基本的な表記の体裁に関する部分と emath に依存した図形描画の部分を分割する。とくに,依存パッケージが多い部分を切り離し読み込むか否かを選択可能にする。
  • 体裁が異なるごとに新たな名称のマクロを用意していたが,代わりにスイッチで切り替える方式を導入する。
  • バージョン管理について学んだうえで,適切な方式を選択する。

パッケージ名を ghostmath へ変更すると同時に,これらの修正を試みました33


  1. 追記 2023-08-11。段落全体。 ↩︎

  2. timestalker,TeX: プリアンブルの外部化。Time Stalker: てきとーろぐ,参照 2022-07-22。 ↩︎

  3. 佐古貴行,TeX におけるプリアンブルの外部ファイル化とマクロのまとめ。Takayuki Sako Webpage,参照 2022-07-22。 ↩︎

  4. 追記 2022-07-22。直前の箇条書きを含む。 ↩︎

  5. zr_tex8r,TeX & LaTeX Advent Calendar 2017。ADVENTER,参照 2017-12-05。 ↩︎

  6. 阿部紀行,行取り。にっき♪,参照 2017-12-05。 ↩︎

  7. 細田真道,LilyPondとGhostscriptとTeXで作る楽譜と文章を組み合わせたドキュメント。Qiita,参照 2017-12-05。 ↩︎

  8. 追記 2017-12-09。段落全体。 ↩︎

  9. 追記 2021-10-03。段落全体。 ↩︎

  10. timestalker,TeX: プリアンブルの外部化。Time Stalker: てきとーろぐ,参照 2021-10-03。 ↩︎

  11. (Wiki),はじめての方へ。TeX Wiki,参照 2021-10-03。 ↩︎

  12. (Wiki),TeX入手法。TeX Wiki,参照 2021-10-03。 ↩︎

  13. 2020-12-28 現在。 ↩︎

  14. 数研出版株式会社,Studyaid D.B.。数研出版株式会社,参照 2021-10-03。 ↩︎

  15. Microsoft,Microsoft Word。Microsoft,参照 2021-10-03。 ↩︎

  16. (Wiki),WYSIWYG。ウィキペディア,参照 2021-10-03。 ↩︎

  17. gfngfn,有名な集合 - LaTeX コードを高い保守性の下で記述する例。東大TeX愛好会,参照 2017-12-05,リンク切れ 2020-12-28。 ↩︎

  18. (Wiki),パッケージ。TeX Wiki,参照 2021-10-03。 ↩︎

  19. 本来,スタイルファイルはこのように命名するものではありません。 ↩︎

  20. (Wiki),各種パッケージの利用。TeX Wiki,参照 2021-10-03。 ↩︎

  21. (Wiki),パッケージ。TeX Wiki,参照 2021-10-03。 ↩︎

  22. (Wiki),パッケージ。TeX Wiki,参照 2021-10-03。 ↩︎

  23. 追記 2018-06-18。 ↩︎

  24. gfngfn,有名な集合 - LaTeX コードを高い保守性の下で記述する例。東大TeX愛好会,参照 2017-12-05,リンク切れ 2020-12-28。 ↩︎

  25. doraTeX,\mathchoice の闇。TeX Alchemist Online,参照 2021-10-03。 ↩︎

  26. zr_tex8r,TeX & LaTeX Advent Calendar 2017。ADVENTER,参照 2021-10-03。 ↩︎

  27. ZR-TeXnobabbler,マクロツイーター。マクロツイーター,参照 2021-10-03。 ↩︎

  28. 追記 2017-12-09。ここから節終了まで。 ↩︎

  29. wtsnjp,(tweet)。Twitter,参照 2017-12-09。 ↩︎

  30. Watson,パッケージ制作のすゝめ / latex-package。SpeakerDeck,参照 2017-12-09。 ↩︎

  31. hohei3108,(tweet)。Twitter,参照 2017-12-09。 ↩︎

  32. hohei3108,(tweet)。Twitter,参照 2017-12-09。 ↩︎

  33. 追記 2017-12-28,削除 2022-07-24。ghostmath 開発,開発終了,jep への移行による。 ↩︎