[TeX関連] WhizzyTeX for Vim
WhizzyTeX を Vim から呼び出すためのスクリプトを書きました.
まだまともに動かない可能性が大です.
本来は Beamer で使うために作ったのですが... フォーマットを行って .fmt ファイルを生成してから .dvi を生成した場合,\special コマンドの内容がどうも反映されず,私の技量ではどうにもできなかったため,Beamer 使用時はファイル全体をタイプセットするようにしています.
[TeX関連] Beamer + iniptex の怪
Beamer というプレゼンテーション用文書を作成するためのスタイルファイルを使ってプレゼン資料を書いてみようと思い,Vim を使いつつ Whizzytex のようにプレビューしながら表示するためのシェルスクリプトを書くことにしました.
prosper と Powerdot スタイルに対応したスクリプトは既にありますが (これらはまだ配布していません),Beamer に対してはそのままでは使えないようです.
調べてみると,iniptex で取得したフォーマットを使ってタイプセットした結果の DVI ファイルが正しくない様子です.調べるための実験に用意した LaTeX ソースは以下の通り.ここではこのファイルを仮に test.tex とします.
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{hoge}
text
\begin{itemize}
\item 1
\item 2
\item 3
\begin{itemize}
\item 3-1
\item 3-2
\item 3-3
\end{itemize}
\end{itemize}
\end{frame}
\end{document}
これを platex を用いて普通にタイプセットすると DVI ファイルが生成されます.
% platex test.tex This is pTeX, Version 3.14159-p3.1.5 (euc) (Web2C 7.4.5) (./test.tex pLaTeX2e <2005/01/04>+0 (based on LaTeX2e <2001/06/01> patch level 0) (/usr/share/texmf/tex/latex/beamer/base/beamer.cls (/usr/share/texmf/tex/latex/beamer/base/beamerbasercs.sty) Document Class: beamer 2004/10/07 release version 3.00 A class for typesetting presentations (rcs-revision 1.54) (中略) LaTeX Font Warning: Font shape `OT1/cmss/m/n' in size <4> not available (Font) size <5> substituted on input line 37. [1] (./test.aux) LaTeX Font Warning: Size substitutions with differences (Font) up to 1.0pt have occurred. ) Output written on test.dvi (1 page, 9180 bytes). Transcript written on test.log. %
次に,iniptex を使ってフォーマットを行い,そこで得たフォーマットを使ってタイプセットします.ここでは,この一連の処理を「2 段階タイプセット」と呼ぶことにします.では,まず最初にフォーマットを行います.フォーマットを行うためには,元のソースからプリアンブルだけを抜き出し,最後に \dump コマンドの呼び出しを書いたソースを initex で処理するだけです.変更したソースファイルは以下の通り.実にシンプルです.ここではこのファイルを test2.tex とします.
\documentclass{beamer}
\dump
これを iniptex で処理します.以下の例では iniptex の代わりに platex -ini を使用しています.
% platex -ini '&platex' test2.tex This is pTeX, Version 3.14159-p3.1.5 (euc) (Web2C 7.4.5) (INITEX) (./test2.tex pLaTeX2e <2005/01/04>+0 (based on LaTeX2e <2001/06/01> patch level 0) (/usr/share/texmf/tex/latex/beamer/base/beamer.cls (/usr/share/texmf/tex/latex/beamer/base/beamerbasercs.sty) Document Class: beamer 2004/10/07 release version 3.00 A class for typesetting presentations (rcs-revision 1.54) (中略) Beginning to dump on file test2.fmt (format=test2 2007.2.24) 10634 strings of total length 163209 182871 memory locations dumped; current usage is 332&178411 9232 multiletter control sequences (中略) No pages of output. Transcript written on test2.log. %
フォーマットが終わったので,得られたフォーマットファイルを使って本文だけのソース(test3.tex, 中身は省略)をタイプセットします.
% platex '&test3' test3.tex This is pTeX, Version 3.14159-p3.1.5 (euc) (Web2C 7.4.5) (./test3.tex pLaTeX2e <2005/01/04>+0 (based on LaTeX2e <2001/06/01> patch level 0) No file test3.aux. (/usr/share/texmf/tex/latex/hyperref/nameref.sty) No file test3.nav. (/usr/share/texmf/tex/latex/amsfonts/umsa.fd) (/usr/share/texmf/tex/latex/amsfonts/umsb.fd) LaTeX Font Warning: Font shape `OT1/cmss/m/n' in size <4> not available (Font) size <5> substituted on input line 32. [1] (./test3.aux) LaTeX Font Warning: Size substitutions with differences (Font) up to 1.0pt have occurred. ) Output written on test3.dvi (1 page, 4112 bytes). Transcript written on test3.log. %
続いて,得られたそれぞれの DVI ファイルを dvips(k) を使って PostScript に変換し,ESP GhostScript 7.07 でレンダリングしてみます.その結果,2 段階でタイプセットした方はレンダリングに失敗します.
% dvips test.dvi This is dvips(k) 5.92b p1.6a Copyright 2004 ASCII Corp.(www-ptex@ascii.co.jp) based on dvips(k) 5.92b Copyright 2002 Radical Eye Software (www.radicaleye.com) ' TeX output 2007.02.24:1837' -> test.ps <texc.pro><special.pro><color.pro>. [1] % gs -sDEVICE=x11 -dSAFER -dBATCH -dNOPAUSE -q test.ps ←正常に表示 % dvips test3.dvi This is dvips(k) 5.92b p1.6a Copyright 2004 ASCII Corp.(www-ptex@ascii.co.jp) based on dvips(k) 5.92b Copyright 2002 Radical Eye Software (www.radicaleye.com) ' TeX output 2007.02.24:1856' -> test3.ps <texc.pro><special.pro><color.pro>. [1] % gs -sDEVICE=x11 -dSAFER -dBATCH -dNOPAUSE -q test3.ps Error: /undefined in pgfo ←エラー Operand stack: Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1 3 %oparray_pop 1 3 %oparray_pop 1 3 %oparray_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- Dictionary stack: --dict:1050/1417(ro)(G)-- --dict:0/20(G)-- --dict:69/200(L)-- --dict:195/300(L)-- Current allocation mode is local Current file position is 17348 ESP Ghostscript 7.07.1: Unrecoverable error, exit code 1
最初にこのエラーに遭遇したときは,なんでやねん,と思わずツッコんでしまいました.2 段階タイプセットしても同じ DVI ファイルが得られると思っていたからです.
両方の PostScript ファイルを見比べると,確かに 2 段階タイプセットした方には pgfo の定義がありません.いずれの場合でも,prosper や Powerdot を用いた場合は PostScript ファイルに pgfo の定義が含まれていないので,Beamer 固有の問題と考えているわけですが,これはどうやって解決すればよいのか...
考えている解決策は次の 2 通り.
- Beamer 使用時は 2 段階タイプセットを行わない.
- 2 段階タイプセットを行った上で,pgfo およびその他の必要な定義をシェルスクリプト側で自動的に PostScript ファイルに書き加える.
上の 2 つはどちらもかなり安直ですから,今はもう少し pgfo について調べてみることにします.
[TeX関連] コマンドあるいはマクロが定義されているかを判別する LaTeX マクロ
あるコマンドを \renewcommand しようとして,既に定義されていれば \renewcommand, 未定義なら \newcommand を使うようにしたかったので調べると,\@ifundefined マクロがありました.使用例は以下の通り.この例では,jsarticle や jsbook で定義されている \figurename, \tablename, \appendixname の内容を変更しています.\@ifundefined がアットマークを含むので,これらをプリアンブルに書く場合は \makeatletter, \makeatother で囲む必要があります.
\@ifundefined{figurename}{\newcommand{\figurename}{図}}{\renewcommand{\figurename}{図}} \@ifundefined{tablename}{\newcommand{\tablename}{表}}{\renewcommand{\tablename}{表}} \@ifundefined{appendixname}{\newcommand{\appendixname}{付録}}{\renewcommand{\appendixname}{付録}}
[TeX関連] スタイルもしくはパッケージがロードされているかを判別する LaTeX マクロ
例えば,jsarticle がロードされているかどうかを判別する \ifjsarticle を作るには,こんな感じ.
\newif\ifjsarticle \@ifclassloaded{jsarticle}{\jsarticletrue}{\jsarticlefalse}
上の例はドキュメントクラスの場合ですが,パッケージの場合にも可能で,その場合は以下の通り.
\newif\ifgraphicx \@ifpackageloaded{graphicx}{\graphicxtrue}{\graphicxfalse}
アットマークを含むコマンド(\@ifpackageloaded)を使用しているので,プリアンブルに書く場合は \makeatletter, \makeatother で囲んでください.
[TeX関連] powerdot を使ってみる
今までプレゼンテーション用スライドを LaTeX を使って作成するために prosper を用いていましたが,私が新しい発表用のスライドを作るにあたって,それに改良を重ねた powerdot というものを試してみることにしました.
まずは CTAN からダウンロードして,適当な場所に展開します.
(/path/to/powerdot.zip に powerdot のアーカイブファイルがあると仮定) % cd ~/.texmf/tex/latex/ % unzip /path/to/powerdot.zip
これで ~/.texmf/tex/latex/powerdot 以下に powerdot のスタイルファイルと,スタイルファイルのソースファイル,およびドキュメントが展開されます.私はドキュメントとソースファイルは消しました.
なお,~/.texmf 以下に自分専用の LaTeX 関連ファイルを置く方法についてはユーザ専用の TeX 環境を独自に構築を参照してください.
powerdot を使用するためには,いくつかの依存スタイルファイルをインストールもしくはアップグレードする必要があります.
私の場合,xcolor は Gentoo の portage にありましたので,そちらを使用しました.
% sudo emerge xcolor
後で調べると,xkeyval も portage にあったのですが,当時は気づかず,CTAN のファイルをそのまま手動でインストールしました.今もそのままです.
さて,何か作ってみることにします.試しに以下のものを書いてみました.
\documentclass[size=14pt,orient=landscape,paper=screen,mode=present,display=slides,style=sailor,hlentries,hlsections,fleqn]{powerdot} \renewcommand{\kanjifamilydefault}{gt} \title{タイトル} \author{pakuchan} \date{September 10, 2006} \renewcommand{\baselinestretch}{1.3} \begin{document} \maketitle \begin{slide}{最初} \begin{itemize} \item 1st. \pause \item 2nd. \pause \item 3rd. \pause \end{itemize} \end{slide} \begin{slide}{次} \begin{itemize}[type=1] \item 1st. \pause \item 2nd. \pause \item 3rd. \pause \end{itemize} \end{slide} \end{document}
documentclass のオプション部については,powerdot のドキュメントを参照してください.
タイプセットは prosper の時と同様です.
% platex test.tex (中略) % dvips -z -f test.dvi (中略) % gs -sPAPERSIZE=a4 -dCompatibilityLevel=1.4 -dNOKANJI -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "-sOutputFile=test.pdf" -c '.setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Ryumin-Light /GothicBBB-Medium]>> setdistillerparams' -f test.ps *** unembeddable CIDFont: /GothicBBB-Medium %
gs に渡すオプションがやたら長いのは,フォント埋め込みをしないようにするためです (私が使っている gs には,taiji さん作成のパッチを適用しています).
ここまでで,prosper の時から変わったと感じたのは... オーバーレイされたスライドを作る際に \overlays を書かなくてよくなったこと (\pause を書くだけでよくなった) と,dvips に用紙サイズのオプションを渡さなくてよくなったことでしょうか.
できあがった PDF ファイルを Adobe Reader 7.0.8 で開いてみると... 結構 prosper との違いがわかります.以下に 3 枚のサンプル画像を示します.
左端にナビゲーション用とおぼしき見出しが並んでいることと,type=1 とした itemize 部分のうち,一部が淡色表示されるようになったことでしょうか.見出しはハイパーリンクになっているので,Adobe Reader 上でクリック等のアクションを起こすことで,そのページにジャンプすることができました.
良さそうなので,今回のプレゼンテーションスライドは powerdot で作ってみます.
[TeX関連] movie15
LaTeX で作成した PDF に動画や音声を埋め込む方法があったようなので,覚え書きをここに残しておきます.
\documentclass[landscape, final, colorBG, pdf, dvips, total, slideColor, fyma]{prosper} \usepackage{movie15} \usepackage{hyperref} \usepackage{graphicx} \begin{document} \begin{slide}{test of movie15} \includemovie[text={\rule[-42.33mm]{80.00mm}{60.00mm}}]{80.00mm}{60.00mm}{C30.mpg} \end{slide} \end{document}
上記 LaTeX ソースファイルをタイプセットし,生成された DVI ファイルを dvips(k) + ps2pdf で PDF に変換して完了です.
Adobe Reader 7.0 for Windows で再生できました.
[TeX関連] ユーザ専用の TeX 環境を独自に構築
Linux 上の TeX 環境で多書体を扱う方法ではみかちゃんを使用する方法について丁寧に書かれています.このようなカスタマイズの手順は大抵の場合,/usr/share/texmf 以下を直接書き換えていますが,共用のマシンなどを利用していて書き換えられない場合もあるでしょう.
そんな時は,環境変数を操作して独自の TeX 環境を構築することができます.例えば以下のように.
export TEXINPUTS=".:$HOME/.texmf//:" export CMAPINPUTS=".:/usr/share/ghostscript/Resource/CMap" export TTFONTS=".:$HOME/.texmf/fonts/truetype//:" export VFFONTS=".:$HOME/.texmf/fonts/vf//:" export TFMFONTS=".:$HOME/.texmf/fonts/tfm//:" export DVIPDFMINPUTS=".:$HOME/.texmf/{dvipdfm,dvips}//:"
このような記述を .bashrc 等に書いておくと,/usr/share/texmf/ 以下ではなく ~/.texmf 以下に各種ファイルを配置することができます.
環境変数の末尾にコロンを付けているのは,/usr/share/texmf/web2c/texmf.cnf のデフォルト値が後に続いていることを示すためです.コロンがないと,デフォルトで入っているスタイルファイルを見つけられず,以下のようなエラーが出ました.
$ export TEXINPUTS=.:${HOME}/.texmf// $ platex fuga.tex This is pTeX, Version 3.14159-p3.1.5 (euc) (Web2C 7.4.5) (./fuga.tex pLaTeX2e <2005/01/04>+0 (based on LaTeX2e <2001/06/01> patch level 0) ! LaTeX Error: File `jarticle.cls' not found. Type X to quit or <RETURN> to proceed, or enter new name. (Default extension: cls) Enter file name: ^D (snip)
そして,末尾にコロンを付けた場合です.
$ export TEXINPUTS=.:${HOME}/.texmf//: $ platex fuga.tex This is pTeX, Version 3.14159-p3.1.5 (euc) (Web2C 7.4.5) (./fuga.tex pLaTeX2e <2005/01/04>+0 (based on LaTeX2e <2001/06/01> patch level 0) (/usr/share/texmf/ptex/platex/base/jarticle.cls Document Class: jarticle 2002/04/09 v1.4 Standard pLaTeX class (/usr/share/texmf/ptex/platex/base/jsize10.clo)) (./fuga.aux) [1] (./fuga.aux) ) Output written on fuga.dvi (1 page, 216 bytes). Transcript written on fuga.log. $
なお,環境変数はこれが全てではありません./usr/share/texmf/web2c/texmf.cnf にいろいろ書いてあるので,必要に応じて追加する必要があります.
[TeX関連] 90ms-RKSJ-H エンコーディングとの闘い (最終章)
さて,無事に Ghostscript の設定が済んだところで,lprng + magicfilter を通して PDF を印刷させてみます.
結果... 次の内容が印刷された紙が出てきました.
Error: /undefined in /90ms-RKSJ-H Operand stack: --dict:7/7(L)-- TT2 1 --dict:5/5(L)-- --dict:5/5(L)-- MS-Gothic Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1 3 %oparray_pop 1 3 %oparray_pop --nostringval-- 2 1 3 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- Dictionary stack: --dict:1052/1123(ro)(G)-- --dict:0/20(G)-- --dict:92/200(L)-- --dict:92/200(L)-- --dict:97/127(ro)(G)-- --dict:229/230(ro)(G)-- --dict:19/24(L)-- --dict:4/6(L)-- --dict:24/31(L)-- Current allocation mode is local Last OS error: 2
印刷キューを追加したユーザの設定は読んでくれなかったのですね... 研究室に泊まってまでやってきた今までの苦労は一体... orz
結局 sudo して設定を変えてしまうしかないのですか... 共用マシンではあまり sudo したくないんですけどねぇ.
[TeX関連] 90ms-RKSJ-H エンコーディングとの闘い (3)
四角いゴミがどこに出現しているかを見てみると,空白と改行の部分に現れていました.
ということは,CMap ファイルをいじって空白と改行のマッピングを変えてやればこの四角は消えるのではないでしょうか.
ということで作業開始.まずは 90ms-RKSJ-H を見てみます.
1 beginnotdefrange
<00> <1f> 231
endnotdefrange
という記述がありました.どうやら制御コードは 231 (0x00E7) にマッピングされているようです.
さて,Shift-JIS から UCS-2 へのマッピングが分かったので,あとは 0x00E7 が変な文字で印字されるのを止めさせるだけです.Adobe-Japan1-UCS2 をいじくります.
--- Adobe-Japan1-UCS2.org Tue May 3 11:13:55 2005 +++ Adobe-Japan1-UCS2 Tue May 3 11:14:20 2005 @@ -110,7 +110,7 @@ <00E4> <2122> <00E5> <017E> <00E6> <0030> -<00E7> <2002> +<00E7> <0020> <0123> <00A5> <0145> <203E> <0186> <FFFD>
デフォルトで 0x00E7 は 0x2002 にマッピングされています.この文字が何かはさておき,とりあえず強引に空白文字 0x0020 に修正しています.
これでレンダリングを行うと... 無事に所望の結果を得ることができました.めでたしめでたし.
ちなみに,90ms-RKSJ-H を次のように修正する方法では出力結果が全く変化しませんでした.
1 beginnotdefrange
<00> <1f> 32
endnotdefrange
[TeX関連] 90ms-RKSJ-H エンコーディングとの闘い (2)
Ghostscript 8.15 - TeX Wiki によると,GNU Ghostscript 7.x では日本の gs-cjk プロジェクトの成果が取り込まれ
たとあるので,Ghostscript 7.05 + VFlib でも一応 VFlib を介さずに TrueType フォントを使用できるのではないかと思い,以下のようにしてみました.
$ cd $ mkdir -p .ghostscript/{lib,Resource/CIDFont} $ cp /usr/local/share/ghostscript/lib/gs_res.ps .ghostscript/lib $ cat > .ghostscript/Resource/CIDFont/MS-Gothic %!PS-Adobe-3.0 Resource-CIDFont %%BeginResource: CIDFont (MS-Gothic) /MS-Gothic (/usr/share/fonts/ryobi/tcgothb.ttc) .openttcidfont dup length dict begin {def} forall currentdict end /CIDFont defineresource pop %%EndResource %%EOF $ vi .ghostscript/lib/gs_res.ps (248-249 行目を以下のように編集) /FontResourceDir (/home/hoge/.ghostscript/Resource/Font/) readonly .forcedef /GenericResourceDir (/home/hoge/.ghostscript/Resource/) readonly .forcedef $ export GS_LIB=$HOME/.ghostscript/lib:$HOME/.ghostscript/vflib
これで,MS-Gothic に対しては gs-cjk 経由で TrueType フォントが使用されるはずです.
早速レンダリングを実行.そしてその結果は...!
なんでしょうね.この四角いゴミは.これさえなければ完璧なんですけどねぇ.惜しい?
[TeX関連] LaTeX によるタイプセットをちょっと高速にする方法
例えば,hoge.tex のプリアンブルの末尾に \dump と書いてタイプセットします.
すると,hoge.fmt というフォーマットファイルができあがります.これは LaTeX のマクロを展開した結果が納まったファイルです.
フォーマットが完了したら,先程追加した \dump を削除します.そして次回以降のタイプセットは次のようにすることで,hoge.fmt に格納された情報だけでタイプセットを行うため,若干高速になります.
platex &hoge hoge.tex
強調部分には,ファイル名 hoge.fmt から拡張子を除いた部分を指定します.また,"&" を特殊記号として扱うシェルを使用している場合はエスケープしてください.
言うまでもありませんが,プリアンブルを変更した場合は再フォーマットする必要があります.
[TeX関連] pdfjam
portage の app-text/pdfjam に,pdfnup というコマンドがあります.pdfnup は psnup の pdf 版です.
PDF を印刷するときに便利です.
[TeX関連] BaKoMa
TeX の標準フォントである Computer Modern の TrueType 版がないかなーと探すと,BaKoMa がまさにそれでありました.
これで OpenOffice.org の図がちょっと綺麗に描けます.
[TeX関連] TEXINPUTS
環境変数 TEXINPUTS に ./eps を付け加えておくと,\includegraphics{hoge.eps} をタイプセットする際に,自動的に eps/hoge.eps を探しに行くので便利です.
設定例は次のような感じです.私は自分専用のスタイルファイルを ~/.texmf の下に入れているので,その設定が含まれています.
export TEXINPUTS=.:${HOME}/.texmf//:./eps:
多くの場合は環境変数 TEXINPUTS の末尾をコロンで終わらせておく必要があります.TEXINPUTS / TEXTFM 等の環境変数は,末尾がコロンである場合,そこにデフォルトの定義が続いているものとして解釈するからです.
ファイルの検索には kpathsea を使用するので,ダブルスラッシュを用いることができます.
また,PATH と同じように,TEXINPUTS にはカレントディレクトリを含める必要があります.
[TeX関連] ps2pdf で EPS を無圧縮で PDF に埋め込む方法
Acrobat Distiller も ghostscript の pdfwriter も,組み込まれた画像を不可逆圧縮するため,表示時にブロックノイズが現れてしまいます.
これを回避するために,ps2pdf を -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false 付きで実行します.
[TeX関連] Prosper のスライドを landscape で上手にプレビュー
Prosper のスライドを dvips で PostScript に変換し,gv でプレビューします.
そのままでは portlait なので,-landscape オプションを付けます.
これで準備万端と思ったら,大間違いでした.
というのも,gv は 2 ページ目を描画する前に,1 ページ目の内容をクリアしてくれるのですが,このときクリアされる範囲が portlait のままなのです.
描画範囲は landscape なので,クリアされずに残った部分に 2 ページ目の内容が重ね書きされていきます.
続けて数ページも描画させれば,画面はもう阿鼻叫喚の地獄絵図です.
...頼むよ gv さん.
私は whizzytex のように,ファイルを保存する度にバックグラウンドで platex と dvips を起動して,できあがったら kill -HUP (pid of gv) を実行するように vim スクリプトを書いているので,この阿鼻叫喚の地獄絵図現象を食い止めなければなりません.
試行錯誤の結果,gs に -dFIXEDMEDIA オプションを渡せばよいようなので,これを gv のオプションとして... あれ?
gv -arguments '-dFIXEDMEDIA'... なんと gs にオプションが渡っていません.
~/.gv を編集して,次の 1 行を編集して無事解決.
GV.gsArguments: -dFIXEDMEDIA
[TeX関連] PDF のしおり
PDF を Acrobat Reader で出力すると,ウィンドウの左ペインに「しおり」の一覧が出力されます.あの場所に日本語を用いるために,ps2pdf/dvipdfmx で日本語 PDF を作る: 日本語のしおりで紹介している convert-euc スクリプトを用いました.