Drafting in Org Mode
When minimal-mistakes-plus is enabled in your Minimal Mistakes themed project you can write posts or pages in Org Mode while keeping the existing Markdown method, that is, you now have a dual-drafting method! When composing an article you can choose either method at will.
This article itself, as well as most articles on this site, is written in Org Mode. It also serves as a demonstration of this feature.
You can do everything in the original Markdown way, which is kept intact. When drafting in Org Mode certain features non-native to Org Mode are also supported, such as the following:
- Front matter
- Liquid syntax
- Figure: For showcasing an image in a gallery view.
- Gallery: For showcasing multiple images or an album in a gallery view.
The following contents demonstrate the basic Org Mode elements and the extra features aforementioned.
Headings
Custom ID
In Markdown you can write the attribute syntax {: id="your-custom-id"} to assign a custom ID to a heading. In Org you can achieve the same by using the conventional CUSTOM_ID in a property drawer.
Topdown IDs and ID Deduplication
By default, heading id-s are generated automatically by transforming the heading to a hyphenated string. By adding heading_ids: topdown in the front matter you can enable topdown IDs, which are generated by concatenating for each heading all the id-s of its parent headings, if any. For example,
* Heading 1
# id: heading-1
** Foo
# id: heading-1-foo
*** Bar
# id: heading-1-foo-bar
* Heading 2
# id: heading-2
** Foo
# id: heading-2-foo
*** Bar
# id: heading-2-foo-barAt any rate, there is a duplication check during the generation. If a duplicate ID is found, a number will be appended incrementally.
However, CUSTOM_ID is never affected.
Auto Numbering
Headings can be numbered automatically for the whole document or only a subtree. To enable this add use either of the following methods:
- For all headings: Add
ordered: trueto the front matter of the page. - For all headings under a subtree: Add the attribute
{: .ordered}right under a subtree heading. All of its sub-headings will be numbered.
The numbers appear in both the page content and the table of contents.
If a heading is marked with {: .ordered} the numbering of its sub-headings always starts from 1. regardless of its level in the document or its position relative its siblings.
If both ordered: true and {: .ordered} are present for a heading, the rules of the latter override those of the former.
For example:
---
title: "Numbering All Headings"
permalink: /docs/headings/
toc: true
ordered: true
---
* Heading 1
** Heading 2
*** Heading 3
**** Heading 4
***** Heading 5
****** Heading 6
* Heading 1
** Heading 2
*** Heading 3
**** Heading 4
***** Heading 5
****** Heading 6becomes:
1. Heading 1
1.1. Heading 2
1.1.1. Heading 3
1.1.1.1. Heading 4
1.1.1.1.1. Heading 5
1.1.1.1.1.1. Heading 6
2. Heading 1
2.1. Heading 2
2.1.1. Heading 3
2.1.1.1. Heading 4
2.1.1.1.1. Heading 5
2.1.1.1.1.1. Heading 6And this:
---
title: "Numbering Subtrees"
permalink: /docs/headings/
toc: true
---
* Heading 1
{: .ordered}
** Heading 2
*** Heading 3
**** Heading 4
{: .ordered}
***** Heading 5
****** Heading 6
* Heading 1
** Heading 2
*** Heading 3
{: .ordered}
**** Heading 4
***** Heading 5
****** Heading 6becomes:
* Heading 1
1. Heading 2
1.1. Heading 3
1.1.1. Heading 4
1. Heading 5
1.1. Heading 6
* Heading 1
** Heading 2
*** Heading 3
1. Heading 4
1.1. Heading 5
1.1.1. Heading 6Tables
A simple Org table:
| Col1 | Col2 | Col3 |
|---|---|---|
| foo | foo1 | Hello World |
| bar | bar1 | Hello World |
Complex Tables
A complex Org table which contains line-wrapping cells, column- and row-spanning cells:
#+ATTR_ARGS: :complex t :newlines t
| Col1 | Col2 | Col3 |
|------+--------+---------|
| foo | foo1 | Hello |
| | | World |
|------+--------+---------|
| bar | <span | > |
|------+--------+---------|
| | | |
| zoo | ------ | ------- |
| | | |
|------+--------+---------|
| zoo | | Hello |
| zoo | ------ | World |
| | | || Col1 | Col2 | Col3 |
|---|---|---|
| foo | foo1 | Hello World |
| bar | ||
| zoo | ||
| zoo zoo | Hello World | |
A complex Org table like this isn’t natively supported by either Org Mode or org-ruby, and is solely supported by Minimal Mistakes Plus!
- A table is processed specially as a complex table only when it’s marked by
#+ATTR_ARGS: :complex t. - When it’s a complex table rows are delimited by horizontal rulers, not lines.
- The first row is always interpreted as the header row.
- Column-spanning is indicated by the notation
<span ... >. To merge several columns of the same row you put<spanin the first cell and>in the last. - Row-spanning is recognized automatically when there isn’t a horizontal ruler across several cells in a column but there are rulers across the cells of the same rows in other columns.
-
#+ATTR_ARGS:can take other arguments:-
:newlines: Whether to preserve newlines in the output HTML, either as<br>or linefeeds. Ifnilor unset, don’t preserve newlines, i.e., strip off all<br>and linefeeds in the cell. Iftpreserve newlines as<br>.
-
Another example:
| Word | Sensory Anchor | Mental Image |
|---|---|---|
| kasukani | The Radio | A radio signal fading out. You have to strain your ears to hear if the music is even still playing. |
| honokani | The Candle | A candle in a dark room. The light is soft, flickering, and has a warm, “emotional” quality. |
| honnonito | The Peach | The skin of a peach or a baby’s cheek. A soft, warm pinkish glow that bleeds into the surface. |
| ussurato | The Veil | A thin layer of mist over a lake or a dusting of powdered sugar on a cake. |
An Emacs built-in table (provided by table.el):
+------+------+-------+
| Col1 | Col2 | Col3 |
+======+======+=======+
| foo | foo1 | Hello |
| | | World |
+------+------+-------+
| bar | |
+------+------+-------+
| | | |
| zoo +------+-------+
| | | |
+------+------+-------+| Col1 | Col2 | Col3 |
|---|---|---|
| foo | foo1 | Hello World |
| bar | ||
| zoo | ||
- No need for
#+ATTR_ARGS: :complex t.
Lists
An ordered list with multiple levels:
-
First item
Hello world! -
Second item
-
Sub-item A (Indented 3 spaces)
Some text
- Sub-item A (Indented 3 spaces)
-
Sub-item A (Indented 3 spaces)
- Sub-item A (Indented 3 spaces)
- Sub-item A (Indented 3 spaces)
- Sub-item A (Indented 3 spaces)
-
Sub-item B
- Deeply nested bullet (Indented another 3 spaces)
- Deeply nested bullet (Indented another 3 spaces)
-
- Third item
Links
In addition to standard Org links, minimal-mistakes-plus facilitates the composing of links in the following ways:
Link to a Post
- Link to a page in the same project
- Link to a page in another project
- Link to a page using org links
Link to a [post]({{ site.baseurl }}{% post_url 2026-02-20-custom-gallery %})Images
A simple image:

A figure:

A gallery (with [customization]({{ site.baseurl }}{% post_url 2026-02-20-custom-gallery %})):Code highlighting
Inline codes: print, hello
Inline codes: ~github: “josephtesfaye/minimal-mistakes-plus”~,
Using : to start a line of code:
descriptor + subject + taxonomic rank
Using structure template (code block):
def print_hi(name)
puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.Text block:
Hello
{% include gallery columns=6 caption="My custom gallery" %}
{% include gallery columns=6 caption="My custom gallery" %}Notices
You can write notices similarly to Markdown.
For One Line or Paragraph
{: .notice}
*Watch out!* This is a notice inside an Org file.
{: .notice--primary}
*Watch out!* This is a primary notice inside an Org file.
{: .notice--info}
*Watch out!* This is an info notice inside an Org file.
{: .notice--warning}
*Watch out!* This is a warning notice inside an Org file.
{: .notice--success}
*Watch out!* This is a success notice inside an Org file.
{: .notice--danger}
*Watch out!* This is a danger notice inside an Org file.Watch out! This is a notice inside an Org file.
Watch out! This is a primary notice inside an Org file.
Watch out! This is an info notice inside an Org file.
Watch out! This is a warning notice inside an Org file.
Watch out! This is a success notice inside an Org file.
Watch out! This is a danger notice inside an Org file.
For Block Contents
You can put a block of contents in a notice in the following styles:
Style 1
Using <div class="notice--type" org="1">:
<div class="notice" org="1">
*Bold Text:* Plain text. A [[#images][link]].
A list:
- Item 1
- Item 2
A code block:
#+begin_src html
<html>
<body>Hello World!<body>
</html>
#+end_src
</div>Bold Text: Plain text. A link.
A list:
- Item 1
- Item 2
A code block:
<html>
<body>Hello World!<body>
</html>Style 2
Using {% capture <id> %}:
{% capture notice-1 %}
*Bold Text:* Plain text. A [[#images][link]].
A list:
- Item 1
- Item 2
A code block:
#+begin_src html
<html>
<body>Hello World!<body>
</html>
#+end_src
{% endcapture %}
<div class="notice">{{ notice-1 | orgify }}</div>Bold Text: Plain text. A link.
A list:
- Item 1
- Item 2
A code block:
<html>
<body>Hello World!<body>
</html>Style 3
Using straight HTML:
#+begin_html
<div class="notice">
<p><b>Bold Text:</b> Plain text. A <a href="#images">link</a>.</p>
<p>A list:</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<p>A code block:</p>
<div class="language-html highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nt"><html></span>
<span class="nt"><body></span>Hello World!<span class="nt"><body></span>
<span class="nt"></html></span></code></pre>
</div>
</div>
</div>
#+end_htmlBold Text: Plain text. A link.
A list:
- Item 1
- Item 2
A code block:
<html>
<body>Hello World!<body>
</html>