Markdown學習筆記(1)

Warning:本文章是使用知乎的導入功能由Markdown文檔導入到知乎的。知乎對Markdown的支持有點問題,儘管已經手動修復了一些排版明顯有問題的地方,但是有一些格式仍然不被支持,所以也無從修改。

因此我們建議你先去這裡查看文章內容,或者使用知乎用戶 @陳關州在Windows Store上發布的免費軟體Markdown.UWP來查看你從GitHub中下載的md文件,這個Markdown編輯器使用了CommonMark.NET庫,它有著不錯的實現。

緣起

Markdown作為一種用於編寫結構化文檔的純文本格式,它易讀易寫的純文本特性和寬泛簡單的語法十分適用于格式化的筆記和說明中。正因為這種書寫和表達上的便利性,它已經成為了知乎、GitHub、 Bitbucket,、Reddit等知名社區的主流文本語言。因此,如果你作為貢獻者經常活躍於這些社區,你應該更深入地了解一下這種文本格式。

其實,Html的文本已經很容易書寫了,而且它功能強大,能展現出很多樣式。但很顯然地,Html文檔並沒有那麼適合閱讀。2004年,Markdown的作者John Gruber,使用Perl語言寫出了一個markdown文檔到Html文檔的轉換器,即Markdown.pl。Markdown語言就隨著這個轉換器,在BSD協議下被發布出來了。

但John Gruber顯然不怎麼喜歡「語法律師」,他並沒有規定Markdown的一些語法細節,只給出了大概的語法。對於那些沒有具體規定的書寫規則,Markdown文本將被如何轉換為Html文本,以及將以什麼樣子在視覺上呈現出來,這完全取決於Markdown.pl的實現。John Gruber在推特中表示,正是因為沒有對Markdown進行標準化,Markdown這種文檔書寫格式才具有很強的生命力。

一般來說,沒有語法標準的語言會對學習者以及使用者造成很大的困擾。但Markdown語法體系的構建只依賴幾個符號,書寫特別簡單,而且任何格式的文本都是合法的,因此大家仍然沒有太多疑惑地在用各自習慣的方式使用它。有很多不同的Markdown解析器給出了幾種不同的實現。

當然,有些人不想要標準化的Markdown語法,就有人想要標準化的Markdown書寫格式。一些人認為,在不同的地方要調整Markdown語法才能夠讓顯示效果保持一致,這要求使用者記憶幾套不同的語法細節,這是很麻煩的,於是,他們試圖制定一套實用的Markdown語法標準,這就是CommonMark。我們不評價這種行為,只對這套語法標準本身進行討論。CommonMark消除了很多原本語法中的未定義行為,這使它獲得了一部分人的青睞,CommonMark在社區的一些用戶眼中成為了事實上的Markdown語法標準。

這篇學習筆記主要圍繞CommonMark定義的語法標準展開。但即使你是一個堅定的去標準化主義者,粗略地看一下Markdown的通用語法規則也是有益處的,這篇文章接下來的部分將介紹這些規則,它們十分簡單,很切合易讀易寫的設計理念。


段落

前後都有空行的文本就是一個段落。

斜體

在文本前後加上或者*符號,即可把文本樣式變為斜體。

例子:_Italic_或者*Italic*

效果:Italic

加粗

在文本前後加上連續的兩個_或者*符號,即可把文本樣式變為粗體。

例子:__Bold__或者**Bold**

效果:Bold

分隔線

分隔線標識獨佔一行,這行文本可以由0~3個空格開始,包含3個及以上的_-或者*符號。符合上述描述的一行文本將被視為一個分隔線,這些符號之間可以包含任意數量的空格。

例子:---或者___或者***或者* ** * * * ** ***或者____ _____

效果:


引用

在行首、文本前加上>,代表這行的本文是一行引用內容。

例子:>這句話引用自《blahblah》

效果:

這句話引用自《blahblah》

無序列表

新起一行,在列表項前加*或者-,再加一個或多個空格,來構成無序列表項。

例子:

- 茄子- 白菜- 蘿蔔

效果:

  • 茄子
  • 白菜
  • 蘿蔔

有序列表

新起一行,在列表項前加數字和.,再加一個或多個空格,來構成有序列表項。

也可以用)來替代.。但無論是無序列表還是有序列表,一個列表項前的標識符只能為同一種。

例子:

1. 茄子2. 白菜3. 蘿蔔

效果:

  1. 茄子
  2. 白菜
  3. 蘿蔔

列表項前的數字無需有順序,第一個數字將作為第一個序號被顯示出來。無論如何書寫剩下的數字標記,Markdown都會對序號自動進行順序排列。

例子:

4. 茄子2. 白菜182. 蘿蔔

效果:

4. 茄子

5. 白菜

6. 蘿蔔

內聯代碼

內聯代碼和其他本文可以在同一行中共存。只需在代碼文本兩側使用`標記。

例子:

接下來是代碼內容`std::cout<<"Hello World!"`

效果:

接下來是代碼內容std::cout<<"Hello World!"

代碼塊

代碼塊單獨佔用一至多行。只需在代碼文本兩側使用```標記。

例子:

```int countNum = 1;std::cout<countNum;```

效果:

int countNum = 1;std::cout<<countNum;

也可以在一行前加一個Tab或者四個空格,則這行的內容被視為代碼(這就是一行前一般不能加四個或四個以上空格的原因,加多了就成代碼塊了)。

例子:

int countNum = 1;

效果:

int countNum = 1;

標題

標題有1~6個級別,1級標題文字前加一個#號,再緊跟著一個或者多個空格。以此類推。

例子:

# 這是一個一級標題## 這是一個二級標題### 這是一個三級標題#### 這是一個四級標題##### 這是一個五級標題###### 這是一個六級標題

效果:

這是一個一級標題

這是一個二級標題

這是一個三級標題

這是一個四級標題

這是一個五級標題

這是一個六級標題

一級標題也可以通過在標題文本行的下一行寫三個或以上的=符號來實現。

二級標題也可以通過在標題文本行的下一行寫三個或以上的-符號來實現。

例子:

這是一個一級標題 ===這是一個二級標題---

效果:

這是一個一級標題

這是一個二級標題

插入鏈接

Markdown中插入鏈接有兩種方式,一種是內聯式(inline links),一種是參考式(reference links)。

內聯式的鏈接書寫格式為:

[鏈接的文字描述](鏈接URL)

參考式的鏈接書寫格式為:

[鏈接的文字描述][鏈接標籤名字]

然後在任意空行定義鏈接標籤(link label),定義鏈接標籤的格式為:

[鏈接標籤名字]:URL文本 "鏈接描述"

其中,鏈接描述(雙引號也是鏈接描述的一部分)是可選的。

例子:

[github首頁](https://github.com/) [我的github主頁][R] [R]:https://github.com/TiriSane "這個鏈接是我的github主頁"

效果:

github首頁 我的github主頁

當然,在URL文本兩側使用<>標記,也可以讓URL文本可以作為本身URL的鏈接。

例子:<zhihu.com>

效果:https://www.zhihu.com

插入圖片

插入圖片和格式和插入、鏈接類似,只是前面多加了一個!。

例子:

[我的一個頭像](https://ws1.sinaimg.cn/large/005K80gply1foqkrf6lv2j30c40d4tag.jpg)[我的另一個頭像][T][T]:https://ws1.sinaimg.cn/large/005K80gply1foqkturaj6j30sg0sgkjl.jpg "這張圖片是我的另一個頭像"

效果:

如你所見,這種插入圖片的方法是無法指定大小的,所以使用它可能導致你的排版很糟糕。(還好我畫的小姐姐好看(逃)


Have A Break

以上幾乎就是Markdown基本語法的所有內容了。儘管關於Markdown,不同網站都有一套自己的規矩,但上述語法在各種地方都可以使用。你甚至可以直接在Markdown文本里插入Html片段來精細地控制文本格式,既然Markdown轉換器的原理是把Markdown翻譯成Html代碼,再展示出來,那麼直接再Markdown里使用Html片段自然也是可以的,Markdown做到了這種兼容。

但是你有時仍會對Markdown的使用有所疑惑,比如:空行里的---是一個二級標題標記還是一個分隔線標記;如果列表項中出現*號和空格的組合,它們代表的是一個新的子列表項,還是列表項的一部分。不過這些問題你總能在不斷嘗試中得到你想要的樣式作為答案。Markdown的語法標記很少,只知其然,不知其所以然也是夠用的。你可以前往這裡來進行互動式Markdown學習。

所以接下來的部分,是給一些想更深入了解Markdown並且不反對標準化的使用者準備的哦~

稍作休息,我們在下篇文章里再見。

推薦閱讀:

我用 Markdown,所以顯得很酷嗎?
Markdown 完全入門(下)

TAG:Markdown | Markdown語法 |