Move good content out of my computer as fast as possible
Reproducible
Git-based collaboration
Write once, generate:
Code
Paper
PowerPoint
Site/documentation
Literate Programming
Literate programming can help create high-quality reproducible, documented code.
Donald E. Knuth proposed literate programming in a 1984 article.
Jupyter implements the literate programming paradigm, but generating high-quality mass-consumable output (articles, websites) requires additional tools.
I tried many tools for Literate Programming
LaTeX
Needs extra tools like CWeb
Great for PDFs… Beamer for slides
Not great for websites
Dynamic content -> code in Latex
\usepackage{ifthen}
@for, @while
Python notebooks
Great, with Pandoc
Config separated from files
Word/PPT
Hard to collaborate before O365
Hard to reproduce / auto-generate
code and writing separate
RMarkdown
Great for everything
Heavily dependent on R
New features in Quarto
Quarto
Quarto® is an open-source scientific and technical publishing system built on Pandoc.
The name “quarto” comes from the format of a book or pamphlet printed with eight pages of text, four to a side, then folded twice to produce four leaves.
The earliest known European printed book, the Sibyllenbuch (Gutemberg, c.1452), was done in the quarto format. Shakespeare’s plays, too!
With some scripting, you can use Pandoc on .ipynb files to generate papers, HTML, PowerPoint, etc.
You just need to learn Pandoc and shell scripting.
Refresh the page to see the diagram on the right.
graph TD
A[.ipynb] --> B(("Pandoc"))
B ----> E[.doc]
B ----> H[.pptx]
B --> C[.md]
B --> D[.tex]
D --> F((Xetex))
C --> I((Hugo))
F --> G[.pdf]
I --> J[.html]
style B fill:#FF6655AA
style F fill:#88ffFF
style I fill:#88ffFF
Quarto in Python, in a nutshell
All you need to use Quarto is to add some YAML (mostly simplified Pandoc configurations) to a .qmd file.
ipynb + YAML = .qmd.
This keeps the configuration and content in the same file. You can then render the outputs using quarto render <file.qmd> in the command line.
Refresh the page to see the diagram on the right.
graph TD
Q[.qmd] --> A
subgraph Quarto
A[.ipynb] --> B(("Pandoc"))
B --> C[.md]
B --> D[.tex]
D --> F((Xetex))
C --> I((Hugo))
style B fill:#FF6655AA
style F fill:#88ffFF
style I fill:#88ffFF
end
B ----> E[.doc]
B ----> H[.pptx]
F --> G[.pdf]
I --> J[.html]
Using Quarto
The YAML front-matter
Quarto .qmd files always start with a YAML front-matter.
The YAML configuration determines what’s the output format of your document. A few popular output options are html, pptx, docx, and pdf.
You can use a single source file to generate multiple output types.
For example, the YAML on the right will generate a PowerPoint file and a Revealjs presentation.
---title:"Quarto with Python"format:pptx:reference-doc: templates/template.pptxrevealjs:incremental:falsetheme: pulseauthor: Lucas A. Meyerdate: 2022-07-07---
Quarto’s Markdown supports figures, tables, bibliography, etc.
It also supports lots of extra features, like diagrams with mermaid and GraphViz, and even LaTeX equations:
\[
E = mc^2
\]
### Writing contentWrite content in [Markdown].Quarto's Markdown supportsfigures, tables, bibliography, etc. It also supports lots of extra features, like diagrams with `mermaid` and `GraphViz`, and even LaTeX equations: $$E = mc^2$$
What if I want to add code?
The best thing about Quarto is that you can use it to run any code that you would be able to run in a Python notebook.
# Load the datadf_wage = pd.read_csv("data/wage1.csv")# Create an OLS model using R syntaxmod = smf.ols(formula="wage ~ educ", data=df_wage)# Fit the modelres = mod.fit()# Show the resultsreg_table = pd.read_html(res.summary(). tables[1].as_html(), header=0)[0]display(Markdown(reg_table. to_markdown(index=False)))
Presentations in Quarto
Basic slide syntax
To create slides, you create sections with #, titles with ##, and bullets with -.
Content types
You can add several types of content
code (use backticks)
images
diagrams
tables
etc.
## Basic slide syntaxTo create slides, you create sections with `#`, titles with `##`, and bullets with `-`.### Content types- You can add several types of content - code (use backticks) - images - diagrams - tables - etc.
Creating PowerPoint slides
To generate a presentation from a .qmd file, add format: pptx to the YAML front-matter.
Title Slide: created from metadata fields like title and author
Section Header: created from the top-level headings (#)
Two Content: used when .qmd source contains :::: {.columns} and only text content. Previous slide is an example.
Comparison: same as “Two Content”, but content of columns is not text
Content with Caption: used when slide has non-text content, but no columns
Title and Content: whatever doesn’t fit the rules above.
PowerPoint templates
By adding a reference-doc entry to your YAML, you can tell Quarto (and pandoc) to use a file as a template for the format of your presentation.
The “Slide Master” needs to contain layouts named as per the previous slide (e.g. “Comparison”).
This allows you a lot of flexibility in the design of your slide deck, even if it is for just the small number of layouts that were listed in the previous slide.
You can control fonts, add background images, page numbering, etc.
---title:"Using Quarto for everything"format: pptxreference-doc: templates/template.pptxauthor: Lucas A. Meyerdate: 2022-07-14---
Best feature: generate content dynamically
Let’s say you’re presenting a project about population dynamics but you don’t know which world leaders are coming to the conference.
On the presentation day, you learn that Italy, China, Brazil, India, Japan and Nigeria are attending.
You can use Python or R to automatically generate slides.
Generating slides with Python
The next slides/sections were generated using the code below:
df_dr = pd.read_csv("data/dr.csv.gz", compression="gzip")df_pop = pd.read_csv("data/pop_brackets.csv.gz", compression="gzip")years = [2000, 2025, 2050, 2075, 2100]regions = ["Italy", "China", "Brazil", "India", "Japan", "Nigeria"]for name in regions: display(Markdown(f"## Age and Population Pyramids for {name}")) display(Markdown(f'<div class="columns">')) display(Markdown(f'<div class="column">')) plot_dependency_ratio(df_dr[df_dr.Location == name]) display(Markdown(f'</div>')) display(Markdown(f'<div class="column">')) plot_population_pyramid_series(df_pop[df_pop["Location"]==name], years) display(Markdown(f'</div>')) display(Markdown(f'</div>'))
Age and Population Pyramids for Italy
Age and Population Pyramids for China
Age and Population Pyramids for Brazil
Age and Population Pyramids for India
Age and Population Pyramids for Japan
Age and Population Pyramids for Nigeria
Generating a website
Changing one line creates a website
---title:"Quarto with Python"format: html # revealjs: # incremental: false # theme: [simple, revealjs-customizations.scss] # title-slide-attributes: # data-background-image: images/data-viz-bg.jpg # data-background-size: contain # data-background-position: rightauthor: Lucas A. Meyerdate: 2022-07-14---
Adding or changing the format to html will create a website.
Screenshot of website
Scholarly articles
Writing scholarly articles
I reused some of the content of this presentation to create two scholarly-looking articles.
The purpose of the articles is just to show how easy it is to generate them with Quarto, they don’t contain original research.
Quarto adds cross-reference, citations and bibliography support to Markdown.
Citations don’t work on presentations, but are easy to add to articles.
You need to reference a BibTex file in the YAML front-matter bibliography: references.bib. Quarto supports any of the 8000+ Citation Style Languages and will generate the “References” section automatically.
You can cite by using [@citation-name] in your text. Please check the article .qmd source and the PDF and DOCX outputs.
Generating footnotes is also easy. Using [^ref] links to a footnote, and [^ref: content of the footnote] generates its content1.