*special 命令 [#headline] special 命令とは,DVI 標準ではサポートしていない,各 DVI ウェアの独自拡張機能を指示するための命令です。今日の LaTeX において普通に用いられている, -図形描画([[TikZ]],[[PSTricks]]など) -画像ファイルの取込([[graphicx]]) -ハイパーリンクの埋込([[hyperref]]) -用紙サイズ情報の記録([[geometry]]など) などの機能の実装には special 命令が使用されています。 ---- #contents ---- *special 命令の基本 [#basic] // 今の時代に「デバイス」が何を指すかという議論は避けたい。 **special 命令とは何か [#what-is] (旧来の)TeX 処理系は組版結果を DVI ファイルに出力します。この「DVI (device-independent) ファイル」というのは,その名称の通り,デバイス非依存な一種のページ記述言語で書かれています。 DVI ファイルは「“A”の文字を出力する」「参照点を右に 1pt 移動する」などの“DVI 命令”から構成されます。DVI 命令の意味は仕様で明確に決められているので,どの DVI ウェア(DVI ファイルを扱うソフトウェア)を用いても同じように解釈されます。 しかし,場合によっては,特定の DVI ウェアにおいて独自拡張の機能が使える方が便利なことがあります。例えば,DVI 標準では「色を付ける」「ハイパーリンクを置く」などの機能は規定されていません。((モノクロのプリンターで紙に印刷する場合にはこれらの機能は意味を持たないので,“デバイス非依存”を旨とする DVI 標準でサポートされないのは当然でしょう。))しかし PDF 文書形式ではこれらの機能が実現できます。となると,dvipdfmx のような「DVI を PDF に変換する」DVI ドライバを実装する場合には,そのような拡張機能を持たせたいというのは自然な要求です。 そこで,DVI 仕様では「仕様では意味を定めず,専ら独自拡張機能のために使う」ための特別な命令である「special 命令」を敢えて用意しています。つまり,標準の部分と独自拡張の部分を明確に分離する方針をとっているのです。 そして TeX 言語では,この「DVI の special 命令」を発行するための機能として,\special プリミティブが用意されています。 今日の LaTeX では,「色を付ける」機能は (x)color パッケージ,ハイパーリンクを作る機能は [[hyperref]] パッケージで提供されていますが,これらの機能の実装には special 命令(\special プリミティブ)が利用されています。 **DVI の special 命令 [#dvi-special] DVI の special 命令についての概略を把握するため,一つ例を挙げてみます。((special 命令を扱うのに,DVI 仕様の詳細についての理解は(一般には)不要です。)) Te\special{color Red}X この TeX 言語コード(の断片)をコンパイルすると,以下のような DVI 命令の列が生成されます。((ここで挙げたダンプ形式はここでの説明のためのアドホックなものです。実際に DVI ファイルを人間が読める形に“逆アセンブル”するには,dvitype や dv2dt などのツールを利用します。なお,dvitype では special 命令は“xxx”と表示されます。)) // DVIでのspecialの扱いの雰囲気を知らせるため,敢えてDVIコードを出す。 54 : setchar84 % 'T'を出力 91FF2AAA : right3 -54614 % カーニングの左移動 65 : setchar101 % 'e'を出力 EF09636F6C6F7220526564 : special1 9 'color Red' % special命令 58 : setchar88 % 'X'を出力 これから判るように,\special プリミティブに与えた引数の文字列は,TeX 処理系により解釈されることなく,そのまま DVI の special 命令の引数として書き出されています。つまり DVI 標準としては「“color Red”という拡張命令が発行された」という意味しか持っていません。ところが,dvips にとっては“color Red”という special 命令は「以降の文字の色を赤に変える」という意味を持っています。従って,上記の命令列を含む DVI ファイルを dvips で処理した場合は,文字“X”が赤色で出力される(ような PostScript ファイルが生成される)ことになります。 **TeX の \special プリミティブ [#tex-special] \special プリミティブは以下のような単純な書式を持ちます。((「暗黙の波括弧」などの些末な話は措いておきましょう。)) \special{<トークン列>} ここで引数のトークン列は \write プリミティブと同様に“文字列化”されます。つまり,完全展開した後に文字列化した結果が「DVI の special 命令の引数の文字列」となるわけです。 TeX 処理系は,\special{~} が実行((もちろん,\special プリミティブは展開可能ではありません。))されると,「“~”という special 命令を発行する」という情報を込めた特殊なオブジェクト(whatsit ノード)を現在の参照点に配置します。そして,そのオブジェクトを含むページが出力(shipout)された時に,そのページの DVI 命令列の中に実際に special 命令として現れることになります。 **special 命令の文字コード [#fda58d13] 先述の通り \special の引数のトークン列は「文字列化して DVI の special 命令の引数として書き出される」のですが,その際に文字コードの扱いは以下のようになっています。 -8 ビット欧文の TeX においては,文字とは実質バイトのことなので,引数のバイト列がそのまま DVI に書き出されます。 -(u)pTeX において,和文文字は,エンジンの内部漢字コードでエンコードされたバイト列として書き出されます。ソースファイルの漢字コードとは無関係であることに注意してください。欧文文字の扱いは欧文 TeX と同じです。 -XeTeX ((拡張 DVI ファイルに書き出す時の話です。なお,実用されることはまずないと思いますが,“DVI モードの LuaTeX”も XeTeX と同じ動作になります。))においては,文字列は常に UTF-8 でエンコードされたバイト列として書き出されます。やはりソースファイルの文字コードは無関係です。 **PDF 直接出力のときの \special プリミティブ [#j5504fc9] \special プリミティブは DVI の special 命令を出力するためのものです。従って,PDF 出力モードの pdfTeX や LuaTeX では無意味であるのでサポートされていません。(\special を実行すると警告が出て無視されます。) ※ただし例外として,引数が \special{pdf: <トークン列>} のように“pdf:”で始まっている場合は \pdfliteral{<トークン列>} と同等と解釈されます。((不幸なことに,dvipdfmx の独自の special 命令は「pdf:」で始まっており,この規定と衝突しています。そのため,この仕様は「dvipdfmx 用の TeX 文書を誤って pdfTeX でコンパイルした時に,エラーも傾向も出ずに壊れた PDF ファイルを出力してしまう」というトラブルの原因となってしまっています。)) XeTeX は表向きは PDF を直接出力しているように見えますが,実は内部ではいったん「XDV 形式」(DVI の拡張版)のファイルを出力してそれを xdvipdfmx(dvipdmx の拡張版)で PDF に変換する,という手順を踏んでいます。従って,XeTeX では dvipdfmx がサポートする special 命令が使用できます。また,XeTeX の拡張プリミティブが内部では special 命令により実現されていることもあります。 **ドライバ依存に関する注意 [#device-independent] そもそも special 命令は「特定の DVI ウェアの独自拡張命令」を表すためのものなので,当然,それを使った DVI ファイルはその特定の DVI ウェアで処理する必要があります。 例えば,先の例に挙げた \special{color Red} は dvips 用の special 命令なので,これを用いた DVI ファイルは dvips でないと正常に処理されない,ということです。 ただし,ある種類の special 命令が(互換性確保などの理由で)複数の DVI ウェアでサポートされている場合もあります。例えば,実は「color Red」という special 命令は dvipdfmx でもサポートされています。((さらに言うと,「color push Red」という形式の special 命令であれば dvips,dvipdfmx の他に dviout でもサポートされます。)) いずれにしても,\special プリミティブを含むコードを扱うときは,それが特定の DVI ウェアに依存することを常に念頭に置いておく必要があります。 ***LaTeX パッケージのドライバオプション [#driver-option] DVI 標準にない機能で,「複数の DVI ウェアでサポートされているが,それを実現する special 命令の書き方が異なる」という場合があります。例えば,「テキストを斜体変形する」という機能は dvips では次のような PostScript special 命令を使ったマクロで実現できます。 % slantbox{<傾き率>}{<テキスト>} \def\slantbox#1#2{\leavevmode\bgroup\setbox0\hbox{#2}% \special{ps: gsave currentpoint currentpoint translate [1 0 #1 neg 1 0 0] concat neg exch neg exch translate}% \hbox to0pt{\copy0\hss}% \special{ps: grestore}\kern\wd0\egroup} ところが,同じ機能について,dvipdfmx では次のように PDF special を使う必要があります。 % slantbox{<傾き率>}{<テキスト>} \def\slantbox#1#2{\leavevmode\bgroup\setbox0\hbox{#2}% \special{pdf:btrans 1 0 #1 1 0 0}\hbox to0pt{\copy0\hss}% \special{pdf:etrans}\kern\wd0\egroup} ここで,そのような機能を LaTeX パッケージ(“twslant パッケージ”)として提供したいとします。そういう場合は,graphicx パッケージなどと同様に,「文書作成者がドライバオプションを指定する」インタフェースを採用するのが通例です。 // tw- は "TeX Wiki" の略。 % twslant.sty \RequirePackage{ifpdf} \DeclareOption{dvips}{% dvipsの場合 \def\twslant@start#1{\special{ps: gsave currentpoint currentpoint translate [1 0 #1 neg 1 0 0] concat neg exch neg exch translate}}% \def\twslant@end{\special{ps: grestore}}} \DeclareOption{dvipdfmx}{% dvipdfmxの場合 \def\twslant@start#1{\special{pdf:btrans 1 0 #1 1 0 0}}% \def\twslant@end{\special{pdf:etrans}}} \DeclareOption{pdftex}{% pdfTeXの場合 \def\twslant@start#1{\pdfsave\pdfsetmatrix{1 0 #1 1}}% \def\twslant@end{\pdfrestore}} \ifpdf \ExecuteOption{pdftex}\fi % pdfTeXを自動判定する \ProcessOptions\relax % \slantbox{<傾き率>}{<テキスト>} \newcommand*\slantbox[2]{\leavevmode\bgroup\setbox\z@\hbox{#2}% \twslant@start{#1}\hb@xt@\z@{\copy\z@\hss}% \twslant@end\kern\wd\z@\egroup} この方式を採用しておくと,パッケージの使用者(文書作成者)は,「dvips を使う場合と dvipdfmx を使う場合で,ソースの記述が一か所しか異ならない」というメリットが得られます。 % ↓ドライバオプションを変えるだけでよい! \documentclass[a4paper,uplatex,dvips]{jsarticle} %... \usepackage{twslant} %... \begin{document} \slantbox{0.3}{※暫定版(2016-08-08)} %... \end{document} たとえ,一種類の DVI ウェアしかサポートしないという場合も,この方式を採用することにはメリットがあります。今日の習慣では,文書作成者がドライバオプションをグローバルオプションとして指定していることが期待できるので,サポート外の DVI ウェア(や TeX エンジン)が使われている場合に,適切なエラーを出すことができるのです。 % twxxx.sty \newif\iftwxxx@ok \twxxx@okfalse \DeclareOption{dvipdfmx}{\twxxx@oktrue} \DeclareOption{dvips}{\twxxx@okfalse} \DeclareOption{dviout}{\twxxx@okfalse} % pdfTeX とかの扱いも同様に... \iftwxxx@ok\else \PackageError{twxxx}{Not supported}\@ehc \fi // 一般のLaTeXユーザに対する注意をこの記事に書いてもあまり意味がなさそう。 // こうした拡張が進んだ結果,いまどきのユーザは各種の \special を(意図的にあるいは暗黙のうちに) 使うことによって「デバイス依存」な DVI ファイルを作りがちになっています。 // しかし,これらの \special 命令を用いて作成した DVI ファイルは,その命令を正しく解釈できるデバイスドライバ以外で正しく印刷することができないことに注意が必要です。 *主要な \special 命令 [#specials-set] ここでは重要な special 命令の使い方について解説します。 // 仕様の解説がメイン。 ※ special 命令の書式については,各開発者が勝手に決めているものなので,special の種類によって大きく異なっています。 **Papersize special [#papersize-specials] サポート: dvips,(x)dvipdfmx,dviout papersize=<横幅>,<縦幅> 命令があるページとそれ以降のページについて,出力の用紙サイズを指定します。<横幅> と <縦幅> には 210mm や 11in のような「TeX の単位付き数値」を指定します。 これはページ全体(または文書全体)に関わる設定なので,LaTeX では通常は \AtBeginDvi 命令などを用いて本文領域の外に配置されます。 \AtBeginDvi{\special{papersize=182mm,257mm}} % JIS B5で出力 ※mag指定が有効(1000 以外)な場合,papersize special で指定する長さは mag の影響を受けません。つまり “true 付”単位と同じ扱いになります。((210truemm などの“true 付”単位を明示的に指定することは(少なくとも dvips では)できません。ちなみに,同じ用途の pdf:pagesize special 命令では,true 付と true 無しの単位は本来の意味を持ちます。)) ※用紙サイズに関連するものとして他に landscape special(\special{landscape})がありますが,現在は非推奨となっています。特に landscape と papersize を同時に使用すべきではありません。 -参照: [[紙面サイズの指定 (1/2) - マクロツイーター:http://d.hatena.ne.jp/zrbabbler/20101123/1290541806]] **psfile special [#psfile-specials] サポート: dvips,(x)dvipdfmx,dviout psfile=<ファイル名> [hscale=<横拡大率>] [vscale=<縦拡大率> [angle=<回転角度>] [clip] [llx=<左下x>] [lly=<左下y>] [urx=<右上x>] [ury=<右上y>] [rhi=<幅>] [rwi=<高さ>] ([ ] は省略可能であることを示し。[ ] 自体は書かない。) EPS 画像ファイルを読み込みその場に配置します。 - “PSfile=...”と書いてもよい。 - clip は元画像のバウンディングボックス外の部分の描画を抑止する。 - <横拡大率>,<縦拡大率> は百分率の整数で指定。 - <回転角度> は度単位の整数で指定。 - <左下x>,<左下y>,<右上x>,<右上y> はバウンディングボックスの座標を表し,bp 単位の実数で指定。 - <幅>,<高さ> は挿入後の寸法を表し,これらは 0.1 bp 単位の実数で指定。 ※多くのドライバにおいて,graphicx パッケージの機能で EPS 画像を読み込む時には psfile special が用いられます。 ※かつては dvips 意外にも様々な「DVI→PS変換ソフト」が存在し,それぞれが異なる形式の EPS 画像読込の special をサポートしていました。dvips では,互換性のためこれらの一部(“epsfile=...”,“postscriptbox=...”)をサポートしています。 -参照: [[ナントカBoxの話(3) - マクロツイーター:http://d.hatena.ne.jp/zrbabbler/20140704/1404425429]] **color special [#color-specials] サポート: dvips,(x)dvipdfmx,dviout color <色指定> color push <色指定> color pop background <色指定> 色を指定します。元々は dvips で規定されたもので,他の DVI ウェアでも一部の規定がサポートされています。 “background <色指定>”は背景色を,“color <色指定>”は描画色を指定します。描画色は基本的には TeX の出力(テキストや罫)に対するものですが,通常は,PostScript や PDF の描画状態にも反映されます。 TeX の“局所的な代入”と同様の仕組の“局所的な色指定”の実装を容易にするため,“色スタック”が用意されています。“color push”と“color pop”はこの色スタックを操作するものです。色スタックが空でない場合は,そのトップにある色が実際の描画色となります。 -“Black”や“Red”などの,予め定義された名前。dvips では,単にその名前を実行するものと解釈されます。(“/Red {0 1 1 0 setcmykcolor} bind ref”のように定義されているわけです。) -色モデルとパラメタによる定義。以下のものがあります。dvips では,“rgb 0 0.5 0”を“0 0.5 0 TeXrgbcolor”のように解釈します。 --rgb <R> <G> <B> --hsb <H> <S> <B> --cmyk <C> <M> <Y> <K> --gray <G> -「" <PostScriptコード>」で任意の“色を設定するためのコード”が指定できます。 **PostScript special [#ps-specials] // FIXME サポート: dvips,(x)dvipdfmx,dviout [[PostScript]] の命令を直接 TeX ソース中に書き込むための special コマンドセットです。 PostScript specials を完全にサポートできるドライバの条件として,PostScript 命令をヘッダの内容と組み合わせて解釈できる(VTeX 等)か,組み合わせた PostScript 命令をその場で PostScript インタプリタに処理させられる(xdvipdfmx 等)か,あるいは PostScript を解釈せずに次の段階に受け渡す([[dvips]] 等)かが挙げられます。 [[PSTricks]] パッケージや psfrag パッケージで使われています。 [[dvipdfmx]] では PostScript specials による多彩な描画表現はサポートされていませんが,[[MetaPost]] をサポートするために簡単な命令のみ解釈できるようです。 試しに使ってみましょう。まず,以下のような TeX ファイル (test.tex) を用意します: \special{ps: gsave 0 0 moveto 100 0 lineto stroke grestore} \bye そして,TeX と dvipdfmx で処理します: tex test.tex dvipdfmx test.dvi 出来上がった PDF を見ると,直線が引かれているはずです。 -参考:[[なぜか dvipdfmx で PSTricks できる話:http://d.hatena.ne.jp/zrbabbler/20140712/1405179775]] **HyperTeX specials [#hypertex-specials] サポート: dvips,(x)dvipdfmx,dviout,xdvi html:<a href="URL"> html:<a name="アンカー名"> html:</a> html:<img src="URL"> html:<base href="URL"> HTML ライクな書式でハイパーリンクを設置します。 [[hyperref]] パッケージでは,ドライバ指定を hypertex にした場合に,ハイパーリンクを設定するのに HyperTeX special を利用します。[[dviout]] や [[xdvi]] でハイパーリンクを使いたい場合はこの方法が利用されます。 ※hypertex 以外のドライバ指定の時は hyperref は HyperTeX special を利用しません。例えば dvips ドライバでは PostScript special,dvipdfmx ドライバでは PDF special,pdftex ドライバでは \pdfliteral が使われます。 ※ “html:<img ...>”や“html:<base ...>”はほとんどサポートされていないようです。 -参考:[[HyperTeX]] **tpic specials [#tpic-specials] サポート: dvips,(x)dvipdfmx,dviout,xdvi <命令名> <引数> ... ※tpic special の命令名は英小文字 2 文字からなるのが特徴的です。例えば以下のようなものです。 pn 8 ar 140 0 42 42 0 3.142 簡単な図形描画の機能を実現するためのものです。描画プログラミング言語 pic を元にして作られています。eepic や [[Xy-pic]] などの LaTeX パッケージで利用されています。また,描画ソフトウェアで,TeX 向けのエクスポートで tpic special を用いるものがあります。 数多くの DVI ウェアでサポートされ,一時は「TeX での図形描画機能の標準」の座を占めてしましたが,pdfTeX エンジンが tpic special のサポートを行わなかったため,pdfTeX の使用が主流になるにつれて tpic special の利用は廃れてしまいました。現在では,TeX で図形描画の機能を実装する場合は,まずドライバ判定を行った上で,PostScript 出力の場合は PostScript コード,PDF 出力の場合は PDF 描画命令のコードを生成した上で出力中に(special 命令で)埋め込むという方法が一般的です。例えば pict2e や [[TikZ]] はこの方法を採っています。 -参考:[[tpic (pic)>pic#xda9ac26]] **Source special [#src-specials] サポート: dviout,xdvi src:<行番号> <ファイル名> 版面中の特定の位置に対応する TeX ソースの位置の情報を記録します。TeX ソースのエディタと DVI ビューアとの間で,相互に対応部分にジャンプすることを目的としたものです。[[dviout]] や [[xdvi]] などの DVI ビューアが対応しています。 一般的な special 命令は TeX ソース中の \special プリミティブにより出力されるものですが,source special は特別で,TeX エンジンのコマンドのオプションに -src-specials を指定することで,エンジンが自動的に DVI 文書の適当な箇所に special 命令を挿入するという動作を行います。 現在では DVI ファイルではなく PDF ファイルを利用したプレビューが一般的となったため,原理的に DVI ビューアでしかサポートできない source special に代わって,[[SyncTeX]] 機能が使われるようになっています。 **dvipdfmx の PDF special [#pdf-specials] サポート: (x)dvipdfmx dvipdfmx が独自にサポートしている special(「PDF special」と総称される)は以下の書式を持っています。 pdf:<名前> <引数> ... 引数の書式は命令により様々ですが,一般的に次のことがいえます。 -引数は空白区切りで指定する。 -値の表記に PDF 言語のリテラル形式を用いる。例えば “TeX”という文字列は (TeX) または <546558> のように書く。また配列 [...] や辞書 <<...>> を引数に取ることもある。 -ただし寸法値は TeX 言語と同様に 1.5cm や 20pt のように書く。 -なぜか知らないが命令の別名が多く存在する。例えば,“pdf:annotation”・“pdf:annotate”・“pdf:annot”・“pdf:ann”は全て同じ命令である。 ※ PDF special の書式表示の中で,[ ] 内は省略可能であることを示します。([ ] 自体は書きません。) ***PDF specialに関する資料 [#pdf-specials-info] // [Wic99] -Mark A. Wicks: DVIPDFM User's Manual. 1999. --元祖“DVIPDFM”のマニュアル。TeX Live では「texdoc dvipdfm」で開きます。 // [Cho09] -Jin-Hwan Cho: DVI specials for PDF generation. TUGboat, vol.30, no.1, 2009. --TeX Live に含まれていて,「texdoc dvipdfmx-special」で開きます。 // [Cho07] -Jin-Hwan Cho: Hacking DVI files: Birth of DVIasm. TUGboat, vol.28, no.2, 2007. *** PDF specialの一覧 [#pdf-specials-list] 括弧内に別名を示します。 // 代表名は次の順で決めた。 // 1. [Cho09][Cho07]で使われているもの // 2. dvipdfmxの実装の関数名で使われているもの // Wic99§4.1-4.3; Cho09§3 -pdf:ann (annotation, annotate, annot) -pdf:bann (bannot, beginann) -pdf:eann (eannot, endann) // Wic99§4.4-4.6 -pdf:link -pdf:nolink -pdf:dest (destination) // Wic99§4.7-4.8 -pdf:docinfo -pdf:docview -pdf:names // Wic99§4.9,4.12; Cho09§2 -pdf:obj (object) -pdf:stream -pdf:fstream -pdf:put -pdf:close // Wic99§4.10; Cho09§4 -pdf:out (outline) // Wic99§4.11 -pdf:pagesize // Wic99§4.13 -pdf:bead (thread) -pdf:article (art) // Wic99§5,8; Cho09§5 XObjects -pdf:image (img, epdf) -pdf:bxobj (bform, beginxobj) -pdf:exobj (eform, endxobj) -pdf:uxobj (usexobj) // Wic99§6 -pdf:btrans (begintransform, begintrans, bt) -pdf:etrans (endtransform, endtrans, et) // Wic99§7 -pdf:bcolor (begincolor, bc, begingray, bgray, bg) -pdf:scolor (setcolor, sc) -pdf:ecolor (endcolor, ec, endgray, egray, eg) -pdf:bgcolor (bgc, bbc, bbg) // Wic99§9; Cho09§6 -pdf:content -pdf:bcontent -pdf:econtent -pdf:literal -pdf:code -pdf:bop -pdf:eop // その他大勢 -pdf:mapline -pdf:mapfile -pdf:minorversion -pdf:encrypt -pdf:tounicode ***pdf:minorversion [#pdf-minorversion] pdf:minorversion <整数> 出力 PDF 文書のマイナーバージョン(1.x の x の部分)を指定します。指定可能な値の範囲は 3~7 です。pdfTeX の \pdfminorversion に相当するものです。 ***pdf:pagesize [#pdf-pagesize] pdf:pagesize [width <横幅(寸法)>] [height <縦幅(寸法)>] [xoffset <横オフセット(寸法)>] [yoffset <縦オフセット(寸法)>] 出力用の用紙に関する設定です。<横幅> と <縦幅> は用紙サイズを設定するもので,pdfTeX の \pdfpagewidth/height に相当します。<横オフセット> と <縦オフセット> は DVI 座標の原点の位置((「例の 1 インチ」のオフセットのことです。))を定めるもので,pdfTeX の \pdfxorigin/yorigin に相当するものです。 ※papersize special と異なり,パラメタの寸法値には“true付き”と“true無し”のどちらの単位も指定可能で,それは本来の意味を保ちます。 ***pdf:tounicode [#pdf-tounicode] pdf:tounicode <CMap名(名前)> PDF special 中の特定の引数の文字列(主に PDF の文書情報を表す文字列)について,文字コード変換を指示します。専ら,(u)pTeX エンジンを利用する場合に利用されます。 PDF の文書情報の Unicode 文字列は UTF-16BE で符号化されたバイト列で与える必要がありますが,(u)pTeX が出力する special 命令の文字列は“エンジンの内部漢字コード”(SJIS,EUC,UTF-8 の何れか)で符号化されているため,正常に解釈させるためには文字コード変換が必要になります。 *special 命令を利用した TeX コードの例 [#specials-dvipdfmx] // こちらは実例を紹介する。 ここでは,DVI 標準の範囲ではできない様々な機能について,実際に special 命令を利用して実装した例を紹介します。 **ページ設定(用紙サイズなど) [#specials-dvipdfmx-pagesettings] // FIXME サポート: dvips,(x)dvipdfmx,dviout landscape や papersize などの文書全体に影響するものは PDF への変換前にスキャンされ実行されます。 \special{landscape} は用紙を横置きに, \special{papersize=210mm,297mm} は用紙サイズを 210mm × 297mm に設定します。 pagesize は文書の途中でも使えますが,これが実行されるタイミングによっては予期せぬ結果となります。 特にページがシャッフルされる時は意図したようにはなりません。 \special{pdf:pagesize width 210mm height 297mm} のように使います。 [[jsclasses]] の papersize オプションは,DVI ファイルに papersize special を挿入することで用紙サイズを規定しています。 **ファイルを添付 [#specials-dvipdfmx-annotate] サポート: (x)dvipdfmx PDFのアノーテーション(注釈)機能を利用してファイルを添付します。 \special{pdf:fstream @fileobj (ファイル名をここに)}% \special{pdf:ann width 5bp height 10bp << /Type /Annot /Subtype /FileAttachment /FS << /Type /Filespec /F (ファイル名をここに) /EF << /F @fileobj >> >> /Name /Paperclip /C [0.8 0.4 0.4] /T (タイトルをここに) >> }% 上の例ではまず最初の pdf:fstream special で外部ファイルを取り込み,それを fileobj と名付けます。 次の pdf:ann special で "添付ファイル" アノーテーションを作ります。 出来上がった PDF には小さなクリップが表示され,その上で右クリックするとメニューから添付ファイルを保存できるようになるはずです(ビューアによって操作は異なります)。 このようにして TeX のソースを埋め込んでおくこともできます。 **XMP メタデータ [#c01ffb78] サポート: (x)dvipdfmx XMP メタデータは PDF など様々なファイルに添付できる XML 形式のメタデータです。 これも pdf:fstream を使います。 例えば,test.xmp というファイル名で XMP メタデータを用意したとすると,以下のコードでそれを添付できます。 \special{pdf:fstream @xmp (test.xmp) << /Type /Metadata /Subtype /XML >> } \special{pdf:put @catalog << /Metadata @xmp >>} (現在のところメタデータは圧縮されます) **PDF に描画・透かしを入れる [#specials-dvipdfmx-drawing] サポート: (x)dvipdfmx pdf:bop 命令を使用すると,ページの開始時に任意の PDF 描画コードを挿入することができます: \special{pdf:bop 0.4 0.4 0.6 rg 0 0 596 842 re 72 72 452 700 re f*} これは余白の部分を塗りつぶします。 ウォーターマーク(透かし)風のものを入れます:~ (bophook パッケージが必要です) \documentclass{article} \usepackage{bophook} \AtBeginDocument{ \special{pdf:obj @Courier-Bold << /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >> } \special{pdf:bop BT 1 Tr /_Fn01 200 Tf 0.707 0.707 -0.707 0.707 72 216 Tm (Sample) Tj ET} } \AtBeginPage{ \special{pdf:put @resources << /Font << /_Fn01 @Courier-Bold >> >>} } \begin{document} Hello, world. \end{document} やや複雑な例です。 pdf:obj はオブジェクトを定義する命令でここでは Courier-Bold というフォントを定義しています。 次の pdf:bop ではページの開始時に "Sample" という文字列を描画するように指示しています。 pdf:put の部分では resources で識別される辞書オブジェクト(ここではページリソース)に与えられたオブジェクトを追加します。 ここではフォントリソースに先ほど定義したフォント Courier-Bold を "_Fn01" という名前で登録しています。 上の例ではページに直接 Sample という文字を書き込みましたが,アノーテーションを使ってウォーターマークを入れることもできます。 **描画物を切り取り貼り付ける [#jc3fc76f] サポート: (x)dvipdfmx pdf:bxobj/exobj と pdf:uxobj はユニークな機能を提供します。 \special{pdf:bxobj @myform width 100pt height 0pt depth 10pt}% Hello World! \special{pdf:exobj}% \special{pdf:uxobj @myform} \special{pdf:bt rotate -10}\special{pdf:uxobj @myform}\special{pdf:et} \special{pdf:bt rotate -20}\special{pdf:uxobj @myform}\special{pdf:et} \special{pdf:bt rotate -30}\special{pdf:uxobj @myform}\special{pdf:et} \bye TeX の出力結果 "Hello World!" を切り取り,uxobj で貼り付けます。 一度切り取り保存したオブジェクトは何度も再利用できます。 *関連リンク [#links] -[[dvipdfmx(谷村さん):http://www2.hyo-med.ac.jp/~tanimura/LaTeX/dvipdfmx.html]]:dvipdfm/dvipdfmx 用の \special の様々な使用例