TeX & LaTeX Advent Calendar 2024 の20日目の記事です.19日目はdoraTeXさんでした。 21日目は_MadChemiker_さんです。
今回は「TikZを使って文書内の好きな位置に注釈をつける」というテーマで小ネタです.

こんなふうに,本文内の指定された位置に合わせて,横に注釈を付けられるようにします.また,本文を書き足したり,幅を変えたりして位置がズレても,注釈が追従してくれるようにします.
キッカケは,古賀さんのポスト*1です.ちょうど自分も同じようなことができないかな~と思っていたので,今回はTikZ*2で実装してみようと思います. ちなみに,余白の注(傍注)ならば\marginparを使えばできますが,より柔軟にどこでも注釈を置けるようにするのが目標です.
ここでは説明のため,左に本文用,右に注用のminipageを配置します.
\begin{minipage}[t]{.68\linewidth} % 本文を書くminipage % 本文を書くぞう本文を書くぞう本文を書くぞう本文を書くぞう本文を書くぞう \end{minipage} \hfill \begin{minipage}[t]{.25\linewidth} % 注を置くminipage \end{minipage}
TikZでは,\coordinateを使って座標に名前をつけることができます.また,remember pictureを\tikzのオプションにつけることで,座標を定義した\tikzコマンドの外でも座標を参照できるようになります.
というわけで,注をつけたい本文位置の座標に名前(A)を付けます.
ただし,$a, b$は互いに素\tikz[remember picture]{\coordinate (A);}であるとする.
次に,右側minipageの冒頭に,注の左端の基準位置を表す座標(B)を置きます.
\begin{minipage}[t]{.25\linewidth} % 注を置くminipage \tikz[remember picture]{\coordinate (B);} \end{minipage}
このようにすることで,後で本文を書き足したり,minipageの横幅を変えても,その位置を常に(A)や(B)として参照できるようになります.
あとは,「X座標がBと同じで,Y座標がAと同じ点の座標」に,注の内容を含んだTikZのnodeをoverlayで配置すればOKです.「X座標がBと同じで,Y座標がAと同じ点の座標」はTikZでは(A -| B)で取得できます.

また,注のノードは左上端(north west)を基準点にすると,意図した位置に配置できます.これを踏まえて,細かい調整をすると,以下のコードになります.
% 注用のTikZスタイル \tikzset{sidenote/.style={anchor=north west, inner sep=0pt, text width=.25\linewidth, font=\footnotesize, yshift=.8em}} \tikzset{pointer/.style={red, left, inner sep=3pt, yshift=.3em}} % 注のTikZ nodes \tikz[remember picture, overlay]{\node[sidenote] at (A1 -| B) {$\frac{a}{b}$が既約分数ということ}; \node[pointer] at (A1 -| B) {$\blacktriangleleft$};}
今回のサンプルコードは以下で見れます:
www.overleaf.com
*1: texでチャートみたいに解答の右に補足説明を載せられるようにするのに時間かかった.
今の段階だとまだ手動で説明の位置を調整している段階なので,
これを指定した高さに入れられるようにできないかな... pic.twitter.com/7Qds3HOAO9
*2:TikZ以外でも実装できそうな気がするが,どうせ遅かれ早かれTikZを読み込むのでヨシ!