---
# System prepended metadata

title: Markdown và ứng dụng

---

# Markdown và ứng dụng

Tác giả: noodles0428

Reviewer: duong3982

Trong suốt nhiều năm nay, Markdown luôn là một công cụ rất cần thiết cho những ai cần viết văn bản với cách trình bày khoa học, cần linh hoạt sử dụng nhiều ký hiệu Toán học một cách nhanh chóng và không phải chuyển đi chuyển lại. Hãy cùng chúng mình tìm hiểu về Markdown qua bài viết dưới đây nhé!

___

## 1. Markdown là gì?

Markdown là một ngôn ngữ đánh dấu văn bản được thiết kế nhằm giúp người dùng có thể tạo ra nội dung có định dạng mà không cần quá nhiều thao tác phức tạp. Do đó, Markdown từ lâu đã được nhiều người tin tưởng bởi nó dễ sử dụng, tiện lợi mà vẫn khiến cho bài viết được viết theo kiểu Markdown trở nên rất khoa học và dễ đọc.

Khác với HTML, Markdown rất phù hợp cho mọi người, kể cả mới bắt đầu. Bởi lẽ, chúng ta sẽ không bị rối bởi các thẻ định dạng, hay những câu lệnh phức tạp mà vẫn có thể làm quen nhanh kể cả khi mới bắt đầu sử dụng. 

## 2. Ứng dụng của Markdown

Ứng dụng Markdown thì vô vàn, nhưng do bài viết này chỉ được hướng tới những giáo viên Tin học hay học sinh theo đuổi môn Tin, nên hầu hết ứng dụng của Markdown đều liên quan tới đối tượng kể trên.

Với môn Tin, hiện tại, đây là một ngôn ngữ đánh dấu được rất nhiều học sinh và thầy cô sử dụng, bởi lẽ, họ có thể viết nhanh những phép tính phức tạp, đòi hỏi nhiều ký tự đặc biệt mà không phải chuyển qua chuyển lại như Word.

Hiện tại, các website cho phép sử dụng Markdown thì rất nhiều, nhưng trong bài viết này, mình chỉ xin đề cập tới hai nơi phổ biến nhất, đó chính là hackmd.io và các OJ (oj.vnoi.info, oj.clue.edu.vn …):
- Về hackmd.io, đây là một trong những trang web nổi tiếng nhất trong việc hiển thị Markdown bởi nó miễn phí, sát với thực tế và giao diện khoa học. Do đó, website này rất được học sinh và thầy cô tin tưởng trong việc viết lời giải, đề bài, bài giảng… 
- Về các OJ (oj.vnoi.info, oj.clue.edu.vn …), hầu hết đều yêu cầu người dùng thành thạo Markdown để có thể viết đề bài, lời giải một cách trực quan và khoa học nhất. Chính vì vậy, việc người dùng cần nắm vững cách sử dụng Markdown là điều rất quan trọng để có thể khiến bài tập được giao trở nên dễ nhìn. 

Mặt khác, cần lưu ý rằng, Markdown rất hạn chế các định dạng phức tạp, không hỗ trợ các tính năng căn chỉnh lề, dãn dòng, ... Do đó, người sử dụng cần phải hiểu rõ mục đích của bản thân trước khi cân nhắc sử dụng Markdown để soạn thảo.

## 3. Hướng dẫn sử dụng Markdown

Như mình đã nói ở trên, việc sử dụng Markdown là một điều rất cần thiết đặc biệt trong việc giảng dạy môn Tin, nên ở dưới đây, mình sẽ cố gắng đúc kết ngắn gọn nhất về việc sử dụng Markdown một cách hiệu quả.

### a. Tiêu đề (Heading)

Giống với ngôn ngữ lập trình HTML, Markdown bao gồm $6$ loại headings, được xếp từ cao xuống thấp (tức là từ H1 đến H6). Để dễ theo dõi, những tiêu đề cùng bậc phải được xếp **cùng loại heading**, và những ý càng lớn, bao trùm, sẽ được xếp vào loại heading càng nhỏ. 

Lấy bài viết này làm ví dụ, ta có thể thấy rằng tiêu đề "Markdown và ứng dụng" chính là tiêu đề cao nhất (và được xếp vào H1). Để có thể trình bày H1, người viết cần viết cú pháp sau:

```
# Markdown và ứng dụng
```

Tương tự, vẫn lấy bài viết này làm ví dụ, ta có thể sử dụng tiêu đề "Markdown là gì" cho H2. Khi này, người viết cần viết cú pháp sau:

```
## Markdown là gì
```

Do đó, ta có thể đúng kết được rằng, số bậc heading chính là số lượng dấu # ở trước heading đó. 

### b. Kiểu chữ 

Trong Markdown, các kiểu chữ **in đậm**, *in nghiêng*, ~~gạch bỏ~~... đều được viết rất gọn và dễ nhớ. Một số kiểu chữ thường gặp như sau:

| Markdown            | Kết quả hiển thị          | Ghi chú                                   |
| --------------------------- | ------------------------- | ----------------------------------------- |
| `**chữ đậm**`               | **chữ đậm**               | Có thể dùng `__chữ đậm__` thay thế        |
| `*chữ nghiêng*`             | *chữ nghiêng*             | Có thể dùng `_chữ nghiêng_` thay thế      |
| `***vừa đậm vừa nghiêng***` | ***vừa đậm vừa nghiêng*** | Kết hợp cả hai                            |
| `~~chữ gạch bỏ~~`           | ~~chữ gạch bỏ~~           | Thường để chỉ nội dung sai/thay thế       |
| `` `code` ``                | `code`                    | Font monospace trong dòng (inline code)   |
| `> trích dẫn`               | > trích dẫn               | Quote (dùng > ở đầu dòng)                 |


### c. Ký hiệu

Ở bài viết này, mình sẽ chủ yếu đề cập tới ký hiệu Toán/Tin học. 

- Ở hackmd.io, các ký hiệu đặc biệt, chữ số hay tên biến đều phải biểu diễn ở trong hai dấu `$`. Ví dụ, để biểu diễn biến $a^i + \frac{1}{i}$, ta sẽ viết như sau: `$a^i + \frac{1}{i}$`.
- Ở các OJ như VNOJ hay ClueOJ, các ký hiệu đặc biệt, chữ số hay tên biến đều phải biểu diễn ở trong hai dấu `~`. Ví dụ, để biểu diễn biến $a^i + \frac{1}{i}$ ở đề bài của OJ, ta sẽ viết như sau: `~a^i + \frac{1}{i}~`.

Một số ký hiệu thường gặp:

***Trước khi đọc bài dưới đây, mình muốn nhắc lại lần nữa rằng, các ký hiệu ở Markdown phải thêm hai dấu `~` hoặc `$` tại hai vị trí bên ngoài như đã đề cập ở trên thì mới có thể hiện đúng được.***

#### a. Ký hiệu logic & tập hợp

| Markdown | Ký hiệu | Ý nghĩa           |
| ---------------------- | ------- | ----------------- |
| `\forall`              | $∀$       | với mọi           |
| `\exists`              | $∃$       | tồn tại           |
| `\nexists`             | $∄$       | không tồn tại     |
| `\in`                  | $∈$       | thuộc             |
| `\notin`               | $∉$       | không thuộc       |
| `\subset`              | $⊂$       | tập con           |
| `\subseteq`            | $⊆$       | tập con hoặc bằng |
| `\supset`              | $⊃$       | tập cha           |
| `\supseteq`            | $⊇$       | tập cha hoặc bằng |
| `\cup`                 | $∪$       | hợp               |
| `\cap`                 | $∩$       | giao              |
| `\emptyset`            | $∅$       | rỗng              |
| `\mathbb{N}`           | $ℕ$       | tập số tự nhiên   |
| `\mathbb{Z}`           | $ℤ$       | tập số nguyên     |
| `\mathbb{Q}`           | $ℚ$       | tập số hữu tỉ     |
| `\mathbb{R}`           | $ℝ$       | tập số thực       |
| `\mathbb{C}`           | $ℂ$       | tập số phức       |

#### b. Ký hiệu quan hệ

| Markdown     | Ký hiệu | Ý nghĩa              |
| --------- | ------- | -------------------- |
| `=`       | $=$       | bằng                 |
| `\ne`     | $≠$       | khác                 |
| `<`       | $<$       | nhỏ hơn              |
| `>`       | $>$       | lớn hơn              |
| `\le`     | $≤$       | nhỏ hơn hoặc bằng    |
| `\ge`     | $≥$       | lớn hơn hoặc bằng    |
| `\equiv`  | $≡$       | đồng dư, tương đương |
| `\approx` | $≈$       | xấp xỉ               |

#### c. Phép toán

| Markdown         | Ký hiệu | Ý nghĩa       |
| ------------- | ------- | ------------- |
| `+`           | $+$       | cộng          |
| `-`           | $−$       | trừ           |
| `\times`      | $\times$       | nhân          |
| `\cdot`       | $\cdot$       | tích vô hướng |
| `\div`        | $\div$       | chia          |
| `/`           | $/$       | phân số       |
| `\frac{a}{b}` | $\frac{a}{b}$   | phân số       |
| `\pm`         | $\pm$       | cộng trừ      |
| `\sqrt{a}`    | $\sqrt{a}$      | căn bậc hai   |
| `\sqrt[n]{a}` | $\sqrt[n]{a}$     | căn bậc $n$     |
| `\lvert{x}\rvert` | $\lvert{x}\rvert$     | căn bậc $n$     |

#### d. Vector & ma trận

| Markdown                                          | Ký hiệu                                        | Ý nghĩa           |
| ---------------------------------------------- | ---------------------------------------------- | ----------------- |
| `\vec{a}`                                      |$\vec{a}$                                             | véc-tơ            |
| `\overrightarrow{AB}`                          | $\overrightarrow{AB}$                                            | véc-tơ từ A đến B |
| `\begin{bmatrix} a & b \\ c & d \end{bmatrix}` | $\begin{bmatrix} a & b \\ c & d \end{bmatrix}$ | ma trận           |


#### e. Lũy thừa & chỉ số dưới
| Markdown              | Kết quả            |
| ------------------ | ------------------ |
| `a^2`              | $a^2$              |
| `10^{100}`         | $10^{100}$         |
| `a_i`       | $a_i$ |
| `a_i^2`     | $a_i^2$     |
| `x_{n+1}^2` | $x_{n+1}^2$ |
| `A_{ij}^k`  | $A_{ij}^k$  |

#### f. Ký hiệu tổng
| Markdown                               | Kết quả                             |
| ----------------------------------- | ----------------------------------- |
| `\sum a_i`                          | $\sum a_i$                          |
| `\sum_{i=1}^n a_i`                  | $\sum_{i=1}^n a_i$                  |

### d. Khối mã

Trong Markdown, các văn bản trong khối mã sẽ được hiển thị **nguyên văn**, font monospace, không được xử lý (như hiển thị code, ...)

Một vài ví dụ của khối mã như sau:

#### Khối mã một dòng

Chỉ cần dùng duy nhất một dấu backtick (`) ở trước và sau văn bản.

Ví dụ, để hiển thị `y = ax + b`, ta sẽ Markdown như sau:
```
`y = ax + b`
```

#### Khối mã đa dòng

Ta sẽ sử dụng ba dấu backtick ở trên và ở dưới văn bản (lưu ý, văn bản không được cùng dòng với dấu backtick).

Ví dụ, để hiển thị đoạn văn như sau:
```
Xin chào các bạn!
Đây là đội ngũ Admin ClueOJ
```

Ta sẽ Markdown như sau:

````
```
Xin chào các bạn!
Đây là đội ngũ Admin ClueOJ
```
````

#### Khối mã đa dòng (chỉ định ngôn ngữ lập trình)

Khối mã này sẽ giúp nhận diện được ngôn ngữ lập trình, từ đó xuất hiện syntax highlighting (tự động đổi màu chữ, nền hoặc kiểu chữ dựa trên **ngữ pháp của ngôn ngữ lập trình**), giúp code trở nên dễ đọc hơn.

Để có thể hiển thị như vậy, ta sẽ thực hiện như sau:
- Giống như trên, ta sẽ sử dụng ba dấu backtick ở trên và dưới văn bản
- **Bên cạnh** ba dấu backtick ở trên, ta sẽ viết đuôi ngôn ngữ lập trình chính là đuôi **file** của ngôn ngữ đó khi lưu vào và bỏ dấu `.` ở đầu đi. Ví dụ, với ngôn ngữ C++, ta sẽ lưu file dưới dạng `.cpp`, thì ta sẽ viết ba chữ `cpp` bên cạnh ba dấu backtick đầu tiên.

Ví dụ, để hiển thị đoạn code như sau:
```cpp 
#include<iostream>

int main() {
    std::cout << "i love clueoj <3";
}
```

hoặc

```py 
print("i love clueoj <3")
```

Ta sẽ Markdown như sau:
````
```cpp
#include<iostream>

int main() {
    std::cout << "i love clueoj <3";
}
```
````

hoặc
````
```py 
print("i love clueoj <3")
```
````

### e. Chia bảng

Markdown hỗ trợ chia bảng một cách tiện lợi, với cú pháp rất đơn giản và dễ nhớ kể cả cho người mới tiếp xúc. Ta có thể tạo bảng bằng cách sử dụng dấu gạch đứng `|` để chia cột và dấu gạch ngang `-` để tạo header. 

Cú pháp cơ bản như sau:

```
| Cột 1       | Cột 2       | Cột 3       |
|-------------|-------------|-------------|
| Dòng 1 - C1   | Dòng 1 - C2   | Dòng 1 - C3   |
| Dòng 2 - C1   | Dòng 2 - C2   | Dòng 2 - C3   |
| Dòng 3 - C1   | Dòng 3 - C2   | Dòng 3 - C3   |
```

Khi này, kết quả hiển thị sẽ là:

| Cột 1       | Cột 2       | Cột 3       |
|-------------|-------------|-------------|
| Dòng 1 - C1   | Dòng 1 - C2   | Dòng 1 - C3   |
| Dòng 2 - C1   | Dòng 2 - C2   | Dòng 2 - C3   |
| Dòng 3 - C1   | Dòng 3 - C2   | Dòng 3 - C3   |

___


