tabi/blog/series/index.html
2025-09-17 19:49:04 +00:00

164 lines
No EOL
65 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en><head><meta charset=UTF-8><meta content="default-src 'self';font-src 'self' data: 'self';img-src 'self' https://* data:;media-src 'self' https://cdn.jsdelivr.net/;style-src 'self' 'unsafe-inline';frame-src player.vimeo.com https://www.youtube-nocookie.com;connect-src 'self' https://tabi-stats.osc.garden vhiweeypifbwacashxjz.supabase.co;script-src 'self' https://tabi-stats.osc.garden cdn.jsdelivr.net 'self'" http-equiv=Content-Security-Policy><meta content="width=device-width,initial-scale=1.0" name=viewport><meta content=https://welpo.github.io/tabi name=base><title>
~/tabi • A Complete Guide to Series</title><link href=https://welpo.github.io/tabi/img/seedling.png rel=icon type=image/png><link href='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y="50%" x="50%" dominant-baseline="central" text-anchor="middle" font-size="88">🌱</text></svg>' rel=icon><link title="~/tabi - Atom Feed" href=https://welpo.github.io/tabi/atom.xml rel=alternate type=application/atom+xml><link href="https://welpo.github.io/tabi/custom_subset.css?h=0b9535a28bc3d5bf2321" rel=stylesheet><link href="https://welpo.github.io/tabi/main.css?h=e9648e8ea2820aa9b15b" rel=stylesheet><meta content="light dark" name=color-scheme><meta content=#087e96 name=theme-color><meta content="Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories." name=description><meta content="Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories." property=og:description><meta content="A Complete Guide to Series" property=og:title><meta content=article property=og:type><meta content="https://welpo.github.io/tabi/blog/series/social_cards/es_blog_series.jpg?h=d4b64d21ea2e4633bb8c" property=og:image><meta content=1400 property=og:image:width><meta content=800 property=og:image:height><meta content="https://welpo.github.io/tabi/blog/series/social_cards/es_blog_series.jpg?h=d4b64d21ea2e4633bb8c" name=twitter:image><meta content=summary_large_image name=twitter:card><meta content=en_GB property=og:locale:alternate><link href=https://welpo.github.io/tabi/blog/series/ hreflang=en rel=alternate><meta content=ca_ES property=og:locale:alternate><link href=https://welpo.github.io/tabi/ca/blog/series/ hreflang=ca rel=alternate><meta content=es_ES property=og:locale:alternate><link href=https://welpo.github.io/tabi/es/blog/series/ hreflang=es rel=alternate><meta content=https://welpo.github.io/tabi/blog/series/ property=og:url><meta content=~/tabi property=og:site_name><noscript><link href=https://welpo.github.io/tabi/no_js.css rel=stylesheet></noscript><script src=https://welpo.github.io/tabi/js/initializeTheme.min.js></script><script defer src=https://welpo.github.io/tabi/js/themeSwitcher.min.js></script><script async data-goatcounter=https://tabi-stats.osc.garden/count src=https://tabi-stats.osc.garden/count.js></script><script src="https://welpo.github.io/tabi/js/searchElasticlunr.min.js?h=3626c0ef99daa745b31e" defer></script><body><header><nav class=navbar><div class=nav-title><a class=home-title href=https://welpo.github.io/tabi/>~/tabi</a></div><div class=nav-navs><ul><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/blog/>blog </a><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/archive/>archive </a><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/tags/>tags </a><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/projects/>projects </a><li class=menu-icons-container><ul class=menu-icons-group><li class="js menu-icon"><div aria-label="Click or press $SHORTCUT to open search" class="search-icon interactive-icon" title="Click or press $SHORTCUT to open search" id=search-button role=button tabindex=0><svg viewbox="0 -960 960 960" xmlns=http://www.w3.org/2000/svg><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg></div><li class=language-switcher><details class=dropdown><summary aria-label="Language selection" title="Language selection" aria-haspopup=true role=button><div class=language-switcher-icon></div></summary> <div class=dropdown-content role=menu>English<a aria-label=العربية href=https://welpo.github.io/tabi/ar/blog/series/ lang=ar role=menuitem>العربية</a><a aria-label=Español href=https://welpo.github.io/tabi/es/blog/series/ lang=es role=menuitem>Español</a><a aria-label=Català href=https://welpo.github.io/tabi/ca/blog/series/ lang=ca role=menuitem>Català</a></div></details><li class="theme-switcher-wrapper js"><div aria-label="Toggle dark mode" title="Toggle dark/light mode" aria-pressed=false class=theme-switcher role=button tabindex=0></div><div aria-label="Reset mode to default" class="theme-resetter arrow" title="Reset mode to default" aria-hidden=true role=button tabindex=0></div></ul></ul></div></nav></header><div class=content><main><article class=h-entry><h1 class="p-name article-title">A Complete Guide to Series</h1><a class="u-url u-uid" href=https://welpo.github.io/tabi/blog/series/></a><ul class=meta><li><time class=dt-published datetime=2024-11-08>8th Nov 2024</time><li title="1597 words"><span aria-hidden=true class=separator></span>8 min read<li class=tag><span aria-hidden=true class=separator></span>Tags: <li class=tag><a class=p-category href=https://welpo.github.io/tabi/tags/showcase/>showcase</a>, <li class=tag><a class=p-category href=https://welpo.github.io/tabi/tags/tutorial/>tutorial</a>, <li class=tag><a class=p-category href=https://welpo.github.io/tabi/tags/faq/>FAQ</a>, <li class=tag><a class=p-category href=https://welpo.github.io/tabi/tags/series/>series</a></ul><ul class="meta last-updated"><li><time class=dt-updated datetime=2025-02-21>Updated on 21st Feb 2025</time><li><span aria-hidden=true class=separator></span><a class=external href=https://github.com/welpo/tabi/commits/main/content/blog/series/index.md>See changes</a></ul><div class=toc-container><h3>Table of Contents</h3><ul><li><a href=https://welpo.github.io/tabi/blog/series/#quick-start>Quick Start</a><li><a href=https://welpo.github.io/tabi/blog/series/#how-do-series-work>How Do Series Work?</a><li><a href=https://welpo.github.io/tabi/blog/series/#jump-to-posts>Jump to Posts</a><li><a href=https://welpo.github.io/tabi/blog/series/#series-pages-and-order>Series Pages and Order</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#sorting-options>Sorting Options</a><li><a href=https://welpo.github.io/tabi/blog/series/#page-indexing>Page Indexing</a></ul><li><a href=https://welpo.github.io/tabi/blog/series/#intro-and-outro-templates>Intro and Outro Templates</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#template-types>Template Types</a><li><a href=https://welpo.github.io/tabi/blog/series/#placement-in-content>Placement in Content</a></ul><li><a href=https://welpo.github.io/tabi/blog/series/#variables>Variables</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#basic-series-variables>Basic Series Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#navigation-variables>Navigation Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#first-article-reference>First Article Reference</a><li><a href=https://welpo.github.io/tabi/blog/series/#template-example>Template Example</a><li><a href=https://welpo.github.io/tabi/blog/series/#custom-variables>Custom Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#using-custom-variables>Using Custom Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#example-with-custom-variables>Example with Custom Variables</a></ul></ul></div><p class=p-summary hidden>Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories.<section class="e-content body"><p>A series organizes related posts in a sequential order, similar to chapters in a book. Unlike tags, which simply group related content, series suggest a specific reading order from start to finish.<p>Posts within a series do not need to be published consecutively; the series feature brings together thematically linked posts in a coherent sequence.<p>The diagram below illustrates how series posts (3, 5, and 8) exist within the main blog flow while maintaining their own ordered sequence within Series 1.</p><noscript><strong>⚠️ JavaScript is required to render the diagram.</strong></noscript><pre class="mermaid invertible-image full-width">
flowchart
subgraph main[BLOG]
P1[Post 1]
P2[P2]
P3[P3]
P4[P4]
P5[P5]
P6[P6]
P7[P7]
P8[P8]
P9[P9]
end
subgraph series1[SERIES 1]
PS1["Series Post 1 (=P3)"]
PS2["Series Post 2 (=P5)"]
PS3["Series Post 3 (=P8)"]
end
P3 o-.-o PS1
P5 o-.-o PS2
P8 o-.-o PS3
</pre><h2 id=quick-start><a aria-label="Anchor link for: quick-start" class="header-anchor no-hover-padding" href=#quick-start><span aria-hidden=true class=link-icon></span></a> Quick Start</h2><ol><li><p>Create a directory for your series.</p><li><p>Create <code>_index.md</code> in the series directory.</p><li><p>Set up the <code>_index.md</code> front matter:</p> <pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">title</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Learning Rust<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">template</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>series.html<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">sort_by</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>slug<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">transparent</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-constant z-language z-toml">true</span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-constant z-language z-toml">true</span>
</span></code></pre><li><p>Create your series articles in this directory.</p></ol><p>Want more? Keep reading!<h2 id=how-do-series-work><a aria-label="Anchor link for: how-do-series-work" class="header-anchor no-hover-padding" href=#how-do-series-work><span aria-hidden=true class=link-icon></span></a> How Do Series Work?</h2><p>A series is just a section which is handled in a special way by tabi. For more details on sections, see the <a class=external href=https://www.getzola.org/documentation/content/section/>Zola documentation</a>.<p>Taking the example from the diagram above, the directory structure would be as follow:<pre class="language-txt z-code" data-lang=txt><code class=language-txt data-lang=txt><span class="z-text z-plain">content/
</span><span class="z-text z-plain"> _index.md
</span><span class="z-text z-plain"> blog/
</span><span class="z-text z-plain"> _index.md
</span><span class="z-text z-plain"> post1/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post2/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post4/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post6/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post7/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post9/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> series1/
</span><span class="z-text z-plain"> _index.md
</span><span class="z-text z-plain"> post3/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post5/
</span><span class="z-text z-plain"> index.md
</span><span class="z-text z-plain"> post8/
</span><span class="z-text z-plain"> index.md
</span></code></pre><p>To create a series, you need to:<ol><li>Use the <code>series.html</code> template<li>Set <code>series = true</code> in the sections <code>[extra]</code> configuration<li>Enable <code>transparent = true</code> to integrate series posts with the parent blog section</ol><p>The series main page displays an overview followed by a list of all posts in the series:<div class=full-width><img alt="a series" src="https://welpo.github.io/tabi/blog/series/img/series_light.webp?h=b263f660f586e7a0978f" class=img-light loading=lazy><img alt="a series" src="https://welpo.github.io/tabi/blog/series/img/series_dark.webp?h=33e658ae352f1e6cb809" class=img-dark loading=lazy></div><h2 id=jump-to-posts><a aria-label="Anchor link for: jump-to-posts" class="header-anchor no-hover-padding" href=#jump-to-posts><span aria-hidden=true class=link-icon></span></a> Jump to Posts</h2><p>If the content of a series (the Markdown after the front matter in <code>_index.md</code>) is over 2000 characters, a “Jump to posts” link appears next to the series title.<div class=full-width><img alt="jump to series posts link" src="https://welpo.github.io/tabi/blog/series/img/jump_to_series_posts_light.webp?h=36a55aa8486a48dcad54" class=img-light loading=lazy><img alt="jump to series posts link" src="https://welpo.github.io/tabi/blog/series/img/jump_to_series_posts_dark.webp?h=b2050110d2b4ad3f8768" class=img-dark loading=lazy></div><p>To force the feature on or off, set <code>show_jump_to_posts</code> in the <code>[extra]</code> section of your series section or in <code>config.toml</code>. This setting follows <a href=https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy>the hierarchy</a>.<h2 id=series-pages-and-order><a aria-label="Anchor link for: series-pages-and-order" class="header-anchor no-hover-padding" href=#series-pages-and-order><span aria-hidden=true class=link-icon></span></a> Series Pages and Order</h2><p>All pages in the series section will be a series page. The series pages will be ordered as per the series section <code>sort_by</code>.<p>While series maintain their own internal order, they remain independent from the main sections (e.g. <code>blog/</code>) chronological flow thanks to the <code>transparent</code> setting.<h3 id=sorting-options><a aria-label="Anchor link for: sorting-options" class="header-anchor no-hover-padding" href=#sorting-options><span aria-hidden=true class=link-icon></span></a> Sorting Options</h3><p>Choose from these sorting methods, each with its own advantages:<div class=full-width><table><thead><tr><th><code>sort_by</code><th>pros<th>cons<tbody><tr><td><code>slug</code><td>The series pages order is made explicit in the path (e.g. <code>example.com/blog/series1/01-series-post-one</code>).<td>Each series page must be prefixed accordingly.<tr><td><code>weight</code><td>The series pages order is easy to set up transparently.<br>First series post has weight <code>1</code>, second series post has weight <code>2</code> and so on.<td>Each series page must have its weight set accordingly.<tr><td><code>date</code><td>The series pages order can be configured once in the series section configuration. No need to do anything on each series page.<td>The series pages order has to be reversed because the first page is usually the oldest. This can only be achieved by paginating the series section (<code>paginate_by = 9999</code>) and reversing its order (<code>paginate_reversed = true</code>).</table></div><div class="admonition danger"><div class="admonition-icon admonition-icon-danger"></div><div class=admonition-content><strong class=admonition-title>Zola version to sort by date</strong><p>In order to properly reverse dates, Zola v0.19.3+ (unreleased) is required so that pagination information is available through the <code>get_section</code> function. Anything relying on the series pages order wont be correct in a series page otherwise (e.g. previous/next series page, ordered and unordered list…) See <a class=external href=https://github.com/getzola/zola/pull/2653>Zola PR #2653</a>.</div></div><h3 id=page-indexing><a aria-label="Anchor link for: page-indexing" class="header-anchor no-hover-padding" href=#page-indexing><span aria-hidden=true class=link-icon></span></a> Page Indexing</h3><p>Pages in a series are indexed starting from 1, following their <code>sort_by</code> order. To reverse the indexing (making the first page have the highest index instead), add this setting to <code>_index.md</code> or <code>config.toml</code>:<pre class="language-toml z-code" data-lang=toml><code class=language-toml data-lang=toml><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">post_listing_index_reversed</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-constant z-language z-toml">true</span> <span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Defaults to false if unset.</span>
</span></code></pre><div class=full-width><img alt="a series with indexes reversed" src="https://welpo.github.io/tabi/blog/series/img/series_reversed_light.webp?h=c87548ebd6afb4dc6f53" class=img-light loading=lazy><img alt="a series with indexes reversed" src="https://welpo.github.io/tabi/blog/series/img/series_reversed_dark.webp?h=2a7db8e8e3808c5925fd" class=img-dark loading=lazy></div><p>This setting follows <a href=https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy>the hierarchy</a>.<h2 id=intro-and-outro-templates><a aria-label="Anchor link for: intro-and-outro-templates" class="header-anchor no-hover-padding" href=#intro-and-outro-templates><span aria-hidden=true class=link-icon></span></a> Intro and Outro Templates</h2><p>Series articles can have automatic introduction and conclusion sections. These are configured in your series <code>_index.md</code>. A basic example:<pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_intro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>This article is part of the $SERIES_HTML_LINK series.<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_outro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Thanks for reading part $SERIES_PAGE_INDEX of $SERIES_HTML_LINK!<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span></code></pre><p>The intro and outro sections each have their own CSS classes (<code>series-page-intro</code> and <code>series-page-outro</code>), allowing you to customize their appearance through <a href=https://welpo.github.io/tabi/blog/mastering-tabi-settings/#custom-css>custom CSS</a>.<h3 id=template-types><a aria-label="Anchor link for: template-types" class="header-anchor no-hover-padding" href=#template-types><span aria-hidden=true class=link-icon></span></a> Template Types</h3><p>The series system uses different templates based on an articles position in the series:<ul><li><code>next_only</code> - Used for the first article (has next article but no previous)<li><code>middle</code> - Used for articles with both previous and next articles<li><code>prev_only</code> - Used for the last article (has previous article but no next)<li><code>default</code> - Fallback template used when a specific position template isnt defined</ul><p>The system automatically determines which template to use based on the articles position. The templates are defined in the series configuration (<code>_index.md</code>), as <code>extra.series_intro_templates</code> and <code>extra.series_outro_templates</code>.:<pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_intro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">next_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Welcome to part 1! Next up: $NEXT_HTML_LINK<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">middle</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Previous: $PREV_HTML_LINK | Next: $NEXT_HTML_LINK<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">prev_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>The final chapter! Previously: $PREV_HTML_LINK<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span></code></pre><p>All templates are optional. Template selection follows a priority system:<ol><li>If a position-specific template exists (<code>next_only</code>, <code>middle</code>, or <code>prev_only</code>), it will be used<li>Otherwise, the <code>default</code> template is used<li>If no templates are defined at all, no series information will be displayed</ol><p>See the <a href=https://welpo.github.io/tabi/blog/series/#template-example>template example</a> for a more elaborate example.<h3 id=placement-in-content><a aria-label="Anchor link for: placement-in-content" class="header-anchor no-hover-padding" href=#placement-in-content><span aria-hidden=true class=link-icon></span></a> Placement in Content</h3><p>By default:<ul><li>Series introductions appear at the start of your article<li>Series outro appears at the end (before footnotes, if any)</ul><p>You can control exactly where these appear using <code>&lt;!-- series_intro --></code> and <code>&lt;!-- series_outro --></code> in your Markdown:<pre class="language-markdown z-code" data-lang=markdown><code class=language-markdown data-lang=markdown><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">This paragraph appears before the series introduction.
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-disable-markdown"><span class="z-comment z-block z-html"><span class="z-punctuation z-definition z-comment z-begin z-html">&lt;!--</span> series_intro <span class="z-punctuation z-definition z-comment z-end z-html">--></span></span></span><span class="z-meta z-disable-markdown">
</span></span><span class="z-text z-html z-markdown">
</span><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">Main content of the article.
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-disable-markdown"><span class="z-comment z-block z-html"><span class="z-punctuation z-definition z-comment z-begin z-html">&lt;!--</span> series_outro <span class="z-punctuation z-definition z-comment z-end z-html">--></span></span></span><span class="z-meta z-disable-markdown">
</span></span><span class="z-text z-html z-markdown">
</span><span class="z-text z-html z-markdown"><span class="z-meta z-block-level z-markdown"><span class="z-markup z-heading z-2 z-markdown"><span class="z-punctuation z-definition z-heading z-begin z-markdown">##</span> </span><span class="z-markup z-heading z-2 z-markdown"><span class="z-entity z-name z-section z-markdown">Learning Resources</span><span class="z-meta z-whitespace z-newline z-markdown">
</span></span></span></span><span class="z-text z-html z-markdown">
</span><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">Extra content…
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-paragraph z-markdown">
</span></span><span class="z-text z-html z-markdown"><span class="z-meta z-link z-reference z-def z-footnote z-markdown-extra"><span class="z-punctuation z-definition z-constant z-begin z-markdown">[</span><span class="z-entity z-name z-reference z-link z-markdown">^1</span><span class="z-punctuation z-definition z-constant z-end z-markdown">]</span><span class="z-punctuation z-separator z-key-value z-markdown">:</span> Footnotes will always appear at the end.
</span></span></code></pre><h2 id=variables><a aria-label="Anchor link for: variables" class="header-anchor no-hover-padding" href=#variables><span aria-hidden=true class=link-icon></span></a> Variables</h2><p>Series templates use a flexible variable system that lets you:<ol><li>Reference series information (title, links)<li>Add navigation between articles<li>Show progress indicators<li>Include custom information using your own variables</ol><p>Variables are placeholders starting with <code>$</code> that get replaced with actual content when your site builds. For example, <code>$SERIES_HTML_LINK</code> becomes a clickable link to your series index page.<p>There are three types of variables:<ul><li><a href=https://welpo.github.io/tabi/blog/series/#basic-series-variables><strong>Basic Series Variables</strong></a>: General information about the series<li><a href=https://welpo.github.io/tabi/blog/series/#navigation-variables><strong>Navigation Variables</strong></a>: Links to previous/next articles<li><a href=https://welpo.github.io/tabi/blog/series/#custom-variables><strong>Custom Variables</strong></a>: Your own placeholders for additional information</ul><h3 id=basic-series-variables><a aria-label="Anchor link for: basic-series-variables" class="header-anchor no-hover-padding" href=#basic-series-variables><span aria-hidden=true class=link-icon></span></a> Basic Series Variables</h3><div class=full-width><table><thead><tr><th>Variable<th>Availability<th>Returns<th>Description<th>Example Usage<th>Example Output<tbody><tr><td><code>$SERIES_TITLE</code><td>Always<td>Text<td>Plain text title of the series<td><code>Part of $SERIES_TITLE</code><td>Part of Learn Rust<tr><td><code>$SERIES_PERMALINK</code><td>Always<td>Text<td>URL to series index<td><code>[See all posts]($SERIES_PERMALINK)</code><td><a href=/series/learn-rust>See all posts</a><tr><td><code>$SERIES_HTML_LINK</code><td>Always<td>HTML<td>Ready-to-use link to series<td><code>Welcome to $SERIES_HTML_LINK!</code><td>Welcome to <a href=/series/learn-rust>Learn Rust</a>!<tr><td><code>$SERIES_PAGES_NUMBER</code><td>Always<td>Number<td>Total articles in series<td><code>A $SERIES_PAGES_NUMBER part series</code><td>A 5 part series<tr><td><code>$SERIES_PAGE_INDEX</code><td>Always<td>Number<td>Current articles position<td><code>Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER</code><td>Part 3 of 5<tr><td><code>$SERIES_PAGES_OLIST</code><td>Always<td>HTML<td>Ordered list of all articles<td><code>Articles in series: $SERIES_PAGES_OLIST</code><td>Articles in series: <ol><li>Current article<li><a href=...>Other articles</a></ol><tr><td><code>$SERIES_PAGES_ULIST</code><td>Always<td>HTML<td>Unordered list of all articles<td><code>Articles in series: $SERIES_PAGES_ULIST</code><td>Articles in series: <ul><li>Current article<li><a href=...>Other articles</a></ul></table></div><div class="admonition tip"><div class="admonition-icon admonition-icon-tip"></div><div class=admonition-content><strong class=admonition-title>TIP: Custom text with permalinks</strong><p>Markdown links like <code>[text]($SERIES_PERMALINK)</code> will be marked (and <a href=https://welpo.github.io/tabi/blog/mastering-tabi-settings/#external-link-indicator>styled</a>) as external. If you need custom text and want to avoid external styling, use HTML: <code>&lt;a href=\"$SERIES_PERMALINK\">your text&lt;/a></code>.</div></div><h3 id=navigation-variables><a aria-label="Anchor link for: navigation-variables" class="header-anchor no-hover-padding" href=#navigation-variables><span aria-hidden=true class=link-icon></span></a> Navigation Variables</h3><div class=full-width><table><thead><tr><th>Variable<th>Availability<th>Returns<th>Description<th>Example Usage<th>Example Output<tbody><tr><td><code>$PREV_TITLE</code><td>Previous exists<td>Text<td>Previous articles title<td><code>Previously: $PREV_TITLE</code><td>Previously: Setting Up Your Environment<tr><td><code>$PREV_PERMALINK</code><td>Previous exists<td>Text<td>URL to previous article<td><code>[← Back]($PREV_PERMALINK)</code><td><a href=/series/learn-rust/setup>← Back</a><tr><td><code>$PREV_HTML_LINK</code><td>Previous exists<td>HTML<td>Ready-to-use link to previous<td><code>Read $PREV_HTML_LINK first</code><td>Read <a href=/series/learn-rust/setup>Setting Up Your Environment</a> first<tr><td><code>$PREV_DESCRIPTION</code><td>Previous exists<td>Text<td>Description of previous article<td><code>Recap: $PREV_DESCRIPTION</code><td>Recap: Setting up Rust<tr><td><code>$NEXT_TITLE</code><td>Next exists<td>Text<td>Next articles title<td><code>Next up: $NEXT_TITLE</code><td>Next up: Advanced Patterns<tr><td><code>$NEXT_PERMALINK</code><td>Next exists<td>Text<td>URL to next article<td><code>[Continue →]($NEXT_PERMALINK)</code><td><a href=/series/learn-rust/patterns>Continue →</a><tr><td><code>$NEXT_HTML_LINK</code><td>Next exists<td>HTML<td>Ready-to-use link to next<td><code>Continue with $NEXT_HTML_LINK</code><td>Continue with <a href=/series/learn-rust/patterns>Advanced Patterns</a><tr><td><code>$NEXT_DESCRIPTION</code><td>Next exists<td>Text<td>Description of next article<td><code>Coming up: $NEXT_DESCRIPTION</code><td>Coming up: Learn about Rusts advanced pattern matching features</table></div><h3 id=first-article-reference><a aria-label="Anchor link for: first-article-reference" class="header-anchor no-hover-padding" href=#first-article-reference><span aria-hidden=true class=link-icon></span></a> First Article Reference</h3><div class=full-width><table><thead><tr><th>Variable<th>Availability<th>Returns<th>Description<th>Example Usage<th>Example Output<tbody><tr><td><code>$FIRST_TITLE</code><td>Always<td>Text<td>First articles title<td><code>Start with $FIRST_TITLE</code><td>Start with Introduction to Rust<tr><td><code>$FIRST_HTML_LINK</code><td>Always<td>HTML<td>Ready-to-use link to first article<td><code>Begin at $FIRST_HTML_LINK</code><td>Begin at <a href=/series/learn-rust/intro>Introduction to Rust</a></table></div><h3 id=template-example><a aria-label="Anchor link for: template-example" class="header-anchor no-hover-padding" href=#template-example><span aria-hidden=true class=link-icon></span></a> Template Example</h3><div class="admonition tip"><div class="admonition-icon admonition-icon-tip"></div><div class=admonition-content><strong class=admonition-title>HTML vs text variables</strong><p>Use HTML variables (ending in <code>_HTML_LINK</code>) when you want ready-made links. Use text variables (ending in <code>_TITLE</code> or <code>_PERMALINK</code>) when you want more control over the formatting.</div></div><pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Introduction.</span>
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_intro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">next_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Welcome to $SERIES_HTML_LINK! This $SERIES_PAGES_NUMBER-part series will teach you Rust from scratch.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Up next: $NEXT_HTML_LINK - $NEXT_DESCRIPTION
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">middle</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">📚 Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER in $SERIES_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Previously: $PREV_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Next up: $NEXT_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">prev_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Welcome to the final part of $SERIES_HTML_LINK!
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">New here? Start with $FIRST_HTML_LINK to build a strong foundation.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Previously: $PREV_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Fallback template.</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>This article is part of the $SERIES_HTML_LINK series.<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Outro.</span>
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_outro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">next_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Thanks for reading! 🙌
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Continue your journey with $NEXT_HTML_LINK, where $NEXT_DESCRIPTION
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Or check out the complete [$SERIES_TITLE]($SERIES_PERMALINK) series outline.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">middle</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">---
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">📝 Series Navigation
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">- Previous: $PREV_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">- Next: $NEXT_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">- [Series Overview]($SERIES_PERMALINK)
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">prev_only</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">🎉 Congratulations! You've completed $SERIES_HTML_LINK.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Want to review? Here's where we started: $FIRST_HTML_LINK
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Or check what we just covered in $PREV_HTML_LINK.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Fallback.</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">---
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">This article is part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER in $SERIES_HTML_LINK.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span></code></pre><h3 id=custom-variables><a aria-label="Anchor link for: custom-variables" class="header-anchor no-hover-padding" href=#custom-variables><span aria-hidden=true class=link-icon></span></a> Custom Variables</h3><p>Series templates support custom variables for additional information you want to include across your series. The process takes two steps:<ol><li>First, define your <strong>placeholders</strong> in your series configuration (<code>_index.md</code>):</ol><pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-constant z-language z-toml">true</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series_template_placeholders</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span><span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>$POSITION<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>$TOPIC<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>$DIFFICULTY<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-definition z-array z-end z-toml">]</span>
</span></code></pre><ol start=2><li>Then, in each series article, provide the values for these placeholders in <code>series_template_variables</code>:</ol><pre class="language-toml z-code" data-lang=toml data-name=series/article.md><code class=language-toml data-lang=toml data-name=series/article.md><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_template_variables</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">position</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>first<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">topic</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Variables and Types<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">difficulty</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Beginner<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span></code></pre><h3 id=using-custom-variables><a aria-label="Anchor link for: using-custom-variables" class="header-anchor no-hover-padding" href=#using-custom-variables><span aria-hidden=true class=link-icon></span></a> Using Custom Variables</h3><p>You can use your custom variables in any template, alongside the built-in variables:<pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_intro_templates</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">This is the $POSITION article in $SERIES_HTML_LINK.
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Today's topic: $TOPIC
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">Difficulty level: $DIFFICULTY
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span></code></pre><div class="admonition warning"><div class="admonition-icon admonition-icon-warning"></div><div class=admonition-content><strong class=admonition-title>WARNING</strong><p>While placeholders are defined with uppercase (<code>$POSITION</code>), the variable names in <code>series_template_variables</code> must be lowercase (<code>position</code>).</div></div><h3 id=example-with-custom-variables><a aria-label="Anchor link for: example-with-custom-variables" class="header-anchor no-hover-padding" href=#example-with-custom-variables><span aria-hidden=true class=link-icon></span></a> Example with Custom Variables</h3><pre class="language-toml z-code" data-lang=toml data-name=series/_index.md><code class=language-toml data-lang=toml data-name=series/_index.md><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> In the series configuration.</span>
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-constant z-language z-toml">true</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series_template_placeholders</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span><span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>$LEARNING_TIME<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>$KEY_CONCEPTS<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-definition z-array z-end z-toml">]</span>
</span><span class="z-source z-toml">
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">series_intro_templates</span><span class="z-punctuation z-separator z-key z-toml">.</span><span class="z-entity z-name z-tag z-toml">default</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"""</span>
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">📚 Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">⏱️ Estimated time: $LEARNING_TIME
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml">🔑 Key concepts: $KEY_CONCEPTS
</span></span><span class="z-source z-toml"><span class="z-string z-quoted z-triple z-basic z-block z-toml"><span class="z-punctuation z-definition z-string z-end z-toml">"""</span></span>
</span></code></pre><pre class="language-toml z-code" data-lang=toml data-name=series/02-learning-rust/index.md><code class=language-toml data-lang=toml data-name=series/02-learning-rust/index.md><span class="z-source z-toml"><span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> In an article of the series.</span>
</span><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">series_template_variables</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">learning_time</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>30 minutes<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">key_concepts</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>Functions, Error Handling, Pattern Matching<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span>
</span></code></pre><p>This will output:<pre class="language-txt z-code" data-lang=txt><code class=language-txt data-lang=txt><span class="z-text z-plain">📚 Part 2 of 5
</span><span class="z-text z-plain">⏱️ Estimated time: 30 minutes
</span><span class="z-text z-plain">🔑 Key concepts: Functions, Error Handling, Pattern Matching
</span></code></pre><div class="admonition warning"><div class="admonition-icon admonition-icon-warning"></div><div class=admonition-content><strong class=admonition-title>Missing Variables</strong><p>If you use a placeholder in your templates but dont provide its value in <code>series_template_variables</code>, the build will fail with an error listing the missing variables.</div></div></section><form action="https://vhiweeypifbwacashxjz.supabase.co/rest/v1/rpc/increment_hits?apikey=sb_publishable_EoB7MFJhCmb6PiAk-GPJ4w_PGhQ44Ru" class=iine-form method=post><input name=page_slug type=hidden value=/blog/series/><button aria-label="Like this post" title="Like this post" class=iine-button data-icon=thumbs_up data-slug=/blog/series/>👍</button></form><nav class="full-width article-navigation"><div></div><div><a aria-describedby=right_title aria-label=Prev href=https://welpo.github.io/tabi/blog/mastering-tabi-settings/>Prev <span class=arrow></span></a><p aria-hidden=true id=right_title>Mastering tabi Settings: A Comprehensive Guide</div></nav></article></main><div id=button-container><div id=toc-floating-container><input class=toggle id=toc-toggle type=checkbox><label class=overlay for=toc-toggle></label><label title="Toggle Table of Contents" class=button for=toc-toggle id=toc-button><svg viewbox="0 -960 960 960" xmlns=http://www.w3.org/2000/svg><path d="M414.82-193.094q-18.044 0-30.497-12.32-12.453-12.319-12.453-30.036t12.453-30.086q12.453-12.37 30.497-12.37h392.767q17.237 0 29.927 12.487 12.69 12.486 12.69 30.203 0 17.716-12.69 29.919t-29.927 12.203H414.82Zm0-244.833q-18.044 0-30.497-12.487Q371.87-462.9 371.87-480.45t12.453-29.92q12.453-12.369 30.497-12.369h392.767q17.237 0 29.927 12.511 12.69 12.512 12.69 29.845 0 17.716-12.69 30.086-12.69 12.37-29.927 12.37H414.82Zm0-245.167q-18.044 0-30.497-12.32t-12.453-30.037q0-17.716 12.453-30.086 12.453-12.369 30.497-12.369h392.767q17.237 0 29.927 12.486 12.69 12.487 12.69 30.203 0 17.717-12.69 29.92-12.69 12.203-29.927 12.203H414.82ZM189.379-156.681q-32.652 0-55.878-22.829t-23.226-55.731q0-32.549 23.15-55.647 23.151-23.097 55.95-23.097 32.799 0 55.313 23.484 22.515 23.484 22.515 56.246 0 32.212-22.861 54.893-22.861 22.681-54.963 22.681Zm0-245.167q-32.652 0-55.878-23.134-23.226-23.135-23.226-55.623 0-32.487 23.467-55.517t56.12-23.03q32.102 0 54.721 23.288 22.62 23.288 22.62 55.775 0 32.488-22.861 55.364-22.861 22.877-54.963 22.877Zm-.82-244.833q-32.224 0-55.254-23.288-23.03-23.289-23.03-55.623 0-32.333 23.271-55.364 23.272-23.03 55.495-23.03 32.224 0 55.193 23.288 22.969 23.289 22.969 55.622 0 32.334-23.21 55.364-23.21 23.031-55.434 23.031Z"/></svg></label><div class=toc-content><div class=toc-container><ul><li><a href=https://welpo.github.io/tabi/blog/series/#quick-start>Quick Start</a><li><a href=https://welpo.github.io/tabi/blog/series/#how-do-series-work>How Do Series Work?</a><li><a href=https://welpo.github.io/tabi/blog/series/#jump-to-posts>Jump to Posts</a><li><a href=https://welpo.github.io/tabi/blog/series/#series-pages-and-order>Series Pages and Order</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#sorting-options>Sorting Options</a><li><a href=https://welpo.github.io/tabi/blog/series/#page-indexing>Page Indexing</a></ul><li><a href=https://welpo.github.io/tabi/blog/series/#intro-and-outro-templates>Intro and Outro Templates</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#template-types>Template Types</a><li><a href=https://welpo.github.io/tabi/blog/series/#placement-in-content>Placement in Content</a></ul><li><a href=https://welpo.github.io/tabi/blog/series/#variables>Variables</a> <ul><li><a href=https://welpo.github.io/tabi/blog/series/#basic-series-variables>Basic Series Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#navigation-variables>Navigation Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#first-article-reference>First Article Reference</a><li><a href=https://welpo.github.io/tabi/blog/series/#template-example>Template Example</a><li><a href=https://welpo.github.io/tabi/blog/series/#custom-variables>Custom Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#using-custom-variables>Using Custom Variables</a><li><a href=https://welpo.github.io/tabi/blog/series/#example-with-custom-variables>Example with Custom Variables</a></ul></ul></div></div></div><a title="Go to the top of the page" class=no-hover-padding href=# id=top-button> <svg viewbox="0 0 20 20" fill=currentColor><path d="M3.293 9.707a1 1 0 010-1.414l6-6a1 1 0 011.414 0l6 6a1 1 0 01-1.414 1.414L11 5.414V17a1 1 0 11-2 0V5.414L4.707 9.707a1 1 0 01-1.414 0z"/></svg> </a></div><script defer src=https://welpo.github.io/tabi/js/mermaid.min.js></script><span class=hidden id=copy-success> Copied! </span><span class=hidden id=copy-init> Copy code to clipboard </span><script defer src=https://welpo.github.io/tabi/js/copyCodeToClipboard.min.js></script><script defer src=https://cdn.jsdelivr.net/gh/welpo/iine@main/iine.mini.js></script></div><footer><section><nav class="socials nav-navs"><ul><li><a class="nav-links no-hover-padding social" href=https://welpo.github.io/tabi/atom.xml> <img alt=feed loading=lazy src=https://welpo.github.io/tabi/social_icons/rss.svg title=feed> </a><li class=js><a class="nav-links no-hover-padding social" data-encoded-email=dGFiaUBvc2MuZ2FyZGVu href=#><img alt=email loading=lazy src=https://welpo.github.io/tabi/social_icons/email.svg title=email> </a><li><a class="nav-links no-hover-padding social" rel=" me" href=https://github.com/welpo/> <img alt=github loading=lazy src=https://welpo.github.io/tabi/social_icons/github.svg title=github> </a><li><a class="nav-links no-hover-padding social" rel=" me" href=https://soundcloud.com/oskerwyld> <img alt=soundcloud loading=lazy src=https://welpo.github.io/tabi/social_icons/soundcloud.svg title=soundcloud> </a><li><a class="nav-links no-hover-padding social" rel=" me" href=https://instagram.com/oskerwyld> <img alt=instagram loading=lazy src=https://welpo.github.io/tabi/social_icons/instagram.svg title=instagram> </a><li><a class="nav-links no-hover-padding social" rel=" me" href=https://youtube.com/@oskerwyld> <img alt=youtube loading=lazy src=https://welpo.github.io/tabi/social_icons/youtube.svg title=youtube> </a><li><a class="nav-links no-hover-padding social" rel=" me" href=https://open.spotify.com/artist/5Hv2bYBhMp1lUHFri06xkE> <img alt=spotify loading=lazy src=https://welpo.github.io/tabi/social_icons/spotify.svg title=spotify> </a></ul></nav><nav class=nav-navs><small> <ul><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/about/> about </a><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/privacy/> privacy policy </a><li><a class="nav-links no-hover-padding" href=https://tabi-stats.osc.garden/> site statistics </a><li><a class="nav-links no-hover-padding" href=https://welpo.github.io/tabi/sitemap.xml> sitemap </a></ul> </small></nav><div class=credits><small> Powered by <a href=https://www.getzola.org>Zola</a> & <a href=https://github.com/welpo/tabi>tabi</a><a href=https://github.com/welpo/tabi> Site source </a></small></div></section><script async src=https://welpo.github.io/tabi/js/decodeMail.min.js></script><div class="search-modal js" aria-labelledby=modalTitle id=searchModal role=dialog><h1 class=visually-hidden id=modalTitle>Search</h1><div id=modal-content><div id=searchBar><div aria-hidden=true class=search-icon><svg viewbox="0 -960 960 960" xmlns=http://www.w3.org/2000/svg><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg></div><input aria-controls=results-container aria-expanded=false autocomplete=off id=searchInput placeholder=Search… role=combobox spellcheck=false><div class="close-icon interactive-icon" title="Clear search" id=clear-search role=button tabindex=0><svg viewbox="0 -960 960 960" xmlns=http://www.w3.org/2000/svg><path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z"/></svg></div></div><div id=results-container><div id=results-info><span id=zero_results> No results</span><span id=one_results> $NUMBER result</span><span id=many_results> $NUMBER results</span><span id=two_results> $NUMBER results</span><span id=few_results> $NUMBER results</span></div><div id=results role=listbox></div></div></div></div></footer>