\special{pdf:...}で文字修飾

LaTeXの通常のコマンドだけでは、

  • 文字の縁に線をつける(袋文字)
  • 任意の斜体(左斜体を含む。←地図中で川や湾に使われる字形)
  • 透明

などの実現が難しい。

TikZを使えば多分どれも可能だが、もう少しシンプルに実現したい。 いっそのこと\special命令でどうにかしようと調べた結果をメモ。

文字の縁に線をつける(袋文字)

まずプリアンブルで、

  • \usepackage[dvipdfmx]{graphicx}

などとしてdvipdfmxオプションでgraphicxパッケージを読み込む。

そして、色を変えたいところの開始位置で、

  • \special{pdf:bcolor [c1 m1 y1 k1] [c2 m2 y2 k2]}で塗りと縁の線の色を指定

    • [c1 m1 y1 k1] :塗りの色。CMYKをそれぞれ0-1で指定。数値は4つとは限らない。3つならRGB、1つならグレースケール
    • [c2 m2 y2 k2]:縁の線の色。
  • \special{pdf:code q width w mode Tr}で線の太さと塗り・線の有無を指定

    • width:縁の線の太さ。単位はpt
    • mode:塗りと縁の線の有無を指定。0:塗りだけ、1:縁の線だけ、2:両方あり

終了位置で

  • \special{pdf:code Q}\special{pdf:ecolor}

とする。

使用例

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\begin{document}
\special{pdf:bcolor [1 0 0 0] [0 1 0 0]}%
\special{pdf:code q .25 2 Tr}%
test%
\special{pdf:code }%
\special{pdf:ecolor}%
\end{document}

縁の線が0.25ptで色はシアン100%、塗りはマゼンタ100%。

毎回\special命令すべて入力するのは煩雑なので、次のようなマクロにしておく。

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\def\stroketext#1#2#3#4{%#1: 塗りの色、#2: 線の色、#3: 線の太さ、#4: 文字列
\special{pdf:bcolor [#1] [#2]}%
\special{pdf:code q #3 w 2 Tr}%
#4
\special{pdf:code Q}%
\special{pdf:ecolor}%
}  
\begin{document}
\stroketext{1 0 0 0}{0 1 0 0}{0.25}{test}
\end{document}

ただし、これらの書き方だと塗りの上に線が来るため、文字がちょっと読みにくいかもしれない。

塗りの下に線が来るようにしたければ、もう一手間かける。

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\newbox\strokebox %文字を保存するためのボックス
\def\stroketext#1#2#3#4{%#1: 塗りの色、#2: 線の色、#3: 線の太さ、#4: 文字列
\setbox\strokebox=\hbox{#4}
\hbox{%
\special{pdf:bcolor [#1] [#2]}%
\special{pdf:code q #3 w 2 Tr}%
\hbox to0pt{\unhcopy\strokebox\hss}%
\special{pdf:code q 0 Tr}%縁なしに変更
\unhbox\strokebox
\special{pdf:code Q}%
\special{pdf:ecolor}%
}%
}  
\begin{document}
\stroketext{1 0 0 0}{0 1 0 0}{0.5}{test}%第3引数を0.25→0.5に変更
\end{document}

線つきの文字の上に、線なしの文字を重ね打ちしている。

水平ボックスに文字を保存して2回出力している。

線の内側半分は上に来た塗りで隠れてしまうから、 線の太さとして見せたい太さの倍の数値を入力しないといけない。