本文支持WTFPL協議,因此你想往哪轉就往哪轉。
Why markdown?
Markdown是一種可以使用普通文本編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文本內容具有一定的格式。
Markdown具有一系列衍生版本,用於擴展Markdown的功能(如表格、腳注、內嵌HTML等等),這些功能原初的Markdown尚不具備,它們能讓Markdown轉換成更多的格式,例如LaTeX,Docbook。Markdown增強版中比較有名的有Markdown Extra、
MultiMarkdown、 Maruku等。這些衍生版本要么基於工具,如Pandoc;要么基於網站,如GitHub和Wikipedia,在語法上基本兼容,但在一些語法和渲染效果上有改動。
- Baidu Baike
上述內容告訴你,Markdown是一種標記語言,再粗暴一點說,就是排版用的,再再粗暴一點,就是如何讓你看起來如同記事本一般平淡的文本能夠變得花里胡哨。
偷偷告訴你:這篇文章就是用Markdown寫的。
標記語言??我知道HTML啊,有什么區別么??
他倆啥關系
Markdown是基於HTML所開發的,與HTML不同的是,Markdown(以下簡稱MD)並不受W3C基金會管理,但本身也是開放的。
Markdown允許內嵌HTML代碼(盡管不完全支持HTML標准下的所有標簽,這是出於安全考慮,而且這也不是倡用的行為),而在網頁顯示的時候這些Markdown語法也會被轉換成對應的HTML標記文本顯示在你的面前。
但是現在的Markdown並不只限於可以轉換為HTML,新的技術(Pandoc)標明他們實際上還可以轉換成doc或者pdf之類的……
他倆誰好用
這不是一個可以很快下定論的東西,無所謂誰更好或者更糟,如果Markdown和HTML真能像這樣一較高下的話恐怕另一個也就不復存在了不是。
他們兩個的面向是不同的,HTML專注於一種通用的,能夠在各個設備上在一定的文本協議(HTTP/HTTPS)下正確的進行顯示,所以論強大的話,HTML可以支持更加花哨強大的功能,但是相對應的,使用起來就要繁瑣一些,並且具備一個相當龐大的語法標准和一些協議性的說明。
而Markdown則是面向於快速標記的,而且對程序員非常友好(因為本身針對代碼的排版做了相關的處理,可比HTML的<code>
再配上一堆亂七八糟的CSS方便多了),因此廣受IT行業的青睞,不僅如此,最近的Markdown甚至可以支持部分\(\mathrm{\LaTeX}\)語法(當然主要用於寫數學公式用,而另一方面用於HTML的MathML似乎沒能推廣起來的樣子)
所以簡單來說,Markdown比HTML用起來快,但HTML具有Markdown無法替代的功能。
Markdown 用起來有多快??看看下面這段話就知道了:
萬維網聯盟創建於1994年,是Web技術領域最具權威和影響力的國際中立性技術標准機構。到目前為止,W3C已發布了200多項影響深遠的Web技術標准及實施指南
Markdown:
> *萬維網聯盟*創建於**1994**年,是Web技術領域**最具權威**和**影響力**的國際中立性技術標准機構。到目前為止,W3C已發布了200多項影響深遠的Web技術標准及實施指南
HTML:
<blockquote><p><i>萬維網聯盟</i>創建於<b>1994</b>年,是Web技術領域<b>最具權威</b>和<b>影響力</b>的國際中立性技術標准機構。到目前為止,W3C已發布了200多項影響深遠的Web技術標准及實施指南<br /></p></blockquote>
據上述內容統計,當輸入一個HTML標簽的時候,你需要按下若干次的Shift+,+Shift+.+←[+/]+標簽鍵位,而在Markdown里至多只需要若干次的Shift+8而已,根據時間復雜度o(n)的分析和人體工學的相關……
How?
本人的資歷尚淺,即便如此自己還是能希望通過自己綿薄的力量幫助大家快速上手,自己從大二開始經常使用Markdown記錄筆記,因此用的還算方便和熟練。因此這里針對一些非常非常常用的功能進行說明:。
標題文本(巧了,說的不就是我么??)
標題文本一般用#
開始,#
的數量決定標題的等級,這和HTML里面的<h1>
到<h6>
多少有些類似,盡管Markdown的最終渲染結果取決於各服務器提供的CSS文件但一般來說,層級越高(##...## Title
)的標題通常字會越小作為副標題使用。
比如,這段的標題實際上就是這么寫的
## 標題文本
是的,根據井號的數量來看,這是個二級標題。
如沒有特殊規定,一般標題最大支持到六級(正好對應HTML的<h6>
)
在有些Markdown系統下,#
可以(甚至會要求)成對出現
## 標題文本 ##
但是博客園里的沒做這種要求
標題屬於行級格式,因此標題只能出現於一行的行首,而不允許在行的中間或結尾出現,而且當某一行被標注為標題的時候,整個一行的文字都會變成標題的格式。位於行中間的井號會被真的處理為#
位於分割線上方的文本會被自動處理為標題
粗體、斜體、粗斜體、刪除線
身正不怕影子 斜
正是這樣,Markdown提供了一種非常快速方式進行這種文字版式的替換,使用若干個成對的*
完成:
一對*
是斜體(*斜體*
)(不知何種原因,博客園的MD編輯器似乎不支持斜體,自然,粗斜體也會同樣變成粗體,好吧,跟皮膚有關系,有的皮膚樣式對應的Markdown渲染樣式就沒有斜體,換個皮膚就好了)
兩對*
是粗體(**粗體**
)
我想又粗又斜怎么辦,很簡單,1+2=3(***粗斜***
)
此外,Markdown還允許使用一堆雙浪線~~
包圍文本作為刪除線使用,例如:
浪個里格浪
~~浪個里格浪~~
不幸的是,Markdown語法里並未提供下划線,盡管如此可以通過內嵌HTML的<u>
標簽來實現。
引用
著名的作家魯迅先生曾經在這里說了很多的東西,比如“我從來沒說過這句話”……
引用在Markdown里由一個>
開始,值得注意的是,引用是一個塊級結構,這意味着引用不會對文段的一部分進行修飾,而是直接作用於一整個文段
如果想要讓后文內容脫離引用,根據上面的說法就是讓后文內容脫離被引用的文段,也就是在引用文段的最后一行與非引用文段的第一行之間加個回車比如:
魯迅說過:……
魯迅沒說過……
用Markdown寫出來就是:
> 魯迅說過:……
魯迅沒說過……
但如果是
> 魯迅說過:……
魯迅也說過……
就會變成:
魯迅說過:……
魯迅也說過……
和標題類似,引用也可以通過增加>
的數量進行嵌套引用:
魯迅先生曾經說過
世界上本沒有路,走的人多了,便成了路
> 魯迅先生曾經說過
>> 世界上本沒有路,走的人多了,便成了路
引用內的文段一樣可以加上其他的格式標注,比如:
魯迅先生強調過:真的
勇士猛士,敢於直面慘淡的人生,敢於正視淋漓的鮮血。
> [魯迅](https://baike.baidu.com/item/魯迅/36231?fr=aladdin)先生**強調**過:**真的~~勇士~~猛士,敢於直面慘淡的人生,敢於正視淋漓的鮮血。**
表格
0 | VS | 0 |
---|---|---|
× | ○ | ○ |
○ | ○ | × |
× | × | ○ |
住手!!你們住手!!不要再下啦!!
這已經是你們下的第4294967295盤啦!!
Markdown提供了一個非常簡單的關於表格的格式支持,盡管這原本並不存在於最初的Markdown語法集當中,Markdown對於表格功能上的支持是無法與HTML的<table>
標簽抗衡的,因為它支持最完整的表格,也只有這種格式:
表頭1 | 表頭2 | 表頭3 |
---|---|---|
左對齊的文本 | 居中的文本 | 右對齊的文本 |
左對齊 | 居中 | 右對齊 |
左對齊 | 居中 | 右對齊 |
只有表格的第一行可以作為表頭使用,其他的項只能作為普通的元組使用,表格是向下排開的,所以想寫橫向表格的話也不是一個很好的選擇,和引用類似,表格也是一個塊級結構,而表格要求在其前后都要有一個回車,否則內容不被視為表格,表格的基本語法如下(這恐怕是Markdown里最麻煩的語法格式了):
上一段文本……
|表頭1|表頭2|表頭3|
|:---|:---:|---:|
|左對齊的文本|居中的文本|右對齊的文本|
|左對齊|居中|右對齊|
|左對齊|居中|右對齊|
下一段文本
第一行作為表頭使用表頭的格式與表格其他項會略有不同,他的字更粗而且他所在的單元格與其他的單元格長得也略有不同。
第二行那個很像火星文的東西用於指定整列的對齊方式,橫線的數量不限,冒號確定文本的對齊錨點位置,表示如下含義:
|:---|:---:|---:|
左 中 右
並不一定非要指定成這個樣子,也可以全是左的,也可以全是右的……總之是這樣。
后面的行就是普通的表格項了,以|
分割,不限於3列,可以更多,每列用|
分割,而且請注意,MD中一張表格的列數是固定的,因此,你不可以指定被合並的單元格,也不可以弄出那種像磚牆那樣的鋸齒表格,而且表格的列寬是自適應內容的,因此在原生MD中你無法指定列寬。
但如果真的需要這樣怎么辦呢,由於MD允許內嵌HTML代碼,因此可以使用HTML的<table><tr><td>...
這些標簽來實現(i.e.寫成HTML表格),因為HTML的table功能足夠強大,盡管如此內嵌HTML也不是倡用的做法。
代碼塊與行內代碼
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
這是Markdown最受IT從業者青睞的地方了,因為同樣的功能如果讓HTML來做會需要用各種各樣的標簽控制等寬文本然后還要用CSS或者JS腳本來控制高亮……
但是在Markdown里你完全不需要考慮這些(當然,高亮與否以及高亮的方式取決於服務器提供的CSS樣式)。
這里先介紹代碼塊,它由一對三個反單引號包圍```
,反單引號在哪呢??在鍵盤Tab鍵的上方你會找到一個標有~
的鍵,這個鍵用Shift打出來就是浪線,但是直接敲出來就是反單引號,在中文標點下,這個鍵會打出間隔符·
代碼塊是塊級結構,被修飾的內容即使被寫到某一段內,也會被另起一行作為新的段落,直至再出現三個反單引號結束,比如本節最開始的那個Hello World實際上是這樣嬸兒的:
(請無視反斜線`\`,我沒找到好方法能夠讓代碼塊里顯示代碼塊的寫法)
\```cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
\```
其中,第一個三反單引號后面可以加入你的語言名稱的縮寫(cpp表示C++),這個有助於文檔確認你這段代碼基於何種語法進行高亮,你也可以指定JavaScript之類的
在有些Markdown系統中,允許通過另外一種方式定義代碼塊,將整個文段向內進行一次Tab(縮進)即可,這個文段整個就被當作代碼塊處理。這里不對此方法進行描述。
除了代碼塊以外,Markdown
還支持行內代碼,對就是這樣,行內代碼和加粗類似,屬於對文段內部的修飾,由一對反單引號包圍,比如這段內容的Markdown語法就是這樣的:
除了代碼塊以外,`Markdown`還支持**行內代碼**,對就是這樣,……
這種寫法在有些時候是非常方便的,比如:
這里介紹關於
System.Collection.Generic
所包含的接口和類……
這樣,在文本內排放代碼是非常容易並且美觀的
可比某課設里面往Word里面粘代碼來的順暢多了……
鏈接
鏈接在Markdown中的組織形式也非常簡單,鏈接有兩部分構成,一個是鏈接的顯示文本,還有一個就是鏈接的符號地址:
比如沈陽航空航天大學官網
Markdown語法就是:
[沈陽航空航天大學官網](http://www.sau.edu.cn)
[顯示文本](符號地址)
如果顯示文本為空,則鏈接將直接取符號地址作為顯示文本。
圖片
(上圖來自於百度搜索結果)
在Markdown中由於圖片也是直接鏈接網絡資源,因此她的格式多少與鏈接有些類似:


圖片描述通常不會顯示出來,有些頁面允許圖片描述作為鼠標懸停在圖片上的提示文本出現,圖片描述的另一個作用在於,當對服務器進行檢索的時候,提供圖片描述的關鍵字可以直接檢索出該圖片。
圖片地址表示圖片在網絡上的位置(URI),如果圖片存在,則直接顯示圖片,否則圖森破!
列表
- 吃飯
- 早飯
- 午飯
- 晚飯
- 夜宵
- 睡覺
- 打豆豆
- 紅豆
- 黃豆
- 綠豆
有序列表
有序列表就是帶編號的列表,Markdown最基礎的語法只支持這種格式的編號:
- 項目1
- 項目2
- 項目3
1. 項目1
2. 項目2
3. 項目3
是的!你沒看錯,就是這么寫的!其中,如果手動編號順序錯誤,有些Markdown編輯器會矯正過來(這種矯正可能不會在編輯期間完成,而是在最終顯示的時候被修正),有些編輯器甚至會自動產生編號。
有些編輯器甚至支持下級的編號,以及其他的編號格式,如abc等,博客園的支持多級編號:
- 項目1
- 子項目1
- 孫子項目1.1
- 子項目2
- 子項目1
- 項目2
- 項目3
產生次級編號的方法是對次級編號進行縮進:
1. 項目1
1. 子項目1
1. 孫子項目1.1
2. 子項目2
2. 項目2
3. 項目3
無序列表
無序列表當然也就沒有編號,他們用圓點作為項目符,在Markdown中可以使用加號+
,減號-
,星號*
引領一個無序項,使用哪個符號的最終結果是一樣的,同樣,無序列表也支持多級列表,例如:
- Who
- cares
- my
- order
- out
- of
- its
- own
- ORDER
寫出來就是:
+ Who
+ cares
+ my
+ order
+ out
+ of
+ its
+ own
+ ORDER
數學公式(\(\mathrm{\LaTeX}\)擴展語法)
好吧,我估計錯了,博客園的數學公式支持功能需要自己在設置里面打開。
這里不介紹關於如何開啟該功能的方法,可自行查找其他博文。
這里也不介紹如何控制\(\mathrm{\LaTeX}\)文本的語法,這不屬於標准Markdown語法而是\(\mathrm{\LaTeX}\)的語法
這里只說如何在Markdown中嵌入,類似於代碼塊,公式塊也可以塊級鍵入或者行內嵌入,塊級嵌入的公式使用一對雙美元號$$
,而行內則使用一對單美元號$
(這里只用塊級的,有些系統不支持使用行內嵌入,當然,有的系統干脆不支持這個東西):
$$
E=mc^2
$$
$$
e^{i\pi}+1=0
$$
$$
\Phi (x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^x e^{-\frac{t^2}{2}} \mathrm{d}t
$$
$$
\mathbf{E} =
\begin{bmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{bmatrix}
$$
$$
\mathbf{A}\vec{x} =
\begin{bmatrix}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
a_{31} & a_{32} & a_{33} \\
\end{bmatrix}
\begin{bmatrix}
x_1 \\ x_2 \\ x_3
\end{bmatrix}
=
\begin{bmatrix}
b_1 \\ b_2 \\ b_3
\end{bmatrix}
= \vec {b} \implies
\begin{equation}
\begin{cases}
a_{11}x_1+a_{12}x_2+a_{13}x_3 &= b_1 \\
a_{21}x_1+a_{22}x_2+a_{23}x_3 &= b_2 \\
a_{31}x_1+a_{32}x_2+a_{33}x_3 &= b_3 \\
\end{cases}
\end{equation}
$$