ぱるちのものおき2.0

主にLaTeXや数学のお話をするブログです。

ぼくのかんがえたさいきょうのゼミ用TeXスタイル

はじめに

ここでは,独断と偏見に基づいて作成した自分の \rm\TeX 設定を紹介します。

文書は書きやすいものであると同時に読みやすくあるべきと考えます。
数式を伴う文書を作成する場合,\rm \TeX は書きやすさ読みやすさ共に必須のツールでしょう。しかしデフォルトのままでは読みづらいと思うこともしばしばあります。

f:id:f_d0123:20200824144037p:plain
分数コマンドの比較

一例として,分数コマンド \frac について見てみます。デフォルトの \frac は上記画像の左側,右側は emath.sty から \bunsuu コマンドを用いたものです。少なくとも僕は右側の方が見やすいと思います。
では,通常の \frac コマンドで \bunsuu コマンドのような出力を得ることは出来ないだろうか?予め分数の標線を少し長くする旨の命令をしておけば良いのでは?と考えました。

他にも,(1,\ 2,\ 5) と入力する際に,わざわざカンマと数字の幅を広くするために (1,\ 2,\ 5) と入力することがかなり面倒です。あらかじめ初期設定に〈数式モード内のカンマは,やや余白をとるように設定する〉旨の命令をしてしまえば,煩わしいことをしなくても済むでしょう。

ということでこの記事では,こうした方がいいなーと個人的に考えたことをまとめながら,僕がゼミかなんかでTeXを用いた原稿を作る際に用いている設定を紹介します。
自分用の設定ですので,賛否両論あるかもしれません。。。
忌憚のないコメントをお待ちしております。

なお,今回の記事では upLaTeX で TeXLive2019 を用いていることとします*1pLaTeXだと,後で述べる理由から,hyperref.sty を読み込んだ時にエラーが出るからです。また,TeXLive2019 内部にあるファイルだけが使用可能とし,emathやceoなど別途にダウンロードする必要があるファイルは使わないものとします。

こういう例はOverleafを使うのがさいきょう

というわけでそのスタイルをOverleafに公開しました。

使った環境:

  • TeXLive2019
  • upLaTeX
  • latexmkrc (Overleaf で upLaTeX を使うため,および若干の設定)

www.overleaf.com


実験的な部分もありますので,再配布や改変などは自由にしてもらって結構です。

以下,その設定における詳しい動機と変更内容について,心に思いつくところを思いつくままに書いていきます。

読み込むパッケージ

少なめです。

\RequirePackage{amsmath,amssymb}
\RequirePackage{mathtools}
\RequirePackage{bm}
\RequirePackage[many]{tcolorbox}
\RequirePackage[deluxe,burasage,jis2004]{otf}
\RequirePackage[noto-otc,unicode]{pxchfon}
\RequirePackage{tikz}
\usetikzlibrary{cd}
\RequirePackage[dvipdfmx]{hyperref}
\RequirePackage[otfcid,otfmacros]{pxjahyper}
\RequirePackage[dvipdfmx,marginparwidth=0pt,margin=25truemm]{geometry}
\RequirePackage{bxpapersize}
amsmath,amssymb

必需品

mathtools

\coloneqq など,結構使います。読み込んでおいて損はないです。

tcolorbox

僕にとっての必需品です。定理環境もtcolorboxで定義します。

otf, pxchfon

後述「和文フォント」参照。

tikz,cd

可換図式とお友達になりたいです。その他図を書きたいときに。

hyperref, pxhyperja

ハイパーリンク機能。upLaTeXを指定した原因。詳しくは「otfパッケージと囲み数字」参照。

geometry, bxpapersize

レイアウトの指定。A4で全角約45文字分です。

和文フォント

pxchfon.sty はさいきょう

ヒラギノが利用できる場合はヒラギノを使った方がきれいでしょう。ここでは Windows の民でも出来る設定を紹介します。

TeXLive2019 以降には,Noto CJK JP が標準装備されています。

doratex.hatenablog.jp

上記のサイトを参考に,和文フォントをデフォルトのもの(IPA)から Noto CJK JP に変更しました*2。多書体にもしたかったので,otf パッケージを読み込みつつ,以下のように記述しました。

\RequirePackage[deluxe,burasage,jis2004]{otf}
\RequirePackage[noto-otc,unicode]{pxchfon}

もしもヒラギノ基本6書体がPC内にインストールされている場合は代わりに

\RequirePackage[deluxe,burasage,jis2004]{otf}
\RequirePackage[hiragino-pron]{pxchfon}

などとすればよいです。今回は Overleaf の中でも読み込める(即ち,TeXLive2019さえあれば読み込める)Noto CJK JP を用いるため,前者を採用します。

丸ゴシックは NotoSans にはないため,pxchfon パッケージを読み込んだだけだと,\mgfamily には NotoSansCJK-Medium が代用されます。源柔ゴシックをインストールして利用した例が上記サイトにはありますが,僕は丸ゴシックを使わないので設定していません。

otf パッケージと囲み数字(upLaTeXを使う理由)

otf パッケージを読み込むと,オマケに ajmacros.sty も読み込まれます。これがものすごく便利なので,ここで紹介します。

例えば Word で“”と入力することは容易いですが,TeX で①を打つのは一苦労でした(す?)。今のご時世は XeLaTeX や upLaTeX,LuaLaTeX を使うことで,ソースコードに直に“①”と書いてもエラーを吐きだすことはありません。しかし pLaTeX を使っていると,環境依存文字を利用することが出来なかったため,代替案として \textcircle{\scriptsize 1} などを用いていたようです*3。ですが“①”というフォントは U+2460 として登録されている以上使えるハズなのです。

前置きが長くなりましたが,otf.sty を読み込み,本文中に次のように書いてみました。

\ajMaru0,\ajMaru1,\ajMaru{20}\ajKakko1,\ajKakko{20}\ajRoman1,\ajRoman{14}\ajLig{(株)}
f:id:f_d0123:20200831235315p:plain
ajmacroはすごい

画像の出力例はヒラギノですが,このように記述するだけで様々な全角文字を出力することが出来ます。〈丸91〉などの大きい数字も,\ajMaru{91} と入力すれば一発です。他にもたくさんコマンドが用意されていますが,それについては ajmacros.sty の中身を覗くか,奥村先生の『[改訂第7版] LaTeX2ε 美文書作成入門』の付録E.5を参照されるなりしてください*4

これらの文字をenumerate 環境のラベルとして使うことが出来ます。
具体的には

\renewcommand{\labelenumi}{\ajLabel\ajKakko{enumi}}
\renewcommand{\labelenumii}{\ajLabel\ajMaru{enumii}}

などと,\ajLabel を入れればよいのです。しかし,ここでhyperref.styを用いているとエラーが出ます。hyperref.sty で\ajLabel の定義が若干変わってしまい,適切にコンパイルすることが出来ません。pxjahyper を読み込めばこのエラーは回避できるため,

\RequirePackage[dvipdfmx]{hyperref}
\RequirePackage[otfcid,otfmacros]{pxjahyper}

としました。hyperref の後に読み込んでいる pxjahyper が,upLaTeXで正しく動き,pLaTeXではエラーが出てしまいます。従ってupLaTeXにすることをお願いしました。

欧文,数式フォント

意味もなく Latin Modern*5 を利用します。実際いくつかのフォント(euler, fourier, times, ceo.styのCenturyOldest など)を使ってみたんですが,なにか煙たい目で見られたため,Latin Modern に収まりました。何か良いフォントがあれば教えてください*6

以下,Latin Modern を利用していると仮定して数値の設定を行っていますので,「他のフォントだと不揃いだ!!」というご意見は受け付けません。

frac コマンド

最初の具体例にも出した通り,僕はデフォルトの frac コマンドは好きくありません。デフォルトでは標線と数字が離れすぎているからか,少々汚く思えてしまいます。
かといってわざわざ \frac{\,1\,}{\,3\,} として標線を長くするのはダルいでしょう。それこそストレッサーです。従って, fracコマンドとdfracコマンドの定義を変えてしまおう! という結論に至りました*7。なお,定義の変更についてはemath.styやceo.styを参考にしたうえで,独自の変更を行っています。

frac コマンドの定義は,amsmath.sty では以下のようになっています。

\DeclareRobustCommand{\frac}[2]{{\begingroup#1\endgroup\@@over#2}}

なお,\@@over とは amsmath.sty の内部で \over と同等のコマンドを示すものと定義されており,\begingroup と \endgroup については
TeX入門/マクロの作成 - TeX Wiki
を参照するなどしてください。

amsmath.sty を読み込んだうえで \frac コマンドを弄った結果,次のようになりました。

\DeclareRobustCommand*\frac[2]{%
   \mathchoice
      {\@frac\textstyle{3.5}{#1}{#2}}%
      {{\displaystyle\@frac\textstyle{3.5}{#1}{#2}}}%
      {\@frac\scriptstyle{1.5}{#1}{#2}}%
      {\@frac\scriptscriptstyle{1.5}{#1}{#2}}}
\def\@frac#1#2#3#4{%
    {\begingroup\mkern#2mu\lower.44ex\hbox{$#1#3$}\mkern#2mu\endgroup
    \@@over \mkern#2mu\lower-.1ex\hbox{$#1#4$}\mkern#2mu}}
\DeclareRobustCommand\dfrac[2]{\displaystyle\@frac\textstyle{3.5}{#1}{#2}}
\DeclareRobustCommand\tfrac[2]{\textstyle\@frac\textstyle{3.5}{#1}{#2}}

僕の独断として,$\frac12$と\[ \frac12 \] の出力は同じになるようにしました。というのも文章中の分数においては,$\frac12$とするよりも$1/2$とした方が読みやすく,わざわざ文章中に$\frac12$とするならば,それはもう別行立ての数式と同じ形でいいんじゃないかと思ったからです。
つまり,\dfrac と\frac の出力は,\displaystyle と \textstyle においては等しい出力となります。

もし強制的に textstyle の大きさのものにしたい場合は,\tfrac を用いることもできます。

(ところで,emath.sty の\bunsuu コマンドを使えば幸せになれるのではないか…?)

sqrt コマンド

二重根号について不満があります。例えば通常の入力において,

\[
  \displaystyle \sqrt{2+\sqrt3},\qquad \textstyle \sqrt{2+\sqrt3}
\]

と入力した場合,以下の出力が得られます。

f:id:f_d0123:20200831224422p:plain
二重根号の比較

displaystyle の二重根号はかなり余白があり,個人的には好きくありません。従って textstyle の方で統一してしまいたい!と思い,どうにか弄れないかを試みていたのですが,\sqrt の定義がかなり複雑*8で,そのすべてを理解していないためにまだ変更できていません。今後の目標として,メモ書き程度に残しておきます。一応使いやすさのために \dsqrt と \tsqrt を定義して用いています。

\DeclareRobustCommand\tsqrt{\textstyle\sqrt}
\DeclareRobustCommand\dsqrt{\displaystyle\sqrt}

また,\sqrt a\sqrt b のように,根号の高さがそろっていないのはどうかと思うので,その部分だけは改変しました。煩雑なのでソースは割愛。ざっくりいうと,\vphantom{h} を入れることで高さを調節しています。

\[
\sqrt a, \sqrt b
\]

と入力するだけで,以下の画像のように根号をそろえることが出来ました。

f:id:f_d0123:20200903213223p:plain
根号の高さ

今のところはこれで良しとしています。が,要改善。

箇条書き

abenori.blogspot.com
上記サイトを参考にし,itemize 環境や enumerate 環境,discription などの箇条書きをする環境において,主にインデントの部分で調整を行いました。
これについてもどのように弄ったかについてはOverleaf の例を見てもらうとして,ここでは出力のみ表示します。なお,otfパッケージと囲み数字で紹介した記号の中から,\ajKakko や \ajMaru をラベルに用いています。再掲ですが,

\renewcommand{\labelenumi}{\ajLabel\ajKakko{enumi}}
\renewcommand{\labelenumii}{\ajLabel\ajMaru{enumii}}

のように \ajLabel コマンドを入れないと正常に動作しません。

本文中に

ここはenumerate環境の前の部分。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。

\begin{enumerate}
    \item ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。
    
    改行するとこんな感じ。ほげほげほげお。
    
    \item ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。

\end{enumerate}

ここはenumerate環境の後の部分。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。ほげほげほげお。

と入力すると,こんな感じの出力になります。

f:id:f_d0123:20200903222507p:plain
ほげほげ箇条書き

インデント厨もにっこりしてくれると信じています。

強調

普通に \emph を使えばよいのですが,otf パッケージを読み込んだことで,太字のゴシックにすべきと考えました。また,強調部分には若干の余白を入れています。(これは完全なる好み。)

%\emph
\renewcommand{\emph}[1]{\,{\bfseries\gtfamily #1}\,}

数式上下のインデント

デフォルトよりやや狭くします。

\AtBeginDocument{\setlength{\abovedisplayskip}{5pt}%
\setlength{\belowdisplayskip}{5pt}}
\jot=5pt

数式内のカンマ

あらかじめ余白をとっといた方が幸せな気がしました。

note.com

上記サイトが大変ありがたく,

\begingroup
\catcode`\,=\active
\def\@x@{\def,{\normalcomma\hskip.5em}} 
\expandafter\endgroup\@x@%
\mathcode`\,="8000
\def\normalcomma{\mathchar"613B }

と書くことで解決しました。ただし,この状況において $1,000$ などと入力した場合もカンマ後の余白が出来てしまいます。僕は $1,000$ などと入力する機会はありませんので無問題。

参考:コマンドプロンプトかターミナルで

texdoc mathpunctspace

と入力すると出てくる文書。及び mathpunctspace.sty 。

定理環境と注意書き

定理環境

定理環境については tcolorbox で用意されている "Theorem Library" を使います。amsthm.sty は読み込みません*9し,theorem.sty も読み込みません。

なお,tcolorboxのお誘い - ぱるちのものおき ver 2.0で紹介したものを改良し,定理や命題,定義などのスタイルを一括で変更できるようにしました。

\definecolor{burgundy}{rgb}{0.5, 0.0, 0.13}
\tcbset{mytheo/.style={fonttitle=\gtfamily\sffamily\bfseries\upshape,
enhanced,colframe=burgundy,colback=burgundy!2!white,colbacktitle=burgundy,
boxrule=0pt,borderline south={2pt}{-2pt}{burgundy},
left*=1zw,right*=1zw,
theorem style=standard,
breakable,sharp corners,
before skip=8pt,
after skip=10pt,
before upper={\setlength{\parindent}{1zw}},
before lower={\setlength{\parindent}{1zw}}
}}
%Theorem
\newtcbtheorem[number within=section]{theorem}{Theorem}%
{mytheo}{th}
\newcommand{\thref}[1]{{\bfseries\sffamily Theorem \ref{th:#1}}}
%Proposition
\newtcbtheorem[use counter from=theorem]{prop}{Proposition}%
{mytheo}{pr}
\newcommand{\prref}[1]{{\bfseries\sffamily Proposition \ref{pr:#1}}}
%Corollary
\newtcbtheorem[use counter from=theorem]{cor}{Corollary}%
{mytheo}{co}
\newcommand{\coref}[1]{{\bfseries\sffamily Corollary \ref{co:#1}}}
%Definition
\newtcbtheorem[use counter from=theorem]{definition}{Definition}%
{mytheo,
colframe=blue!50!black,colback=blue!50!black!2!white,colbacktitle=blue!50!black,borderline south={2pt}{-2pt}{blue!50!black},}{de}
\newcommand{\deref}[1]{{\bfseries\sffamily Definition \ref{de:#1}}}
%Lemma
\newtcbtheorem[use counter from=theorem]{lemma}{Lemma}%
{mytheo,
colframe=green!50!black,colback=green!50!black!2!white,colbacktitle=green!50!black,borderline south={2pt}{-2pt}{green!50!black},}{le}
\newcommand{\leref}[1]{{\bfseries\sffamily Lemma \ref{le:#1}}}
%Example
\definecolor{charcoal}{rgb}{0.21, 0.27, 0.31}
\newtcbtheorem[use counter from=theorem]{example}{Example}%
{mytheo,
colframe=charcoal,colback=charcoal!2!white,colbacktitle=charcoal,borderline south={2pt}{-2pt}{charcoal},}{ex}
\newcommand{\exref}[1]{{\bfseries\sffamily Example \ref{ex:#1}}}

これにより,本文中にこんな感じで入力しました。

\begin{theorem}{なにか定理}{nanikateiri}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{theorem}

定理番号を参照したいときは\thref{nanikateiri}とする。自動でTheoremかPropositionかDefinitionか判定するコマンドを作るかは検討中。


\begin{prop}{なにか命題}{nanikameidai}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{prop}

番号を参照したいときは\prref{nanikameidai}とする。

\begin{cor}{なにか系}{nanikakei}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{cor}

番号を参照したいときは\coref{nanikakei}とする。

\begin{definition}{なにか定義}{nanikateigi}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{definition}

番号を参照したいときは\deref{nanikateigi}とする。

\begin{lemma}{なにか補題}{nanikahodai}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{lemma}

番号を参照したいときは\leref{nanikahodai}とする。

\begin{example}{なにか例示}{nanikareiji}
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ
\end{example}

番号を参照したいときは\exref{nanikareiji}とする。
f:id:f_d0123:20200904230039p:plain
定理環境
proof環境

定理や命題を述べるなら,proof 環境も欠かせません。これも tcolorbox のコマンドのみで定義します。基本的な入力や出力は amsthm.sty のProof 環境と同じなので割愛します。\qedhere についても同様に定義されています。

なぜ tcolorbox で定義したかというと,tcolorbox のオプションの1つであるvoid オプションが使いたいからです。これを使えば,証明部分は出力しないでコンパイルする,と言ったことが出来るからです。発表時に証明を見ながら板書をするのは野暮だと考えていますので,僕には必要なのです。

注意書き

tcolorboxのお誘い - ぱるちのものおき ver 2.0で紹介したものと同様の,tcolorbox のマニュアル*10でよく見る枠です。

\newtcolorbox{marker}[1][]{enhanced,
  before skip=2mm,after skip=3mm,fontupper=\gtfamily\sffamily,
  boxrule=0.4pt,left=5mm,right=2mm,top=1mm,bottom=1mm,
  colback=yellow!50,
  colframe=yellow!20!black,
  sharp corners,rounded corners=southeast,arc is angular,arc=3mm,
  underlay={%
    \path[fill=tcbcolback!80!black] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
    \path[draw=tcbcolframe,shorten <=-0.05mm,shorten >=-0.05mm] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
    \path[fill=yellow!50!black,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=4mm]interior.north west);
    },
  drop fuzzy shadow,#1}
f:id:f_d0123:20200615014937p:plain
いつ見てもすごい。

おわりに

ここでは TeXLive2019 内で完結できるように,自分勝手なスタイルファイルを紹介しました。

普段は emath パッケージ群にある mawarikomi 環境や uline--.sty で下線を引いているため,もう少し色々と定義をしたものを使っています。気力があればそこら辺の話もしたいです。

参考文献

上記では紹介しなかったもので,話題に上げたものや参考にしたものを列挙します。

画像について(TeX2img):めちゃくちゃ便利です。
tex2img.tech


和文フォントについて:

texdoc pxchfon

emath:
emathWiki - PukiWiki および
http://emath.s40.xrea.com/

ceo:
数学と数式用フォント

uline--. について:現在は二次配布により入手可能。その詳細については
行分割可能な \fbox をつくる - TeX Alchemist Online
にあります。

*1:最近はluaLaTeXが流行っているそうですが,まだ僕は(u)pLaTeXです。またTeXLive2020でちゃんと動作するかは未検証なので,今回は2019としています。ていうかそもそも Overleaf は 2019 が最新です。W32TeXでどうなるかは知りません。

*2:どうやらTeXLive2020では,2020をインストールした段階で和文フォントのデフォルトが Noto CJK JP (厳密には原ノ味フォント)になっているようです。

*3:検索窓に「囲み数字 latex」などと入力してみれば先人たちの苦労が伝わってきます。

*4:なにやら改訂第8版が2020年中に発売されるらしい…?( https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2619#p15294

*5:Latin Modern フォントは,基本的には Computer Modern(TeXのデフォルト欧文フォント)と同じデザインのもので,Computer Modernの上位互換と思ってください。カーニングの改良や文字サイズの適切な出力を与えてくれます。

*6:高校数学程度ならば安田先生のceoが最も好きですが,リガチャやカーニングについては非対応となっているため,あまり普段使いはしていません。

*7:emath.styの\bunsuuコマンドが望みの出力に近いため,僕個人で利用するtexファイルは\bunsuuコマンドなのですが,他人との互換性を考えた結果定義を弄ることとしました。

*8:正確には,「\sqrt の定義に使われている \root コマンドの定義が複雑」です。例えばamsmath.styの341行目から374行目あたりを参照ください。その部分のなにを弄ればよいのか…

*9:amsthm.styを読み込まないことによって,記事内のスタイルファイルをbeamerで使おうとすると,エラーが出ます。その際はドキュメントクラスのオプションに notheorems を加えてください。

*10:texdoc tcolorbox