# GFM (GitHub Flavored Markdown) 标准语法

<p style="text-indent: 2em;">首行缩进（行首空两格）的表示方法，非标准Markdown语法要求，不在GFM语法范畴。Markdown的设计初衷就是为了简洁，标准Markdown不推荐。</p>

```html
<p style="text-indent: 2em;">首行缩进（行首空两格）的表示方法，非标准Markdown语法要求，不在GFM语法范畴。Markdown的设计初衷就是为了简洁，标准Markdown不推荐。</p>
```

*这是GitHub Flavored Markdown (GFM) 标准语法，供其他MarkDown编辑器使用参考*

------

<center>

![Markdown语法](https://www.heyanper.top/images/markdown.jpg){width=80%}

</center>

请不要删除这个文档，你可以从这里找到需要的帮助信息。

## 什么是 Markdown?

Markdown 是一种轻量级的标记语言。它允许人们使用易读易写的纯文本格式编写文档，并支持图片、图表、数学公式等，然后转换成有效的 HTML 文档。Batata采用 [GitHub Flavored Markdown](https://github.github.com/gfm/) 语法（简称 GFM），并支持一些扩展语法。

为了方便导航，我们在这里插入本文档目录：

[toc]

## 0 目录

```
[TOC] 或者 [toc]
```

## 1 标题

- 标准Markdown最高支持六级标题，一级标题在行首使用一个`#`，二级标题使用两个`##`，以此类推。
- 使用 `===` 表示高阶标题，使用 `---` 表示次阶标题。  
1 `#` 和标题之间记得有个空格哦。  
2 `====` 和 `----` 表示标题时，大于等于2个都可以表示，与分割线区别是分割线前面要空一行。语法如下：  

```
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

一级标题
===
二级用标题
---

```

## 2 文本强调

使用 `** 或者 __` 表示__粗体__。  
使用 `* 或者 _ ` 表示_斜体_。  
使用`==`表示 ==高亮==  
使用`~~`表示 ~~删除~~  
`*，= 或 _` 的后面不要跟空格  

+ `**粗体**`用于表示**粗体**
+ `*斜体*`用于表示*斜体*
+ `~~删除线~~`用于表示~~删除线~~

## 3 脚注

### 用法
正文中引用脚注`[^1]`和`[^note]`。
定义脚注内容：

    [^1]: 这是第一个数字脚注的内容
    [^note]: 这是命名脚注，支持**加粗**等行内格式


- `[^id]` 引用按首次出现顺序自动编号为上标链接
- `[^id]:` 脚注内容 定义从正文移除，统一汇总到文末（带回链 ↩）
- 定义内容支持行内 Markdown


### 示例 
我们可以在这里插入一个命名脚注 [^footnote]。
[^footnote]: 这是命名脚注内容。

## 4 引用

使用 > 表示引用， >> 表示引用里面再套一层引用，依次类推。

如果 > 和 >> 嵌套使用的话，从 >> 退到 > 时，必须之间要加一个空格或者 > 作为过渡，否则默认为下一行和上一行是同一级别的引用。如示例所示。
引用标记里可以使用其他标记，如：有序列表或无序列表标记，代码标记等。  
  
示例

    > 这是一级引用
    >> 这是二级引用
    >>> 这是三级引用
      
    > 这是一级引用

效果：
> 这是一级引用
>> 这是二级引用
>>> 这是三级引用
 
> 这是一级引用


## 5 链接

```
[链接标题](http://www.acemark.net)
```
输出：[链接标题](http://www.acemark.net)

自动链接:
```
<https://apps.apple.com/app/id1472328263>
<user@example.com>
```
<https://apps.apple.com/app/id1472328263>
<user@example.com>

## 6 图片

如果想要显示一张网络图片，方式和普通链接类似，但需要在前面加一个`!`符号。
```
![图片标题](https://www.heyanper.top/api/images/img_10001.jpg)

# 指定大小
![图片标题](https://www.heyanper.top/api/images/img_10001.jpg){width=640px}
![图片标题](https://www.heyanper.top/api/images/img_10001.jpg){width=60%}

# 居中
<center>

![图片标题](https://www.heyanper.top/api/images/img_10001.jpg){width=60%}

</center>

注意：<center>前后要空一行，否则不生效。
```
<center>

![图片标题](https://www.heyanper.top/api/images/img_10001.jpg){width=30%}

</center>

## 7 表格

通过下面的标记，就可以输出一份表格

    有边框表格
    | 标题1 | 标题2 | 标题3 |
    |------|-------|------|
    | 内容1 | 内容2 | 内容3 |
    | 内容4 | 内容5 | 内容6 |

    无边框表格

    标题1 | 标题2 | 标题3
    ------|-------|------
    内容1 | 内容2 | 内容3
    内容4 | 内容5 | 内容6

    对齐方式:
    Heading | Heading | Heading
    :----- | :----: | ------:
    Left   | Center | Right
    Left   | Center | Right
    
输出表格：

- 有边框表格

| 标题1 | 标题2 | 标题3 |
|------|-------|------|
| 内容1 | 内容2 | 内容3 |
| 内容4 | 内容5 | 内容6 |

- 无边框表格

标题1 | 标题2 | 标题3
------|-------|------
内容1 | 内容2 | 内容3
内容4 | 内容5 | 内容6


- 对齐方式:

Heading | Heading | Heading
:----- | :----: | ------:
Left   | Center | Right
Left   | Center | Right


## 8 列表

### 有序列表
`1. 2. 3.`用来标识有序列表项。例如：

```
1. 第一项
2. 第二项
```

输出结果：

1. 第一项
2. 第二项

### 无序列表

`+`、`*`、`-`都可以用来标识无序列表项。例如：

```
+ 项目1
* 项目2
- 项目3
```

输出结果：

+ 项目1
* 项目2
- 项目3

### 嵌套列表
#### 无序嵌套列表
无序列表的嵌套很简单，你只需要在子列表的每一项前增加额外的缩进（通常是四个空格或者一个制表符）。
- 一级列表
    - 二级列表
        - 三级列表
            - 四级列表

#### 有序嵌套列表
有序列表的嵌套方法与无序列表类似，也是在子列表的每一项前增加额外的缩进。
1. 一级列表
    1. 二级列表1
    2. 二级列表2
        1. 三级列表1
            1. 四级列表
            2. 四级列表
            3. 四级列表
        2. 三级列表2
2. 一级列表

#### 混合嵌套列表

1. 一级列表
    1. 二级列表1
    2. 二级列表2
        1. 三级列表1
            - 四级列表
            - 四级列表
            - 四级列表
        2. 三级列表2
2. 一级列表

### TODO 标记

```
- [ ] 未完成
- [X] 已完成
```

输出结果：

- [ ] 未完成
- [X] 已完成

### 注意事项
确保在Markdown编辑器中正确地使用空格或制表符进行缩进。不同的Markdown解析器对缩进的处理可能略有不同，但大多数都接受四个空格或一个制表符作为标准。  
在某些Markdown变种或特定渲染环境中，你可能需要使用四个空格而不是一个制表符来实现一致的渲染效果。例如，GitHub和一些Markdown解析器推荐使用四个空格进行缩进。  
在写作时，保持一致的缩进风格可以提高Markdown文档的可读性和兼容性。  

## 9 代码
- 反引号代码块：用两个位于行首的` ``` `包裹表示;  
- 缩进代码块：用四个空格或者一个 Tab 表示缩进代码块，8个空格或者2个Tab表示进一步缩进; 
- 不管反引号还是缩进代码块代码块，前后分别空一行才能正确解析渲染。  
- 行内代码：格式`行内代码`

### 缩进代码示例

    这是一个普通的段落。

支持几十种代码高亮。例如：

### 代码块示例

#### PHP

```php
require_once "Parsedown.php";
$parsedown = new Parsedown();
echo $parsedown->text("# Hello Markdown!");
```

#### Go

    ```go
    func Fibonacci(n int) int {
        if n <= 1 {
            return n
        }
        return Fibonacci(n-1) + Fibonacci(n-2)
    }
    ```
    
输出：

```go
func Fibonacci(n int) int {
    if n <= 1 {
        return n
    }
    return Fibonacci(n-1) + Fibonacci(n-2)
}
```

#### JavaScript

    ```javascript
    function Fibonacci(num) {
        if (num <= 1) return 1;
        return Fibonacci(num - 1) + Fibonacci(num - 2);
    }
    ```

输出：

```javascript
function Fibonacci(num) {
    if (num <= 1) return 1;
    return Fibonacci(num - 1) + Fibonacci(num - 2);
}
```

#### Lua

    ```lua
    local function Fibonacci(n)
        local function doFibonacci(n, ret1, ret2)
            if (n <= 1) then
                return ret2
            end
            return doFibonacci(n - 1, ret2, ret1 + ret2)
        end
        return doFibonacci(n, 1, 1)
    end
    ```
    
输出：

```lua
local function Fibonacci(n)
    local function doFibonacci(n, ret1, ret2)
        if (n <= 1) then
            return ret2
        end
        return doFibonacci(n - 1, ret2, ret1 + ret2)
    end
    return doFibonacci(n, 1, 1)
end
```

## 10 数学公式

支持 LaTeX 语法的数学公式。例如

```
$$
f(x) = a x^2 + b x + c
$$
```

会输出一个抛物线方程

$$
f(x) = a x^2 + b x + c
$$

$$
x = {-b \pm \sqrt{b^2-4ac} \over 2a}
$$


而下面这个表达式
```
$$
F(\omega)=\int_{-\infty}^{+\infty} {f(t)e^{-i\omega t}dt}
$$
```

会输出一个傅里叶变换积分方程

$$
F(\omega)=\int_{-\infty}^{+\infty} {f(t)e^{-i\omega t}dt}
$$

要输出矩阵也很简单，只需要

```
$$
\begin{bmatrix}
1 & x & x^2 \\
1 & y & y^2 \\
1 & z & z^2 \\
\end{bmatrix}
$$
```

便可得到想要的效果

$$
\begin{bmatrix}
1 & x & x^2 \\
1 & y & y^2 \\
1 & z & z^2 \\
\end{bmatrix}
$$

公式也可以显示在行内。例如 `$f(x)=kx+b$` 就会输出 $f(x)=kx+b$，这是一个显示在行内的直线方程。

## 11 换行

- 标准语法要求在行尾添加两个空格或者换行符代表换行
- 部分MarkDown工具可以自动处理回车为换行，无标准换行要求。如Typro，AceMark等, FlashNode调用Parsedown支持自定义设置：$pd->setBreaksEnabled(true); marked.js默认支持GFM 模式，默认已启用（marked.setOptions({ gfm: true, breaks: true })）

标准换行示例如下：

这行的行尾有两个空格  
这是一个新行。 

## 12 分割线

使用 `---` 或者 `***` 或者变体`* * *` 表示水平分割线，显示效果相同。

1.  只要 `*` 或者 `-` 大于等于三个就可组成一条平行线。
2.  使用 `---` 作为水平分割线时，要在它的前后都空一行，防止 `---` 被当成标题标记的表示方式。

示例

---

***

* * *

Markdown 分割线本质是 HTML `<hr>` 标签，基础语法仅支持横线，具体样式（粗细、颜色、圆角）需通过 CSS 定制。

1. 基础写法（生成标准横线）
以下三种写法效果相同，均要求独占一行且符号数量 ≥3个：
- `---`（减号，最推荐，简洁通用）
- `***`（星号）
- `___`（下划线，注意避免与标题语法冲突）
- *变体*：符号间可加空格，如 `- - -` 或 `* * *`，渲染效果一致 。

2. 自定义样式（需嵌入 HTML/CSS）
原生 Markdown 无法直接改变颜色或粗细，需在支持 HTML 的编辑器中插入 `<style>` 或内联样式：

- 修改粗细：
```html
  <hr style="border-top: 3px solid 000;">
```
- 修改颜色：将 `000` 替换为任意颜色代码（如 `4ade80`）。
- 修改圆角/渐变：
```html
  <div style="border-top: 4px solid 4ade80; border-radius: 4px; margin: 32px 0;"></div>
```
  *注：部分平台（如 GitHub）会过滤自定义 CSS，仅显示默认灰色细线 。*

3. 关键注意事项
- 前后留空：分割线前后必须各空一行，否则可能无法渲染或被误解析为文本 。
- YAML 冲突：在静态站点生成器（如 Hugo/Hexo）中，文档开头的 `---` 可能被识别为 Front Matter 分隔符，需确保上下文正确 。
- 平台差异：Typora、Obsidian 等本地编辑器支持 CSS 美化；网页端（如知乎、CSDN）通常仅显示默认样式 。