Skip to content
04-formatting.md 8.78 KiB
Newer Older
Greg Wilson's avatar
Greg Wilson committed
---
title: "Formatting"
teaching: 10
exercises: 0
questions:
maneesha sane's avatar
maneesha sane committed
- "How are The Carpentries lessons formatted?"
Greg Wilson's avatar
Greg Wilson committed
objectives:
- "Explain the header of each episode."
- "Explain the overall structure of each episode."
- "Explain why blockquotes are used to format parts of episodes."
- "Explain the use of code blocks in episodes."
keypoints:
Greg Wilson's avatar
Greg Wilson committed
- "Lesson episodes are stored in _episodes/dd-subject.md."
- "Each episode's title must include a title, time estimates, motivating questions, lesson objectives, and key points."
- "Episodes should not use sub-titles or HTML layout."
Raniere Silva's avatar
Raniere Silva committed
- "Code blocks can have the source, regular output, or error class."
Greg Wilson's avatar
Greg Wilson committed
- "Special sections are formatted as blockquotes that open with a level-2 header and close with a class identifier."
- "Special sections may be callouts or challenges; other styles are used by the template itself."
Greg Wilson's avatar
Greg Wilson committed
---
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
A lesson consists of one or more episodes,
each of which has:

Greg Wilson's avatar
Greg Wilson committed
*   a [YAML][yaml] header containing required values
*   some teachable content
*   some exercises
Greg Wilson's avatar
Greg Wilson committed

The diagram below shows the internal structure of a single episode file
(click on the image to see a larger version):

<a href="{{ page.root }}/fig/episode-format.png">
  <img src="{{ page.root }}/fig/episode-format-small.png" alt="Formatting Rules" />
</a>
## Maximum Line Length

Limit all lines to a maximum of 100 characters.
`bin/lesson_check.py` will report lines longer than 100 characters
and this can block your contributions of being accepted.

The two reasons behind the decision to enforce a maximum line lenght are
(1) make diff and merge easier in the command line and other user interfaces
and
(2) make update of translation of the lessons easier.

Greg Wilson's avatar
Greg Wilson committed
## Locations and Names

Greg Wilson's avatar
Greg Wilson committed
Episode files are stored in `_episodes`
or, for the case of R Markdown files, `_episodes_rmd`
Greg Wilson's avatar
Greg Wilson committed
so that [Jekyll][jekyll] will create a [collection][jekyll-collection] for them.
Greg Wilson's avatar
Greg Wilson committed
Episodes are named `dd-subject.md`,
where `dd` is a two-digit sequence number (with a leading 0)
and `subject` is a one- or two-word identifier.
For example,
the first three episodes of this example lesson are
`_episodes/01-design.md`,
`_episodes/02-tooling.md`
and `_episodes/03-formatting.md`.
These become `/01-design/index.html`, `/02-tooling/index.html`, and `/03-formatting/index.html`
in the published site.
Greg Wilson's avatar
Greg Wilson committed
When referring to other episodes, use:

{% raw %}
    [link text]({{ page.root }}{% link _episodes/dd-subject.md %})
Greg Wilson's avatar
Greg Wilson committed
{% endraw %}

i.e., use [Jekyll's tag link](https://jekyllrb.com/docs/templates/#links) and the name of the file.
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
## Episode Header

Greg Wilson's avatar
Greg Wilson committed
Each episode's [YAML][yaml] header must contain:

*   the episode's title
*   time estimates for teaching and exercises
*   motivating questions
*   lesson objectives
*   a summary of key points

These values are stored in the header so that [Jekyll][jekyll] will read them
and make them accessible in other pages as `site.episodes.the_episode.key`,
where `the_episode` is the particular episode
and `key` is the key in the [YAML][yaml] header.
This lets us do things like
list each episode's key questions in the syllabus on the lesson home page.
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
## Episode Structure

Greg Wilson's avatar
Greg Wilson committed
The episode layout template in `_layouts/episode.html` automatically creates
Greg Wilson's avatar
Greg Wilson committed
an introductory block that summarizes the lesson's teaching time,
exercise time,
key questions,
and objectives.
It also automatically creates a closing block that lists its key points.
Greg Wilson's avatar
Greg Wilson committed
In between,
authors should use only:

*   paragraphs
*   images
*   tables
*   ordered and unordered lists
*   code samples (described below).
Greg Wilson's avatar
Greg Wilson committed
*   special blockquotes (described below)
Greg Wilson's avatar
Greg Wilson committed

Authors should *not* use:

*   sub-titles (instead, use H2 subheadings (`##`) in the episode files)
Greg Wilson's avatar
Greg Wilson committed
*   HTML layout (e.g., `div` elements).
Greg Wilson's avatar
Greg Wilson committed

Katrin Leinweber's avatar
Katrin Leinweber committed
> ## Linking section IDs
Katrin Leinweber's avatar
Katrin Leinweber committed
> In the HTML output each header of a section, code sample, exercise will be associated with an unique ID (the rules of
> the ID generation are given in kramdown [documentation](https://kramdown.gettalong.org/converter/html.html#auto-ids),
Katrin Leinweber's avatar
Katrin Leinweber committed
> but it is easier to look for them directly in the page sources).
> These IDs can be used to easily link to the section by attaching the hash (`#`) followed by the ID to the page's URL
> (like [this](#linking-section-ids)). For example, the instructor might copy the link to
> the etherpad, so that the lesson opens in learners' web browser directly at the right spot.
Greg Wilson's avatar
Greg Wilson committed
## Formatting Code

Inline code fragments are formatted using back-quotes.
Longer code blocks are formatted by opening and closing the block with `~~~` (three tildes),
with a class specifier after the block:

Greg Wilson's avatar
Greg Wilson committed
{% raw %}
Greg Wilson's avatar
Greg Wilson committed
    ~~~
    for thing in collection:
        do_something
    ~~~
    {: .source}
Greg Wilson's avatar
Greg Wilson committed
{% endraw %}
Greg Wilson's avatar
Greg Wilson committed

which is rendered as:

~~~
for thing in collection:
    do_something
~~~
{: .source}
Greg Wilson's avatar
Greg Wilson committed

The class specified at the bottom using an opening curly brace and colon,
the class identifier with a leading dot,
and a closing curly brace.
The [template]({{ site.template_repo }}) provides three styles for code blocks:

Greg Wilson's avatar
Greg Wilson committed
~~~
.source: program source.
~~~
{: .source}

~~~
.output: program output.
~~~
{: .output}

~~~
.error: error messages.
~~~
{: .error}
Greg Wilson's avatar
Greg Wilson committed

naught101's avatar
naught101 committed
### Syntax Highlighting

The following styles like `.source`, but include syntax highlighting for the
specified language.
Please use them where possible to indicate the type of source being displayed,
and to make code easier to read.

`.language-bash`: Bash shell commands:

~~~
echo "Hello World"
~~~
{: .language-bash}

`.html`: HTML source:

~~~
<html>
<body>
<em>Hello World</em>
</body>
</html>
~~~
{: .html}

`.language-make`: Makefiles:

~~~
all:
    g++ main.cpp hello.cpp -o hello
~~~
{: .language-make}

`.language-matlab`: MATLAB source:

~~~
disp('Hello, world!')
~~~
{: .language-matlab}

`.language-python`: Python source:

~~~
print("Hello World")
~~~
{: .language-python}

`.language-r`: R source:

~~~
cat("Hello World")
~~~
{: .language-r}

`.language-sql`: SQL source:

~~~
CREATE PROCEDURE HelloWorld AS
PRINT 'Hello, world!'
RETURN (0)
~~~
{: .language-sql}
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
## Special Blockquotes

Greg Wilson's avatar
Greg Wilson committed
We use blockquotes to group headings and text
rather than wrapping them in `div` elements.
Greg Wilson's avatar
Greg Wilson committed
in order to avoid confusing [Jekyll][jekyll]'s parser
(which sometimes has trouble with Markdown inside HTML).
Greg Wilson's avatar
Greg Wilson committed
Each special blockquote must started with a level-2 header,
but may contain anything after that.
Greg Wilson's avatar
Greg Wilson committed
For example,
a callout is formatted like this:

~~~
> ## Callout Title
>
> text
> text
> text
Greg Wilson's avatar
Greg Wilson committed
>
Greg Wilson's avatar
Greg Wilson committed
> ~~~
> code
> ~~~
> {: .source}
Greg Wilson's avatar
Greg Wilson committed
{: .callout}
~~~
{: .source}
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
(Note the empty lines within the blockquote after the title and before the code block.)
This is rendered as:

> ## Callout Title
>
> text
> text
> text
>
> ~~~
> code
> ~~~
> {: .source}
Greg Wilson's avatar
Greg Wilson committed
{: .callout}

Greg Wilson's avatar
Greg Wilson committed
The [lesson template]({{ site.template_repo }}) defines styles
for the following special blockquotes:

Greg Wilson's avatar
Greg Wilson committed
<div class="row">
  <div class="col-md-6" markdown="1">

> ## `.callout`
Greg Wilson's avatar
Greg Wilson committed
>
> An aside or other comment.
{: .callout}

> ## `.challenge`
>
> An exercise.
{: .challenge}

> ## `.checklist`
>
> Checklists.
{: .checklist}

> ## `.discussion`
>
> Discussion questions.
{: .discussion}

Greg Wilson's avatar
Greg Wilson committed
> ## `.keypoints`
>
> Key points of an episode.
{: .keypoints}

Greg Wilson's avatar
Greg Wilson committed
  </div>
  <div class="col-md-6" markdown="1">

Greg Wilson's avatar
Greg Wilson committed
> ## `.objectives`
>
> Episode objectives.
{: .objectives}

> ## `.prereq`
>
> Prerequisites.
{: .prereq}

Greg Wilson's avatar
Greg Wilson committed
> ## `.solution`
>
> Exercise solution.
{: .solution}

Greg Wilson's avatar
Greg Wilson committed
> ## `.testimonial`
>
> A laudatory quote from a user.
{: .testimonial}
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
  </div>
</div>

Note that `.challenge` and `.discussion` have the same color but different icons.
Note also that one other class, `.quotation`,
is used to mark actual quotations
(the original purpose of the blockquote element).
This does not add any styling,
but is used to prevent the checking tools from complaining about a missing class.

Most authors will only use `.callout`, `.challenge`, and `.prereq`,
Greg Wilson's avatar
Greg Wilson committed
as the others are automatically generated by the template.
Note that `.prereq` is meant for describing things
that learners should know before starting this lesson;
setup instructions do not have a particular style,
but are instead put on the `setup.md` page.
Greg Wilson's avatar
Greg Wilson committed

Greg Wilson's avatar
Greg Wilson committed
Note also that solutions are nested inside exercises as shown below:

~~~
> ## Challenge Title
>
> This is the body of the challenge.
>
> ~~~
> it may include some code
> ~~~
> {: .source}
>
> > ## Solution
> >
> > This is the body of the solution.
> >
> > ~~~
> > it may also include some code
> > ~~~
> > {: .output}
> {: .solution}
{: .challenge}
~~~
{: .source}

The double indentation is annoying to edit,
but the alternatives we considered and discarded are worse:

1.  Use HTML `<div>` elements for the challenges.
    Most people dislike mixing HTML and Markdown,
    and experience shows that it's all too easy to confuse Jekyll's Markdown parser.

2.  Put solutions immediately after challenges rather than inside them.
    This is simpler to edit,
    but clutters up the page
    and makes it harder for tools to tell which solutions belong to which exercises.