# “LaTeX Error: Can be used only in preamble” even though all directives before begin directive

In the following simplified version of a markdown doc intended for pandoc/latex generation to pdf:

\documentclass{article}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Schola}
\setmathfont{TeX Gyre Schola Math}
\begin{document}

## Custom F1 Score For Scoring of Graph Matching

### Overview

The F1 Score is intended to compare two sets:

- Truth Set
- Actuals Set

Its calculation is:

$$F_{\beta} = (1 + \beta^2) \cdot \frac{\mathrm{precision_k} \cdot \mathrm{recall_k^2}}{(\beta^2 \cdot \mathrm{precision_k}) + \mathrm{recall_k}}$$

\end{document}


Notice that all of the preamble directives happen before the begin{document}

The pdf is generated via pandoc:

    \$pandoc  -V fontsize=9pt --pdf-engine xelatex -V
geometry:"left=2cm,right=2cm,top=2cm,bottom=2cm" -o myDoc.pdf myDoc.md


The following error is produced:

Error producing PDF.
! LaTeX Error: Can be used only in preamble.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
...

l.60 \documentclass


What is incorrect here for bringing in a mathsy font?

• In markdown you need a YAML header, not \documentclass{article}. Use something like - header-includes: -\usepackage{unicode-math} -\setmainfont{TeX Gyre Schola} -\setmathfont{TeX Gyre Schola Math}. See, for example, How to include LaTeX package in R Markdown? – Werner Dec 12 '18 at 6:18
• @Werner - ah ya .. I have other docs doing that and will go copy and paste from them. Pls make this an answer – javadba Dec 12 '18 at 6:19

The conversion of a markdown document places content within a YAML header within the preamble. However, since there is no YAML header specified, the contents is assumed to form part of the regular document body. As such, \documentclass (and the rest) ends up after \begin{document} and not in the preamble. Hence, the error "Can be used only in preamble" and pointing to \documentclass...

You'll need something like this:

---
title: "Some title"
author: "Some author"
- \usepackage{unicode-math}
- \setmainfont{TeX Gyre Schola}
- \setmathfont{TeX Gyre Schola Math}
output:
pdf_document
---

## Custom F1 Score For Scoring of Graph Matching

### Overview

...

• ya i forgot to add that yaml header. – javadba Dec 12 '18 at 6:30
• In newer versions of pandoc you can set the fonts directly: mainfont: 'TeX Gyre Schola' and mathfont: 'TeX Gyre Schola Math', cf. pandoc.org/MANUAL.html#variables-for-latex – DG' Dec 12 '18 at 7:05

It seems you have two problems.

The first is that you need to escape the # symbols (i.e. like \#).

The second is your pandoc command. You need to add --from latex to it, like this:

pandoc  -V fontsize=9pt --from latex --pdf-engine xelatex -V geometry:"left=2cm,right=2cm,top=2cm,bottom=2cm" -o myDoc.pdf myDoc.md


I'm not entirely sure why you are using LaTeX code in a Markdown file, however. When I change your command to:

pandoc  -V fontsize=9pt --pdf-engine xelatex -V geometry:"left=2cm,right=2cm,top=2cm,bottom=2cm" -o myDoc.pdf myDoc.tex


And the file from .md to .tex, it also fixes the problem. It seems more natural to just keep it as a .tex file, because it is a .tex file. Not sure if I misunderstood something?

• "escape the #" huh ? this absolutely is markdown. I have truncated a couple hundred line markdown file to show just the tex` related portion of it. – javadba Dec 12 '18 at 6:03
• @javadba it was difficult to tell. Looked like TeX, but you were saying Markdown, so I was a little confused what you were aiming for. I decided to go the route of the document provided, whereas Werner went the route that you said in your post :) Anyhow, glad it worked out with his answer. – whatisit Dec 12 '18 at 6:55