LyX で Sweave 出力

前回、RstudioでSweave出力の方法を説明した。LyXも同様に、実行する。 どうように英語の場合と日本語使用の場合にわけて解説する。

英語のみ

英語のみの場合、lyxのみでpdfを直接つくることが可能である。 「文書=>モジュール」で「Sweave」を追加する。 注意することはpdflatexを使用するので、「文書=>文書クラス」で「article」にして、グラフィックドライバを「規定値」にする必要がある。

Screenshot_from_2013-06-18 21:59:57

そしてRコードの導入方法であるが、例えば、「挿入=>Texコード」で

<<>>=
1+1
x <- runif(7)
x
@

などと入力すると、Rコードで1+1の演算結果と、一様分布にしたがう乱数を7つ作り出す。 値の平均値を計算するには、

The mean of  $x$ is

と入力して、「挿入=>任意設定差込枠=>S/R表現」として、

mean(x)

とすればよい。

こうして作ったファイルを通常のLyXファイルと同じように「PDF (pdflatex)」を出力か表示させることができる。

ただ、LyXからの出力の場合、うまくコマンドが正しく入力されなければ、上手く出力されない。RStudio のときのように、Sweaveファイルを作成しながら、このコマンドが正しいのかを実行することは難しい。確かめたい場合、「ファイル=>書き出し=>Sweave」として、RStudioで読みこめばよい。もしLyXで修正をして再度書きだした際に、Rstudioでタブを切り替え直せば、ファイルを再度開くことなく、ファイルが更新させる。

日本語使用

一方、日本語の場合、直接LyXから出力することは現状、難しい。どうしてもpdflatexを実行するようである。そこでtexファイルを出力して、auctexやtexworkからPDFを出力するようにする。もちろん、「文書=>設定=>モジュール」で「Sweave」を追加する。また、「文書=>設定=>文書クラス」で「article (Japanese New)」にして、グラフィックドライバを「DVIPDFMx」にする必要がある。また「文書=>設定=>LaTeXプリアンブル」に

\usepackage{mediabb}

をつけくわえる。

そして、「ファイル=>書き出し=>LaTeX (plain)」として、texファイルを出力する。それをTexworksで開いてコンパイルすればよい。

もちろん、英語の時のと同様に、「ファイル=>書き出し=>Sweave」として、RStudioで読みこむ。コンソール画面上で、

> Sweave("sweave0", encoding="utf8")

と入力して、texファイルを生成すればよい。

Screenshot_from_2013-06-18 22:56:29

ESS で Sweave 出力

前回、日本語のSweave出力でauctexで用いる方法を示したが、もちろん、ESSは、Sweave のlatex変換に対応している。おそらくRnwファイルを開いていれば、auctexが実行できるだけでなく、メニューに「Noweb」という項目があるはずである。ないのなら、「M-x ess-noweb-mode」でたちあげればよい。

そのもとで、あらかじめ、「M-x R」でRをたちあげておいて、「M-n s」を実行すれば、Sweaveが実行されて、Texファイルが作られる。これは、日本語が含まれている場合、自動的にUTF8モードで変換してくれる。さらに、「M-n l」でlatexの実行ができるが、デフォルトでは、その実行が「pdflatex」なので日本語のはいったRnwファイルは扱えない。

しかしながら、

http://stackoverflow.com/questions/11060023/ess-auctex-sweave-synctex-integration-from-rnw-pdfviewer

を参考にして、

(defun ess-makePDFandView ()
(interactive)
(setq namestem (substring (buffer-name) 0 (search ".Rnw" (buffer-name))))
(setq tex-filename (concat "\"" namestem "\".tex"))
(setq my-command-string (concat "latexmk" tex-filename))
(shell-command my-command-string)
(setq my-command-string (concat "/Applications/Skim.app/Contents/MacOS/Skim \"" namestem ".pdf\" &"))
(shell-command my-command-string))

(define-key ess-noweb-minor-mode-map "\M-nv" 'ess-makePDFandView)

を作成する。オリジナルから5行目が「latexmk」に変更しているのと、最後の行が「ess-noweb-minor-mode-map」になっている。これはmac用で「Skim」を使っているが、他機種も対応可能である。
たとえば、Ubuntuでは7行目を

(setq my-command-string (concat "evince \"" namestem ".pdf\" &"))

と変更すればよい。

こうすることで、日本語のRnwのファイルを開いたままで、texファイルを開くことなく、一気にPDFファイルが作られて見ることができる。英語のみのRnwファイルの場合は、Auctexのもとで、「C-c C-c LatexSweave」でPDFファイルを生成し、「C-c C-v」でファイルを閲覧すればよい。

Sweave で 日本語を扱う。

前回の補足をすると、Sweave で 日本語を扱うときの方法について

http://d.hatena.ne.jp/T_2GMon/20120426/1335412328

が参考になる。ポイントは

  1. \usepackage{mediabb}の追加
  2. \usepackage{graphicx}の追加

である。パッケージ「mediabb」はPDFファイルを、dvipdfmx対応のplatexで無理して主力するために必要である。もし最初からepsで出力するように、オプションに「eps=TRUE」を付け加えれば、必要無くなる。

上記のサイトの例を最小限修正して、次のように書き換える。

\documentclass[a4paper]{jsarticle}
\usepackage{graphicx}
\title{plot}
\author{miyazakikenji}
\begin{document}
\maketitle
Sweaveで日本語を扱う
<<>>=
x <- 1:10
y <- 1:10
@
\begin{center}
<<fig = TRUE, echo = FALSE, eps=TRUE>>=
plot(x,y)
@
\end{center}
\end{document}

これをauctexではどのようにするのかを説明する。以前述べたように

Gnupack の Emacs に Auctex

Gnupack の Emacs に ESS

のように「init.el」を書き換えているとする。上記の説明はWindows 8 上のGnupackであるが、MacやUbuntuでも同様に可能である。

  1. texmfが読み込める箇所(私の設定だと”~/Dropbox/texmf/tex”)に「Sweave.styae.sty(とmediabb.sty)を追加する。
  2. 「C-c  C-c Sweave」でSweaveを実行する。先の設定でユニコード対応がうまく実行されるはずである。
  3. 変換されたTexファイルをView-modeで開く。先の設定でauctexモードで実行されるはずであるView-modeをつかうのはコンパイル中のエラーをおもわずtexファイルに書き込んでしまうのを防ぐために。
  4. 「C-c C-c LatexMk」でPDFを作成。
  5. 「C-c C-v」でPDFファイルをSmatraPDFで表示。

いまの設定だと、Rnwを修正したばあい、Sweaveを実行したら、auto-revertが効いていてバッファが自動的に更新される。また、PDFもSmatraPDFをつかうようにしているので、自動的に更新される。現在、一発で変換できる方法を考えている。

Rstudio で Sweave 出力

Rstudio を用いて、Sweave形式のファイルを出力する方法を述べる。 英語のみの場合と日本語使用の場合にわけて解説する。

英語のみ

英語のみの場合は、Rstudioの機能からそのまま出力することができる。 例えば、次のファイルがあるとする。

\documentclass{article}

\begin{document}
\SweaveOpts{concordance=TRUE}

This is a test.
<<>>==
1+1
x <- runif(5)
x
@

<<fig=TRUE>>==
data(iris)
plot(iris$Sepal.Length,iris$Petal.Length)
@

というファイル(Sweave0.Snw)を作成する。そして、「Compile PDF」ボタンを押せばよい。

Screenshot_from_2013-06-18 21:33:24

日本語使用

日本語の場合、ひと工夫が必要である。まえに述べたように、「mediabb.sty」というパッケージが必要である。 またスタイルファイルを「jsarticle」に変更し、「dvipdfmx」を使うように指定する。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{mediabb}

\begin{document}
\SweaveOpts{concordance=TRUE}

これはテストである。
<<>>==
1+1
x <- runif(5)
x
@

<<fig=TRUE>>==
data(iris)
plot(iris$Sepal.Length,iris$Petal.Length)
@

このまま「Compile PDF」ボタンを押しても上手く行かない。pdflatexを使うようになっているからである。

そのため、コンソール画面上で、

> Sweave("sweave0", encoding="utf8")

と入力して、texファイルを生成すればよい。ポイントは、「encoding=”utf8″」というオプションが必要である。 そうして、auctexやTexworksからファイルを開いて、コンパイルすればよい。