[TikZ] TikZ でテキスト装飾
2021年12月03日 (金) 12:38
この記事は TeX & LaTeX Advent Calendar 2021 の 3 日目の記事です。 2 日目は h20y6m さんの 独自TeX Liveリポジトリを作ってみる話 でした。 4 日目は ??? さんの ????? です(すなわちまだ空き枠です。レッツ登録)。
なお、この記事を作成するのにあたって、CSS を編集しました。 過去記事のスタイルが壊れてたら教えて下さい……。
導入
LaTeX で文章を作成するにあたって、㊝のようなものを本文中に出力するために、文字(または図形) を重ねて出力したいという要望が出てくるのは自然だといえます。これを TikZ で実現します。
実現方法
そのための方法のヒントは、ZR さんの TikZ で“インラインな”図を描く に示されています。 ここでは、その記事の内容を参考にしながら、◇に「3」を重ねたものを出力するのを試みてみます。
まず、愚直に TikZ で「◇」と「3」を重ねます。
1. AB \tikz{\draw node(C){\large ◇}node(T){3};} DE
各ノードの初期位置は (0,0) なので、ここでは C も T も (0,0) の位置にあることに注意してください。 (別に両方 T で揃えてもいいのですが、今後のことを考えて、ノードの名前を変えておきます)
これでは、「◇」の下端にノードのパディングを加えたものが本文のベースラインに合わせられ、 本文から浮いて見えます。
次に、 ベースラインを周りとあわせます。今回は、「3」のベースラインを周りと合わせるとして、 (T.baseline) で「3」のベースラインの y 座標を取得し、baseline パラメタで外側のベースラインと合わせます。
2. AB \tikz[baseline=(T.base)]{\draw node(C){\large ◇}node(T){3};} DE
マージンやパディングを消しておきます。
3. AB \tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt](C){\large ◇}node(T){3};} DE
ということでできました。
◇でなくとも、いろいろなものに応用することができます。
AB
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt](C){\large △}node(T){3};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt](C){\large ◇}node(T){3};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt](C){\large ■}node(T)[color=white]{3};}
DE\\
TikZ を使って囲み文字を自作するやつ。 pic.twitter.com/PHVU3Q5Fo1
— ドグェラヒヒ 💉⓵7/23⓶8/22 未読: 伊勢物語、まほよめ最新刊 (@CareleSmith9) December 3, 2021
ドミニオンの コインのやつ も再現できます。
\usepackage{graphicx,tikz,xparse,newpxtext}
\NewDocumentCommand\Coin{m s t+}{%
\tikz[baseline=(T.base)]{
\draw
node[inner sep=0pt,outer sep=0pt,](C){\includegraphics[height=1.1\zh]{Coin.png}}
node(T){\vphantom{1}#1\textsuperscript{\IfBooleanT{#2}{*}\IfBooleanT{#3}{+}}};
}%
}
\Coin{1}, \Coin{2}, \Coin{0}*, \Coin{4}+,
hogehoge fugafuga \Coin{a}, \Coin{b}, \Coin{c}.
ドミニオンのコインのやつ。 pic.twitter.com/h19DttJCcH
— ドグェラヒヒ 💉⓵7/23⓶8/22 未読: 伊勢物語、まほよめ最新刊 (@CareleSmith9) December 3, 2021
パラメタを微調整することもできます。
1.
AB
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){a};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){g};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){h};}
DE\\
{\scriptsize\verb|\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){X};}|}
2.
AB
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){\vphantom{gh}a};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){\vphantom{gh}g};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){\vphantom{gh}h};}
DE\\
{\scriptsize\verb|\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){vphantom{gh}X};}|}
3.
AB
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node[anchor=base](T){a};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node[anchor=base](T){g};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node[anchor=base](T){h};}
DE\\
{\scriptsize\verb|\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node[anchor=base](T){X};}|}
4.
AB
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,anchor=base](C){\large ◇}node[anchor=base](T){a};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,anchor=base](C){\large ◇}node[anchor=base](T){g};}
\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,anchor=base](C){\large ◇}node[anchor=base](T){h};}
DE\\
{\scriptsize\verb|\tikz[baseline=(T.base)]{\draw node[inner sep=0pt,outer sep=0pt,anchor=base](C){\large ◇}node[anchor=base](T){X};}|}
5.
AB
\tikz[baseline=(C.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){a};}
\tikz[baseline=(C.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){g};}
\tikz[baseline=(C.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){h};}
DE\\
{\scriptsize\verb|\tikz[baseline=(C.base)]{\draw node[inner sep=0pt,outer sep=0pt,](C){\large ◇}node(T){X};}|}
ディセンダー・アセンダーで位置がずれるので、適当にパラメタをいじってみる例。 pic.twitter.com/PRrIYlWjDS
— ドグェラヒヒ 💉⓵7/23⓶8/22 未読: 伊勢物語、まほよめ最新刊 (@CareleSmith9) December 3, 2021