CINXE.COM

~/tabi • A Complete Guide to Series

<!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;script-src 'self' https://tabi-stats.osc.garden '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=98c8cfb580fe7a59eb13" 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=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=en_GB property=og:locale:alternate><link href=https://welpo.github.io/tabi/blog/series/ hreflang=en 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><h1 class=article-title>A Complete Guide to Series</h1><ul class=meta><li>8th Nov 2024<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 href=https://welpo.github.io/tabi/tags/showcase/>showcase</a>, <li class=tag><a href=https://welpo.github.io/tabi/tags/tutorial/>tutorial</a>, <li class=tag><a href=https://welpo.github.io/tabi/tags/faq/>FAQ</a>, <li class=tag><a href=https://welpo.github.io/tabi/tags/series/>series</a></ul><ul class="meta last-updated"><li>Updated on 15th Feb 2025<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><section class=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 section’s <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" class=img-light loading=lazy src=https://welpo.github.io/tabi/blog/series/img/series_light.webp><img alt="a series" class=img-dark loading=lazy src=https://welpo.github.io/tabi/blog/series/img/series_dark.webp></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" class=img-light loading=lazy src=https://welpo.github.io/tabi/blog/series/img/jump_to_series_posts_light.webp><img alt="jump to series posts link" class=img-dark loading=lazy src=https://welpo.github.io/tabi/blog/series/img/jump_to_series_posts_dark.webp></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 section’s (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 won’t 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" class=img-light loading=lazy src=https://welpo.github.io/tabi/blog/series/img/series_reversed_light.webp><img alt="a series with indexes reversed" class=img-dark loading=lazy src=https://welpo.github.io/tabi/blog/series/img/series_reversed_dark.webp></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 article’s 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 isn’t defined</ul><p>The system automatically determines which template to use based on the article’s 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 article’s 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>&LTa 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 article’s 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 article’s 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 Rust’s 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 article’s 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 don’t provide its value in <code>series_template_variables</code>, the build will fail with an error listing the missing variables.</div></div></section><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></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>

Pages: 1 2 3 4 5 6 7 8 9 10