第527回ではRStudioのインストール方法を、
TinyTeXで日本語PDFを生成できるようにする
第529回でも紹介しているように、
これは一般的なLinuxで使われているTeX Liveではパッケージサイズが大きくなりがちで、tlmgr
コマンドでインストールする仕組みになっています。またRの実行環境からtlmgr
コマンドを実行できる、tinytex
ライブラリーも同梱されています。
第529回同様、
$ sudo docker run --rm -d -p 8787:8787 --name verse rocker/verse
メニューからR Markdownファイルを作成し、output: pdf_
」
output:
pdf_document:
latex_engine: lualatex
documentclass: ltjsbook
この状態でKnitを実行するとdocumentclass
で指定したクラスファイルltjsbook.
」
実際、latex_
」lualatex
」ltjsbook.
ファイルを提供しているluatexjaパッケージのダウンロードを試みます。
tlmgr search --file --global '/ltjsbook.cls' Trying to automatically install missing LaTeX packages... tlmgr install luatexja (中略) tlmgr install luatexja tlmgr install: package already present: luatexja tlmgr path add tlmgr search --file --global '/ltjsbook.cls' ! LaTeX Error: File `ltjsbook.cls' not found.
しかしながら、
TinyTexにはR向けのtinytexライブラリーがあります。これを使えば、tlmgr
を実行できます。
> tinytex::tlmgr_search('/ltjsbook.cls') tlmgr search --file --global '/ltjsbook.cls' luatexja: texmf-dist/tex/luatex/luatexja/ltjsbook.cls > tinytex::tlmgr_install('luatexja') (中略) copy /opt/TinyTeX/tlpkg/texlive.tlpdb.tmp to /opt/TinyTeX/tlpkg/texlive.tlpdb failed: Operation not permitted at /opt/TinyTeX/tlpkg/TeXLive/TLPDB.pm line 628. tlmgr path add
今度は/opt/
以下の所有者はrootになっているものの、/opt/
以下を変更できるのです。
しかしながらプライマリグループはrstudioであるため、/opt/
」
さてRコンソールからのTeXパッケージのインストールはうまくいきませんでした。そこで泥臭い方法ではありますが、--name verse
」tlmgr
を実行できます。
$ sudo docker exec -it verse tlmgr install luatexja \ luatexbase ctablestack adobemapping ms filehook running mktexlsr ... done running mktexlsr. tlmgr: package log updated: /opt/TinyTeX/texmf-var/web2c/tlmgr.log
luatexjaの依存関係から最低限必要なパッケージも列挙しています。
また日本語フォントもRockerイメージにはインストールされていませんので、
$ sudo docker exec -it verse apt update $ sudo docker exec -it verse apt install fonts-ipaexfont
あとはKnitを実行すれば、
生成されたTeXファイルを残しておきたい
R Markdownから生成されるTeXファイルをPDFにコンパイルする際の問題に対応したい場合、keep_
」
output:
pdf_document:
latex_engine: lualatex
keep_tex: true
documentclass: ltjsbook
Knitでビルドすると、
$ sudo docker exec -it verse bash # lualatex foo.tex
たとえば特定のスタイルファイルが見つからないエラーが発生したとします。
# lualatex foo.tex (中略) ! LaTeX Error: File `filehook.sty' not found. Type X to quit or <RETURN> to proceed, or enter new name. (Default extension: sty) Enter file name: x
tlmgr
コマンドでそのファイルを提供しているパッケージを探してみましょう。
# tlmgr search --global --file '/filehook.sty' (中略) filehook: texmf-dist/tex/latex/filehook/filehook.sty texmf-dist/tex/latex/filehook/pgf-filehook.sty
filehookパッケージであることがわかったので、
# tlmgr install filehook
コンテナに加えた変更は一通り記録しておいて、
ちなみにUbuntuのTeX Liveパッケージでもtlmgr
コマンドは提供されています。しかしながらDebianパッケージ版のTeXシステムとの整合性を取ることが難しいため、
RStudioを日本語ロケールで動かす
Rocker版のRStudioはen_
」
ロケールはコンテナ起動時に環境変数で指定できます。
$ sudo docker run --rm -d -p 8787:8787 --name verse \ -e LANG=ja_JP.UTF-8 -e LC_ALL=ja_JP.UTF-8 rocker/verse
しかしながらコンテナ内部に日本語のロケール情報が生成されていないので、
$ sudo docker exec -it verse bash -c \ 'echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && locale-gen && update-locale LANG=ja_JP.UTF-8'
ちなみにR本体が--disable-nls
」
タイムゾーンについてはコンテナ起動時に環境変数TZ
を指定すれば変更できます。
$ sudo docker run --rm -d -p 8787:8787 --name verse \ -e TZ=Asia/Tokyo rocker/verse
恒久化したい場合はやはりいずれもDockerfileに記述することになるでしょう。
Dockerfileで自分用イメージを作成する
TinyTeXの対応方法や日本語ロケールへの変更方法がわかれば、
具体的な例を見てみましょう。ここで行った設定は次のような内容で、
FROM rocker/verse
## フォントのインストールと余計なデータの削除
RUN apt-get update \
&& apt-get install -y fonts-ipaexfont \
&& apt-get remove --purge -y $BUILDDEPS \
&& apt-get autoremove -y \
&& apt-get autoclean -y \
&& rm -rf /var/lib/apt/lists/*
## 標準のロケールとタイムゾーンの変更
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo
RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
&& locale-gen ja_JP.UTF-8 \
&& update-locale LANG=ja_JP.UTF-8
## TeXパッケージのインストール
RUN tlmgr install \
luatexja \
luatexbase \
ctablestack \
adobemapping \
ms \
filehook
## Rパッケージのインストール
RUN install2.r --error \
--deps TRUE \
githubinstall
このDockerfileを元にDockerイメージを作ってみましょう。
$ sudo docker build -t myverse . Sending build context to Docker daemon 111.3 MB Step 1/8 : FROM rocker/verse ---> 49ba46f8dce6 (中略) The downloaded source packages are in ‘/tmp/downloaded_packages’ ---> e40cbe97aee2 Removing intermediate container 1febd5a9203c Successfully built e40cbe97aee2
「-t myverse
」
これでdocker run
」
$ sudo docker run --rm -d -p 8787:8787 --name verse myverse
作成したDockerfileをGitHubの任意のリポジトリにアップロードしておき、