1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

longmath の括弧の高さを自動調整する新しい方法を使ってみよう

Posted at

longmath パッケージは括弧の高さ自動調整するためのまったく新しいコマンドを提供します。

longmath パッケージ内部で Lua を利用しているため、LuaLaTeX のみで動作します。

また、本記事はバージョン 1.0 (2024-03-04) です。

longmath の新しい left・right

LaTeX がデフォルトで提供する \left\middle\right のように、longmath パッケージでは基本となる 3 つのコマンドがあります。

  • \lleft
  • \mmiddle
  • \rright

基本的な使い方はまったく同じですが、決定的に違う点として、それぞれを独立に利用できるという点があります。

これまで \left\right は独立して利用できず、必ず組で使う必要がありました。加えて、\middle はこの組の間になければなりませんでした。

%% \middle が外側にあるような書き方は許されなかった
\frac{ \left ( a + 1 \right) \middle / x }{a}

longmath パッケージから提供されるコマンドではこのようなグルーピングは行わないため、それぞれを独立して利用できます。

%% longmath パッケージでは \middle が外側にあっても許される
\frac{ \lleft ( a + 1 \rright) \middle / x }{a}

そのため、邪悪な気もしますが \vphantom を代替するような使い方も可能になっています。(後述

また、\lleft\rright\left\right における丸括弧周囲の謎スペースを生じさせません。

1.png

数式クラスに対応した \middle

\middle では、これに続く記号がどの数式クラスに属するかは指定されていませんでした。

例えば集合における内包的記法では、以下のように \middle| とすることで \left\{\right\} の高さと合わせるようにします。

G =
  \left\{
    (x,y) \in \mathbb{N}^2
    \middle|
    Z - \frac{1}{2} \leq x^2 + y^2 \leq Z + \frac{1}{2}
  \right\}

このときの \middle| はいずれの数式クラスにも当てはまりません。(参考

longmath パッケージでは \mmiddle に加えて、数式クラスに対応したコマンドが存在します。

コマンド 数式クラス
\mmord 通常 (e.g. a, \alpha)
\mmrel 関係演算子 (e.g. =, \coloneq)
\mmbin 二項演算子 (e.g. +, -)
\mmop 前に置かれる作用素 (e.g. \int, \sum)
\mmpunct 後置記号 (eg. ., !)

上で挙げた参考の記事内では、\mathrel{}\middle|\mathrel{} とすることで \middle| を関係演算子の扱いにしていますが、longmath パッケージでは \mmrel| とすることで関係演算子として扱うことが出来ます。

G =
  \lleft\{
    (x,y) \in \mathbb{N}^2
    \mmrel|
    Z - \frac{1}{2} \leq x^2 + y^2 \leq Z + \frac{1}{2}
  \rright\}

01.png

数式環境内で括弧の高さを揃える

例えば以下のような数式を考えたとき、\sum を含む 1 つ目の組と \int を含む 2 つ目の組では丸括弧の高さが若干異なります。

\lleft( A + \sum B \rright)
\lleft( C + \int D \rright)

02.png

longmath パッケージでは、これを解消するために 2 つのコマンドが用意されています。

  • \mleft
  • \mright

これらを利用することで、環境内(グループ内)にある最も高いデリミタに調整されます。

\mleft( A + \sum B \mright)
\mleft( C + \int D \mright)

03.png

この高さの統一は TeX のグループに左右されます。そのため、各組を {} で囲う等すると高さは揃いません。

%% これでは各組の丸括弧の高さが揃わない
{ \mleft( A + \sum B \mright) }
{ \mleft( C + \int D \mright) }

手動のスケール調整

ここまでに紹介した 10 つのコマンドは数値によって手動でスケールを調整することも出来ます。

\lleft の後に数値を置くことでスケールを調整します。

X =
  \lleft (
    \sum_k^\infty A
    \mmbin 900 | \sum_k^\infty B
    \mmbin 700 | \sum_k^\infty C
    \mmbin 500 | \sum_k^\infty D
    \mmbin 300 | \sum_k^\infty E
  \rright )

04.png

タグ付け

この機能は複数回のタイプセットが必要になります。

例えば次のような式を考えたとき、それぞれの項で丸括弧とスラッシュの高さは異なります。

  \frac{ \lleft ( a + 1      \rright) \mmord / x }{a}
+ \frac{ \lleft ( \sum_k b^k \rright) \mmord / y }{b}
+ \frac{ \lleft ( c^2 + 1    \rright) \mmord / z }{c}

05.png

longmath パッケージでは、\lleft コマンド等に続いてタグ付けすることで高さを揃えることが出来ます。

  \frac{ \lleft {f5} ( a + 1      \rright) \mmord / x }{a}
+ \frac{ \lleft {f5} ( \sum_k b^k \rright) \mmord / y }{b}
+ \frac{ \lleft {f5} ( c^2 + 1    \rright) \mmord / z }{c}

06.png

このとき、{f5} のようなタグ付けは \lleft\rright どちらのコマンドに付随していても同じ結果を得ます。
また、\mleft\mright を使っても同じ結果を得ます。

あるいはこのとき、\mmord にタグ付けをすると、スラッシュの高さのみが全体で揃うようになります。

  \frac{ \lleft ( a + 1      \rright) \mmord {f6} / x }{a}
+ \frac{ \lleft ( \sum_k b^k \rright) \mmord {f6} / y }{b}
+ \frac{ \lleft ( c^2 + 1    \rright) \mmord {f6} / z }{c}

07.png

このタグ付けは、次のような角括弧と丸括弧の高さを各々で揃えたいとき等にも有効です。

  F\lleft {Fx} [ X   \rright] \lleft {Pw} ( 1 + 2^2 \rright) \lleft {Pw} ( 1 + 2^{2^2} \rright)
+ F\lleft {Fx} [ X^2 \rright] \lleft {Pw} ( 1 + 3^3 \rright) \lleft {Pw} ( 1 + 3^{3^3} \rright)
+ F\lleft {Fx} [ X^3 \rright] \lleft {Pw} ( 1 + 5^5 \rright) \lleft {Pw} ( 1 + 5^{5^5} \rright)

08.png

このタグ付けは相互参照のように固有のタグ名である必要があります。

一意のタグを作成する必要があるため、タグの命名が非常に面倒になるかも知れませんが、\delimiterprefix を構成することで比較的容易に一意に構成することが出来ます。

例えば以下のように構成すると、すべてのタグ名の先頭に \theequation. が挿入されます。(この例では数式毎にタグ名が固有になります)

\delimiterprefix{\theequation.}

このタグ名は相互参照のラベル名とは干渉しません。

改行や & をまたいで高さを揃える

split 環境内で高さを調整する括弧が改行を含む場合でも、タグを使用して紐づけることができます。

\begin{equation}
  \begin{split}
    a \lleft( \sum_{k=1}^N k + \sum_{k=1}^N \frac{1}{k} \rright)
    & = a
      %% ここから
      \lleft {be} (
        \frac{1}{1} + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{5} + \cdots
    \\
    & \quad 1 + 2 + 3 + 4 + 5 + \cdots
      \rright {be} )
      %% ここまで
  \end{split}
\end{equation}

09.png

あるいは、\pushdelimiter\pulldelimiter を利用して以下のように構成することも出来ます。

\begin{equation}
  \begin{split}
    a \lleft( \sum_{k=1}^N k + \sum_{k=1}^N \frac{1}{k} \rright)
    & = a
      %% ここから
      \lleft(\pushdelimiter
        \frac{1}{1} + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{5} + \cdots
    \\
    & \quad 1 + 2 + 3 + 4 + 5 + \cdots
      \pulldelimiter\rright)
      %% ここまで
  \end{split}
\end{equation}

数式環境をまたいで高さを揃える

タグ付けして高さを揃えることが出来るため、数式環境をまたいで高さを揃えることも可能です。

Equations that start with
\[
  \lleft(
    \int\limits_1^\infty f(x) \, \mathrm{d}x
  \rright)
  %% ここから
  \lleft {longeq} (
    \sum_k a_k + 1000 + 999 + \cdots
\]
often go on for pages and end with
\[
  \cdots + 1
  \rright {longeq} )
  %% ここまで
  = 0 .
\]

10.png

\delimiterprefix を構成している場合、このような数式環境をまたいで高さを揃えられない場合があります。

\vphantom 的な使い方

例えば次のような根号を含む式を考えたとき、それぞれの項の根号記号の高さは異なります。

  \sqrt{ a + 1 }
+ \sqrt{ \sum\nolimits_k b_k }
+ \sqrt{ c^2 + 1 }

11.png

このとき、高さを揃えようとすると \vphantom を使った非常に面倒な操作が必要です。また、高さが最大となる項を事前に知っている必要もあります。

longmath パッケージから提供されるコマンドは独立して利用できるため、以下のようにすることで高さを揃えるように機能させることが出来ます。

  \sqrt{ \mleft {sq8} . a + 1 }
+ \sqrt{ \mleft {sq8} . \sum\nolimits_k b_k }
+ \sqrt{ \mleft {sq8} . c^2 + 1 }

12.png

ネストの深さ応じた自動的な括弧の判定

この機能は複数回のタイプセットが必要になります。

これまで紹介した高さを自動調整するコマンドに * を与えることで、ネストの深さに応じて自動的に括弧を変更することが出来ます。

\autodelimiters を使って、以下のようにネストされる括弧の順序を指定します。(対応する括弧の中央に * を置きます)

\autodelimiters{ \lfloor [ \{ ( * ) \} ] \rceil }

数式内では、\lleft*\rright* を使います。

\lleft* A + \lleft* B + \lleft* C + \lleft*
D + \frac{ \lleft* X + Y \rright* \times Z }{ W }
\rright* \cdot E \rright* \cdot F \rright* \cdot G \rright*

13.png

これによって、自動的にネストに深さに応じて括弧を変更されます。

加えて、タグ付けを行うとネストをそろえることも出来ます。

  \lleft {qx} *
    \frac{ n+1 }{ n^2 }
  \rright * ^2
+ \lleft {qx} *
  \frac{ n }{ \lleft * n - 1 \rright *^2 }
  \rright * ^2

14.png


実際に使う場合、\lleft*\rright* とするのは疲れるので、以下のように定義しておくと便利でしょう。

\NewDocumentCommand{\ad}{ o m }{%% Auto Delimiter
  \IfNoValueTF{#1}%
    {\lleft* #2 \rright*}%
    {\lleft {#1} * #2 \rright*}%
}

これを利用することで、上で示した例は以下のように書き替えることが出来ます。

\ad{ A + \ad{ B + \ad{ C + \ad{
D + \frac{ \ad{ X + Y } \times Z }{ W }
} \cdot E } \cdot F } \cdot G }
  \ad[qx]{
    \frac{ n+1 }{ n^2 }
  } ^2
+ \ad[qx]{
  \frac{ n }{ \ad{ n - 1 }^2 }
  } ^2

自動的に改行する split 環境

longmath パッケージでは、自動的に改行する split 環境に準じた longmath 環境と longmath* 環境を提供します。

これらの 2 つの環境では、minipage 環境と同じように幅を指定することで自動的に数式を改行するようになります。(longmath* 環境の方がちょっとだけタイトな結果になるようです)

オプション引数は、aligned や gathered 環境と同じ tcb を受け付けます。

Q =
  \begin{longmath}[t]{70mm}
    1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{5} + \frac{1}{6} + \frac{1}{7} + \frac{1}{8} + \frac{1}{9} + \frac{1}{10}
    + \frac{1}{11} + \frac{1}{12} + \frac{1}{13} + \frac{1}{14} + \frac{1}{15} + \frac{1}{16} + \frac{1}{17} + \frac{1}{18} + \frac{1}{19} + \frac{1}{20}
    + \frac{1}{21} + \frac{1}{22} + \frac{1}{23}
    + \cdots
  \end{longmath}

15.png

見た目としては mathtools パッケージの multlined 環境に似たものになります。

幅の大きさは 70mm のような絶対的な数値の他にディスプレイ可能な寸法の比(0.6 など)による表現も可能です。

加えて、幅の値に + を続けてズレ幅を指定することも出来ます。(当然ですが、足された値が幅になります)

Q =
  \begin{longmath}[t]{70mm+20mm}
    1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{5} + \frac{1}{6} + \frac{1}{7} + \frac{1}{8} + \frac{1}{9} + \frac{1}{10}
    + \frac{1}{11} + \frac{1}{12} + \frac{1}{13} + \frac{1}{14} + \frac{1}{15} + \frac{1}{16} + \frac{1}{17} + \frac{1}{18} + \frac{1}{19} + \frac{1}{20}
    + \frac{1}{21} + \frac{1}{22} + \frac{1}{23}
    + \cdots
  \end{longmath}

16.png


ところで、個人的に関係演算子の右側で改行されるのは奇妙に感じていますが、これは数学的に一般的な表現方法ですか…?

余談

個人的に longmath パッケージで有用だと感じている機能は ネストの深さに応じて自動的に括弧を判定するやつ です。

多くの場合、丸括弧 ⇒ 角括弧 ⇒ 波括弧の順で括ると思われるので、\autodelimiters{ \{ [ ( * ) ] \} } として利用すると便利だと思います。


投稿日の今日は 2024 年 7 月 7 日の七夕ですが、多くの地点の 暑さ指数 は 30 を超え熱中症に気を付けなければならない気温となっています。まじであつい :hot_face:

LaTeX をするときくらいはなるべく楽な方法を探してクールに過ごしましょう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?