マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

例の TikZ な練習問題の解説のようなアレ

某アドベントカレンダー某 ZR 氏の記事の中のアレな練習問題の話。

アレな問題

下の図のように、テキストにバツ印を付けて出力するための命令 \myCrossedOut を定義しなさい。

命令の書式は、\myCrossedOut{色名}{テキスト} とします。つまり、先の出力は以下のようなソースによって出力されたものです。

ここで早速\myCrossedOut{red}{dvipdfm}%
\textcolor{red}{dvipdfmx}を起動する。
アレな解説

まずは、例の記事に従って、“気付かれない TikZ”の装飾をテキストを施した形を作ってみる。ただし、ここでの目的では、バツ印はテキストの外側に少しだけはみ出す形で描かれている。この余白をノードの inner sep として確保しておこう。そして取りあえず既定の rectangle の形状のままノードの外枠を描いてみる。

%[プレアンブル]
\usepackage{tikz}
%[本体]
早速
\tikz[baseline=(T.base)]
  \node[draw=red, inner sep=2pt, outer sep=0pt]
  (T) {dvipdfm};%
を。
結果は以下のようになる。

このノード T の大きさに合わせてバツ印を描くには、T の対角線を描く \draw 命令を書けばいいのだが、実はもっと簡単な方法がある。ノードの shape パラメタの値を cross out にすると、「形状がバツ印」になる。(shapes ライブラリが必要。)

%[プレアンブル]
\usepackage{tikz}
\usetikzlibrary{shapes}
%[本体]
早速
\tikz[baseline=(T.base)]
  \node[draw=red, shape=cross out,
    inner sep=2pt, outer sep=0pt]
  (T) {dvipdfm};%
を。

あとは、直線を手描き風に歪ませる decoration (よくTikZ屋さんが嬉しがってやっているアレ)を適用した(decorations.pathmorphing ライブラリが必要)上で、全体をマクロ(\newcommand)にすれば完成!

%[プレアンブル]
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing, shapes}
\newcommand*\myCrossedOut[2]{%
  \tikz[baseline=(T.base)]
    \node[draw=#1, thick, shape=cross out, decorate,
      inner sep=2pt, outer sep=0pt,
      decoration={random steps, segment length=2pt, amplitude=0.4pt}]
      (T) {#2};}
%[本体]
早速\myCrossedOut{red}{dvipdfm}を。