Illustrator は,アドビシステムズが販売するベクター画像編集ソフトウェア(ドローソフト)です。 ここでは,TeX や LaTeX と関連づけた利用法を説明します。
最終的に PDF で出力するならば,Adobe Illustrator Artwork (拡張子 “.ai”)のままで OK です。 TeX Live 2016 以降, W32TeX では dvipdfmx で Adobe Illustrator Artwork (拡張子 “.ai”)がサポートされています。
なお Adobe Illustrator の Artwork (拡張子 “.ai”)と同 PDF (拡張子 “.pdf”)ファイル(両者は実質的に同等)は,EPS 仕様型の bounding box 情報(描かれている図形ぴったりの矩形サイズの値)が内部に書き込まれています。 TeX文書内への図の挿入は EPS ファイルの場合と同様に処理されます(LaTeX入門/図表も参照のこと)。
例(hoge.ai を挿入):
bounding box 情報に CropBox を指定する場合は
%%% -*- mode: yatex; Coding: utf-8; Encoding: UTF-8 -*- \documentclass[uplatex]{jsarticle} \usepackage[dvipdfmx]{graphicx} \begin{document} \includegraphics[pagebox=cropbox]{hoge.ai} \end{document}
bounding box 情報に ArtBox を指定する場合は
%%% -*- mode: yatex; Coding: utf-8; Encoding: UTF-8 -*- \documentclass[uplatex]{jsarticle} \usepackage[dvipdfmx]{graphicx} \begin{document} \includegraphics[pagebox=artbox]{hoge.ai} \end{document}
Illustrator で EPS 保存したものを LaTeX に挿入する例:
%%% -*- mode: yatex; Coding: utf-8; Encoding: UTF-8 -*- \documentclass[uplatex]{jsarticle} \usepackage[dvips]{graphicx} \begin{document} \includegraphics[width=50mm,clip]{hoge.eps} \end{document}
Illustrator で保存時の注意:
不正な EPS は, Tomas Rokicki の Illustrator 7.0/8.0/9.0 BeginData Bug から “fixill.pl” を頂いてきて直す。 次のようにして使う。
$ fixill.pl <old.eps >new.eps
“fixill.pl” は Perl スクリプトであり,実行には Perl が必要。 W32TeX なら Strawberry Perl をダウンロードしてインストールすればいいであろう。 W32TeX の “dvipsk-w32.tar.xz” には “fixill.pl” と “fixill.exe” が含まれる。
>fixill.exe <old.eps >new.eps
Illustrator CC から EPS 形式で保存するときは, バージョンは最新のもの(「Illustrator CC EPS」)でかまいません. 「CMYK PostScript を RGB ファイルに含む」チェックボックスをオンにして Adobe PostScript を レベル 2 に設定します. プレビューやサムネールは TeX では不要ですが,他のアプリケーションに埋め込む際にはプレビューがあったほうが便利です. Word などに埋め込む際には,プレビューフォーマットのラジオボタンは必ず「不透明」にします.
「他のアプリケーション用にフォントを埋め込む」チェックボックスはオンにしないと文字化けします. あるいは,逆にこれをオフにして,フォント名をエディタなどで標準的なものに置き換えるという手もあります. たとえば Illustrator CC に附いている小塚明朝 Pr6N M を使った場合,KozMinPr6N-Medium-UniJIS-UTF16-H を Ryumin-Light-UniJIS-UTF16-H に置き換えます.
TeXの数式をDTPソフトにの方法をできる限り楽にするために書いたスクリプトです. フォントをそのまま使うとqa:27936 にあるように問題が生じるので,アウトラインをとって貼り付けます. Illustrator CC のほかに,LaTeX と dvips, Ghostscript が必要です. 和文も処理したい場合は,upLaTeX と dvips, Ghostscript が 使える環境を用意してください. 以下の内容はすべて和文も処理することを前提にしたものです.
Illustrator にさせている仕事は
の3つです. TeX 関係のなんらかの処理を変えたい時はini.tex と makeEPS.bat を書き換えれば充分で, 使用する上ではIllustrator Javascript に関する特別な知識は要らないはずです.
Illustrator 上でのjavascript に関するマニュアルはインストールCD中にあります (CSの場合、Adobe テクニカル情報/Illustrator CS/Scripting/Documentation).
eq.tex -> eq.dvi -> eq.eps -> outline.eps という処理を行うフォルダを用意します. 以下では説明の便宜上"C:\AI\" を作ったことにして説明します. 別の場所に作る場合は,makeEPS.bat および TeX(&T).js を適宜書き換えてください.
eq.tex の雛形になるテキストファイルです.テキストドキュメントを新規作成し, 以下の内容を書き込んでini.texという名前で作業用フォルダの作成で 作成したフォルダに保存します.
\documentclass[uplatex,12pt]{jsarticle} \pagestyle{empty} \usepackage{% amsmath,% amssymb,% bm% } \begin{document} <r> \end{document}
eq.tex -> eq.dvi -> eq.eps -> outline.eps という処理を行うバッチファイルです. テキストドキュメントを新規作成し,以下の内容を書き込んでMakeEPS.batという名前で 作業フォルダの作成で作成したフォルダに保存します. 冒頭の「cd /d C:\AI\」では,作業フォルダの作成に移動しています. 別の場所に作業フォルダを作った場合は適宜書き換えてください.
cd /d C:\AI\ uplatex -no-guess-input-enc -kanji=utf8 eq dvips -Pdl -E eq -o eq.eps rungs -q -sDEVICE=eps2write -r19200 -dNOPAUSE -dBATCH -dSAFER -dEPSCrop -sOutputFile=outline.eps eq.eps
Illustrator CC で作業中に呼び出すことになるスクリプトです. テキストドキュメントを新規作成して,以下の内容を書き込んでTeX(&T).js という名前で"C:\Program Files\Adobe\Adobe Illustrator CC (64 Bit)\Presets\ja_JP\スクリプト\" に保存します.なお,"C:\Program Files..." はIllustrator をデフォルトの設定でインストールした場合です."Adobe Illustrator CC (64 Bit)\Presets\ja_JP\スクリプト\"に保存すれば,スクリプトを呼び出すときに便利です.
第一行目の「AI = "/C/AI/";」は,作業フォルダの作成で作成したフォルダ名を指定しています.例えば,作業フォルダが"D:\hoge\test\" なら,「AI = "/D/hoge/test/"」のように書き換えてください.
var AI = "/C/AI/"; var d_document = false;//true→本文環境 false→数式環境 var o_document = "%d";//数式環境の補完を切り替えるオプション var d_keep = false;//true→テキストを残す false→残さない var o_keep = "%k";//テキストを残すか否かを切り替えるオプション var environment = "align*";//補完する際に使う数式環境 var CR = String.fromCharCode(13);
var selectObj = app.activeDocument.selection;
main(selectObj);
function main(pis){ if (pis.length == 0) return; for (i=0;i<pis.length;i++){ if (pis[i].textRange != undefined) Tex(pis[i]); else if (pis[i].uRL != undefined && pis[i].uRL != "") pasteTxt(pis[i]); } }
function pasteTxt(pi){ textObj = app.activeDocument.activeLayer.textFrames.add(); textObj.contents = pi.uRL; textObj.left = pi.left + pi.width/2 - textObj.width/2; textObj.top = pi.top - pi.height - 5; return; }
function Tex(pi){ equation = pi.textRange.contents; if (equation.indexOf(o_document) != -1) d_document = !d_document; if (equation.indexOf(o_keep)!=-1) d_keep = !d_keep; if (d_keep){ d = 0; dy = -pi.height-5; } else { d = 1; dy = -pi.height/2; } if (!d_document) equation = "\\begin{"+environment+"}"+CR+equation+CR+"\\end{"+environment+"}"; if (!ReplaceTextDoc(AI+"ini.tex",AI+"eq.tex","<r>",equation)) return; if (!Exe(AI+"MakeEPS.bat")) return; if (confirm("描画しますか?")){ if (ImportImg(AI+"outline.eps","eq",pi.textRange.contents,pi.left+pi.width/2,pi.top+dy,d) && !d_keep ) pi.remove(); } }
function MakeTextDoc(filepath,txt){ FileObj = new File (filepath); flag = FileObj.open ("w"); if(!flag){ alert(filepath+"を読めません"); return false; } FileObj.writeln(txt); if(!FileObj.close()) return false; return true; }
function ReplaceTextDoc(readfilepath,writefilepath,regexp,newString){ readFileObj = new File(readfilepath); rflag = readFileObj.open ("r"); if (!rflag){ alert(readfilepath+"を読めません"); return false; } readtext = readFileObj.read(); readFileObj.close();
replacedtext = readtext.replace(regexp,newString); return MakeTextDoc(writefilepath,replacedtext); }
function Exe(filepath){ fileObj = new File(filepath); if (!fileObj.exists){ alert(filepath+"が見つかりません"); return false; } fileObj.execute(); return true; }
function ImportImg(filepath,objName,savedText,x,y,d){ fileObj = new File (filepath); if (!fileObj.exists){ alert(filepath+"が見つかりません"); return false; } placedImg = app.activeDocument.activeLayer.groupItems.createFromFile(fileObj); with(placedImg){ name = objName; left = x - placedImg.width/2; top = y + d*placedImg.height/2; uRL = savedText; } return true ; }
Illustrator を起動してください. TeX(&T).js を"C:\Program Files\Adobe\Adobe Illustrator CC (64 Bit)\Presets\ja_JP\スクリプト\" に保存してあれば,[ファイル]→[スクリプト]とたどれば"TeX(T)" があるはずです. なお,別の場所に保存した場合は,[ファイル]→[スクリプト]の末尾にある[参照]からTeX(&T).js を指定する必要があります. 新規ドキュメントを作成し,テキストツールを使って,例えば次の内容のテキストアイテムを作ります. (テキストツールを使わずに,以下をコピーして,Illustrator 上で貼り付けを行っても問題ありません.)
&\int_{-\infty}^{\infty}\!\!\!\delta(x-\alpha)f(x)\mathrm{d}x=f(\alpha)\\ &A = \begin{pmatrix} a_{11} & \ldots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{m1} & \ldots & a_{mn} \end{pmatrix}
テキストアイテムのフレームを選択した状態で,[ファイル]→[スクリプト]→[TeX(T)]を選択し,cmd.exe が終了した後, "描画しますか?" という確認メッセージに「はい」と答えればテキストオブジェクトが数式に置換されます. なお,[Alt+F]→[R]→[T]でスクリプトを実行することも可能です.
置換したくない場合は数式の最後に"%k" を付けてください( 上の例では"...\end{pmatrix}" を"...\end{pmatrix}%k" とする ). テキストの真下に数式が配置されます. また,複数のテキストを選択した状態でスクリプトを実行すれば, 選択されているすべてのテキストに対して順に処理を行います.
数式を選択した状態で同じスクリプトを実行すると,テキストを復活させることができます.
標準では,テキストオブジェクトの内容に
\begin{align*}
\end{align*}
を補完してeq.tex を書き出す(ini.tex 内の<r> と置換する)仕様です. この補完をさせないためには,テキストオブジェクトの末尾に"%d" をつけてください. 例えば,
Suppose $\hat{A}$ is any linear operator on a Hilbert space, $V$. There exists a unique linear operator $\hat{A}^\dagger$ on $V$ such that....
という内容のテキストオブジェクトに対してスクリプトを実行すると
\begin{document} \begin{align*} Suppose $\hat{A}$ is any linear operator on a Hilbert space, $V$. There exists a unique linear operator $\hat{A}^\dagger$ on $V$ such that.... \end{align*} \end{document}
を処理したことになってしまうのでエラーが出てしまい,うまくいきませんが,
Suppose $\hat{A}$ is any linear operator on a Hilbert space, $V$. There exists a unique linear operator $\hat{A}^\dagger$ on $V$ such that....%d
なら
\begin{document} Suppose $\hat{A}$ is any linear operator on a Hilbert space, $V$. There exists a unique linear operator $\hat{A}^\dagger$ on $V$ such that....%d \end{document}
となるので問題なく処理できます.
また,補完される数式環境はデフォルトでは"align*" ですが, これはスクリプトの第6行目
var environment = "align*";//補完する際に使う数式環境
で指定されています.別の環境が良い場合は,ここを適当に書き換えてください.
Illustrator CS で CM フォントの数式が変になる qa:27936, qa:27942 のスレッド(未解決)。
【参考情報】
情報等