Skip to content

Latest commit

 

History

History
399 lines (233 loc) · 15.1 KB

File metadata and controls

399 lines (233 loc) · 15.1 KB

Changelog

Added

CSL bibliography styles (breaking change)

Quarkdown's internal bibliography management is now powered by CSL (Citation Style Language).

  • A curated selection of citation styles from the CSL Style Repository is now supported. The style parameter now accepts a CSL style identifier (e.g. ieee, apa, chicago-author-date, nature). The default style is now ieee.

    Breaking change: plain and ieeetr styles do not exist anymore, and have been replaced by ieee.

  • Along with BibTeX (.bib) files, the following file formats are now accepted:

    • CSL JSON (.json)
    • YAML (.yaml/.yml)
    • EndNote (.enl)
    • RIS (.ris)
  • Rendered bibliography entries are now localized to the document locale, set via .doclang.

.cite now accepts a comma-separated list of keys (e.g. .cite {einstein, hawking}) to produce a single combined citation label, whose format depends on the active citation style (e.g. [1], [2] for IEEE, (Einstein, 1905; Hawking, 1988) for APA).

Formatted captions

Captions for all supported elements now accept inline formatting (including inline function calls), rather than plain text.

![Pi](pi.png "The symbol of *pi*, which approximately equals .pi")
Formatted caption

.pageformat now supports scoping formats to specific pages in paged documents via two combinable parameters:

  • side (left or right): restricts formatting to recto or verso pages, enabling mirrored margins and other asymmetric layouts.
  • pages (e.g. 2..5): restricts formatting to an inclusive range of page indices.
.pageformat size:{A4}
.pageformat side:{left} margin:{2cm 3cm 2cm 1cm}
.pageformat side:{right} margin:{2cm 1cm 2cm 3cm}
.pageformat pages:{1..3} borderbottom:{4px}

Inline function calls can now be wrapped in curly braces to delimit them from surrounding content, without relying on whitespace.

abc{.uppercase {def}}ghi

The new .heading function creates headings with granular control over their behavior, unlike standard Markdown headings (#, ##, ...). It allows explicit control over numbering (numbered), table of contents indexing (indexed), page breaks (breakpage), depth, and reference ID (ref).

The new .pagebreak function provides an explicit way to insert a page break as an alternative to the <<< syntax.

The new .filetree function renders a visual file tree from a Markdown list.

.filetree
    - src
      - main.ts
      - ...
    - README.md

Bold entries (**name**) are highlighted with a distinct background color, useful for drawing attention to specific items.

.filetree
    - src
      - **main.ts**
      - utils.ts
    - README.md

Both .tableofcontents and .bibliography now accept the following optional parameters to control the heading that precedes them:

  • breakpage: controls whether the heading triggers an automatic page break.
  • headingdepth: the depth of the heading (1-6).
  • numberheading: controls whether the heading is numbered in the document hierarchy.
  • indexheading: when enabled, the heading is included in the document's own table of contents.

The .text function now accepts a script parameter with sub and sup values for subscript and superscript text.

Changed

Removed includeunnumbered parameter from .tableofcontents (breaking change)

The includeunnumbered parameter has been removed, in favor of the more granular heading configuration previously mentioned. Now all indexable headings are included in the ToC by default, regardless of their numbering.

.container's margin now suppresses children's margins

When an explicit margin is applied to a .container, it now suppresses the margins of its direct children, for a more intuitive and flexible layout configuration.

.fullspan now relies on .container

.fullspan, used to create a block spanning over multiple columns in a multi-column layout, is now shorthand for .container fullspan:{yes}.

Fixed

Stabilized multi-column layout

The multi-column layout via .pageformat columns:{N} is no longer experimental, and now works reliably across all document types.

Added call stack limit

Infinite recursion in function calls is now detected and reported as a clear error.

Fixed default browser not opening on Linux (Wayland and XDG environments)

On Linux systems where the Java AWT Desktop API does not support the BROWSE action (e.g., Wayland), --browser default now falls back to xdg-open automatically. Additionally, --browser xdg is now a supported named choice for the --browser CLI option.

Thanks @szy1840!

Fixed scroll position not fully restored during live preview on long paged documents

When editing long paged documents with live preview, the scroll position could sometimes be restored only partially because of long paged.js load times. The swap now reliably waits for the content to be fully loaded.

Fixed Mermaid diagrams preventing page breaks

Fixed an issue that caused Mermaid diagrams in paged documents to cause subsequent content to overflow instead of being pushed to the next page.

Fixed tree traversal not reaching non-body nodes

Fixed an issue that caused tree traversal-dependent features, such as cross-references, to not work in titles of .box and .collapse, and in block quote attributions.

Improved lexer performance

The lexer has been optimized to reduce regex builds to a minimum, resulting in significantly improved performance for large documents.


Sponsors

Thanks to our sponsors! 🎉

@vitto4

Falconer

1.14.1 - 2026-03-06

Added

A backslash (\) in a numbering format string now escapes the next character, treating it as a fixed symbol. For example, \1 produces a literal 1 instead of a decimal counter.

Fixed

Fixed live preview sometimes timing out on Windows

Fixed an IPv6-related issue that caused connections to Quarkdown's server to time out on Windows. Please also update to the latest version of the VS Code extension to v1.1.2 or later.

Fixed block function call incorrectly matching lines with trailing content

Fixed an issue that caused a line like .sum {1} {2} .sum {3} {4} to be incorrectly lexed as two block function calls rather than a single paragraph with two inline function calls.

Changed

Improved lexer performance

The lexer no longer restarts its regex search from scratch when a function call advances the scan position, resulting in slightly improved performance, especially for documents with many function calls.

1.14.0 - 2026-02-19

This version is the biggest release to date, with a large number of new features and improvements, and a new official wiki, written in Quarkdown, that fully replaces the GitHub wiki for a better experience.

Going forward, next minor releases will be smaller and more frequent.

Added

docs is the fourth document type available in Quarkdown, alongside plain, paged and slides. It is designed for technical documentation, wikis and knowledge bases.

It derives from plain, and adds a customizable navigation sidebar, a ToC sidebar, a header, accurate client-side search, and next/previous page navigation buttons.

You can see it in action in the new official wiki! To get started with a new docs document, you can rely on quarkdown create as usual.

New themes: Galactic (color) and Hyperlegible (layout)

Inspired by Astro, this new theme combination is the one used in the new wiki for improved readability and modern look.

Galactic+Hyperlegible

GitHub's alert syntax is now supported, making it easier to migrate from other tools:

> [!NOTE]
> This is a note

Note that Quarkdown's original syntax is still supported and recommended, especially for English documents:

> Note: This is a note

Links to Quarkdown subdocuments now support anchors, to link to specific sections:

[Page](page.qd#section)

The .formatpagenumber {format} function overrides the page numbering format from the current page onward. It accepts the same format specifiers as .numbering, and applies to both page counters and table of contents.

.pagemargin {topcenter}
    .currentpage

# First page

.formatpagenumber {i}

# Second page

# Third page

Page number format example

Thanks @OverSamu!

The .grid function now accepts hgap and vgap parameters to customize the horizontal and vertical gaps between grid items. gap still works as a shorthand for both.

Thanks @OverSamu!

When invoking a native function from the stdlib, none is now supported by nullable parameters, and converted to null.

Before:

.function {rectangle}
    width height background?:
    .if {.background::isnone}
        .container width:{.width} height:{.height}
    .ifnot {.background::isnone}
        .container width:{.width} height:{.height} background:{.background}

After:

.function {rectangle}
    width height background?:
    .container width:{.width} height:{.height} background:{.background}

The new .icon {name} function relies on Bootstrap Icons to display pixel-perfect icons in your documents.

Quarkdown is on .icon {github}

New output target: plain text

Quarkdown can now render to plain text (.txt) via --render plaintext.

This has no particular use case. It was needed to implement the docs search feature in the first place.

Get path to root directory

The new .pathtoroot {granularity?} function returns the relative path from the current source file to the parent directory of:

  • the root document, if granularity is project (default)
  • the subdocument, if granularity is subdocument

Changed

.css doesn't require !important anymore

The .css function now applies !important automatically at the end of each rule.

Revised navigation sidebar

The navigation sidebar, visible in plain and paged documents on web view, is now easier to navigate, with all entries visible at once, and more accessible for screen readers.

Sidebar

Additionally, its generation is now performed at compile time rather than runtime, providing major performance improvements for large documents.

Flexible naming strategy for subdocument output files

--no-subdoc-collisions was removed in favor of --subdoc-naming <strategy>, which is a flexible way to choose how subdocument output files are named:

  • file-name (default): each subdocument output file is named after its source file
  • document-name: each subdocument output file is named after its .docname value
  • collision-proof: former --no-subdoc-collisions

Revamped create CLI

The quarkdown create command is now more intuitive, for a smoother onboarding experience.

Libraries now include content

.include {library} now also includes top-level Markdown content from the library, just like .include {file.qd} does for regular files.

Page content border adjustments

Page content border (.pageformat bordercolor) is now supported in plain documents, and refined for slides documents, especially in PDF output.

Improved code diff styling

Code blocks using the diff language now have improved and clearer styling for added and removed lines.

Fixed

Major improvements to live preview

Live preview has undergone major performance improvements and increased reliability, especially in combination with the new VS Code extension update.

Live reloading not being performed when editing subdocuments has also been fixed.

Fixed subdocument resolution from included files

Linking to subdocuments from files included via .include from a different directory now correctly resolves the subdocument path.

Fixed unresolved reference of local variables in body arguments

The following snippet used to cause an unresolved reference error for y:

.function {a}
    x:
    .x

.function {b}
    y:
    .a
        .y

.b {hello}

Fixed paragraph spacing with floating element

Fixed an issue that caused no spacing to be present between two paragraphs if a floating element was in-between, via .float.

Fixed ToC with no level 1 headings

Table of contents are no longer empty if no level 1 headings are present, or if all are decorative.

Fixed line spacing in table cells

Table cells now correctly apply the same line spacing as paragraphs and lists.


Sponsors

Shout out to our sponsors! 🎉

@vitto4

@serkonda7

Falconer