■
\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回出力している。
線の内側半分は上に来た塗りで隠れてしまうから、 線の太さとして見せたい太さの倍の数値を入力しないといけない。