math subequations - yarakos95/LaTeX-for-math GitHub Wiki

連立方程式をきれいに書く

連立方程式などの複数の数式を並記する際には,align 環境を用いることが多いだろう. この場合では式番号が連立方程式内で連番となる.連番である場合,これらの式がまったく関係のない式なのか,関連する数式なのか自明ではない. したがって,これを(1-a), (1-b), (1-c) のように,サブ番号を付与する形にしたい.

全体に1つだけ番号を付ける

そもそも連立方程式の各々に式番号の付与が必要ないのであれば,全体に一つの式番号を付与すれば良いだろう. これには,equation+aligned を用いれば簡単だ.

\begin{equation}
    \begin{aligned}
    A & = B \\
    C & = D \\
    E & = F
    \end{aligned}
\end{equation}

左側を括弧で括ることも可能だ.

\begin{equation}
\left\{ \,
    \begin{aligned}
    & A = B \\
    & C = D \\
    & E = F
    \end{aligned}
\right.
\end{equation}

equation+aligned.png

○ サブ番号を付ける

amsmath パッケージで提供されているsubequations 環境を使う.(The amsmath Package, §3.11.3 Subordinate numbering sequences)

subequations 環境の特徴は以下である.

  • subequations 環境は数式環境ではない : 文章の挿入が可能
  • subequations 環境内で数式環境を用いる : 数式環境の複数の挿入可能
  • 式番号はサブ番号(子番号)が小文字アルファベットで付与される : 例,(1a), (1b),……

これより使用例を3つ挙げる.

☆ 使用例1 : 通常の使用

\begin{subequations} \label{all}
    \begin{align}
    A & = B \label{first equation} \\
    C & = D \label{second equation} \\
    E & = F \label{third equation}
    \end{align}
\end{subequations}

subequations.png

ここで,式番号の相互参照は\label の位置によって変わる. 上の例では,

  • \label{all} では親番号の(1) となる
  • \label{first equation} では子番号を含めた(1a) となる

親番号のみは,式番号として数式全体かどうかあからさまになっていない.理解しづらい式番号になってしまう可能性がある.

☆ 使用例2 : テキストの挿入

\begin{subequations} \label{all}
一つ目の式
    \begin{equation}
    A = B \label{first equation}
    \end{equation}
二つ目の式
    \begin{equation}
    C = D \label{second equation}
    \end{equation}
三つ目の式
    \begin{equation}
    E = F \label{third equation}
    \end{equation}
\end{subequations}

subequations+text.png

間に挿入されたテキストは\intertext を用いて挿入したときときと似た結果を得る. また,式番号は使用例1と同様の結果となる.

もちろん\intertext を用いれば,アンパサンド& がはたらくことで整列させることが可能になる.

\begin{subequations} \label{all}
    \begin{align}
    \intertext{一つ目の式}
    A & = B \label{first equation} \\
    \intertext{二つ目の式}
    C & = D \label{second equation} \\
    \intertext{三つ目の式}
    E & = F \label{third equation}
    \end{align}
\end{subequations}

subequations+align+intertext.png

こちらの方が前後の文章との段落を意識せずに利用できるので良いかもしれない.

☆ 使用例3 : 式番号の付与

subequations 環境には* 付き環境は提供されていないが,subequations 環境内の数式環境には* 付き環境を用いることも出来る.

\begin{subequations} \label{all}
一つ目の式
    \begin{equation}
    A = B \label{first equation}
    \end{equation}
二つ目の式
    \begin{equation*}    % \notag でも可
    C = D \label{second equation}
    \end{equation*}
三つ目の式
    \begin{equation}
    E = F \label{third equation}
    \end{equation}
\end{subequations}

subequations+notag.png

この場合,二つ目の式には式番号が付与されず,一つ目の式と三つ目の式にそれぞれ(1a), (1b) と付与される.

○ 式番号のスタイルを変更したい

デフォルトでの式番号は(1a) となっている.これを変更する場合は,以下のようにすれば良い.[^subequationssetnumber]

[^subequationssetnumber]: 「Leslie Lamport, LATEX: A document preparation system, 2nd revised ed.,Addison-Wesley, Reading, MA, 1994.」§6.3および§C.8.4を参照されたい.Buy at Amazon

\begin{subequations}
\renewcommand{\theequation}{% 必ずsubequations 環境内に入れる
    \theparentequation-\alph{equation}    % (1-a) となる
%    \theparentequation-\roman{equation}    % (1-i) となる
}
    \begin{align}
    A & = B \\
    C & = D \\
    E & = F
    \end{align}
\end{subequations}

subequations-change-no.png

注意点

  • プリアンブルに挿入しない
  • 挿入されたsubequations 環境内のみでしか式番号のスタイルは変更されない

特に通しの式番号にする場合であれば,ハイフンを挿入しておいた方が見やすい気がする.

■ 新たな環境として定義する

いっそ,一つの新たな環境として定義してしまっても良いかも知れない. 連立方程式を意味する"Simultaneous equations" から,simulteq 環境を定義してみた.

\newenvironment{simulteq}[1]{
        \subequations \label{#1}
        \renewcommand{\theequation}{\theparentequation-\alph{equation}}
        \align
}{
        \endalign
        \endsubequations
}

このように定義してしまえば,[^addmethod]

[^addmethod]: 連立方程式全体の\label が常に不要の場合は,引数を無しで定義すると良いだろう

\begin{simulteq}{<label name>}
    A & = B \\
    C & = D \\
    E & = F
\end{simulteq}

このように定義するメリットは,式番号を逐次的に変更する必要がなくなる点である. また,テキストを挿入したい場合は\intertext を用いることを想定している.

○ showonlyrefs との併用

mathtools パッケージ[^mathtools]のshowonlyrefs を使って式番号を相互参照する数式のみ付与するようにしている人は多いのではないだろうか.

[^mathtools]: mathtools.sty | CTAN から.showonlyref に関しては「数式の相互参照: mathtools の紹介 - 裏紙に雑文」に詳しい.

(追記) \noeqref\label に対して\eqref の参照が無くても式番号を付与する目的のコマンドなので,これで正しい. 過去に勘違いをして記事を書いていたので,一部を取り消し線で消しておきました.

showonlyrefs を利用しながら連立方程式の一部しか相互参照しないがいくつかの方程式に各々式番号を付与したい場合には,\noeqref を用いれば良いような気がするしかし,\label\noeqref に置き換えると,置き換えた数式の式番号が消えてしまう.これを解消するために以下のようにすると上手くいく.

\mathtoolsset{showonlyrefs = true}
\begin{subequations} \label{all}
    \begin{align}
    A & = B \label{first equation} \\
    C & = D \label{second equation} \noeqref{second equation} \\    % 式番号は付与される
    E & = F \label{third equation}  \noeqref{third equation}  % 式番号は付与される
    \end{align}
\end{subequations}
相互参照は\eqref{first equation}だけ!!

通常は\label を付けなくても\noeqref のみで式番号が相互参照なしに式番号が付与される. しかし,showonlyrefs にはサブ番号に対応する能力を持っていないようだ.これを回避するために,\label も付けておく.

これが良い解決方法なのか分からないが,とりあえずはこの方法で解決できることを紹介しておきたい.

○ 左側を括弧で括りたい

\left\{ ~ \right. で囲えば良いような気がするが,そういうわけにもいかないようだ. 以下のようにしても上手くいかない.

\begin{subequations}
\begin{align}    % equation 環境にしても同じ結果となる.
\left\{
    \begin{aligned}
    & A = B \\
    & C = D \\
    & E = F
    \end{aligned}
\right.
\end{align}
\end{subequations}

subequations+equation+aligned.png

各々に式番号は付与されない.(なんで……) 括弧の有無も関係ないようだ.

ちなみにcases 環境を使ってもダメ.そもそも場合分けではないので使うべきではないという感じもする.

■ empheq パッケージを使用する

empheq パッケージ[^empheq]を用いると出来る.[^anothermethod]

[^anothermethod]: empheq パッケージの他に方法があるのかは不明.今回のempheq に関する記事は,調べていた際にstack で回答がなされていたことを参考に紹介している.

[^empheq]: empheq.sty | CTAN から.mathtools パッケージのバンドルとなっている.括弧で括るほかに,ボックスで囲ったりとさまざまな機能がある.「連立方程式を一番美しく書けるempheq - muscle_keisukeの日記」,「天地有情 [LaTeX] empheq --- amsmathに視覚的なマークアップを施す」に詳しい.

読み込みは以下のようにする.

\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{empheq}

基本的な使用方法としては,

\begin{empheq}[<オプション>]{<amsmath 環境名>}
    % amsmath で提供されている環境で数式を入れる
\end{empheq}

<オプション> ではさまざまに設定することが出来るが,今回の場合には以下のようにすれば良い.

\begin{subequations}
    \begin{empheq}[left = {\empheqlbrace \,}, right = {}]{align}
    & A = B \\
    & C = D \\
    & E = F
    \end{empheq}
\end{subequations}

empheq-lbrace.png

オプション部分ではleft = 以下で数式全体の左側を決めている.[^empheqright]

[^empheqright]: もちろんオプションでright = とすれば数式の右側を決めることが出来る.

  • \empheqlbrace ではempheq で定義された波括弧
  • \, では波括弧と数式との間隔を広げている

これも,先ほどと同様に新たな環境simultempheq 環境として定義しておいても良いだろう.

\newenvironment{simultempheq}[2]{
        \subequations \label{#2}
        \renewcommand{\theequation}{\theparentequation-\alph{equation}}
        \empheq[left = \empheqlbrace \, ]{#1}
}{
        \endempheq
        \endsubequations
}
\begin{simultempheq}{align}{<label name>}
    & A = B \\
    & C = D \\
    & E = F
\end{empheq}

○ 実例

電磁気学のノートを例にして作成してみた.少し長くなってしまったが,参考にしてもらえると嬉しい.

実例コードとその結果画像 (折りたたみ)

typeset : upLaTeX + dvipdfmx + jsarticle

\documentclass[uplatex,dvipdfmx,12pt,a4paper]{jsarticle}
\usepackage[left=25mm,right=25mm,top=30mm,bottom=30mm]{geometry}
\usepackage{amsmath,amssymb}
\usepackage{mathtools}
\usepackage{empheq}
\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\divergence}{div}
\DeclareMathOperator{\rot}{rot}
%\numberwithin{equation}{section}    % セクションごとに式番号をリセットする
\begin{document}

\section{Maxwell方程式}

Maxwell方程式の微分形は以下の4式である.
\begin{subequations}\label{eq: maxwell}
\begin{align}
\divergence \boldsymbol{E} (t,\boldsymbol{x})
    & = \frac{\rho (t,\boldsymbol{x})}{\varepsilon_0} ,
    && \text{Gauss's law} \\
\divergence \boldsymbol{B} (t,\boldsymbol{x})
    & = 0 , 
    && \text{Gauss's law for magnetism} \\
\rot \boldsymbol{E} (t,\boldsymbol{x})
    & = - \frac{\partial \boldsymbol{B} (t,\boldsymbol{x})}{\partial t} , 
    && \text{Maxwell-Faraday equation} \\
\rot \boldsymbol{B} (t,\boldsymbol{x}) 
    & = \mu_0 \left( \boldsymbol{j} (t,\boldsymbol{x}) + \varepsilon_0 \frac{\partial \boldsymbol{E} (t,\boldsymbol{x})}{\partial t} \right) . 
    && \text{Anp\'ere's circuital equation}
\end{align}
\end{subequations}

\section{電磁波の予言}

Maxwell方程式Eq\eqref{eq: maxwell}に真空条件($\rho=0, \boldsymbol{j}=0$)を課すと以下のようになる.
\begin{subequations}
\renewcommand{\theequation}{\theparentequation-\roman{equation}}
\begin{empheq}[left = \empheqlbrace\,]{align}
& \divergence \boldsymbol{E} (t,\boldsymbol{x})
    = 0 , \\
& \divergence \boldsymbol{B} (t,\boldsymbol{x})
    = 0 , \\
& \rot \boldsymbol{E} (t,\boldsymbol{x})
    = - \frac{\partial \boldsymbol{B} (t,\boldsymbol{x})}{\partial t} , \label{eq: maxwell-faraday-vac} \\
& \rot \boldsymbol{B} (t,\boldsymbol{x}) 
    = \varepsilon_0 \mu_0 \frac{\partial \boldsymbol{E} (t,\boldsymbol{x})}{\partial t} . \label{eq: anpere-vac}
\end{empheq}
\end{subequations}
ここで,電場$\boldsymbol{E}$または磁束密度$\boldsymbol{B}$について整理したい.

\begin{subequations}
Eq\eqref{eq: maxwell-faraday-vac}の両辺に$\rot$を左から掛けて電場$\boldsymbol{E}$について整理すると,
\begin{equation}
\left( \varepsilon_0 \mu_0 \frac{\partial^2}{\partial t^2} - \boldsymbol{\nabla}^2 \right) \boldsymbol{E}
    = 0
\end{equation}

Eq\eqref{eq: anpere-vac}の両辺に$\rot$を左から掛けて磁束密度$\boldsymbol{B}$について整理すると,
\begin{equation}
\left( \varepsilon_0 \mu_0 \frac{\partial^2}{\partial t^2} - \boldsymbol{\nabla}^2 \right) \boldsymbol{B}
    = 0
\end{equation}
となる.
\end{subequations}
これは波動方程式であり,ここから,この電場$\boldsymbol{E}$と磁束密度$\boldsymbol{B}$の伝播速度$c$を読み取ると,
\begin{equation*}
c
    = \frac{1}{\sqrt{\varepsilon_0 \mu_0}}
\end{equation*}
である.

\subsection{電磁波は横波}

電場$\boldsymbol{E}$の振動方向を$x$方向のみとすると,Eq\eqref{eq: maxwell-faraday-vac}より,
\begin{equation}
B_y(t,z)
    = \frac{1}{c}E_x(t,z)
\end{equation}
となる.これにより,電場$\boldsymbol{E}$と磁束密度$\boldsymbol{B}$は常に直交したまま変動しており,電場の振幅の大きさは磁束密度の振幅の大きさの$c$倍であることが分かる.

\end{document}

math-subequations.png

\numberwithin を有効にしてみてもおもしろいだろう.

参考

追記

  • 2020/10/09: 「showonlyrefs との併用」で\noeqref についての説明に間違いがあったので訂正しました.
⚠️ **GitHub.com Fallback** ⚠️