以下の内容はhttps://tobetakoyaki.hatenablog.com/entry/2025/04/26/140000より取得しました。


LaTeX文書で文字列をハイライト&真下にキャプションしてみたい②

直前の投稿に用いた LaTeX のコマンドを「せっかくだから共有しちゃおう!」という思いでこの投稿を書きました.読まれる方の参考になれば嬉しく思います.

この記事の目標

以前,以下の記事の中で,文字列の真下に補足の文言を付けるための方法を紹介しました.

tobetakoyaki.hatenablog.com

これを応用すると,以下のような,式変形の途中で変形の補足を行う文書を作成することができます.

\highlight によって変形の補足を行った例

しかし,これを用いると,等号の位置が自動では揃わず,細かい調整が必要という難点があります.

これをなんとかして整えていきましょう.完成形のイメージは次のような感じです*1

完成形*2

言語化すると,

要件

  • align 環境の & で等号位置を揃えることができるこれがメイン

という感じです*3

コード例

先に上記の「完成形」を実現するコマンドの実装例を示します*4

% 必要なパッケージの読み込み
\usepackage[x11names]{xcolor}%
\definecolor{MyBlue}{cmyk}{1,0.16,0.06,0}%
\usepackage{tikz}%
\usetikzlibrary{positioning}%
%
% 以下が本質的なコマンド定義部分
\NewDocumentCommand{\explainingtoequation}{O{MyBlue}mm}{%
  %コードの可読性処理
  \def\tmpA{\node[rectangle, fill=#1!20](x){\ensuremath{#2}};}%
  \def\tmpB{\node[above=0em of x, color=#1, align=center, font={\gtfamily\scriptsize}]{#3};}%
  %まず高さ(行送り)を確保
  \vphantom{\tikz[baseline=(x.base)]{\tmpA \tmpB}}%
  %文字の出力
  \tikz[remember picture, baseline=(x.base)]{\tmpA}%
  \tikz[remember picture, overlay]{\tmpB}\;%
}%

使用例も載せておきます.「完成形」を出力するコードです*5*6

\begin{alignat*}{3}
  \alpha%
  &\mathrel{\explainingtoequation{=}{モノイド\\[-3pt]$1$:単位元}} && \alpha \cdot 1\\%
  &\mathrel{\explainingtoequation{=}{$\beta$:右逆}} &&\alpha \cdot (x \cdot \beta)\\%
  &\mathrel{\explainingtoequation{=}{モノイド\\[-3pt]結合律}} &&(\alpha \cdot x) \cdot \beta\\%
  &\mathrel{\explainingtoequation{=}{$\alpha$:左逆}} &&1 \cdot \beta\\%
  &\mathrel{\explainingtoequation{=}{モノイド\\[-3pt]$1$:単位元}} &&\beta%
\end{alignat*}

なお,補足文言の文字列が両脇の式(1行目の「 \alpha」や「 \alpha \cdot 1」など)に被らないようにしたい場合は,適宜手動で微調整する必要があります*7

\begin{alignat*}{5}
  \alpha%
  & \hspace{10pt} && \mathrel{\explainingtoequation{=}{モノイド\\[-3pt]$1$:単位元}} & \hspace{10pt} & \alpha \cdot 1\\%
  &&&\mathrel{\explainingtoequation{=}{$\beta$:右逆}} &&\alpha \cdot (x \cdot \beta)\\%
  &&&\mathrel{\explainingtoequation{=}{モノイド\\[-3pt]結合律}} &&(\alpha \cdot x) \cdot \beta\\%
  &&&\mathrel{\explainingtoequation{=}{$\alpha$:左逆}} &&1 \cdot \beta\\%
  &&&\mathrel{\explainingtoequation{=}{モノイド\\[-3pt]$1$:単位元}} &&\beta%
\end{alignat*}

出力例はこんな感じ.

両脇にアキを入れた version

単体だと分かりにくいので並置したバージョンも.

並置版

ちなみに,大型演算子などと共存する場合はこんな感じになります(出力例は省略).

大型演算子と共存する場合

補足

実装例が何をしているのか,少しだけ補足を加えます.

\highlight として定義していたものでは等号の位置が揃わなかった原因は,説明対象の引数(第2引数)と補足文言の引数(第3引数)を同じ TikZ の picture の中に入れていたためのようでした.

15行目,16行目のようにそれらを分離して,overlay 機能を用いて重ねるように出力することでうまくいくようにしています.

ただし,これだけだと補足文言の入るスペースを確保できないため,以下のように詰まって出力されてしまいます.

行送りを確保しない場合の出力の様子

そのため,これとは別に,13行目で行送りを確保する,すなわち補足文言が入る高さを確保する,という手段をとっています*8

保留点

TikZ の挙動をちゃんと調べていないのですが,今回の実装の仕方だと,「remember picture」として記憶しておくデータがどんどん蓄積されてしまう気がするのですが,これはメモリの使用量的な観点から問題がありそうな気がします.

が,(私個人で使用する範疇では)当面の問題はなさそうなので,放置します.

参考記事

[1] tobetakoyaki.hatenablog.com
[2] TikZ の公式マニュアル(ネット上だと例えば下記からアクセス可.TeX Liveとかには同梱されているはず(記憶が不確か).)
ctan.org
[3] 下記ページの「TikZの使い方」というPDF(紙の本もあるようです) alg-d.com

*1:直前の投稿で使った図と同じものです.

*2:「慣性系と口に出すとシラけてしまいそうだから~」

*3:なお,上の「完成形」に至る過程で,補足文言の設定を洗練させるべく以下のマイナーチェンジも序でに施していますが,これらについては説明を割愛します. ①説明対象のバックは,角が丸くない長方形で塗る ② 補足文言は,説明対象の上側に表示する ③ 補足文言内での改行を可能にする ④ 補足文言の書体は,和文がゴシック,欧文がローマン(立体),数式がローマン(イタリック体)をデフォルトとする 以前のブログで \highlight を設えてから年月を経ているためで,自分の好みに変化が生じていることを実感しました.

*4:なお,実装時のコンパイル環境は upLaTeX です.

*5:上記の実装例の他にも,otf パッケージや pxchfon パッケージを使用したフォント設定,amsmath パッケージの読み込みが必要です.前者が必要な理由は「補足」の第2項を参照.

*6:「要件」には align 環境と書いているくせして使用例には alignat* 環境を使っている一貫性のなさには目を瞑っていただけると幸甚です.

*7:本当はそこまでコマンドの中に組み込みたかったのですが,「 = の左側に & を入れることで位置を揃える」ということとの両立が困難だったので諦めました.ただ,補足文言が長い場合を想定した場合を考えると手動で調整した方が見栄えが良く,使い物にもなりそうだと思います.いや分からないけれど.〔言い訳につき長文〕

*8:幅(水平方向)も確保してしまうと等号の配列がうまくいかないため,高さだけを確保しています.




以上の内容はhttps://tobetakoyaki.hatenablog.com/entry/2025/04/26/140000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14