02 - Authoring Quarto

Quarto, anatomy

  1. Metadata: YAML

  2. Text: Markdown

  3. Code: knitr or jupyter

Add it all together, and you have beautiful, powerful, and useful outputs!

Literate programming

Literate programming is writing out the program logic in a human language with included (separated by a primitive markup) code snippets and macros. - Wikipedia

---
title: "ggplot2 demo"
date: "5/22/2021"
format: html
---

## Air Quality

There is a relationship between temperature and the ozone level.

```{r}
#| label: fig-airquality
library(ggplot2)
ggplot(airquality, aes(Temp, Ozone)) + 
  geom_point() + 
  geom_smooth(method = "loess"
)
```

1 Metadata

Metadata: YAML

“Yet Another Markup Language” or “YAML Ain’t Markup Language”

---
key: value
---

Output Options

---
format: something
---
---
format: html
---
---
format: pdf
---
---
format: revealjs
---

Then add option arguments!

---
format: 
  html:
    toc: true
    code-fold: true
---

Sub-options should be below the main format output and spacing matters!

---
format: 
  html:
    option1: text
    option2: logical
---

YAML for format: html

YAML is sensitive

---
format:html # invalid, no space between
---

---
format: # invalid, read as missing
html
---

---
format: 
  html: # valid but needs next object
---

Valid YAML can look a bit differently based on what all is needed

format: html # valid - there's a space

format:
  html # valid - there's 2x spaces on a new line and no trailing :

# valid - format = HTML with selections made
format: 
  html:
    toc: true

Why YAML?

To avoid manually typing out all the options, every time!

quarto render document.qmd --to html


quarto render document.qmd --to html -M code fold:true


quarto render document.qmd --to html -M code-fold:true -P alpha:0.2 -P ratio:0.3

Demo: Navigating within RStudio

Quarto workflow

Executing the Quarto Render button in RStudio will call Quarto render in a background job - this will prevent Quarto rendering from cluttering up the R console, and gives you and easy way to stop.

Rendering

  1. Render in RStudio, starts a background job and previews the output
  1. System shell via quarto render
quarto render document.qmd # defaults to html
quarto render document.qmd --to pdf
quarto render document.qmd --to docx
  • Renders via terminal
  1. R console via quarto R package
library(quarto)
quarto_render("document.qmd") # defaults to html
quarto_render("document.qmd", output_format = "pdf")

Our Turn

  • Open RStudio and materials/workshop/visual-editor.qmd
  • Compare behavior of rendering from RStudio > Render, using the CLI with quarto render, and in R console via quarto::quarto_render()

Quarto linting

Lint, or a linter, is a static code analysis tool used to flag programming errors, bugs, stylistic errors and suspicious constructs. - Lint

Quarto YAML Intelligence

RStudio + VSCode provide rich tab-completion - start a word and tab to complete, or Ctrl + space to see all available options.

Our turn

  • Open a new Quarto document in RStudio
  • Try Ctrl + space to see the available YAML options
  • Try out the tab-completion of any options you remember

HTML options

quarto.org/docs/reference/formats/html

You can use the HTML reference if needed.

Text & Markdown

Lists

Markdown Syntax Output
* unordered list
    + sub-item 1
    + sub-item 2
        - sub-sub-item 1
  • unordered list

    • sub-item 1

    • sub-item 2

      • sub-sub-item 1
*   item 2

    Continued (indent 4 spaces)
  • item 2

    Continued (indent 4 spaces)

1. ordered list
2. item 2
    i) sub-item 1
         A.  sub-sub-item 1
  1. ordered list

  2. item 2

    1. sub-item 1

      1. sub-sub-item 1
(@)  A list whose numbering

continues after

(@)  an interruption
  1. A list whose numbering

continues after

  1. an interruption
term
: definition
term

definition

Text Formatting

Markdown Syntax Output
*italics* and **bold**
italics and bold
superscript^2^ / subscript~2~
superscript2 / subscript2
~~strikethrough~~
strikethrough
`verbatim code`
verbatim code

Headings

Markdown Syntax Output
# Header 1

Header 1

## Header 2

Header 2

### Header 3

Header 3

#### Header 4

Header 4

##### Header 5
Header 5
###### Header 6
Header 6

Tables

| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
|   12  |  12  |    12   |    12  |
|  123  |  123 |   123   |   123  |
|    1  |    1 |     1   |     1  |
Right Left Default Center
12 12 12 12
123 123 123 123
1 1 1 1

Tables from code

knitr itself can turn R dataframes into tables with knitr::kable()

A very simple table generator, and it is simple by design. It is not intended to replace any other R packages for making tables. . . .

head(mtcars) |> 
  knitr::kable()
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

Quotes

Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do. - Donald Knuth, Literate Programming 1

> Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do. - Donald Knuth, Literate Programming

I like dogs
And I like cats

> I like dogs
> And I like cats

Code

Anatomy of a code chunk

```{r}
#| label: car-stuff
#| echo: false
mtcars %>% 
  distinct(cyl)
```
  • Has 3x backticks on each end ```
  • Indicate engine (r) between curly braces {r}
  • Place options underneath, behind the #| (hashpipe): #| option1: value

Divs and Spans

Pandoc and therefore Quarto can parse “fenced Div blocks”

::: {.border}
This content can be styled with a border
:::

This content can be styled with a border

This is text with [special]{style="color:red;"} formatting.

This is text with special formatting.

You’re not limited to HTML/CSS concepts - Pandoc and Quarto also have “attributes” that can be assigned in this way.

Divs and Spans

  • You can think of a ::: div as a HTML <div> but it can also apply in specific situations to content in PDF
  • Similarly, [text]{.class} spans can be thought of a <span .class>Text</span> but again are a bit more transferable if using Pandoc/Quarto native attributes.

The following, if specifying a Quarto class can often apply between formats.

::: {.unnumbered .unlisted}
Text
:::

While the following is hard-coded as HTML.

<div style="font-size: 200px;">Text</div>

Callout Blocks

:::{.callout-note}
Note that there are five types of callouts, including: 
`note`, `tip`, `warning`, `caution`, and `important`.
:::

Note

Note that there are five types of callouts, including: note, tip, warning, caution, and important.

Warning

Callouts provide a simple way to attract attention, for example, to this warning.

This is important

Danger, callouts will really improve your writing.

Tip with caption

Caution, under construction

Here is something under construction

Callout markdown syntax

:::{.callout-note}
Note that there are five types of callouts, including:
`note`, `warning`, `important`, `tip`, and `caution`.
:::


:::{.callout-tip}
## Tip With Caption

This is an example of a callout with a caption.
:::



:::{.callout-caution collapse="true"}
## Expand To Learn About Collapse

This is an example of a 'folded' caution callout that can be expanded by the user. You can use `collapse="true"` to collapse it by default or `collapse="false"` to make a collapsible callout that is expanded by default.
:::

Our turn

  • Open materials/workshop/02-authoring/callout-boxes.qmd
  • Try changing the types of callouts/remove them from code boxes and then render
  • Open materials/workshop/02-authoring/callout-pdf.qmd and render it as well

Figures

Basic markdown syntax:

![Boston Terrier](images/boston-terrier.png)

Boston Terrier

Figures w/ code

```{r}
#| fig-width: 4
#| fig-align: right

knitr::include_graphics("images/howard-gentleman.jpeg")
```

Fragments/spans

![Boston terrier](images/boston-terrier.png){fig-align="left"}

![](images/boston-terrier.png){fig-align="right" fig-alt="A photo a Boston Terrier."}

A photo a Boston Terrier.

Subfigures fenced div class

::: {#fig-bostons layout-ncol=2}

![Excited](images/boston-terrier.png){#fig-boston width="250px"}

![Sleeping](images/boston-sleep.png){#fig-sleep width="250px"}

Two states of Howard

:::

Subfigures

(a) Excited

(b) Sleeping

Figure 1: Two states of Howard

Subfigures

Subfigures

::: {#fig-bostons layout-nrow=2}

![Excited](images/boston-terrier.png){#fig-boston width="250px"}

![Sleeping](images/boston-sleep.png){#fig-sleep width="250px"}

![Still Excited](images/boston-terrier.png){#fig-boston width="250px"}

![Still sleeping](images/boston-sleep.png){#fig-sleep width="250px"}

:::

Subfigures

Excited

Sleeping

Still Excited

Still sleeping

Two states of Howard, twice

Subfigures

::: {layout-ncol="2"}
![Excited](images/boston-terrier.png){width="250px"}

![Sleeping](images/boston-sleep.png){width="250px"}

![Still Excited](images/boston-terrier.png){width="250px"}

![Still sleeping](images/boston-sleep.png){width="250px"}

Two states of Howard, twice
:::

Excited

Sleeping

Still Excited

Still sleeping

Two states of Howard, twice

Diagrams w/ mermaid

flowchart LR
  A[Hard edge] --> B(Round edge)
  B --> C{Decision}
  C --> D[Result one]
  C --> E[Result two]