Photo by Chris Leggat on Unsplash.

Workflow: Ulysses, BibDesk, R Markdown und LaTeX

Das Verfassen wissenschaftlicher Texte geht mit einer Vielzahl wiederkehrender Aktionen einher. Nachem ich lange Zeit Scrivener und Papers verwendet habe, setzte ich seit kurzem auf die Kombination Ulysses (Pandoc Markdown) und BibDesk. Dank Pandoc Templates ist eine sehr komfortable Integration der jeweiligen Literatur möglich. Beispielsweise wandelt die Eingabe author=turner mit dem Anschließenden Aufruf des Systemdienstes “Zitat vervollständigen” mittels ⌘⇧J in den entsprechenden Cite Key um. Eine komplette Suche der BibDesk Bibliothek direkt im geschriebenen Text empfinde ich als sehr komfortabel. Sind Teile des Cite Keys bekannt, kann man diesen auch direkt vervollständigen. Hierfür ist die Tastenkombination ⌘⇧K voreingestellt. Darüber hinaus exitiert der Dienst “Zeige Eintrag mit Cite Key”, dem man allerdings noch eine Tastenkombination zuweisen muss. Er ermöglicht die Anzeige des entsprechenden $\rm{B{\small\kern-0.1emI\kern-0.017emB}}\kern-0.15em\TeX$ Eintrags, inkl. hinterlegter PDF und ggf. Skim Notizen.

Neben der Frage nach der Zitation stellt sich die Frage nach der Intergration von R Code. Hierfür nutze ausführbare Codeblöcke in Ulysses, so dass ich direkt meinen R Code schreiben kann. Besonders komfortabel ist dieses Vorgehen, wenn man auf Archivist Objekte zurückgreift. Kompexe Analysen führe ich weiterhin mit RSudio aus, speichere die Ergebnisse (Datensätze, Grafiken, Tabellen etc.) ab und greife dann direkt in Ulysses darauf zu. Zahlendreher oder ein aufwendiges Erstellen von Grafiken ist nicht nötig. Alles wird “live” und immer aktuelle zusammengestellt.

Für diesen Workflow habe ich folgendes Skript geschrieben, das den Ulysses Pandoc Markdown Export in ein $\LaTeX$ gesetztes PDF übersetzt.

#!/bin/bash

# Dissertation setzen
# Copyright 2017 Fabian Mundt

# Order öffnen
cd /path/to/manuscript

# R Markdown erzeugen
mv index.md index.Rmd

# R Markdown (knitr) ausführen
Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::pdf_book')"

# Markdown erzeugen
mv index.Rmd index.md

# Template Dateien löschen
rm zeit-raum-studium.glo
rm zeit-raum-studium.run.xml
rm zeit-raum-studium.xdy

# PDF verschieben
mv _book/zeit-raum-studium.pdf Zeit-Raum\ Studium.pdf

# LaTeX Skript kopieren
cp _book/zeit-raum-studium.tex zeit-raum-studium.tex

# Bilder etc. kopieren
cp -R _bookdown_files/zeit-raum-studium_files zeit-raum-studium_files

# LuaLaTeX ausführen
lualatex zeit-raum-studium.tex

# Zitate setzen
biber zeit-raum-studium.bcf

# Index erstellen
makeglossaries zeit-raum-studium

# Index erstellen
splitindex -M texindy zeit-raum-studium

# Finales Dokument setzen (zweimal, um die Verzeichnisse zu generieren)
lualatex zeit-raum-studium.tex
lualatex zeit-raum-studium.tex

# Bilder löschen
rm -rf zeit-raum-studium_files

# LaTeX Dateien löschen
rm zeit-raum-studium.tex
rm zeit-raum-studium.aux
rm zeit-raum-studium.bbl
rm zeit-raum-studium.bcf
rm zeit-raum-studium.blg
rm zeit-raum-studium.glg
rm zeit-raum-studium.glo
rm zeit-raum-studium.gls
rm zeit-raum-studium.idx
rm zeit-raum-studium.lof
rm zeit-raum-studium.log
rm zeit-raum-studium.lot
rm zeit-raum-studium.out
rm zeit-raum-studium.run.xml
rm zeit-raum-studium.toc
rm zeit-raum-studium.xdy

# PDF verschieben
mv zeit-raum-studium.pdf Zeit-Raum\ Studium.pdf

# LaTeX Dateien löschen
rm -rf _bookdown_files
rm -rf _book

Besonders wichtig ist die Konfiguration des Bookdown Pakets (_bookdown.yml):

book_filename: "zeit-raum-studium"
rmd_files: ["_setup.Rmd", "index.Rmd"]

In der _setup.Rmd Datei lege ich dann einen Code Chunk {r setup, include=FALSE} an, der die verwendeten Objekte lädt und allgemeine Einstellungen vornimmt:

# Pakete laden
pacman::p_load("TimeSpaceAnalysis")

# Allgemeine Ausgaberegeln festlegen
knitr::opts_chunk$set(echo = FALSE)
knitr::opts_chunk$set(message = FALSE)
knitr::opts_chunk$set(warnings = FALSE)
knitr::opts_chunk$set(fig.showtext=TRUE)
knitr::opts_chunk$set(fig.pos="H")
knitr::opts_chunk$set(fig.align="center")
knitr::opts_chunk$set(dev = "pdf")

# Repository festlegen
aoptions("repoDir", "/path/to/repository")
aoptions("repo", "/path/to/repository")

# Daten laden
loadFromLocalRepo(names(asearch("name:datensatz_allgemeine_angaben")))
## Wintersemester 15/16
loadFromLocalRepo(names(asearch("name:daten_zeitverwendung_1516")))
loadFromLocalRepo(names(asearch("name:daten_studienorte_1516")))
loadFromLocalRepo(names(asearch("name:daten_rahmenbedingungen_1516")))
## Sommersemester 16
loadFromLocalRepo(names(asearch("name:daten_zeitverwendung_16")))
loadFromLocalRepo(names(asearch("name:daten_studienorte_16")))
loadFromLocalRepo(names(asearch("name:daten_rahmenbedingungen_16")))
## Wintersemester 16/17
loadFromLocalRepo(names(asearch("name:daten_zeitverwendung_1617")))
loadFromLocalRepo(names(asearch("name:daten_studienorte_1617")))
loadFromLocalRepo(names(asearch("name:daten_rahmenbedingungen_1617")))

## Liste der Gruppen generieren
gruppen <- list(spalten = c(ncol(daten_zeitverwendung_1516),
                            ncol(daten_studienorte_1516),
                            ncol(daten_rahmenbedingungen_1516)),
                namen = c("Zeitverwendung",
                          "Studienorte",
                          "Rahmenbedingungen"))

## Geometrische Modelle
loadFromLocalRepo(names(asearch("name:mca_studienalltag")))
loadFromLocalRepo(names(asearch("name:hcpc_studienalltag")))

Für ein ansprechendes Aussehen gereife ich auf $\LaTeX$ zurück. Das lässt sich in der Datei _output.yml genauer spezifizieren:

bookdown::pdf_book:
  latex_engine: lualatex
  citation_package: biblatex
  keep_tex: true
  template: _template.latex
  pandoc_args: ["--listings"]

Zuletzt verwende ich ein spezielles $\LaTeX$-Template, um einen ansprechenden Satz zu erzielen (_template.latex):

\documentclass[12pt,twoside=false,index=totoc,numbers=noenddot]{scrbook}

% LuaLaTeX Standardpakete
\usepackage{luatextra} % lädt fontspec, luacode, metacode, fixltx2e, luatexbase, lualibs

% Standardschriften
\setmainfont{Minion Pro}
\setsansfont{Myriad Pro}
\setmonofont{Consolas}

% Formelschrift
% Minion Math ist leider eine kommerzielle Schrift
\usepackage{MnSymbol}
\usepackage{unicode-math}

\setmathfont{MdSymbol-Regular.otf}
\setmathfont[range=\mathup/{num,latin,Latin,greek,Greek}]{Minion Pro}
\setmathfont[range=\mathbfup/{num,latin,Latin,greek,Greek}]{MinionPro-Bold}
\setmathfont[range=\mathit/{num,latin,Latin,greek,Greek}]{MinionPro-It}
\setmathfont[range=\mathbfit/{num,latin,Latin,greek,Greek}]{MinionPro-BoldIt}
\setmathfont[range=\mathscr,StylisticSet={1}]{MinionPro-It}

% Zeilenabstand
\usepackage[onehalfspacing]{setspace}

% Anführungszeichen
\usepackage[german=guillemets]{csquotes}

% Fußnote mit Abstand zum Fußnotentext
\deffootnote{1em}{1em}{%
\makebox[1em][l]{\textsuperscript{\thefootnotemark}}}

% Fuß- und Kopfzeile
\usepackage[automark]{scrpage2}
\automark[section]{chapter} % Bis zu welcher Überschriftenebene soll geschrieben werden
\pagestyle{scrheadings}
\clearscrheadfoot % Kopf- und Fußzeile werden gelöscht
\ohead{\headmark} % Kapitel wird in die Kopfzeile außen geschrieben
\ofoot[\pagemark]{\pagemark} %Seitenzahl wird in die Fußzeile außen geschrieben
\renewcommand*{\partpagestyle}{empty} % Seitenzahl bei Teilseiten löschen

% Bezeichnung allgemeiner Kürzel
\usepackage{polyglossia}
\setdefaultlanguage{german}
\setotherlanguages{english}

% Sach- und Personenregister
\usepackage[makeindex]{splitidx}
\newindex[Sachregister]{sach}
\newindex[Personenregister]{pers}
\usepackage[font=small]{idxlayout}

% Listings für R Markdown
\usepackage{listings}

% Randnotizen
\newcommand*{\sidenote}[1]{\hspace{0pt}\marginline{\textsf{\footnotesize #1}}}

% Verweise
\usepackage[german]{varioref}
\usepackage[plainpages=false,pdfpagelabels,raiselinks=true,colorlinks=true,linkcolor=black,citecolor=black,filecolor=black,urlcolor=black]{hyperref}
\usepackage{cleveref}

% Glossar
\usepackage[xindy={language=german, codepage=utf8}, style=long, toc]{glossaries}
\makeglossaries

% Zitation und Bibliografie
\usepackage[style=authoryear-icomp,block=ragged,uniquelist=false,url=false,isbn=false]{biblatex}
\addbibresource{/Users/fabianmundt/Library/Mobile Documents/com~apple~CloudDocs/Papers/Bibliography.bib}

% Zitationsstil anpassen
% Punkte durch Doppelpunkt ersetzen
\renewcommand{\labelnamepunct}{\addcolon\addspace}
\renewcommand{\postnotedelim}{\addcolon\addspace}
% Komma wegen natbib-Kompatibilität löschen
\renewcommand*{\nameyeardelim}{\space}
% Das S. enfernen
\DeclareFieldFormat{postnote}{#1}
\DeclareFieldFormat{multipostnote}{#1}
\DeclareFieldFormat{pages}{#1}
% Autoren in der Literaturliste als Kapitälchen
\AtBeginBibliography{
 \renewcommand*{\mkbibnamefamily}[1]{\textsc{#1}}
}
% Leerzeichen zwischen Seitenzahl und Suffix entfernen
\renewcommand*{\sqspace}{}
% Originaldatum anzeigen
\renewbibmacro*{date}{%
  \iffieldundef{origyear}{%
  }{%
    \setunit*{\addspace}%
    \printtext[parens]{orig. \printorigdate}%
  }%
}
% Längere Zitate verkleinern
\makeatletter
\g@addto@macro\quote{\small}
\makeatother

% Eingangszitat
\usepackage{epigraph}
\setlength{\epigraphrule}{0pt}
\setlength{\epigraphwidth}{0.5\textwidth}
\renewcommand{\textflush}{flushepinormal}

% Pandoc Template Anpassungen
\providecommand{\tightlist}{%
  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}

% Beschriftung von Grafiken und Tabellen
\usepackage[labelfont=bf]{caption}
\setlength{\belowcaptionskip}{10pt}

% Erster Buchstabe größer
\usepackage{lettrine}

% Bildermanagement
\usepackage{graphicx}
\usepackage{epstopdf}

% Farbmanagement
\usepackage{xcolor}

% Grafikproduktion
\usepackage{tikz}
\usetikzlibrary{arrows,backgrounds,fit,decorations.pathreplacing}

% Bilder positionieren
\usepackage{float}
\usepackage{rotating}
\usepackage{rotfloat}

% Mehrere parallele Bilder
\usepackage{subfig}

% Tabellen
\usepackage{longtable}
\usepackage{booktabs}

% Absatzkontrolle aktivieren
\clubpenalty = 10000
\widowpenalty = 10000
\displaywidowpenalty = 10000

% Schrifgröße der Verzeichnisse verringern
\renewcommand{\bibfont}{\normalfont\small}
\renewcommand{\glsnamefont}[1]{\mdseries\small #1}


% Inhaltsverzeichnis umbenennen
\addto\captionsgerman{
  \renewcommand{\contentsname}{Inhalt}
}

% Glossareinträge
\newglossaryentry{GDA}{name = GDA, description = {Geometrische Datenanalyse}}

\begin{document}
    \titlehead{\centering TITLEHEAD}
    \subject{SUBJECT}
    \title{TITLE}
    \subtitle{SUBTITLE}
    \author{AUTHOR}
    \date{YEAR}
    \publishers{\large Betreut durch\\ SUPERVISORS}
\maketitle

\begingroup
  \ohead{}
  \frontmatter
  \tableofcontents
  \listoftables
  \listoffigures
  % \listofdiagrams
  \clearpage
\endgroup

\ohead{\headmark}
\mainmatter

$body$

\backmatter

\printbibliography[title=Literaturverzeichnis, heading=bibintoc]

\printglossary

\printindex*

\end{document}

comments powered by Disqus