---
# System prepended metadata

title: LaTeX 的前世今生
tags: [LaTeX]

---

---
disqus: yueswater
---

{%hackmd @themes/orangeheart %}

<style>
.likecoin-button {
  position: relative;
  width: 100%;
  max-width: 485px;
  max-height: 240px;
  margin: 0 auto;
}
.likecoin-button > div {
  padding-top: 49.48454%;
}
.likecoin-button > iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
.markdown-body{
    word-wrap:break-word;
    color:#000;
    font-family:Optima-Regular,Optima,PingFangSC-light,PingFangTC-light,PingFang SC,Cambria,Cochin,Georgia,Times,Times New Roman,serif;
    font-size:16px;
    letter-spacing:0;
    line-height:1.6;max-width:860px;
    padding:5px 20px;
    text-align:left;
    word-break:break-word;
    word-spacing:0}.markdown-body 
p{
    color:#000;
    font-size:16px;
    line-height:26px;
    margin:0;
    padding-bottom:8px;
    padding-top:8px
}
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6{
    color:#000;
    font-weight:700;
    margin-bottom:15px;
    margin-top:30px;
    padding:0
}

.markdown-body h1{
    font-size:2.5rem
}
.markdown-body h2{
    border-bottom:2px solid #61679e;
    font-size:2.1rem
}
.markdown-body h2 span{
    background:#61679e;
    border-top-left-radius:5px;
    border-top-right-radius:5px;
    color:#fff;
    display:inline-block;
    font-weight:700;
    margin-right:0;
    padding:5px 10px 1px
}
.markdown-body h3{
    font-size:1.8rem
}
.markdown-body h4{
    font-size:1.65rem
}
.markdown-body h5, .markdown-body h6{
    font-size:1.5rem
}
.markdown-body ol, .markdown-body ul{
    color:#000;
    margin-bottom:8px;
    margin-top:8px;
    padding-left:25px
}
.markdown-body ul{
    list-style-type:disc
}
.markdown-body ul ul{
    list-style-type:square
}
.markdown-body ol{
    list-style-type:decimal
}
.markdown-body li section{
    color:#010101;font-weight:500;
    line-height:26px;
    margin-bottom:5px;
    margin-top:5px;
    text-align:left
}
.markdown-body blockquote{
    overflow-scrolling:touch;
    background:#eff0f5;
    border-left:3px solid #61679e !important;
    color:#6a737d;
    display:block;
    font-size:.9em;
    margin-bottom:10px;
    margin-top:10px;
    overflow:auto;
    padding:5px 10px 5px 20px
}
.markdown-body blockquote p{
    color:#000;
    line-height:26px;margin:0
}
.markdown-body a{
    word-wrap:break-word;
    border-bottom:0 solid #61679e;
    color:#61679e;
    font-weight:700;
    text-decoration:none
}
.markdown-body a:hover {
    color: #c0c2d8; /* 設定您想要的 hover 顏色 */
}
.markdown-body a:visited {
    color: #61679e; /* 設定您想要的 visited 顏色 */
}
.markdown-body li code, .markdown-body p code{
    word-wrap:break-word;
    background-color:rgba(27,31,35,.05);
    border-radius:4px;
    color:#61679e;
    ont-family:Operator Mono,Consolas,Monaco,Menlo,monospace;
    font-size:14px;
    margin:0 2px;
    padding:2px 4px;
    word-break:break-all
}
.markdown-body table{
    display:table;
    text-align:left
}
.markdown-body tbody{
    border:0
}
.markdown-body table tr{
    background-color:#fff;
    border:0;
    border-top:1px solid #ccc
}
.markdown-body table tr:nth-child(2n){
    background-color:#f8f8f8
}
.markdown-body table tr td, .markdown-body table tr th{
    border:1px solid #ccc;
    font-size:16px;
    padding:5px 10px;
    text-align:left
}
.markdown-body table tr th{
    background-color:#f0f0f0;
    font-weight:700
}
.markdown-body li code, .markdown-body span code{
    color:#61679e
}
.markdown-body mark{
    background-color:#61679e;
    border-radius:2px;
    border-radius:4px;
    color:#fff;
    font-weight:500;
    margin:0 2px;
    padding:2px 4px
}
.markdown-body .anchor{
    margin-left:-40px
}
.octicon-link{
    border-radius:3px;
    color:#fff!important;
    padding:5px 10px!important
}
.gallery {
  display: flex;
  gap: 16px;
  justify-content: center;
}

.gallery-item {
  width: 300px;
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
  background-color: #fff;
/*   box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); */
  display: flex;
  flex-direction: column;
  align-items: center;
}

.gallery-item img {
  width: 100%;
  height: 180px;
  object-fit: cover;
}

.gallery-content {
  padding: 16px;
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  width: 100%;
}

.gallery-title {
  font-size: 14px;
  font-weight: bold;
  margin-bottom: 8px;
    text-align: center;
}

.gallery-description {
  font-size: 14px;
  color: #666;
  margin-bottom: 12px;
}

.gallery-details {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 14px;
  color: #888;
  margin-bottom: 8px;
}

.gallery-tag {
  background-color: #eee;
  border-radius: 4px;
  padding: 2px 6px;
  font-size: 12px;
  color: #666;
}

.gallery-duration {
  font-size: 12px;
  color: #666;
}

.gallery-date {
  font-size: 12px;
  color: #aaa;
  text-align: right;
}
</style>
###### tags: `LaTeX`

相信一定不少人在學生時期或出社會工作之後，都面臨著撰寫報告的地獄需求。不過，經常使用 Microsoft Word、PowerPoint 的人一定會發現，插入圖片並且讓它在正確的位置上似乎是一件很費時的任務，一方面是因為將圖片導入文件後，還要調整大小，且每一張圖片的大小都不相同；另一方面是 Word、PPT 在文字與圖片排列稍顯的不聰明一點。[^1]

這一系列文章介紹的語言——LaTeX，不僅可以解決上述關於圖片排版的問題，更提供了在數學公式、表格、程式碼嵌入、簡報製作等方面的優良功能。
# LaTeX 的前世今生

LaTeX 是一種強大的排版系統，廣泛應用於科學、技術、工程及數學（也就是俗稱的 STEM）領域的文件編輯。LaTeX 的前身是 Donald Knuth 於1978年發明的 TeX 系統。Knuth 是一位著名的計算機科學家，他為了解決當時排版系統的不足，親自設計了 TeX，以便創作高品質的文件和書籍。

然而，TeX 雖然功能強大，但對於一般用戶來說並不友好（必須撰寫許多程式碼、前置設定等）。因此，為了解決這個問題，Leslie Lamport 於1984年在 TeX 的基礎上開發了 LaTeX。LaTeX 簡化了文件編寫的流程，使用者只需關注所輸入的內容，而不必操心具體的排版細節，這正是 LaTeX 最引以為傲的功能：**所得即所見**（What You See Is What You Get）。
# 前置作業：編譯器與編輯器

「工欲善其事、必先利其器。」

從學生時期撰寫撰寫作文，到出社會撰寫公司業務報告，都需要一些硬體工具（例如紙筆、電腦、平板等），以及既有的知識。LaTeX 的撰寫也是一樣，編輯一份 LaTeX 文件需要兩個重要的工具：編譯器和編輯器。這邊簡單解釋一下兩者的差異：編輯器用於編寫和管理 LaTeX 程式碼，提供便捷的編寫環境；編譯器則負責將這些程式碼轉換為最終輸出的文件。

![圖 1：LaTeX 編譯流程圖](https://i-blog.csdnimg.cn/direct/8b204085b978426b8552a93eb1be5d2c.png#pic_center)

選擇 LaTeX 編譯器時，不同系統的使用者可以選擇適合自己的編譯器，但是請注意：請先安裝編譯器之後再安裝編輯器！如果你是 Windows 使用者，推薦[MikTeX](https://miktex.org/)與[TeXLive](https://tug.org/texlive/)，但如果你很不幸地使用搞排擠的 macOS 系統，那麽就建議你使用[MacTeX](https://www.tug.org/mactex/)。

至於編輯器的選擇就沒有那麼多限制，只要你覺得編輯器好看、好用，電腦預設的記事本也可以成為你撰寫 LaTeX 的工具。好用的編輯器大概有[TeXmaker](https://www.xm1math.net/texmaker/)、[TeXstudio](https://www.texstudio.org/)、[Visual Studio Code](https://code.visualstudio.com/)。[^3]

如果你想要擁有跟 Google 文件一樣的共同編輯功能，那麼推薦使用[Overleaf](https://www.overleaf.com/)。Overleaf 是一個完全免費的平台，好處是不用下載編譯器（網站內建），而且可以邀請別人一起編輯、查看原始碼；但是壞處是 Overleaf 時不時就會維修，所以個人建議還是要學一下如何在本機安裝編譯器與編輯器。

# LaTeX 語法概說

在正式開始進入 LaTeX 語法教學之前，我們先來看一下底下的範例。

```tex
!TeX xelatex
\documentclass[12pt]{article}
\title{My First Document}
\author{Author}
\date{\today}

\begin{document}
\maketitle

\end{document}
```

細心的你肯定有發現，LaTeX 的指令是以反斜線(backslash) `\` 開頭的，也就是如果你需要使用一些指令，那麼就必須用 `\` 告訴 LaTeX 編譯器你需要使用該指令，否則電腦無法判讀。常見的 LaTeX 指令符如下：

| 符號 | 功能 |
| ---- | ---- |
| `\`    | 下排版命令 |
| `%`    | 註解 |
| `#`    | 定義巨集 |
| `~`    | 產生空白 |
| `$`    | 進入/離開數學模式 |
| `^`    | 數學模式中的上標字 |
| `_`    | 數學模式中的下標字 |
| `&`    | 分隔符號 |

## 決定美醜的關鍵：參數

我們可以注意到 `\documentclass` 後面有兩個不一樣的東西：一個是 `[12pt]`，另一個則是 `{article}`。這兩個東西有什麼不一樣呢？在 LaTeX 中，參數的傳遞方式有兩種，一種是選擇參數，也就是以方括號 `[我是選擇參數]` 包住的，使用者可以留空，不會影響排版，也可以輸入設定指令調整排版。另一種則是必要參數，以花括號 `{我是必要參數}` 包住，只要使用者沒有輸入內容留空，電腦就不清楚目前需要做什麼[^4]。關於參數的設定，有幾點需要注意的事情：

- 不同於Word，LaTeX 文稿中，空一個與多個英文空白的意思是一樣的，LaTeX 會認作一個空白。
- 按下Enter 鍵不代表換行，換行必須要使用雙斜線（`\\`，Windows 使用者可以同時按下 Ctrl 與 Enter 鍵；masOS 使用則可同時按下 ⌘ 與 ↩︎ 鍵），或是以 `\newline`、`\linebreak` 進行換行。

## 使用指令

LaTeX 的指令是從反斜線後第一個字母開始，到第一個非字母符號為止 （包含空白、標點符號及數字）。因此：

`This is my first \LaTeX typesetting example.`

這樣的話，由於空白屬於指令的一部分，因此會印出如下面輸出範例的結果。若要避免上述情況，就必須使用以下三種方法：

1.  `This is my first {\LaTeX} typesetting example.`
2.  `This is my first \LaTeX{} typesetting example.`
3.  `This is my first \LaTeX\ typesetting example.`

```tex
% !TeX xelatex
\documentclass[12pt]{article}
\title{My First Document}
\author{Author}
\date{\today}

\begin{document}
\maketitle

This is my first \LaTeX typesetting example.

This is my first {\LaTeX} typesetting example.

This is my first \LaTeX{} typesetting example.

This is my first \LaTeX\ typesetting example.

\end{document}
```

## 使用註解

註解符號（`%`） 可以放在一行的任何地方，`%` 之後的文字會被忽略掉，特定的編譯器在註解之後文字會變色。而註解功能最大的好處是，在微調一些參數或設定時，可以使用註解，將更改的地方註解起來或取消註解，並編譯出結果比較前後的差異。

## 開啟環境

LaTeX 有一種巨集結構，稱為環境（environment），主要是讓作用範圍能 擴大至較大的範圍。所有的環境都起於`\begin{環境名稱}`，止於`\end{環境名稱}`。這兩個指令之間的文稿都會被作用，而且，環境之內還可以套用其他不同的環境。LaTeX 文稿的內文，就是包在一個

```tex
\begin{環境名稱}
 ...
\end{環境名稱}
```

這個 document 環境當中。以下就是所有 LaTeX 必須具備的文稿大結構：

```tex
\documentclass[]{}
%這裡是preamble 區
\begin{document}
 ...
\end{document}
```

## 前言區(preamble)

這裡可以引用巨集（macro），而且會影響整篇文稿的指令，例如一些事先 定義好的指令，想在整篇文稿中使用，就可以置放在 preamble 區。例如：

```tex
!TeX xelatex
\documentclass[12pt]{article}
\usepackage{xcolor}
\begin{document}

The text will be \textcolor{blue}{blue}.

\end{document}
```

## 章節標題設定

在 LaTeX 的文件裡，章節標題的形成都是由同樣的指令來控制的，這樣有一個好處，臨時插入章節標題及其內文時，我們不必去理會標題編號及目錄的問題，也不必去理會要用什麼字型、及字型大小要多大，LaTeX 會自動計算處理，字型大小也會和內文使用的字型大小互相配合調整，使用者就專心在內文構思、寫作即可。以下由列表來瞭解整個章節結構：

| 深度編號 | 指令 | 作用及注意事項 |
| -------- | -------- | -------- |
| -1 | `part{}` | 部|
| 0 | `chapter{}` | 章，在 article 沒有章|
| 1 | `section{}` | 節|
| 2 | `subsection{}` | 小節|
| 3 | `subsubsection{}` | 次小節|
| 4 | `paragraph{}` | 段落|
| 5 | `subparagraph{}` | 次段落|

你肯定會問：「深度編號是什麼？」要知道背後的原理，還有很長的路要走。所以在這邊我就留下一個伏筆，待後續之分解。

[^1]: 此處的不聰明並不是指「文繞圖」(wrap text around a picture)的功能，而是指圖片時常不會在正確的位置上，容易因為文字的多寡而跑版。
[^3]: 關於 LaTeX 在 VS code 上的設定，可以參考這篇文章：[https://hackmd.io/@DextinChen/VSCode-LaTeX-setting?utm\_source\=preview-mode&utm\_medium=rec](https://hackmd.io/@DextinChen/VSCode-LaTeX-setting?utm_source=preview-mode&utm_medium=rec)，裡面有詳盡的解說。
[^4]: 但有時某些指令中，必要參數可以不必填寫，例如 `\date{}`，不填寫的話，則標題頁的日期就不會顯示，而是會留一行空白，直接跳到下一行的作者列。