LaTeX-Dokumente mit eingebetteten R-Berechnungen und Grafiken mit TeXnicle erstellen

Mit dem R-Paket knitr lassen sich in R Dokumente entweder in Markdown oder eben in LaTeX schreiben, in die Berechnungen und Ausgaben wie Tabellen und Grafiken in R eingebettet werden. Benutzt man für die Erstellung dieser Dokumente die R-IDE RStudio, wo wird man seitens R gut unterstützt, will heißen, man kann zunächst auf der R-Konsole Dinge ausprobieren und dann in das Dokument übernehmen.

Aus RStudio heraus lassen sich auch die Dokumente dann kompilieren. Die Ergebnisse werden dann entweder als HTML-Seite im Falle von Markdown oder als PDF im Falle eines LaTeX-Dokumentes angezeigt.

So weit, so gut. Doch werden LaTeX-Dokumente schnell sehr lang. Außerdem wünscht man sich eine IDE, die bei der Erstellung der typischen LaTeX-Konstrukte wie begin{enumerate} … end{enumerate} Unterstützung in Form einer Autovervollständigung liefert. Das leistet RStudio leider nicht. Es bietet sich daher an, hier seine bevorzugte LaTeX-IDE zu nehmen.

Ich nutze auf dem Mac zur Zeit  TeXnicle. TeXnicle hat zwar die eine oder andere Macke. Dennoch arbeite ich sehr gerne damit.

Der geplante Workflow sieht nun so aus:

  • Die nötigen R-Berechnungen und Ausgaben in RStudio erstellen
  • Wenn sämtliche Ergebnisse bereitstehen, diese in Teilstücke zerteilen und in einem „.Rnw“-Dokument (LaTeX mit eingebettetem R-Code) in TeXnicle mit Prosa-Text erweitern

Es war nun in TeXnicle eine „Engine“ zu erstellen, die das Dokument erst durch R (bzw. knitr) jagt und dann dessen Ausgabe weiter mit LaTeX prozessiert.

Anpassungen

Dieses Verfahren will ich nun im Detail beschreiben:

Unter Einstellungen (⌘-,) wählt man Typesetting und dann Engines aus. Dann wählt man pdflatex aus und dupliziert diese.

Neue Engine erstellen
Neue Engine erstellen

Nun erweitert man diese Enginge um den gewünschten Aufruf von R. Dies kann man entweder über den Button „Edit“ machen oder aber das File via „Reveal“ im Finder anzeigen lassen.

Die Engines liegen unter ~/Library/Application Support/TeXnicle/engines

Engine erstellen

Im Detail umfasst die Änderung den Block:

<br /># sometimes the extension is missing ...<br />mainfile=${mainfile%%.Rnw}.Rnw<br /><br /># Running knitr<br />export LANG=de_DE.UTF-8<br />/usr/bin/Rscript -e "library(knitr); knit("${mainfile}")"<br /><br />mainfileTeX=${mainfile%%.Rnw}.tex<br />export TEXINPUTS=$TEXINPUTS:/Library/Frameworks/R.framework/Versions/Current/Resources/share/texmf/tex/latex/<br />

Dieser Block ist nach den Zeilen

<br /># Go to the working directory<br />cd "$outputDir"<br />

einzufügen.

Zum Schluss sind noch die Aufrufe der eigentlichen LaTeX-Engine und von BibTeX anzupassen, so dass das gesamte File nun so aussieht:

<br />#!/bin/bash<br /><br />if [ $# -lt 2 ]<br />then<br />echo "usage:   ( )"<br />exit<br />fi<br /><br /># Executable values<br />PATH=/usr/texbin:/usr/local/bin:$PATH<br />ENGINE=/usr/texbin/pdflatex<br /># ENGINE=/usr/texbin/lualatex<br />BIBTEX=/usr/texbin/bibtex<br /><br /># Process inputs.<br /># TeXnicle passes the file to be processed as the first input to this<br /># script and the working directory as the second input. Other options follow.<br />mainfile=$1<br />outputDir=$2<br />nCompile=$3<br />doBibtex=$4<br />doPS2PDF=$5<br /><br />echo "****************************"<br />echo "*** Compiling $mainfile"<br />echo "*** Output dir $outputDir"<br />echo "*** Ncompile $nCompile"<br />echo "*** Do bibtex $doBibtex"<br />echo "****************************"<br /><br /># Go to the working directory<br />cd "$outputDir"<br /><br /># sometimes the extension is missing ...<br />mainfile=${mainfile%%.Rnw}.Rnw<br /><br /># Running knitr<br />export LANG=de_DE.UTF-8<br />/usr/bin/Rscript -e "library(knitr); knit("${mainfile}")"<br /><br />mainfileTeX=${mainfile%%.Rnw}.tex<br />export TEXINPUTS=$TEXINPUTS:/Library/Frameworks/R.framework/Versions/Current/Resources/share/texmf/tex/latex/<br /><br /># Do the correct number of typesetting runs<br />count=1<br />while [ $count -le $nCompile ]<br />do<br />echo " "<br />echo "***------------------------------------------------------------"<br />echo "*** Run $count..."<br />echo "***------------------------------------------------------------"<br />$ENGINE -synctex=1 -file-line-error -interaction=nonstopmode "$mainfileTeX"<br /><br /># if this is after the first run, run bibtex if requested<br />if [ $count -eq 1 ]<br />then<br />if [ $doBibtex -eq 1 ]<br />then<br />echo "*** Running bibtex..."<br />$BIBTEX "$mainfileTeX"<br />fi<br />fi<br /><br />count=$(( $count + 1 ))<br />done<br /><br />echo "*** pdflatex.engine has completed."<br /><br /># END<br />

Ein analoges File lässt sich natürlich auch für die Verwendung von XeLaTeX erstellen.

Verwendung

Damit TeXnicle nun die neue Engine verwendet, muss man dies im TeXnicle-Projekt einstellen. Diese erreicht man oben links über das Zahnrad.

Engine im Projekt einstellen
Engine im Projekt einstellen

 

Ausblick

In Zukunft möchte ich an dieser Stelle weitere Best-practises rund um das Thema R, LaTeX und Markdown beschreiben.