---
title: Auto-identifiers
---
# Auto-identifiers
Enable with `.UseAutoIdentifiers()` (included in `UseAdvancedExtensions()`).
This extension automatically generates `id` attributes for all headings, similar to [Pandoc auto identifiers](https://pandoc.org/MANUAL.html#extension-auto_identifiers). This is essential for linking to specific sections.
## How it works
Every heading gets an `id` attribute derived from its text content:
```markdown
## Getting Started
```
Renders as:
```html
Getting Started
```
You can then link to it:
```markdown
See [Getting Started](#getting-started).
```
With the default `AutoLink` option, `[Getting Started]` also links to the heading.
These implicit heading references do not resolve inside another still-open link or
image bracket. For example, `[Read [Getting Started]](/guide)` links the entire
label `Read [Getting Started]` to `/guide`. Explicit reference definitions such as
`[Getting Started]: /guide` retain normal CommonMark reference-link behavior.
## ID generation rules
1. Convert to lowercase
2. Remove anything that is not a letter, number, space, or hyphen
3. Replace spaces with hyphens
4. Remove leading/trailing hyphens
**Examples:**
{.table}
| Heading | Generated ID |
|---|---|
| `# Hello World` | `hello-world` |
| `## C# Tips & Tricks` | `c-tips--tricks` |
| `### 2. Installation` | `2-installation` |
## Duplicate handling
If two headings produce the same ID, a numeric suffix is appended:
```markdown
## Section
## Section
## Section
```
Produces: `section`, `section-1`, `section-2`.
## Options
`UseAutoIdentifiers` accepts an `AutoIdentifierOptions` flags enum:
```csharp
using Markdig.Extensions.AutoIdentifiers;
var pipeline = new MarkdownPipelineBuilder()
.UseAutoIdentifiers(AutoIdentifierOptions.GitHub)
.Build();
```
Available options:
{.table}
| Option | Description |
|---|---|
| `AutoIdentifierOptions.Default` | Standard auto-identifier behavior |
| `AutoIdentifierOptions.GitHub` | GitHub-compatible ID generation |
| `AutoIdentifierOptions.AutoLink` | Also create a self-link anchor |
| `AutoIdentifierOptions.AllowOnlyAscii` | Strip non-ASCII characters from IDs |
## Combining with generic attributes
You can override the auto-generated ID using [Generic attributes](generic-attributes.md):
```markdown
## My Heading {#custom-id}
```
The explicit `#custom-id` takes precedence over the auto-generated one.