- Why?
- Prerequisites
- Sample repository
- Basics
- YAML LaTeX Metadata
- IEEE Template
- Referencing Figures
- Bibliography
- Bibliography in Markdown
- md2pdf-ieee.fish
- Conclusion
This post is a how-to guide on how a research paper can be written in Markdown and then converted to a PDF following IEEE style. In case you are not familiar, IEEE style is usually the format how technical research papers are written.
Why?
If you ever need to write an IEEE style research/technical paper your options are pretty much as follows:
- 
    write in Microsoft Word This is definitely an option however if you are a developer and are used to writing things in plaintext, with version control, this might not be an appealing option. 
- 
    write in LaTeX LaTeX is really amazing at generating PDFs however its syntax is very flexible but complicated (at least to a beginner) which makes it a really good option if you are already familiar with LaTeX but not very appealing if you are new to LaTeX or simply don’t like the syntax. 
- 
    write in anything but LaTeX and then convert to LaTeX Since LaTeX is so good at generating PDFs, it would be amazing to be able to write the paper in a much simpler markup language such as Markdown and then convert it to LaTeX to generate the PDF. Enter Pandoc! Pandoc is a document swiss-army converter between various markups, including Markdown and LaTeX. This post will guide in more detail how exactly to do that. 
Prerequisites
This post assumes you are using a Mac however many of the steps should be compatible with Linux or if not might need only minor changes.
First lets install all dependencies with Homebrew:
$ brew install \
    fish \
    pandoc \
    pandoc-citeproc \
    pandoc-crossref
$ brew cask install basictex
BasicTeX is a lightweight distribution of LaTeX however as such it does not
support some things such as SVG images. If you need to use SVG images in
the paper, instead of basictext you should install the following:
$ brew install rsvg-convert
$ brew cask install mactext-no-gui
Sample repository
All examples in this post can be found in md2pdf-ieee-sample GitHub
repository. All cd commands in the examples indicate in which folder the of
the sample repository commands should be executed in. To clone the repository:
$ git clone https://github.com/miki725/md2pdf-ieee-sample.git
$ cd md2pdf-ieee-sample
Basics
As all dependencies are ready, lets try a basic example. We will convert a simple Markdown document to a PDF:
# Basic Title
## Very Important Subtitle
**Super** amazing article *here* about
[cats](https://www.pexels.com/search/cat/).
](cat.jpg)
If all goes well final PDF should look something like:

Here are the commands to create the PDF:
$ cd basics
$ pandoc --from markdown --to latex --output basics.pdf basics.md
Lets break the pandoc command down:
- --fromspecifies the input file markup format name
- --tospecifies the output file markup format name
- 
    --outputspecifies the output filename. Note that even thoughtofile format islatex, since filename has extensionpdf, pandoc will automatically create PDF from converted LaTeX document. If you omit theoutputparameter, pandoc will show the converted LaTeX document:$ pandoc --from=markdown --to=latex basics.md
YAML LaTeX Metadata
Full research paper requires more metadata than Markdown allows to annotate
therefore some LaTeX cannot be avoided. Pandoc allows to specify such
metadata with YAML. It can be provided either as a separate file with
--metadata-file parameter or be directly embedded in Markdown file as YAML
header. Here is a simple metadata header example:
---
title: Basic Title
subtitle: Very Important Subtitle
author:
  - name: Miroslav Shubernetskiy
    affiliation: GameChanger
    location: New York
    email: example@gc.com
numbersections: yes
lang: en
abstract: |
    This paper is a basic example with LaTeX metadata.
header-includes: |
  \usepackage{booktabs}
...
---
$ cd paper-metadata
$ pandoc --from markdown --to latex --output basics.pdf basics.md
Generated PDF should look similar to:

Its not perfect but we will be improving it in the following sections.
IEEE Template
Above example adds some metadata which is only used by IEEE template hence the
true in the paper header. Applying IEEE template fixes those issues and
makes PDF look like this:

Much better :D.
IEEE template itself consists of 2 files:
- IEEEtran.cls- LaTeX class file with all IEEE specifications
- template.latex- paper template which uses the- IEEEtran.clsto format the LaTeX document
The command which uses all the files to generate PDF:
$ cd ieee-template
$ pandoc \
    --from=markdown \
    --to=latex \
    --template=template.latex \
    --output=ieee-template.pdf \
    ieee-template.md
Referencing Figures
Referencing figures is relatively simple. Adding a figure is as simple as including an image in Markdown except at the end a figure label is added which allows to reference it in other places:
See @fig:cat.
](cat.jpg){#fig:cat}

When multiple figures are present pandoc will automatically cross reference the
correct figure number however that requires providing additional --filter
flags to pandoc:
$ cd figures
$ pandoc \
    --from=markdown \
    --to=latex \
    --template=template.latex \
    --filter=pandoc-crossref \
    --filter=pandoc-citeproc \
    --output=figures.pdf \
    figures.md
Note that the order of pandoc-crossref and pandoc-citeproc is important.
Bibliography
Any good research paper should include references. Pandoc allows to provide a bibliography via a BibTeX file. PDF with References section as well as a citation to a reference should look like this:

A BibTeX reference looks like the following and multiple references can be
combined in bibliography.bib:
@article{shell2019use,
  title={How to use the IEEEtran LATEX class},
  author={Shell, Michael},
  journal={IEEE Design \& Test},
  year={2019},
  publisher={IEEE}
}
Some services like Google Scholar allow to download references directly in BibTeX format:

All references can be included in Markdown with nocite: '@*' YAML document.
Also note that each BibTeX includes a label. For the example above, that label
is shell2019use and it can be used to cite references in the paper simply
with a @<label>:
Shell [@shell2019use] writes more about `IEEEtran` file.
# References
---
nocite: '@*'
---
By default references are not formatted with IEEE style therefore additional configuration file is necessary:
- bibliography.csl- LaTeX class file for formatting references
The command to generate PDF is now:
$ cd bibliography
$ pandoc \
    --from=markdown \
    --to=latex \
    --template=template.latex \
    --filter=pandoc-crossref \
    --filter=pandoc-citeproc \
    --bibliography=bibliography.bib \
    --csl=bibliography.csl \
    --output=bibliography.pdf \
    bibliography.md
Bibliography in Markdown
Instead of relying on bibliography.bib, there is a way to define all
references in the YAML header however it has a different format compared to
BibTeX which means BibTeX references cannot be simply copy-pasted. There is a
hack though :D. Copy BibTeX references to YAML as is, and then extract them
into bibliography.bib with a script. Given Markdown YAML header:
title: Basic Title
subtitle: Very Important Subtitle
author:
  - name: Miroslav Shubernetskiy
    affiliation: GameChanger
    location: New York
    email: example@gc.com
numbersections: yes
lang: en
bibliography: |
  @article{shell2019use,
    title={How to use the IEEEtran LATEX class},
    author={Shell, Michael},
    journal={IEEE Design \& Test},
    year={2019},
    publisher={IEEE}
  }
abstract: |
    This paper is a basic example with LaTeX metadata
    with IEEE template.
header-includes: |
  \usepackage{booktabs}
...
---
All bibliography references can be extracted with a bit of Python:
$ cd bibliography-md
$ cat bibliography-md.md | python -c "
import itertools
import sys
print('\n'.join(
    list(
        map(
            lambda i: i.strip(),
            itertools.takewhile(
                lambda i: i.strip() != i or i.startswith('bibliography'),
                itertools.dropwhile(
                    lambda i: not i.startswith('bibliography'),
                    sys.stdin.read().splitlines()
                ),
            )
        )
    )[1:]
))
" > bibliography.bib
$ pandoc \
    --from=markdown \
    --to=latex \
    --template=template.latex \
    --filter=pandoc-crossref \
    --filter=pandoc-citeproc \
    --bibliography=bibliography.bib \
    --csl=bibliography.csl \
    --output=bibliography-md.pdf \
    bibliography-md.md
Granted this is a bit hacky but it allows paper to be self-contained. In the next section we will make the paper to be even more self-contained.
md2pdf-ieee.fish
Now we can generate research paper PDF with IEEE style however the pandoc
command has lots of parameters and we need to download multiple files
first into the current directory before generating PDF. We can abstract
all that away though with md2pdf-ieee.fish function.
The function does the following:
- downloads all necessary files to ~/.pandoc
- extracts the bibliography from the Markdown file
- generates PDF with pandoc
- opens the generated file
Installing and using the function is pretty easy. Simply download
md2pdf-ieee.fish to ~/.config/fish/functions/md2pdf-ieee.fish or download
with curl:
$ mkdir -p ~/.config/fish/functions
$ curl -L http://bit.ly/2MHJgMn \
    > ~/.config/fish/functions/md2pdf-ieee.fish
If you use fish as a default shell simply call the function:
$ cd md2pdf-ieee
# source should automatically happen
# if you start another fish shell
$ source ~/.config/fish/functions/*
$ md2pdf-ieee paper.md
Or if you use any other shell you can call fish function with:
$ cd md2pdf-ieee
$ fish -c 'md2pdf-ieee paper.md'
This allows to write a complete paper in a single Markdown file and convert to PDF with a single command. Easy-peasy!
Conclusion
Congratulations. You should be able to create, if I may, beautiful, documents. Now all you need is a good research idea!