第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の任意のリポジトリにアップロードしておき、