pythontex は,望み薄かな?
実装が古いのと,日本語化の関連で,ちょっと面倒くさいというか無理っぽい。
やっぱ,R と Sweave の組み合わせが最強。
pythontex は,望み薄かな?
実装が古いのと,日本語化の関連で,ちょっと面倒くさいというか無理っぽい。
やっぱ,R と Sweave の組み合わせが最強。
そのまんまでは,入力と出力のフォーマットに全く違いがない。ので,まぎらわしい。
Sweave のようには行かず,インタラクティブモードのように,入力の前にプロンプトがつくようにはできないようだ。
そこで,LaTeX の listings を使う。
listings.sty と jlisting.sty を用意して,プリアンブルで以下を定義しておく。
\usepackage{listings,jlisting}
\lstset{%
basicstyle={\ttfamily\normalsize},%
frame={tbrl},
numbers=left,%
xleftmargin=3zw,%
lineskip=-0.5ex%
}
これだけではだめで,
/usr/local/lib/python3.6/site-packages/pweave/formatters/tex.py
の,initformat の赤字部分を以下のように変更する。
def initformat(self):
self.formatdict = dict(codestart='\\begin{lstlisting}',
codeend='\\end{lstlisting}',
outputstart='\\begin{quote}\n\\begin{verbatim}',
outputend='\\end{verbatim}\n\\end{quote}',
figfmt='.pdf',
width='\\linewidth',
doctype='tex')
これで
<<>>=
x = 2
y = 4
print(x-y)
@
が,
のようなイメージで表示される。
すなわち,プログラム〔入力〕が行番号付きで,出力は行番号なしで出力される。
\color{} を使って,入力と出力を分けることもできるけど,色を使うのは避けたい。
Sweave engine の最初の部分だけを以下のように変更して使う。
mp = function(file, makeindex=FALSE, silent=FALSE, deletePdfs=FALSE, deleteWorkfiles=FALSE, ...) {
Sys.setlocale("LC_ALL", "ja_JP.UTF-8")
if (grepl("\\.", file) == FALSE) {
file = paste(file, "Rnw", sep=".")
}
cat("Input file:", file, "\n")
cmd = sprintf("pweave -f tex %s", file)
system(cmd)
base = sub(".Rnw", "", file)
:
R のための Sweave と同じような感じで,python のための Pweave(http://mpastell.com/pweave/) を使ってみる。
以下で,全角の <,> は,実際は半角で
TeXShop を使って,*.Pnw --> *.tex ---> *.pdf の操作を行うにあたって,大問題がある。
それは,TeXShop は .Pnw などという拡張子を認識しないということである(.Rnw は認識するのに)。
仕方ないから,.Rnw を流用することにするが,何とかならないか?
● チャンクの記述法
もう一つの問題点。
コマンドラインでは ```pythpn 〜 ``` が有効で,<<>>= 〜 @ はだめ。
TeXShop では全く逆。```pythpn 〜 ``` がだめで,<<>>= 〜 @ が有効。
次の 3 つの例は,だめ。
(1)
```python
a = 12
b = 34
print(a+b)
```
(2)
オプションを定義することもできる
```python, echo=False
a = 12
b = 34
print(a+b)
```
図を挿入する方法
```python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi)
plt.plot(x, np.sin(x))
```
\bigskip
次の 2 つの例は有効。
<<fig = True, width = '12 cm', echo = True>>=
from pylab import *
plot(arange(10))
show()
@
<<>>=
x = 2
y = 4
print(x-y)
@
● インラインコード
コードをその場で評価する sqrt(8)= <% np.sqrt(8) %>
8 の平方根を,この後へ挿入 sqrt(8)=2.8284271247461903
式を評価した結果を出力する sqrt(8)=<%= np.sqrt(8) %>
8 の平方根を,この後へ挿入 sqrt(8)=2.8284271247461903
違いはないようにみえるのだが?
TeXShop で用意されている engine に Sweave 用のものがないので,作ってみた。
基本的には,以下のようであるが,肝は Sweave 関数の前に,Sys.setlocale("LC_ALL", "ja_JP.UTF-8") を置くこと。これがないと locale が "C" になっているので,日本語が正しく処理されない。
このファイルを Sweave.engine と名付けて,Engines フォルダに放り込んでおく。選択肢に "Sweave" が加わる。
#!/usr/local/bin/Rscript --vanilla --default-packages=methods,datasets,utils,grDevices,graphics,stats
file = sub("\\.Rnw", "", commandArgs(TRUE)[1])
Sys.setlocale("LC_ALL", "ja_JP.UTF-8")
Sweave(file, encoding="utf-8")
system(sprintf("/Library/TeX/texbin/uplatex %s.tex", file))
system(sprintf("/Library/TeX/texbin/dvipdfmx %s.dvi", file))
Sweave で,
<<>>==
ans <- lm(Petal.Length ~ ., data=iris)
logLik(ans)
@
のようなチャンクを含む *.Rnw を
Sweave ==> uplatex ==> dvipdfmx すると,*.dvi ファイルを *.pdf ファイルにする際に
kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 tcrm1000
mktexpk: Cannot find mktex.opt; check your installation.
kpathsea: Appending font creation commands to missfont.log.
dvipdfmx:warning: Could not locate a virtual/physical font for TFM "tcrm1000".
dvipdfmx:warning: >> There are no valid font mapping entry for this font.
dvipdfmx:warning: >> Font file name "tcrm1000" was assumed but failed to locate that font.
dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...
Output file removed.
なるエラーメッセージを吐いてとまってしまう。
R コンソールでは,直前のエラーメッセージが赤字で目立つのだが,その前に本当のエラーが暗示されている。
LaTeX Font Warning: Font shape `TS1/aett/m/n' undefined
(Font) using `TS1/cmr/m/n' instead
(Font) for symbol `textquotesingle' on input line 31.
ドツボにはまっていたのだが,`textquotesingle' だの,aett だのと書かれているのがポイント。
確かに,件のチャンクの出力は,
'log Lik.' -9.283269 (df=7)
と,シングルクオートを含む。さらに,そういえば Sweave.sty で ae が悪さをすることがあるというのを思い出した。
Sweave.sty の 8 行目,
\setboolean{Sweave@ae}{true}
を
\setboolean{Sweave@ae}{false}
にすることで,問題解決...したのかな?
R の次のバージョンのコードネームは Pumpkin Helmet だそうだ。
いつものように,Snoopy と Charlie Brown ゆかりのもの。
http://dvd.netflix.com/Movie/You-re-a-Good-Sport-Charlie-Brown/70111491
最初の絵の説明中には,以前のコードネーム Good Sport(R 3.0.1) や Masked Marvel(R 3.0.0) も出ている。
http://en.wikipedia.org/wiki/You%27re_a_Good_Sport,_Charlie_Brown も参照。
Sweave-12 で書いた ae フォントを使うかどうかの件
やはり,困るという人もいるようで,マニュアルにちゃんと記載がある。
‘Sweave.sty’ also supports the [noae] option, which suppresses the use of the ae package, the use of which may interfere with certain encoding and typeface selections. If you have problems in the rendering of certain character sets, try this option.
マニュアル,ちゃんと読め > オレ
Sweave で作った pdf と,LaTeX だけで作った pdf を比べて,前者と後者のフォントの大きさ(当然ながら,版面の大きさとか行当たりの文字数など)が異なることに気づいた。
LaTeX のソースに \usepackage{Sweave} を加えるだけで,変になることがわかった。
消去法で突き止めた原因は,Sweave.sty にある
\newboolean{Sweave@ae}
\setboolean{Sweave@ae}{true}
が元凶のようだ。このようになっていると
\RequirePackage[T1]{fontenc} というfontを使うようになるようだ。そこで,
\setboolean{Sweave@ae}{false}
とすると,おかしなことはなくなった。
もっとも,そのほうがいいか,元のままがいいかは,個人の好みなんだろうなあ。
\include に対応するものはないけど \input に対しては,\SweaveInput がある。
\includeonly ができないのだけど,やむを得ない。
xtable と print.xtable の組み合わせで表を書くというのも,長ったらしいオプションであるとか,標準と違うデフォルトとかいうことで,これもまたラッパー関数を書くしかないかなと言うことで以下のようなものを作る。
ytable <- function(x, caption, label, align=NULL, digits=NULL, display=NULL,
table.placement="htbp", caption.placement="top",
math.style.negative=TRUE )
{
library(xtable)
xtable:::print.xtable(xtable(x, caption=caption, label=label, align=align, digits=digits, display=display),
table.placement=table.placement, caption.placement=caption.placement,
math.style.negative=math.style.negative)
}
.Rnw で
ytable(iris[1:10,], "iris data", "sss")
とか
x <- 1:10
y <- rnorm(10)
ytable(lm(y~x), caption="aaaaa", label="qqq")
caption と label は必須。もし,print.xtable の引数でデフォルトにしたいあるいはデフォルト値を変えたいものがあれば,この関数で定義しておく。
図をフロートにする方法はSweave-3 に書いたが,\begin{figure} から始まる一連の指示を毎回書くのは面倒くさい。
表は xtable でそのままフロートになるのだから xtable のような関数を書いてやればよい。
xfigure <- function(fn, caption, label, location="htbp")
{
cat(sprintf("\\begin{figure}[%s]\n", location))
cat("\t\\centering\n")
cat(sprintf("\t\\includegraphics{%s}\n", sub(".(pdf|PDF)", "", fn)))
cat(sprintf("\t\\caption{%s}\n", caption))
cat(sprintf("\t\\label{%s}\n", label))
cat("\\end{figure}\n")
}
これを .Rnw で以下のように使う。
<<results=tex, echo=false>>=
fn <- "test.pdf"
pdf(fn, width=3, height=2, onefile=FALSE)
hist(rnorm(10000))
invisible(dev.off()) # invisible にするか,結果を何かに代入するかしないと余計な文字列が出力される
xfigure(fn, "ヒストグラム", "lab1")
@
毎回 invisible(dev.off()) と書くのが面倒なら,dev.off2 <- function invisible(dev.off()) とでもしておく。
fig=TRUE を使うとき,悪さをする ctable.sty を使わないことを前提として,余計な処理をしないラッパー関数。エンコーディングも euc-jp であると決める。
ms <- function(file)
{
Sweave(file, encoding="euc-jp")
file <- sub(".(R|S)nw", ".tex", file)
repeat {
system(sprintf("/Applications/UpTeX.app/teTeX/bin/platex -kanji=euc %s", file))
con <- file(sub(".tex", ".log", file), open="r", encoding="euc-jp")
log <- readLines(con)
close(con)
if (sum(grepl("Rerun to get", log)) == 0) break
}
system(sprintf("/Applications/UpTeX.app/teTeX/bin/dvipdfmx %s", sub(".tex", ".dvi", file)))
}
<<>>= の中に書けるもの
engine 文字列(R) engine=R か engine=S のコードチャンクのみ処理される。
echo 論理値(TRUE) R/S コードを出力ファイルに含めるかどうか。
keep.source 論理値(FALSE) R/S コードがエコーされるとき,TRUE ならば書いたままのコードがコピーされ,FALSE ならば deparse されたコード(演算子の前後などに適切に空白を入れたコード)がエコーされる。
eval 論理値(TRUE) コードチャンクを評価するかどうか。評価しないと言うことは結果も図も作成されないと言うこと。
results 文字列(verbatim) verbatim なら R/S 関数の出力は \verbatim 環境に似た環境の下に出力される。tex なら LaTeX の文法に従うものとしてそのまま取り込まれる。hide なら実行はされるがすべての出力は抑制される。
print 論理値(FALSE) TRUE の場合はすべての式は print 関数でラップされてから評価される。このようにすれば,全ての式の結果は見えるようになるからだ。
term 論理値(TRUE) TRUE の場合は,値の見え方が通常の対話 R セッションと同じになる。すなわち,代入の結果は表示されず,オブジェクト名の場合は値が表示される。false の場合には明示的に print 関数や cat 関数を使わない限り表示されない。
split 論理値(FALSE) TRUE の場合は,それぞれのコードチャンクのテキスト出力は別々のファイルに書き込まれる。
strip.white 論理値(FALSE) TRUE の場合は出力の前と後の空白行が取り除かれる。all の場合は,全ての空白行が取り除かれる。
prefix 論理値(TRUE) 生成される画像とテキスト出力のファイル名が共通になる。
prefix.string 文字列 ファイル名のデフォルトは '*.(Rnw|Snw)' の拡張子を除いた部分。
include 論理値(TRUE) テキスト出力の \input,グラフ出力の \includegraphics を自動生成するかどうか。別の場所に自分で挿入したいような場合には include=FALSE とする。
fig 論理値(FALSE) コードチャンクがグラフ出力をするかどうか。
eps 論理値(FALSE) eps 形式のグラフィックファイルを出力するかどうか。
pdf 論理値(TRUE) pdf 形式のグラフィックファイルを出力するかどうか。
pdf.version pdf のバージョンをセットする。デフォルトは pdf.options() で取られる。
pdf.encoding pdf のエンコーディングをセットする。デフォルトは pdf.options() で取られる。
png 論理値(FALSE) png 形式のグラフィックファイルを出力するかどうか。R ≧ 2.13.0 で有効。
jpeg 論理値(FALSE) jpeg 形式のグラフィックファイルを出力するかどうか。R ≧ 2.13.0 で有効。
grdevice (NULL) R ≧ 2.13.0 で有効。
width 数値(6) 図の横幅(インチ単位)
height 数値(6) 図の高さ(インチ単位)
resolution 数値(300) インチあたりのピクセル数(png, jpeg でのみ)
concordance 論理値(FALSE)
figs.only 論理値(TRUE)