Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

November 28(Fri), 2008

[] ptetex3のdvipdfmxを使いフォント埋め込みPDFを作る

ptetex3を導入したUbuntu 8.10*1にてフォント埋め込みのPDFを作る方法。ptetex3ならおそらくどこでも同様。

dvipdfmxで使うフォントは

/usr/local/teTeX/share/texmf-var/fonts/map/dvipdfm/updmap

にあるdvipdfm.mapで欧文フォント、kanjix.mapで日本語フォントの設定をしています。設定を変える必要があるのは日本語フォントの方。ここを直接書き換えても結果は変えられる*2けど、dvipdfmxはdviファイルと同ディレクトリにkanjix.mapがあるとそっちを参照してくれるので、元のkanjix.mapをコピーしてきて!Ryumin-Light!GothicBBB-Mediumと書いてある部分を適当なフォントに書き換えます。

cidgoth-h Identity-H :0:ipag
cidgoth-v Identity-V :0:ipag
cidmin-h Identity-H :0:ipam
cidmin-v Identity-V :0:ipam
futogo-b H :0:ipag
futogo-b-v V :0:ipag
futomin-b H FutoMinA101-Bold
futomin-b-v V FutoMinA101-Bold
gbm H :0:ipag
gbmv V :0:ipag
gtbbb-m H :0:ipag
gtbbb-m-v V :0:ipag
hkb H :0:ipag
hkbv V :0:ipag
hmr H :0:ipam
hmrv V :0:ipam
jun101-l H Jun101-Light
jun101-l-v V Jun101-Light
rml H :0:ipam
rmlv V :0:ipam
ryumin-l H ipam
ryumin-l-v V ipam
unijgoth-h UniJIS-UTF16-H :0:ipag
unijgoth-v UniJIS-UTF16-V :0:ipag
unijmin-h UniJIS-UTF16-H :0:ipam
unijmin-v UniJIS-UTF16-V :0:ipam

この例だとIPAフォント*3の明朝体とゴシック体を埋め込むフォントとして設定した。全部書き換える必要は無かったかも。試してない。

このようなkanjix.mapを置いたディレクトリでdvipdfmxでdviをpdfに置き換えると日本語フォントを埋め込むことができる。

さらに、文字の入っているepsを図として取り込んでいるとHelveticaが利用されるがHelveticaが埋め込まれていないPDFができる。Helveticaを埋め込むためには

/usr/share/ghostscript/8.63/lib

gs_pdfwr.ps

/.standardfonts [
  /Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
  /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique
  /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic
  /Symbol /ZapfDingbats
] readonly def

として埋め込まない基本フォントとして設定している部分を

/.standardfonts [
  %/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
  %/Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique
  %/Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic
  %/Symbol /ZapfDingbats
] readonly def

のように書き換える。更に

/usr/local/teTeX/share/texmf/dvipdfm

dvipdfmx.cfgでも

D  "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile=%o -dNOKANJI -c '.setpdfwrite << /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Ryumin-Light /GothicBBB-Medium] >> setdistillerparams' -f %i -c quit"

のように埋め込まない基本フォントとして設定されているので

D  "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile=%o -dNOKANJI -c '.setpdfwrite << /NeverEmbed [] >> setdistillerparams' -f %i -c quit"

埋め込まないフォントとして指定しないように書き換える必要がある。

今回は論文投稿の規定で「フォントを全て埋め込むこと」とあったのでHelveticaまで埋め込んだが、実際にはHelveticaなどの基本フォントを埋め込む必要はあまり無いかもしれない。

参考

*1:色々めんどうなのでptetex3入れるんならaptからはtexliveとかdvipdfmxとか入れない方が良いと思う

*2:コメントに「このファイル直接いじんな!」とか書いてるけど

*3Ubuntu Japanese Teamパッケージレポジトリから追加したもの

July 20(Sun), 2008

[] LaTeX Beamerでスライド書いた

プレゼン資料プレゼン資料したプレゼン資料ぽいものを作る必要があったので、とりあえず研究室でライセンスもらったPowerPointで書いたりしてみたんだけど、なんかこう、すさまじく窮屈だったのでLaTeXで書いた。最初slides classとか使ってみてたのですが、どうもBeamerとやらの方がモダンっぽいぞと気付いたのでBeamer を使ってみるなど参考にBeamerで書きました。

デフォルト表示からちょっといじりたかったので適当なstyleファイル書いた。コンパイルする.texファイルと同ディレクトリに置くか、texmf以下に置いておいて、texファイル中のdocumentの前に

\usepackage{my_slides}

などと書いておく。

my_slides.sty

\voffset=0in
\hoffset=0in
\voffset=0in

\mathversion{bold}
\renewcommand{\familydefault}{\sfdefault}
\renewcommand{\kanjifamilydefault}{\gtdefault}
\setbeamerfont{title}{size=\large,series=\bfseries}
\setbeamerfont{frametitle}{size=\large,series=\bfseries}
\setbeamertemplate{frametitle}[default][center]

\usefonttheme{professionalfonts}
\useoutertheme{default}

% maketitle
\def\event#1{\gdef\@event{#1}}
\def\group#1{\gdef\@group{#1}}
\def\stdid#1{\gdef\@stdid{#1}}

\renewcommand{\maketitle}{
\frametitle{\inserttitle}
{\footnotesize
\@event{\hfill}
\\
\@group \hspace{1.5zw} \@stdid \hspace{1.5zw} \insertauthor
\vspace{1.5zw}
}
}

適当にコピペとかでやってるので、TeXの文法とか全然知らない。コンパイルは

$ platex hoge.tex
$ dvipdfmx hoge.dvi

などと。エラーが大量に出るのがなんなのかはよく知らない。あとdviファイルは読めないものができる。


以下用例。

出力はopencampus.pdfのようになります

\documentclass[14pt,dvipdfm]{beamer}
\usetheme{Luebeck}
%\usetheme{Pittsburgh}
\setbeamertemplate{navigation symbols}{} 

\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}
% フォントはお好みで
%\usepackage{txfonts}

\usepackage{arydshln}
\usepackage{my_slides}

\event{2008年度電気通信大学オープンキャンパス}
\title{わかったつもりになるガベージコレクション}
\group{電気通信大学 情報工学科四年 阿部研究室}
\stdid{0311048}
\author{小室 直}
\date{2008年7月20日}

\begin{document}
\begin{frame}
\maketitle

\begin{description}
\item[ガベージコレクションとは?] \hspace{1pt} \\
動的に確保したメモリ領域のうち,
いらなくなったものを自動で捨ててくれる仕組み,
それがガベージコレクション(GC)です.
\end{description}
\end{frame}

\begin{frame}
\frametitle{GC解説 -- 計算機の構成}
計算機(コンピュータ)が計算するのに欠かせないのは
CPUとメモリです.
\begin{description}
\item[CPU] \hspace{1pt} \\
脳味噌のようなもの.計算をするところです.

\item[メモリ] \hspace{1pt} \\
計算用紙のようなもの.
人が計算するときも,長い計算のときは
計算用紙に計算途中の式を書いて忘れないようにしますね.
\end{description}
\end{frame}

\begin{frame}
\frametitle{GC解説 -- 忘れっぽい脳味噌(CPU)}
脳味噌が覚えてられるのは本当にほんの少しなので,
それ以外は計算用紙(メモリ)に記録しておく必要があります.

\begin{tabular}{|l|}
\hline
$ y = 3x^2 + 8x - 1$ \\
\hline
$ y = -x^2 + 13x + 2$ \\
\hline
$ 0 = 4x^2 - 5x - 3$ \\
\hline
$ x^2 - \frac{5}{4}x - \frac{3}{4}$ \\
\hline
$ (x - \frac{5}{2})^2 - \frac{25}{4} - \frac{3}{4} = 0$ \\
\hline
\multicolumn{1}{:l:}{$(x - \frac{5}{2})^2 - \frac{28}{4} = 0$}
 \\
\hdashline
\multicolumn{1}{:l:}{$x = \frac{5 \pm \sqrt{28}}{2}$}
 \\
\hdashline
\end{tabular}

例えば5行しか書けない計算用紙だったら,下2行は書いておく場所がありません.
\end{frame}

\begin{frame}
\frametitle{GC解説 -- 計算用紙が足りなくなったら}
計算用紙の余白が無くなってしまったので,
いらない途中式を消してしまいましょう.
\begin{tabular}{|l|}
\hline
$ (x - \frac{5}{2})^2 - \frac{25}{4} - \frac{3}{4} = 0$ \\
\hline
$(x - \frac{5}{2})^2 - \frac{28}{4} = 0$ \\
\hline
$x = \frac{5 \pm \sqrt{28}}{2}$ \\
\hline
\hspace{1pt} \\
\hline
\hspace{1pt} \\
\hline
\end{tabular}

結果を求めるまでに,残り二つの式を書く必要があったわけですが,
直前以外のいらない式を消すことでそれを書く場所が空きました.

この「いらない途中式を消しゴムにかける」作業のことを
「メモリの解放」と言います.
\end{frame}

\begin{frame}
\frametitle{GC解説 -- 正しい消しゴムの使い方}
例えばプログラミング言語Cでは普通
「メモリの解放」は全てプログラマが
いちいち指示する必要があります.

{\color{red}
「だけどそれは面倒だし,
必要な式を消しちゃったりなんて間違いも多いから
その作業も計算機にやらせちゃおう」
}

この考え方がガベージコレクションです.
\end{frame}

\begin{frame}
\frametitle{GC解説 -- 簡単な分類}
GC手法を
おおざっぱに分類すると
\begin{itemize}
 \item 手動メモリ管理
 \item 自動メモリ管理
       \begin{itemize}
        \item 静的メモリ管理
              \begin{itemize}
               \item エスケープ解析
               \item リージョン推論
              \end{itemize}
        \item 動的メモリ管理
              \begin{itemize}
               \item 参照カウント
               \item トレースGC
              \end{itemize}
       \end{itemize}
\end{itemize}
分類だけでこれほどになります.
個々の手法に至っては三桁を越えるでしょう.
しかしそれだけあっても,
「これが一番良い!」
とされる手法はありません.
\end{frame}

\begin{frame}
\frametitle{研究の取り組み -- 研究内容}
\begin{itemize}
\item キャッシュヒット率の高いGC手法の開発
\item 電力消費の少ないGC手法の開発
\item 特定状況において効率の良いGCの開発
\item 既存言語処理系のGCの改善
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{研究の取り組み -- 最近の取り組み}
\begin{itemize}
\item
スクリプト言語Rubyの処理系メモリ管理機構の改善
に取り組んでいます.
提案は世代仮説に基づいて
メモリ利用効率を高める
といった手法.

\item
Squawk VMというJava VMについて,
低電力なGCを組み込めないかと
取り組んでいます.
具体的にはキャッシュヒット率を
高くすることで,それが実現できると
考えています.
\end{itemize}
\end{frame}

\end{document}

June 13(Fri), 2008

[] TeXコンパイル用のMakefile

もう死んでて、毎週研究室のゼミ資料つくるだけの日常。


hogehoge.texをコンパイルするとして、以下のようなMakefileでコンパイル。dviをつくるときmake、psファイルを作りたいときはmake ps、pdfファイルを作りたいときはmake pdf。BibTeXファイルは~/docs/bibtex/あたりにあるgc.bib, gcbook.bib, embedded.bib。

RESUME = hogehoge
BIBS = gc.bib,gcbook.bib,embedded.bib
TEX     = platex
BIB     = jbibtex
DVIPS = dvips
DVIPDF = dvipdfmx

.SUFFIXES: .ps .dvi .tex .eps .pdf .bib

all: dvi
dvi: deps bib $(RESUME).dvi
ps: $(RESUME).ps
pdf: $(RESUME).pdf

force:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)

deps:
        ./texdep.pl $(RESUME).tex >deps

bib:
        zsh -c "cp -p $(HOME)/docs/bibtex/{$(BIBS)} ."

clean:
        -rm -f *.aux *.toc *.lot *.lof *.dvi *.log *.bbl *.blg *.pdf *.ps

remake: clean all

.tex.dvi:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)
.dvi.ps:
        $(DVIPS) $(RESUME)
.dvi.pdf:
        $(DVIPDF) $(RESUME)

-include deps

依存関係を調べるtexdep.plはこんなの。

#!/usr/bin/perl

use strict;
use warnings;
if(@ARGV == 0) {
  print "usage: $0 texfile\n";
  exit -1;
}
my $texfile = $ARGV[0];

if($texfile =~ /([^\.]+)\.tex/) {
  my $texname = $1;
  print "$texname.dvi: ", join(' ', texdep($texfile)), "\n";
  print "$texname.ps: $texname.dvi\n";
  print "$texname.pdf: $texname.dvi\n";
}

sub texdep {
  my ($texfile) = @_;
  my (@depls, @texls);
  open TEX, $texfile or die "cannot open $texfile";
  while(<TEX>) {
    if(/\\input{([^}]+)}/) {
      print $1;
      push @texls, $1;
    }
    elsif(/\\verbatiminput{([^}]+)}/ or /\\includegraphics\[.+\]{([^}]+)}/) {
      push @depls, $1;
    }
    elsif(/\\bibliography{([^}]+)}/) {
      push @depls, map{"$_.bib"}split(',', $1);
    }
  }
  close TEX;
  for my $input (@texls) {
    push @depls, texdep($input);
  }
  return $texfile, @depls;
}

April 13(Sun), 2008

[] ゼミで使うレジュメ用itemizeスタイル

itemizeの幅とか詰めたかったんで、/usr/local/share/texmf/ptex/platex/base/jarticle.cls参考itemizeを再定義。

% itemize
\renewenvironment{itemize}
  {\ifnum \@itemdepth >\thr@@\@toodeep\else
   \advance\@itemdepth\@ne
   \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
   \expandafter
   \list{\csname \@itemitem\endcsname}{%
     \topsep0zh
     \itemindent0zw
     \leftmargin2zw
     \rightmargin0zw
     \labelsep.5zw
     \labelwidth1zw
     \itemsep0em
     \parsep0em
     \listparindent1zw
     \def\makelabel##1{\hss\llap{##1}}}%
   \fi}{\endlist}

%%\leftmargin 左のインデント
%%\rightmargin 右のインデント
%%\labelsep ラベルと説明の間
%%\labelwidth ラベルの幅
%%\itemsep 項目ごとの改行幅
%%\parsep 段落での改行幅
%%\listparindent 段落下げ
最近のコメント