> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/vi/dinh-dang/04-articles-how-to-change-paragraph-spacing-in-latex.md).

# Định dạng đoạn văn

## Giới thiệu

Bài viết này khám phá hai phương pháp để thay đổi nhiều khía cạnh của khoảng cách đoạn văn:

* cách thực hành tốt nhất, và được khuyến nghị, là dùng các gói LaTeX như [`setspace`](https://ctan.org/pkg/setspace) và [`parskip`](https://ctan.org/pkg/parskip) cung cấp các tùy chọn và lệnh ở mức người dùng để thay đổi khoảng cách của tài liệu LaTeX của bạn;
* việc sử dụng các *lệnh tham số* cấp thấp của TeX/LaTeX để điều chỉnh khoảng cách đoạn. Việc dùng trực tiếp các lệnh tham số có thể bỏ qua các kiểm tra hoặc cơ chế kiểm soát do các gói LaTeX được thiết kế cẩn thận cung cấp, có thể dẫn đến những hậu quả/hệ quả phụ không mong muốn ở những nơi khác trong tài liệu LaTeX của bạn, vì vậy hãy sử dụng chúng cẩn thận...

### Chuyển đến các mục quan tâm

Người đọc đang tìm giải pháp nhanh:

* đi tới mục [*Sử dụng các gói LaTeX: setspace và parskip*](#using-latex-packages-setspace-and-parskip)

Người đọc quan tâm đến các lệnh cấp thấp:

* đi tới các mục [*Các lệnh tham số của TeX/LaTeX*](#using-texlatex-parameter-commands) và [*Những điều cơ bản: lệnh tham số và ví dụ*](#the-fundamentals-parameter-commands-and-examples)

Người đọc quan tâm đến các chi tiết tinh vi về phép tính khoảng cách dòng và cấu trúc đoạn văn:

* đi tới mục [*Cấu trúc đoạn văn và phép tính khoảng cách dòng*](#paragraph-structure-and-line-space-calculations)

## Sử dụng các gói LaTeX: setspace và parskip

* [Gói parskip](#the-parskip-package)
* [Gói setspace](#the-setspace-package)

### Gói parskip

Tính năng [`parskip` gói](https://ctan.org/pkg/parskip?lang=en) giúp bạn thay đổi an toàn khoảng trống được chèn giữa các đoạn trong tài liệu của bạn. Nó được thiết kế để đảm bảo rằng các cấu trúc tài liệu như mục lục, các môi trường danh sách và các tiêu đề hiển thị không bị ảnh hưởng bất lợi bởi một giá trị khác 0 của [`\parskip` lệnh](#parskip-tex-primitive), vốn được dùng để đặt lượng khoảng trống TeX/LaTeX chèn giữa các đoạn.

Tính năng `parskip` gói này không cung cấp bất kỳ lệnh nào ở mức người dùng; thay vào đó, nó sử dụng các tùy chọn của gói để cấu hình hành vi của mình. Phần [`parskip` tài liệu](https://mirror.ox.ac.uk/sites/ctan.org/macros/latex/contrib/parskip/parskip.pdf) thì ngắn gọn, chỉ ba trang, nhưng dưới đây là bản tóm tắt ngắn về các tùy chọn của gói:

* **`skip`**: chỉ định `\parskip`, khoảng trắng dọc giữa các đoạn;
* **`tocskip`**: chỉ định một giá trị khác 0 `\parskip` để dùng trong `\tableofcontents` và các danh sách tương tự;
* **`indent`**: đặt giá trị của `\parindent`, phần thụt đầu đoạn;
* **`parfill`**: điều chỉnh giá trị của `\parfillskip`, phần keo được thêm vào cuối dòng cuối cùng trong một đoạn.

Theo mặc định, kiểu `parskip` gói đặt `\parindent` sang `0pt` và cung cấp một giá trị khác 0 cho `\parskip` giá trị của `.5[\baselineskip](#baselineskip-tex-primitive) cộng 2pt`.

#### Các ví dụ về gói parskip

Các ví dụ sau minh họa một số cách dùng của `parskip` gói này. Hãy chọn các liên kết “Open in Overleaf” để mở và biên dịch các ví dụ bằng Overleaf.

**Ví dụ tối giản về gói parskip**

Ví dụ tối giản sau tải `parskip` gói và dàn trang hai đoạn văn được tạo bằng [`blindtext` gói](https://ctan.org/pkg/blindtext?lang=en). Ví dụ cũng dàn trang các giá trị mặc định của `\baselineskip`, `\parskip` và `\parindent`. Lượng khoảng cách giữa hai đoạn được xác định bởi giá trị của `\parskip`:

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=14cm,textwidth=12cm]{geometry}
% Tải gói blindtext để có văn bản giả
\usepackage{blindtext}
% Tải gói parskip mà không có tùy chọn
\usepackage{parskip}
\begin{document}

\blindtext[1]\par %Dùng \par để buộc tạo một đoạn mới
\blindtext[1]

Giá trị của \verb|\parindent| là \texttt{\the\parindent}. Dưới đây là các giá trị khác:

\begin{itemize}
\item Giá trị của \verb|\baselineskip| là \texttt{\the\baselineskip}
\item Giá trị của \verb|\parskip| là \texttt{\the\parskip}
\end{itemize}
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+parskip+package\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+parskip+package+without+options%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cblindtext%5B1%5D%5Cpar+%25Use+%5Cpar+to+force+a+new+paragraph%0A%5Cblindtext%5B1%5D%0A%0AThe+value+of+%5Cverb%7C%5Cparindent%7C+is+%5Ctexttt%7B%5Cthe%5Cparindent%7D.+Here+are+the+other+values%3A%0A%0A%5Cbegin%7Bitemize%7D%0A%5Citem+The+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D%0A%5Citem+The+value+of+%5Cverb%7C%5Cparskip%7C+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ sử dụng gói LaTeX parskip](/files/bf289b0ab9acad98099c802d27598756b46d5efb)

Lưu ý rằng `\parskip` keo thường chứa một [thành phần keo co giãn](#a-few-notes-on-glue) bởi vì điều đó giúp LaTeX sắp xếp nội dung vừa vào trang và tạo ra các ngắt trang tốt nhất (tối ưu nhất).

**Sử dụng các tùy chọn của gói parskip**

Ví dụ sau tải và cấu hình `parskip` bằng cách dùng tùy chọn `skip` và `indent` các tùy chọn. Nó cũng dàn trang hai đoạn văn, thông qua [`blindtext` gói](https://ctan.org/pkg/blindtext?lang=en), và dàn trang các giá trị của `\baselineskip`, `\parskip` và `\parindent`.

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% Tải gói blindtext để có văn bản giả
\usepackage{blindtext}
% Tải gói parskip với các tùy chọn skip và indent
\usepackage[skip=10pt plus1pt, indent=40pt]{parskip}
\begin{document}

\blindtext[1]\par % Dùng \par để buộc tạo một đoạn mới
\blindtext[1]

Giá trị của \verb|\parindent| đã được đặt thông qua tùy chọn \texttt{indent}, vì vậy bây giờ nó là \texttt{\the\parindent}. Các giá trị khác là:

\begin{itemize}
\item \verb|\baselineskip| là \texttt{\the\baselineskip}
\item \verb|\parskip| đã được đặt thông qua tùy chọn \texttt{skip}, vì vậy giá trị của nó là \texttt{\the\parskip}
\end{itemize}
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+parskip+package\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+parskip+package+with+skip+and+indent+options%0A%5Cusepackage%5Bskip%3D10pt+plus1pt%2C+indent%3D40pt%5D%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cblindtext%5B1%5D%5Cpar+%25+Use+%5Cpar+to+force+a+new+paragraph%0A%5Cblindtext%5B1%5D%0A%0AThe+value+of+%5Cverb%7C%5Cparindent%7C+was+set+via+the+%5Ctexttt%7Bindent%7D+option%2C+so+it+is+now+%5Ctexttt%7B%5Cthe%5Cparindent%7D.+The+other+values+are%3A%0A%0A%5Cbegin%7Bitemize%7D%0A%5Citem+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D%0A%5Citem+%5Cverb%7C%5Cparskip%7C+was+set+via+the+%5Ctexttt%7Bskip%7D+option%2C+so+its+value+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ thứ hai về cách dùng gói LaTeX parskip](/files/1bd2e727d878016524f5377317bba1faf416335d)

### Gói setspace

Tính năng [`setspace` gói](https://ctan.org/pkg/setspace?lang=en) cung cấp các lệnh và môi trường để thay đổi khoảng cách giữa các dòng văn bản trong tài liệu của bạn. Dưới đây là bản tóm tắt ngắn về các lệnh và môi trường chính do `setspace`:

* các lệnh **`\singlespacing`**, **`\onehalfspacing`** và **`\doublespacing`** có thể được dùng trong phần tiền đề của tài liệu, hoặc trong phần thân tài liệu để thay đổi khoảng cách ở một phần, hoặc toàn bộ, tài liệu của bạn;
* trang **`\setstretch{*lượng baselinestretch*}`** lệnh đặt một khoảng cách tùy chỉnh (thông qua các thay đổi đến [`\baselinestretch`](#demonstrating-baselinestretch))—nó cũng có thể được dùng trong phần tiền đề của tài liệu;
* các môi trường **`singlespace`**, **`singlespace*`** **`onehalfspace`** và **`doublespace`** cho phép thay đổi khoảng cách dòng cho các phần được chọn của văn bản trong tài liệu;
* trang **`\SetSinglespace{*giá trị*}`** lệnh sử dụng `*giá trị*` để điều chỉnh khoảng cách đơn dòng sao cho phù hợp với khoảng cách dòng của văn bản được dàn trang bằng các phông chữ có hình dạng ký tự (“glyph”) tương đối nhỏ, hoặc lớn, so với cỡ điểm đã cho. Xem mục [*Ghi chú ngắn về phông chữ và cỡ điểm*](#brief-notes-on-fonts-and-point-size) để xem một minh họa cho thấy sự thay đổi kích thước glyph của phông chữ ở một cỡ điểm cho trước;
* trang **`khoảng cách`** môi trường cung cấp khoảng cách tùy chỉnh và cần một đối số: [`\baselinestretch` giá trị](#demonstrating-baselinestretch) để dùng; ví dụ:

```latex
\begin{spacing}{2.5}
...
...
\end{spacing}
```

#### Các ví dụ về gói setspace

Các ví dụ sau minh họa một số cách dùng của `setspace` gói này: hãy nhấp vào các liên kết “Open in Overleaf” để mở và biên dịch các ví dụ bằng Overleaf.

**Dùng \doublespacing trong phần tiền đề của tài liệu**

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% Tải gói blindtext để có văn bản giả
\usepackage{blindtext}
% Tải gói setspace
\usepackage{setspace}
% Dùng \doublespacing trong phần tiền đề
% thay đổi văn bản thành giãn cách dòng đôi
\doublespacing
\begin{document}
\blindtext[1]
\end{document}
```

&#x20;[Mở `setspace` ví dụ trên Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+doublespacing+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%25+Using+%5Cdoublespacing+in+the+preamble+%0A%25+changes+text+to+double+line+spacing%0A%5Cdoublespacing%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ về lệnh \doublespacing của setspace](/files/68088ff7b0421750cb7eaababb453dccc245b5ed)

**Sử dụng môi trường spacing**

Vì đoạn mã sau dàn trang 3 trang nên tốt hơn hết là xem đầu ra trên Overleaf bằng cách chọn liên kết “Open in Overleaf” được cung cấp bên dưới.

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% Tải gói blindtext để có văn bản giả
\usepackage{blindtext}
% Tải gói setspace
\usepackage{setspace}
% Dùng \doublespacing trong phần tiền đề
% thay đổi văn bản thành giãn cách dòng đôi
\doublespacing
\begin{document}
\blindtext[1]

Bây giờ, áp dụng một khoảng cách lớn hơn (tùy chỉnh) bằng cách đặt giá trị \verb|\baselinestretch| là 3:

\begin{verbatim}
\begin{spacing}{3}
\blindtext[1]
\end{spacing}
\end{verbatim}

\begin{spacing}{2.5}
\blindtext[1]
\end{spacing}
Bây giờ, quay lại \verb|\singlespacing|\singlespacing\blindtext[1]
\end{document}
```

&#x20;[Mở `setspace` ví dụ trên Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+various+setspace+commands\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%25+Using+%5Cdoublespacing+in+the+preamble+%0A%25+changes+text+to+double+line+spacing%0A%5Cdoublespacing%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D%0A%0ANow%2C+apply+a+larger+%28custom%29+spacing+by+applying+a+%5Cverb%7C%5Cbaselinestretch%7C+value+of+3%3A%0A%0A%5Cbegin%7Bverbatim%7D%0A%5Cbegin%7Bspacing%7D%7B3%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0A%5Cend%7Bverbatim%7D%0A%0A%5Cbegin%7Bspacing%7D%7B2.5%7D%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0ANow%2C+revert+to+%5Cverb%7C%5Csinglespacing%7C%5Csinglespacing%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

**Sử dụng môi trường singlespace\***

Như đã lưu ý trong bài viết [*Ghi chú nhanh về khoảng cách dòng*](https://texblog.org/2011/09/30/quick-note-on-line-spacing/), còn `setspace` gói này cung cấp các phiên bản có dấu sao (`singlespace*`) và không có dấu sao của `singlespace` môi trường. Các chú thích trong mã của gói `setspace` cho biết rằng `singlespace*` môi trường được thiết kế để “... tạo ra khoảng cách dọc tốt hơn xung quanh các môi trường itemize và quote”.

Ví dụ sau sử dụng các danh sách gạch đầu dòng nằm trong hai `minipage` môi trường, đặt cạnh nhau, để minh họa khoảng cách khác nhau được tạo ra bởi `singlespace` và `singlespace*` các môi trường.

```latex
\doublespacing
\blindtext[1]

\begin{minipage}{.4\textwidth}
\begin{singlespace}
Đây là một danh sách gạch đầu dòng\par (môi trường \texttt{singlespace}).
\begin{itemize}
\item Một
\item Hai
\item Ba
\end{itemize}
\end{singlespace}%
Danh sách đã kết thúc.
\end{minipage}\kern10pt%
\begin{minipage}{.4\textwidth}
\begin{singlespace*}
Đây là một danh sách gạch đầu dòng\par (môi trường \texttt{singlespace*}).
\begin{itemize}
\item Một
\item Hai
\item Ba
\end{itemize}
\end{singlespace*}
Danh sách đã kết thúc.
\end{minipage}
```

&#x20;[Mở `setspace` ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+starred+singlespace+environment\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cdoublespacing+%0A%5Cblindtext%5B1%5D%0A%0A%5Cbegin%7Bminipage%7D%7B.4%5Ctextwidth%7D%0A%5Cbegin%7Bsinglespace%7D%0AHere+is+a+bulleted+list%5Cpar+%28%5Ctexttt%7Bsinglespace%7D+environment%29.%0A%5Cbegin%7Bitemize%7D%0A%5Citem+One%0A%5Citem+Two%0A%5Citem+Three%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bsinglespace%7D%25%0AThe+list+has+ended.%0A%5Cend%7Bminipage%7D%5Ckern10pt%25%0A%5Cbegin%7Bminipage%7D%7B.4%5Ctextwidth%7D%0A%5Cbegin%7Bsinglespace%2A%7D%0AHere+is+a+bulleted+list%5Cpar+%28%5Ctexttt%7Bsinglespace%2A%7D+environment%29.%0A%5Cbegin%7Bitemize%7D%0A%5Citem+One%0A%5Citem+Two%0A%5Citem+Three%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bsinglespace%2A%7D%0AThe+list+has+ended.%0A%5Cend%7Bminipage%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ về môi trường LaTeX singlespace\*](/files/0f2f9878fda8fc0d08d7a50040075e0e33430fb4)

**Sử dụng lệnh \setstretch**

`\setstretch{*giá trị*}` đặt giá trị của `\baselinestretch` sang *giá trị* và kích hoạt một *ngay lập tức* thay đổi trong `\baselineslip` gây ra bởi `\baselinestretch`. Ví dụ sau sử dụng `\setstretch{1.618}`—giá trị kỳ lạ 1.618 là [được giải thích sau trong bài viết](#understanding-and-calculating-values-for-baselinestretch)...

```latex
% Con số kỳ lạ 1.618 được giải thích sau trong bài viết.
\setstretch{1.618}
Chúng ta viết \verb|\setstretch{1.618}| để gây ra thay đổi ngay lập tức đối với khoảng cách dòng. Nếu chúng ta viết \verb|\renewcommand{\baselinestretch}{1.618}| thì khoảng cách dòng sẽ không được sửa đổi cho đến khi một lệnh thay đổi phông chữ, chẳng hạn như \verb|\selectfont|, được dùng.

\blindtext[1]
```

&#x20;[Mở `setspace` ví dụ trên Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+setstretch+command\&snip=%5Cdocumentclass%5B11pt%5D%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Load+the+setspace+package%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0A%25+The+strange+figure+of+1.618+is+explained+later+in+the+article.%0A%5Csetstretch%7B1.618%7D%0AWe+write+%5Cverb%7C%5Csetstretch%7B1.618%7D%7C+to+cause+an+immediate+change+to+the+line+spacing.+If+we+wrote+%5Cverb%7C%5Crenewcommand%7B%5Cbaselinestretch%7D%7B1.618%7D%7C+the+line+spacing+would+not+be+modified+until+a+font-changing+command%2C+such+as+%5Cverb%7C%5Cselectfont%7C%2C+is+used.%0A%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ về lệnh \setstretch](/files/bf4da3cd2f2bb6852056b837d7c93a44269a519c)

**Sử dụng lệnh \SetSinglespace**

Dự án sau được biên dịch bằng LuaLaTeX và sử dụng `fontspec` gói để truy cập các phông chữ TeX Gyre Pagella. Nó so sánh hai đoạn văn được dàn trang bằng TeX Gyre Pagella: đoạn thứ nhất dùng khoảng cách đơn dòng mặc định và đoạn thứ hai có khoảng cách đơn dòng lớn hơn do áp dụng `\SetSinglespace{1.1}`. Một số người có thể thích đoạn thứ hai, hơi “mở” hơn, và thấy rằng nó cải thiện sự thoải mái khi đọc, nhưng dĩ nhiên đó là vấn đề sở thích cá nhân.

```latex
\section*{Giãn cách đơn mặc định của Computer Modern}
Một đoạn văn bản thông thường. \blindtext[1]
\setmainfont{TeX Gyre Pagella}
\section*{Giãn cách đơn dòng mặc định của TeX Gyre Pagella}
Đây là một đoạn văn bản thông thường. \blindtext[1]
\section*{Giãn cách đơn dòng đã điều chỉnh của TeX Gyre Pagella}
Lưu ý: chúng ta cần gọi \verb|\singlespacing| sau khi viết
\verb|\SetSinglespace{1.1}|\SetSinglespace{1.1}\singlespacing
\begin{singlespace*}
Đây là một đoạn văn bản thông thường. \blindtext[1]
\end{singlespace*}
```

&#x20;[Mở `setspace` ví dụ trên Overleaf.](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Example+use+of+the+SetSinglespace+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csection%2A%7BComputer+Modern+default+single+spacing%7D%0ASome+regular+text.+%5Cblindtext%5B1%5D%0A%5Csetmainfont%7BTeX+Gyre+Pagella%7D%0A%5Csection%2A%7BTeX+Gyre+Pagella+default+single+line+spacing%7D%0AHere+is+some+regular+text.+%5Cblindtext%5B1%5D%0A%5Csection%2A%7BTeX+Gyre+Pagella+adjusted+single+line+spacing%7D%0ANote%3A+we+need+to+issue+%5Cverb%7C%5Csinglespacing%7C+after+writing++%0A%5Cverb%7C%5CSetSinglespace%7B1.1%7D%7C%5CSetSinglespace%7B1.1%7D%5Csinglespacing%0A%5Cbegin%7Bsinglespace%2A%7D+%0AHere+is+some+regular+text.+%5Cblindtext%5B1%5D%0A%5Cend%7Bsinglespace%2A%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Minh họa lệnh \SetSinglespace của LaTeX](/files/827189ee9ec700d3b9ec914238d6ee8bfe622063)

Trong phần tiếp theo chúng ta xem xét các lệnh `\baselinestretch` và `\linespread`.

#### Hiểu về \baselinestretch và \linespread

Một phần trong thiết kế của LaTeX để xử lý khoảng cách dòng và thay đổi phông chữ (cỡ chữ, họ phông, mã hóa phông, v.v.) sử dụng hai lệnh mà bạn có thể gặp:

* **`\baselinestretch`**: lệnh này lưu một hệ số tỷ lệ dùng để nhân (co giãn) giá trị hiện tại của [`\baselineskip`](#baselineskip-tex-primitive). Việc co giãn đó thường được áp dụng khi *lần tiếp theo* một lệnh chọn phông được dùng—chẳng hạn như `\selectfont`. Để thay đổi giá trị được lưu bởi `\baselinestretch` bạn nên viết `\renewcommand{\baselinestretch}{*hệ số tỉ lệ*}`
  * **Lưu ý**: Nếu bạn viết `\renewcommand{\baselinestretch}{*hệ số tỉ lệ*}` trong phần thân tài liệu, giá trị mới của `\baselinestretch` [sẽ không có hiệu lực ngay lập tức](https://tex.stackexchange.com/questions/241120/why-does-changing-baselinestretch-not-change-line-spacing): `*hệ số tỉ lệ*` mới sẽ được lưu để dùng sau. Để dùng/áp dụng ngay`*hệ số tỉ lệ*` giá trị mới, hãy viết `\selectfont` như được minh họa trong [đoạn mã dưới đây](#demonstrating-baselinestretch).
* **`\linespread{*hệ số tỉ lệ*}`**: có thể dùng để thay đổi [`\baselineskip`](#baselineskip-tex-primitive) mà không ảnh hưởng đến cỡ phông hiện tại. Lệnh này đặt `\baselinestretch` sang `*hệ số tỉ lệ*` sau đó thay đổi `\baselineskip` sang `*hệ số tỉ lệ* × [\baselineskip](#baselineskip-tex-primitive)`. Tuy nhiên, việc co giãn đó cũng không diễn ra ngay lập tức trừ khi `\linespread` lệnh được dùng trong phần tiền đề của tài liệu. Nếu `\linespread` được dùng trong phần thân tài liệu, nó sẽ có hiệu lực sau khi lệnh đổi/chọn cỡ phông tiếp theo được dùng.

Dựa trên những điều trên, hoặc là:

* `\renewcommand{\baselinestretch}{*hệ số tỉ lệ*}\selectfont` hoặc,
* `\linespread{*hệ số tỉ lệ*}\selectfont`

có thể được dùng để thay đổi khoảng cách dòng, và cả hai sẽ hoạt động qua các thay đổi về cỡ phông, như được minh họa trong ví dụ dưới đây. Vậy bạn nên dùng cái nào? Tham khảo [thảo luận ngắn này trên tex.stackexchange](https://tex.stackexchange.com/a/241121).

**Minh họa \linespread**

Ví dụ sau sử dụng `\linespread{2.5}` trong phần tiền đề của tài liệu, điều này thay đổi khoảng cách dòng mà không cần thêm các lệnh chọn phông khác:

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=18cm,paperwidth=14cm,textwidth=12cm]{geometry}
% Tải gói blindtext để có văn bản giả
\usepackage{blindtext}
% Dùng \linespread trong phần tiền đề sẽ thay đổi
% khoảng cách dòng mà không cần thêm
% lệnh chọn phông, chẳng hạn như \selectfont
\linespread{2.5}
\begin{document}
\blindtext[1] % Các dòng bị ảnh hưởng bởi \linespread{2.5}
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+use+of+the+linestretch+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%25+Using+%5Clinespread+in+the+preamble+changes+%0A%25+line+spacing+without+requiring+additional%0A%25+font-selection+commands%2C+such+as+%5Cselectfont%0A%5Clinespread%7B2.5%7D+%0A%5Cbegin%7Bdocument%7D%0A%5Cblindtext%5B1%5D+%25+The+lines+are+affected+by+%5Clinespread%7B2.5%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Sử dụng lệnh linespread](/files/9b1f57acc3dc6a3bb51d51ce917d7dc5b7b4fc2c)

Sử dụng `\linespread{2.5}` trong phần thân tài liệu (sau `\begin{document}`) *sẽ* đòi hỏi các lệnh chọn phông để kích hoạt thay đổi khoảng cách dòng. Hãy mở đoạn mã sau trên Overleaf và so sánh đầu ra với ví dụ trước:

```latex
Vì lệnh \verb|\linespread| sau đây được dùng trong phần thân tài liệu, nên cần một lệnh chọn phông để thay đổi khoảng cách dòng. Bỏ chú thích \verb|\selectfont| để thấy sự khác biệt:

\linespread{2.5}%\selectfont

% Không có \selectfont thì các dòng đoạn văn sau
% không bị ảnh hưởng bởi \linespread{2.5}:
\blindtext[1]
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Second+example+using+the+linestretch+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D14cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%25+Load+blindtext+package+for+dummy+text%0A%5Cusepackage%7Bblindtext%7D%0A%5Cbegin%7Bdocument%7D%0ABecause+the+following+%5Cverb%7C%5Clinespread%7C+command+is+used+in+the+document+body%2C+a+font-selection+command+is+required+to+change+the+line+spacing.+Un-comment+%5Cverb%7C%5Cselectfont%7C+to+see+the+difference%3A%0A%0A%5Clinespread%7B2.5%7D%25%5Cselectfont%0A+%0A%25+Without+%5Cselectfont+the+following+paragraph+lines+are+%0A%25+unaffected+affected+by+%5Clinespread%7B2.5%7D%3A+%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![sử dụng lệnh \linespread của LaTeX trong tài liệu](/files/904fb4cdac9f4f14d5937307d26079ad3a321e61)

**Minh họa \baselinestretch**

Ví dụ sau minh họa `\baselinestretch` và `\selectfont` để cho thấy các tác động tương ứng lên [`\baselineskip`](#baselineskip-tex-primitive):

```latex
Giá trị mặc định của \verb|\baselineskip|=\the\baselineskip. Bây giờ cập nhật \verb|\baselinestretch|\renewcommand\baselinestretch{2.5}. Tuy nhiên, mặc dù chúng ta đã thực thi

\vspace{5pt}
\verb|\renewcommand\baselinestretch{2.5}|
\vspace{5pt}

\noindent nó \textit{chưa} (vẫn) có bất kỳ tác dụng nào: giá trị mới của \verb|\baselinestretch| được lưu, nhưng chưa được áp dụng. Chúng ta có thể phát lệnh \verb|\selectfont| để thay đổi có hiệu lực; nhưng hiện tại, giá trị của \verb|\baselineskip| vẫn là \the\baselineskip{} (không đổi).

Nếu bây giờ chúng ta thực thi \verb|\selectfont| thì thay đổi đối với \verb|\baselinestretch|, đặt nó thành 2.5, sẽ có hiệu lực—\selectfont ngay cả khi chúng ta đang ở giữa một đoạn văn. Giờ đây, giá trị của \verb|\baselineskip| là \the\baselineskip{} (= \(2.5 \times 12=30\mathrm{pt}\)).

Điều gì xảy ra nếu chúng ta thay đổi cỡ phông thành 14pt và \verb|\baselineskip| thành 16pt bằng các lệnh \verb|\fontsize{14}{16}\selectfont|?

\fontsize{14}{16}\selectfont Bây giờ, \verb|\baselineskip| \textit{không} phải là 16pt mà là \the\baselineskip{} vì giá trị của \verb|\baselinestretch| (2.5) đã được giữ lại và áp dụng, cho ra \verb|\baselineskip| = \(2.5 \times 16=40\mathrm{pt}\).

\section{\texttt{\bfseries\string\linespread}}
Lệnh \verb|\linespread| có thể được dùng để sửa đổi \verb|\baselineskip| mà không thay đổi cỡ phông.
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Demonstrating+baselinestretch\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D18cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D14cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cbegin%7Bdocument%7D%0AThe+default+value+of+%5Cverb%7C%5Cbaselineskip%7C%3D%5Cthe%5Cbaselineskip.+Now+update+%5Cverb%7C%5Cbaselinestretch%7C%5Crenewcommand%5Cbaselinestretch%7B2.5%7D.+However%2C+although+we+have+executed%0A%0A%5Cvspace%7B5pt%7D%0A%5Cverb%7C%5Crenewcommand%5Cbaselinestretch%7B2.5%7D%7C+%0A%5Cvspace%7B5pt%7D%0A%0A%5Cnoindent+it+%5Ctextit%7Bhas+not%7D+%28yet%29+had+any+effect%3A+the+new+value+of+%5Cverb%7C%5Cbaselinestretch%7C+is+stored%2C+but+not+actioned.+We+can+issue+a+%5Cverb%7C%5Cselectfont%7C+command+to+make+the+change+take+effect%3B+but%2C+for+now%2C+the+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+still+%5Cthe%5Cbaselineskip%7B%7D+%28unchanged%29.+%0A%0AIf+we+now+execute+%5Cverb%7C%5Cselectfont%7C+the+change+to+%5Cverb%7C%5Cbaselinestretch%7C%2C+setting+it+to+2.5%2C+will+now+take+effect---%5Cselectfont+even+though+we+are+in+the+middle+of+a+paragraph.+Now%2C+the+value+of+%5Cverb%7C%5Cbaselineskip%7C+is+%5Cthe%5Cbaselineskip%7B%7D+%28%3D+%5C%282.5+%5Ctimes+12%3D30%5Cmathrm%7Bpt%7D%5C%29%29.%0A%0AWhat+happens+if+we+change+the+font+size+to+14pt+and+%5Cverb%7C%5Cbaselineskip%7C+to+16pt+using+the+commands+%5Cverb%7C%5Cfontsize%7B14%7D%7B16%7D%5Cselectfont%7C%3F+%0A%0A%5Cfontsize%7B14%7D%7B16%7D%5Cselectfont+Now%2C+%5Cverb%7C%5Cbaselineskip%7C+is+%5Ctextit%7Bnot%7D+16pt+but+%5Cthe%5Cbaselineskip%7B%7D+because+the+value+of++%5Cverb%7C%5Cbaselinestretch%7C+%282.5%29+has+been+preserved+and+applied%2C+giving+%5Cverb%7C%5Cbaselineskip%7C+%3D+%5C%282.5+%5Ctimes+16%3D40%5Cmathrm%7Bpt%7D%5C%29.%0A%0A%5Csection%7B%5Ctexttt%7B%5Cbfseries%5Cstring%5Clinespread%7D%7D%0AThe+%5Cverb%7C%5Clinespread%7C+command+can+be+used+to+modify+%5Cverb%7C%5Cbaselineskip%7C+without+changing+the+font+size.%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Minh họa baselinestretch](/files/0671231775a5b5526162c2f6ccc5871c1ef8f9a1)

#### “Khoảng cách dòng” được định nghĩa và thay đổi như thế nào trong gói setspace?

Tính năng *chính xác* định nghĩa, và *đo lường* “khoảng cách dòng” là vấn đề có thể diễn giải theo nhiều cách, điều này có thể dẫn đến nhiều cách triển khai khác nhau trong các hệ thống/ứng dụng phần mềm. Rõ ràng, gói `setspace` phải giả định một định nghĩa làm việc về khoảng cách dòng để có thể hỗ trợ dàn trang các dòng “đơn giãn cách” và “kép giãn cách”, hoặc bất kỳ bội số nào khác của khoảng cách dòng. Nhưng biến nào được sửa đổi bởi `setspace` để tạo ra các dòng có mức khoảng trắng giữa chúng khác nhau?

May mắn là, [các thảo luận trên tex.stackexchange](https://tex.stackexchange.com/a/30106) và [các chú thích trong mã của gói](https://tex.stackexchange.com/a/632830) làm rõ cách `setspace` triển khai khoảng cách dòng: nó đặt giá trị của `\baselineskip` bằng cách dùng một bội số của cỡ điểm của phông chữ.

**Ghi chú ngắn về phông chữ và cỡ điểm**

Việc dùng phông chữ ở một cỡ điểm nhất định có nghĩa là áp dụng một *hệ số co giãn* cho các hình dạng ký tự (glyph) trong các phông chữ đó; một khi đã được co giãn theo cỡ điểm, kích thước hiển thị của ký tự là một hàm của thiết kế phông chữ (typeface). Cỡ điểm không có mối quan hệ phổ quát, cứng nhắc, với kích thước hiển thị thực tế của các hình dạng ký tự trong phông chữ.

Hình sau cho thấy các chữ thường “abc” được tạo kiểu bằng 4 phông chữ khác nhau và tất cả đều *được hiển thị ở cùng một cỡ điểm*. Hãy chú ý “kích thước” của các chữ thường này thay đổi theo thiết kế phông chữ (typeface) dù tất cả đều được dàn trang ở *cùng* cỡ điểm:

![Nhiều phông chữ ở cùng một cỡ điểm](/files/e9b348b575e9f77c199700a374e0bd9c9d38a67d)

#### Khoảng cách dòng đơn trong gói setspace

Chúng ta có thể dùng [các thảo luận trên tex.stackexchange](https://tex.stackexchange.com/a/30106) làm cơ sở cho một số giải thích tiếp theo.

Một tài liệu cơ bản dùng lớp `article` có cỡ phông văn bản mặc định là 10pt với `\baselineskip` là 12pt. Với tùy chọn \[11pt] hoặc \[12pt], lớp article dùng cỡ văn bản lớn hơn và giá trị tương ứng lớn hơn cho `\baselineskip` như được trình bày trong bảng sau:

| tùy chọn           | cỡ phông                    | $$\texttt{\baselineskip}$$ | $$\displaystyle\frac{\texttt{\baselineskip}}{\text{font size}}$$ |
| ------------------ | --------------------------- | -------------------------- | ---------------------------------------------------------------- |
| \[10pt] (mặc định) | 10pt                        | 12pt                       | 1.2                                                              |
| \[11pt]            | 10.95pt$${}^{\textbf{\*}}$$ | 13.6pt                     | 1.24                                                             |
| \[12pt]            | 12pt                        | 14.5                       | 1.21                                                             |

$${}^{\textbf{\*}}$$Lý do cho giá trị bất thường của `10.95pt`, chứ không phải chính xác `11pt`, được giải thích khá hay trong [bài đăng reddit](https://www.reddit.com/r/LaTeX/comments/ihle9h/why_does_latex_use_1095pt_text_when_the_11pt/).

Như được cho thấy trong bảng, với mỗi kết hợp của cỡ điểm văn bản, và giá trị mặc định tương ứng (tức là khoảng cách đơn dòng) của `\baselineskip`tỷ lệ

$$\frac{\texttt{\baselineskip}}{\text{font size}}$$

gần bằng 1.2. Giá trị tỷ lệ đó biểu thị khoảng cách đơn dòng và cung cấp cơ sở cho các phép tính khoảng cách dòng được dùng bởi `setspace` gói.

**Hiểu và tính toán các giá trị cho \baselinestretch**

Để đạt được một bội số khoảng cách dòng cụ thể như 1.5, 2, 3, v.v., lệnh `\baselinestretch` phải được đặt thành các giá trị thoạt nhìn [“kỳ lạ”](https://tex.stackexchange.com/a/30106); ví dụ bằng [sử dụng `\linespread` lệnh](https://texblog.org/2011/09/30/quick-note-on-line-spacing/). Trong phần này chúng ta sẽ xem xét kỹ hơn `\baselinestretch` để xem những giá trị “kỳ lạ” đó phát sinh như thế nào.

Hãy chọn một tài liệu có cỡ phông mặc định là $$f$$ và `\baselineskip` của $$\text{dbls}\_1$$, trong đó chỉ số dưới $${}\_1$$ ngụ ý `\baselineskip` giá trị mặc định cho khoảng cách đơn dòng ở cỡ phông $$f$$.

Chúng ta sẽ ***định nghĩa*** khoảng cách đơn dòng là tỷ lệ sau đây mà ta sẽ gọi là $$\alpha\_f$$:

$$\frac{\text{dbls}\_1}{f}=\alpha\_f$$

Với một cỡ phông cho trước $$f$$, ta cũng hãy *định nghĩa* các giá trị khoảng cách dòng sau:

* bội số khoảng cách dòng 1.5 được *định nghĩa* là

$$\frac{\text{dbls}\_{1.5}}{f}=1.5$$

* bội số khoảng cách dòng 2.0 được *định nghĩa* là

$$\frac{\text{dbls}\_{2.0}}{f}=2.0$$

* một bội số, $$m$$, của khoảng cách dòng được *định nghĩa* là

$$\frac{\text{dbls}\_{m}}{f}=m$$

Dùng khoảng cách đơn dòng của chúng ta, được định nghĩa bởi tỷ lệ $$\alpha\_f$$, chúng ta có thể viết đoạn “mã giả” sau để tìm ra một giá trị `\baselinestretch` tương ứng với bất kỳ bội số khoảng cách dòng nào $$m$$:

$$\begin{align\*} \texttt{multi spacing } (m) &= \text{a constant } (\lambda) \times \texttt{single spacing}\ \frac{\text{dbls}\_{m}}{f}&=\lambda \times \alpha\_f\ m&=\lambda\alpha\_f\ \lambda&=\frac{m}{\alpha\_f}\kern5pt(\text{refer to }\lambda\text{ as }\texttt{\baselinestretch})\ \implies \texttt{\baselinestretch}&=\frac{m}{\alpha\_f} \end{align\*}$$

Hãy dùng `11pt` văn bản (thực ra `10.95pt`) và mặc định `\baselineskip` giá trị của `13.6pt` để tính toán `\baselinestretch` cho *kép* giãn dòng:

$$\begin{align\*} m&=2.0\ \texttt{\baselinestretch}&=\frac{2.0}{\alpha\_f}\ &=\frac{2.0}{\frac{\text{dbls}\_1}{f}}\ &=\frac{2.0}{\frac{13.6}{11}}\ &=2.0 \times \frac{11}{13.6}\ &=1.618\ \end{align\*}$$

Đoạn mã sau đây được dùng trong `setspace` gói để đạt được `\doublespacing` khi cỡ phông là 11pt. Lưu ý giá trị của `1.618`, như đã tính ở trên, được lưu trong lệnh `\baselinestretch`:

```latex
\newcommand{\doublespacing}{%
  \setstretch {1.667}%  mặc định
  \ifcase \@ptsize \relax % 10pt
    \setstretch {1.667}%
  \or % 11pt
    \setstretch {1.618}%
  \or % 12pt
    \setstretch {1.655}%
  \fi
}
```

Sử dụng một `article` lớp tài liệu với tùy chọn phông 11pt, ví dụ sau so sánh `\doublespacing` với một `khoảng cách` môi trường sử dụng giá trị đã tính của chúng ta là `1.618` cho `\baselinestretch`. Không có gì ngạc nhiên, các giá trị `\baselineskip` là giống hệt nhau (`22.00475pt`):

```latex
\begingroup
\doublespacing
\verb|\baselineskip|=\texttt{\the\baselineskip} (qua \verb|\doublespacing)|

\blindtext[1]

\endgroup

\begin{spacing}{1.618}
\verb|\baselineskip|=\texttt{\the\baselineskip} (qua \verb|\begin{spacing}{1.618})|

\blindtext[1]
\end{spacing}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Demonstrating+baselinestretch+calculations\&snip=%5Cdocumentclass%5B11pt%5D%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D25cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D14cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bsetspace%7D%0A%5Cusepackage%7Bblindtext%7D+%25+For+dummy+text.%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Cdoublespacing%0A%5Cverb%7C%5Cbaselineskip%7C%3D%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D+%28via+%5Cverb%7C%5Cdoublespacing%29%7C%0A%0A%5Cblindtext%5B1%5D%0A%0A%5Cendgroup%0A%0A%5Cbegin%7Bspacing%7D%7B1.618%7D%0A%5Cverb%7C%5Cbaselineskip%7C%3D%5Ctexttt%7B%5Cthe%5Cbaselineskip%7D+%28via+%5Cverb%7C%5Cbegin%7Bspacing%7D%7B1.618%7D%29%7C%0A%0A%5Cblindtext%5B1%5D%0A%5Cend%7Bspacing%7D%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![minh họa của \baselinestretch](/files/5823831f382b080b2f85f343d682d9c4cc55c9bc)

Các phép tính tương tự cho `\baselinestretch` các giá trị cũng áp dụng cho các kích cỡ phông và tổ hợp giãn dòng khác, như liệt kê trong các bảng sau:

![tham số setspace](/files/442b4d641bb4d212b18466d685a56a3102148c9b)

## Sử dụng các lệnh tham số TeX/LaTeX

Các phần sau đây tìm hiểu một số lệnh liên quan đến giãn/căn chỉnh đoạn văn: một số lệnh trong đó là *được tích hợp sẵn trong* các bộ máy dàn trang TeX, còn những lệnh khác là các macro TeX/LaTeX. Các lệnh được tích hợp sẵn trong bộ máy TeX được gọi là *các nguyên thủy*, nghĩa là chúng là *cơ bản* và *nguyên thủy* vì, khác với macro, các primitive không được xây dựng từ chuỗi các lệnh khác.

Cụ thể, chúng ta sẽ xem xét một số primitive *lệnh tham số* được hỗ trợ bởi mọi bộ máy TeX, bao gồm pdfTeX, XeTeX và LuaTeX. Các lệnh tham số, dù liên quan đến đoạn văn hay không, được dùng để *lấy giá trị hiện tại* của tham số tương ứng, hoặc *đặt tham số đó thành một giá trị mới*. Ví dụ, `\parskip` lệnh, một primitive, xác định giá trị của một tham số điều khiển lượng khoảng trắng chèn giữa hai đoạn văn đã dàn trang.

Để *lấy* (ở đây, để dàn trang) giá trị hiện tại của `\parskip` bạn sẽ viết:

```latex
\the\parskip
```

Để *set* giá trị hiện tại của `\parskip` sang `1pt plus2pt` (một keo co giãn) bạn có thể viết như sau:

```latex
\setlength{\parskip}{1pt plus2pt}
```

Chúng tôi cũng thảo luận một số hữu ích TeX/LaTeX *macro*, các lệnh cấp cao hơn được viết và xây dựng bằng một chuỗi các lệnh thành phần.

### Các lệnh dùng cho giãn đoạn văn

Các lệnh sau đây (primitive và macro) có thể được dùng để tác động đến giãn đoạn văn. Một số được tìm hiểu chi tiết hơn và có thể truy cập bằng cách theo liên kết từ tên lệnh.

#### Các lệnh primitive

* [`**\parindent**`](#parindent-tex-primitive): lượng thụt lề (khoảng trắng) được thêm vào dòng đầu tiên của một đoạn văn.
* [`**\parskip**`](#parskip-tex-primitive): lượng khoảng trắng linh hoạt (“keo”) đặt giữa các đoạn văn.
* [`**\rightskip**`](#leftskip-and-rightskip-tex-primitives): khoảng trắng linh hoạt (keo) chèn vào bên phải của mỗi dòng trong một đoạn văn.
* [`**\leftskip**`](#leftskip-and-rightskip-tex-primitives): khoảng trắng linh hoạt (keo) chèn vào bên trái của mỗi dòng trong một đoạn văn.
* [`**\baselineskip**`](#baselineskip-tex-primitive): giá trị của tham số này có hai vai trò:
  * nó đặt khoảng cách mong muốn giữa các đường cơ sở của văn bản trong một đoạn văn;
  * nó được dùng để tính toán lượng khoảng trắng (keo) biến đổi được thêm giữa các dòng nhằm đạt được khoảng cách đường cơ sở như mong muốn ([xem tiếp trong bài viết](#how-the-space-glue-between-paragraph-lines-is-calculated)).
* [`**\lineskiplimit**`](#lineskip-and-lineskiplimit-tex-primitives): một tham số có giá trị xác định khoảng cách tối thiểu chấp nhận được giữa hai dòng kề nhau của một đoạn văn.
* [`**\lineskip**`](#lineskip-and-lineskiplimit-tex-primitives): lượng khoảng trắng (keo) chèn giữa hai dòng trong một đoạn văn nếu lượng keo được tính toán `\baselineskip` sẽ làm các dòng quá sát nhau.
* `**\parfillskip**`: lượng keo rất linh hoạt được thêm vào cuối dòng cuối cùng trong một đoạn văn để “lấp đầy” nó bằng khoảng trắng; để có ví dụ trực quan, hãy xem hình minh họa ở phần [*Trực quan hóa các loại keo đoạn văn khác*](#visualizing-other-types-of-paragraph-glue).

#### Các lệnh macro

Các lệnh macro TeX/LaTeX sau đây thường được dùng để sửa đổi giãn đoạn văn:

* [`**\offinterlineskip**` và `**\nointerlineskip**`](#offinterlineskipandnointerlineskip): các lệnh có thể được dùng để tắt việc tính toán và chèn `\baselineskip` keo;
* [`**\baselinestretch**`](#understanding-and-calculating-values-for-baselinestretch): một lệnh lưu hệ số số học dùng để tính giá trị của `\baselineskip` khi một phông được chọn. Nó có giá trị mặc định là 1;
* [`**\linespread**`](#demonstrating-linespread): lệnh này có thể được dùng để thay đổi giá trị hiện tại của `\baselinestretch`.

### Khoảng trắng linh hoạt (keo)

Các bộ máy TeX đạt được hiệu ứng giãn cách, bao gồm trong hoặc giữa các đoạn văn, thông qua việc sử dụng một khoảng trắng linh hoạt gọi là *keo* có thể được kéo giãn hoặc co lại tùy theo lượng khoảng trắng cần thiết. Nếu bạn muốn tìm hiểu về khái niệm keo của TeX, có thể xem thêm chi tiết trong các bài viết Overleaf sau:

* [Khám phá các hộp thiếu đầy hoặc thừa đầy và cách tính độ xấu](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv)
* [Cách TeX tính các thiết lập keo trong một \hbox](/latex/vi/bai-viet-chuyen-sau/24-how-tex-calculates-glue-settings-in-an-hbox.md)
* [Hiểu các cảnh báo hộp thiếu đầy và thừa đầy](/latex/vi/co-so-tri-thuc/138-understanding-underfull-and-overfull-box-warnings.md).

## Những điều cơ bản: lệnh tham số và ví dụ

Trong phần này, chúng tôi giải thích một số lệnh tham số liên quan đến đoạn văn và đưa ra các ví dụ về cách dùng chúng.

### \parindent (primitive TeX)

Lệnh tham số này đặt lượng thụt lề (khoảng trắng) được thêm vào dòng đầu tiên của một đoạn văn. Nó có thể được thay đổi bằng cách sử dụng lệnh `\setlength` của LaTeX; ví dụ, để thụt lề các đoạn văn `15pt` set `\parindent` sang `15pt` bằng cách viết:

```latex
\setlength{\parindent}{15pt}
```

Lưu ý rằng:

* bạn có thể thay đổi `\parindent` trong một nhóm, đảm bảo hiệu ứng của nó chỉ khu trú trong các đoạn văn thuộc nhóm đó;
* `\parindent` có thể âm, tạo ra một “thụt lề ngược” thay vì thụt lề;
* theo mặc định LaTeX không thụt lề đoạn văn đầu tiên sau một tiêu đề mục tài liệu (`\section{...}` v.v.).

Ví dụ sau minh họa việc dùng `\parindent`.

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Tạo một lệnh để chứa một đoạn văn bản
\newcommand{\testpar}{\texttt{\string\parindent=\the\parindent\ }Khi \TeX{} dàn trang một đoạn văn, nó coi mỗi ký tự riêng lẻ như một “hộp” 2D với chiều rộng, chiều cao và độ sâu cụ thể.\par}
\begin{document}

% Đặt \parskip để chèn 10pt giữa các đoạn văn
\setlength{\parskip}{10pt}

% Đặt giá trị của \parindent thành 0pt
\setlength{\parindent}{0pt}
\testpar

% Đặt giá trị của \parindent thành 10pt
\setlength{\parindent}{10pt}
\testpar

% Đặt \parindent trong một nhóm
{\setlength{\parindent}{50pt}\testpar}

% Bây giờ \parindent lại là 10pt
\testpar

% Đúng, bạn có thể có \parindent âm
\setlength{\parindent}{-20pt}
\testpar
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+paragraph+indentation\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Create+a+command+to+hold+a+paragraph+of+text%0A%5Cnewcommand%7B%5Ctestpar%7D%7B%5Ctexttt%7B%5Cstring%5Cparindent%3D%5Cthe%5Cparindent%5C+%7DWhen+%5CTeX%7B%7D+typesets+a+paragraph+it+treats+each+individual+character+as+a+2D+%60%60box%27%27+with+a+specific+width%2C+height+and+depth.%5Cpar%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%25+Set+%5Cparskip+to+put+10pt+between+paragraphs%0A%5Csetlength%7B%5Cparskip%7D%7B10pt%7D%0A%0A%25+Set+the+value+of+%5Cparindent+to+0pt%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Ctestpar%0A%0A%25+Set+the+value+of+%5Cparindent+to+10pt%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Ctestpar%0A%0A%25+Set+%5Cparindent+in+a+group%0A%7B%5Csetlength%7B%5Cparindent%7D%7B50pt%7D%5Ctestpar%7D%0A%0A%25+Now+%5Cparindent+is+again+10pt%0A%5Ctestpar%0A%0A%25+Yes%2C+you+can+have+a+negative+%5Cparindent%0A%5Csetlength%7B%5Cparindent%7D%7B-20pt%7D%0A%5Ctestpar%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Dùng các giá trị thụt lề đoạn văn khác nhau trong LaTeX](/files/1d5e3a8f000f50b856db87a796305575fd146f2c)

### \parskip (primitive TeX)

Khả năng đọc của văn bản có thể được cải thiện bằng cách tách các đoạn văn bằng một lượng khoảng trắng thay đổi theo một tiêu chí thẩm mỹ thiết kế nào đó. TeX/LaTeX cho phép người dùng kiểm soát khoảng cách giữa các đoạn văn đó thông qua `\parskip` lệnh tham số.

* **Lời khuyên từ `parskip` gói**: Gói [gói parskip](https://ctan.org/pkg/parskip) khuyên rằng việc sửa đổi trực tiếp `\parskip` có thể “dẫn đến các khoảng trắng dọc ở những chỗ không ngờ tới” (trong một tài liệu LaTeX). `parskip` gói cố gắng khắc phục các vấn đề về giãn cách có thể phát sinh từ việc thay đổi giá trị của `\parskip`—chẳng hạn trong mục lục và các môi trường danh sách. Xem thêm phần gói [`parskip` của bài viết này](#the-parskip-package).

Để đặt thủ công giá trị hiện tại của `\parskip` hãy dùng lệnh `\setlength` của LaTeX; ví dụ, để tách các đoạn văn bởi 3pt bạn có thể viết:

```latex
\setlength{\parskip}{3pt}
```

Ví dụ sau minh họa việc dùng `\parskip`:

```latex
\documentclass{article}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Tạo một lệnh để chứa một đoạn văn bản
\newcommand{\testpar}{\noindent Giá trị hiện tại của \texttt{\string\parskip} là \texttt{\the\parskip}. Khi \TeX{} dàn trang một đoạn văn, nó coi mỗi ký tự riêng lẻ như một “hộp” 2D~với chiều rộng, chiều cao và độ sâu cụ thể.\par}
\begin{document}
\testpar
% Đặt \parskip thành 5pt
\setlength{\parskip}{5pt}\testpar
% Đặt parskip thành 10pt
\setlength{\parskip}{10pt}\testpar
% Đặt \parskip thành 25pt (nhưng trong một nhóm)
{\setlength{\parskip}{25pt}\testpar}
% Kết thúc nhóm, bây giờ \parskip lại là 10pt
\testpar
% Đúng, bạn có thể có \parskip âm
\setlength{\parskip}{-20pt}\testpar
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+parskip+settings\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Create+a+command+to+hold+a+paragraph+of+text%0A%5Cnewcommand%7B%5Ctestpar%7D%7B%5Cnoindent+The+current+value+of+%5Ctexttt%7B%5Cstring%5Cparskip%7D+is+%5Ctexttt%7B%5Cthe%5Cparskip%7D.+When+%5CTeX%7B%7D+typesets+a+paragraph+it+treats+each+individual+character+as+a+2D%7E%60%60box%27%27+with+a+specific+width%2C+height+and+depth.%5Cpar%7D%0A%5Cbegin%7Bdocument%7D%0A%5Ctestpar%0A%25+Set+%5Cparskip+to+5pt+%0A%5Csetlength%7B%5Cparskip%7D%7B5pt%7D%5Ctestpar%0A%25+Set+parskip+to+10pt%0A%5Csetlength%7B%5Cparskip%7D%7B10pt%7D%5Ctestpar%0A%25+Set+%5Cparskip+to+25pt+%28but+in+a+group%29%0A%7B%5Csetlength%7B%5Cparskip%7D%7B25pt%7D%5Ctestpar%7D%0A%25+Group+ends%2C+now+%5Cparskip+is+again+10pt%0A%5Ctestpar%0A%25+Yes%2C+you+can+have+a+negative+%5Cparskip%0A%5Csetlength%7B%5Cparskip%7D%7B-20pt%7D%5Ctestpar%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Minh họa việc dùng \parskip trong LaTeX](/files/8c355149a5a853690fc30e5ab7ad03b91369751c)

#### \parskip linh hoạt

Theo truyền thống, `\parskip` không phải là một *cố định* giá trị, vì như vậy sẽ dẫn đến cùng một lượng khoảng trắng giữa tất cả các đoạn văn. Thay vào đó, `\parskip` thường được định nghĩa là một “khoảng trắng linh hoạt” (gọi là keo) cho phép TeX kéo giãn hoặc co lại khoảng trắng giữa các đoạn văn, giúp nội dung vừa khít trên trang và tìm được chỗ “tốt” cho ngắt trang.

Để làm `\parskip` linh hoạt, bạn sẽ viết nó dưới dạng một khai báo keo:

`\setlength{\parskip}{*lượng cố định* **plus** *lượng để kéo giãn* **minus** *lượng để co lại*}`

trong đó `**plus**` và `**minus**` đang *keywords* được dùng bởi TeX/LaTeX để xác định *lượng để kéo giãn* hoặc *lượng để co lại* có trong một khai báo keo. Bài viết Overleaf [*Khám phá các hộp thiếu đầy hoặc thừa đầy và cách tính độ xấu*](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv) có thảo luận sâu hơn về keo.

Ví dụ, để cho phép `\parskip` dao động giữa `3 + 1 = 4pt` và `3 — 1 = 2pt` bạn có thể viết

```latex
\setlength{\parskip}{3pt plus1pt minus1pt}
```

### \leftskip và \rightskip (primitive TeX)

Các bộ máy TeX cung cấp hai lệnh tham số thêm khoảng trắng (keo) vào bên trái và bên phải mỗi dòng trong đoạn văn đã dàn trang. Đúng như tên gọi của chúng:

* `\leftskip` chèn khoảng trắng (keo) ở bên trái mỗi dòng trong một đoạn văn;
* `\rightskip` chèn khoảng trắng (keo) ở bên phải bên trái của mỗi dòng trong một đoạn văn.

Các ví dụ sau đây sử dụng `\leftskip` và `\rightskip` để sửa trực tiếp căn chỉnh đoạn văn; tuy nhiên... thay đổi căn chỉnh văn bản thường nên được thực hiện thông qua các môi trường hoặc gói LaTeX phù hợp — ví dụ, xem [bài viết Overleaf về căn chỉnh văn bản](/latex/vi/dinh-dang/06-text-alignment.md). Mặc dù chúng tôi minh họa hành vi của một số lệnh tham số cấp thấp (primitive) do các bộ máy TeX cung cấp, nhìn chung nên dùng các gói LaTeX thích hợp bất cứ khi nào có thể.

#### Đặt \leftskip cố định và \rightskip linh hoạt

Ví dụ sau tạo ra hai đoạn văn: đoạn đầu dùng các giá trị mặc định của LaTeX cho `\leftskip` và `\rightskip` và đoạn thứ hai được dàn trang với các thiết lập sau:

```latex
\leftskip 10pt
\rightskip 0pt plus 1 fill
```

Mở dự án Overleaf sau đây để xem kết quả:

```latex
\documentclass{article}
\title{Ví dụ thứ hai về leftskip và rightskip}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Đặt giá trị của một số tham số liên quan đến đoạn văn
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, mỗi cái chứa văn bản cho một đoạn văn.
% Dàn trang một đoạn văn với các giá trị mặc định của \leftskip và \rightskip

\mytextB

% Đặt \leftskip và \rightskip thành các giá trị mới
\leftskip 10pt
\rightskip 0pt plus 1fill
\vspace{8pt}

% Bây giờ dàn trang lại cùng một đoạn văn
\mytextB

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Đặt keo \leftskip trong LaTeX](/files/2cc4387b67d9399e5eb072bf7d17bc5cd9b597ff)

Hình đồ họa sau đây là phiên bản có chú thích của đoạn văn thứ hai được tạo bởi ví dụ ở trên. Nó được thiết kế để làm nổi bật và cho thấy lượng `\leftskip` và `\rightskip` keo được chèn trong các dòng của đoạn văn, cùng với `\parindent` khoảng trắng cho dòng đầu tiên:

![Đặt keo \leftskip trong LaTeX](/files/e7f1eccb7179b7785ee6aeeea2e57a8c6cfd71d6)

Lưu ý rằng `\leftskip` keo có kích thước cố định (10pt) nhưng `\rightskip` keo đã được kéo giãn để cung cấp lượng khoảng trắng cần thiết nhằm lấp đầy phía bên phải của mỗi dòng. Tính “linh hoạt” này là do khai báo của `\rightskip` trong đó chứa `plus 1 fill`—cho phép một dạng keo “có thể kéo giãn vô hạn”.

#### Đặt \rightskip cố định và \leftskip linh hoạt

Ví dụ sau tạo ra hai đoạn văn: đoạn đầu dùng các giá trị mặc định của LaTeX cho `\leftskip` và `\rightskip` và đoạn thứ hai được dàn trang với các thiết lập sau:

```latex
\leftskip 0pt plus 1 fill
\rightskip 10pt
```

Mở dự án Overleaf sau đây để xem kết quả:

```latex
\documentclass{article}
\title{Ví dụ về leftskip và rightskip}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Đặt giá trị của một số tham số liên quan đến đoạn văn
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, mỗi cái chứa văn bản cho một đoạn văn.
% Dàn trang một đoạn văn với các giá trị mặc định của \leftskip và \rightskip

\mytextB

% Đặt \leftskip và \rightskip thành các giá trị mới
\rightskip 10pt
\leftskip 0pt plus 1fill
\vspace{8pt}

% Bây giờ dàn trang lại cùng một đoạn văn
\mytextB

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Đặt keo \rightskip trong LaTeX](/files/2775cd48494429d4d9cfc65da3deb45f79e4d5f3)

Hình đồ họa sau đây là phiên bản có chú thích của đoạn văn thứ hai được tạo bởi ví dụ ở trên. Nó được thiết kế để làm nổi bật và cho thấy lượng `\leftskip` và `\rightskip` keo được chèn trong các dòng của đoạn văn, cùng với `\parindent` khoảng trắng cho dòng đầu tiên:

![Đặt keo \rightskip trong LaTeX](/files/bbceb81c0d1a8012aa0d8ef9fac37a0e2e281a62)

Lưu ý rằng `\rightskip` keo có kích thước cố định (10pt) nhưng `\leftskip` keo đã được kéo giãn để cung cấp lượng khoảng trắng cần thiết nhằm lấp đầy phía bên trái của mỗi dòng. Tính “linh hoạt” này là do khai báo của `\leftskip` trong đó chứa `plus 1 fill`—cho phép một dạng keo “có thể kéo giãn vô hạn”.

#### Đặt \leftskip và \rightskip thành các giá trị linh hoạt

Ví dụ sau tạo ra hai đoạn văn: đoạn đầu dùng các giá trị mặc định của LaTeX cho `\leftskip` và `\rightskip` và đoạn thứ hai dùng các thiết lập keo linh hoạt sau đây:

```latex
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
```

Các thiết lập này làm cho các dòng của đoạn văn được căn giữa:

```latex
\documentclass{article}
\title{Ví dụ về leftskip và rightskip}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight==16cm,paperwidth==12cm,textwidth=8cm]{geometry}
% Đặt giá trị của một số tham số liên quan đến đoạn văn
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, định nghĩa văn bản cho hai đoạn văn
% Dàn trang một đoạn văn với các giá trị mặc định của \leftskip và \rightskip

\mytextB

% Đặt \leftskip và \rightskip thành các thiết lập keo "cực kỳ linh hoạt"
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\vspace{20pt}

% Bây giờ dàn trang lại cùng một đoạn văn
\mytextB

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Ví dụ cho thấy \leftskip và \rightskip](/files/93a78f847830b3e966e3ea8c9767a08451c95495)

Hình đồ họa sau đây là phiên bản có chú thích của đoạn văn thứ hai được tạo bởi ví dụ ở trên. Nó được thiết kế để làm nổi bật và cho thấy lượng `\leftskip` và `\rightskip` keo được chèn trong các dòng của đoạn văn, cùng với `\parindent` khoảng trắng cho dòng đầu tiên:

![Ví dụ cho thấy \leftskip và \rightskip](/files/5d6391ee1f840a14c6bc2e571b545cb7852e8e28)

Lưu ý rằng cả hai `\leftskip` và `\rightskip` đều được chỉ định là `0pt plus 1fill` làm cho chúng đều “linh hoạt vô hạn”; do đó, chúng kéo giãn cùng một lượng, dẫn đến các dòng được dàn trang ở giữa.

#### Đặt \leftskip và \rightskip trong một nhóm

Ví dụ sau cho thấy cách thực hiện các thay đổi tạm thời đối với `\leftskip` và `\rightskip` bằng cách đặt chúng בתוך một nhóm. Trong ví dụ của chúng tôi, nhóm được tạo bởi `\begingroup`... `\endgroup`, như thể hiện trong đoạn mã sau:

```latex
\begingroup
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\mytextB
\endgroup
```

Đoạn văn đầu tiên được dàn trang bằng keo “cực kỳ linh hoạt” cho `\leftskip` và `\rightskip`:

```latex
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
```

nhưng đoạn văn thứ hai sử dụng các giá trị mặc định của LaTeX:

```latex
\documentclass{article}
\title{Một ví dụ khác về leftskip và rightskip}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Đặt giá trị của một số tham số liên quan đến đoạn văn
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, định nghĩa văn bản cho hai đoạn văn
% Ở đây chúng ta thay đổi \leftskip và \rightskip thành các thiết lập keo "cực kỳ linh hoạt"
% trong một nhóm được tạo bởi \begingroup ... \endgroup

\begingroup
\leftskip 0pt plus 1fill
\rightskip 0pt plus 1fill
\mytextB
\endgroup

% Bây giờ dàn trang lại cùng một đoạn văn sau khi nhóm đã kết thúc
% khiến \leftskip và \rightskip quay về các giá trị trước đó của chúng

\vspace{20pt}
\mytextB

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Sử dụng \leftskip và \rightskip trong một nhóm](/files/5cc67ce8e143584b3dc8c5d59e54c931eb82797f)

**Lưu ý**: Các thiết lập (tác dụng) của `\leftskip` và `\rightskip` được giới hạn trong đoạn văn bên trong nhóm được tạo bởi `\begingroup`... `\endgroup`. Sau khi nhóm đã đóng, đoạn văn tiếp theo được dàn trang bằng các giá trị mặc định của LaTeX cho `\leftskip` và `\rightskip`.

### \baselineskip (primitive TeX)

Thông thường trong thực hành dàn trang, các dòng văn bản trong đoạn văn nên cách đều nhau, trừ khi một số dòng chứa các thành phần lớn, chẳng hạn như toán học hoặc hình ảnh, khiến không thể duy trì khoảng cách dòng cố định cho những dòng đó.

TeX/LaTeX cung cấp các lệnh và cơ chế cho phép người dùng kiểm soát ở một mức độ nào đó khoảng cách giữa các dòng. Một lệnh như vậy là `\baselineskip` lệnh nhận, hoặc đặt, giá trị của một tham số xác định khoảng cách giữa các dòng mong muốn (khoảng cách từ đường cơ sở đến đường cơ sở) trong một đoạn văn đã dàn trang.

Để dàn trang giá trị hiện tại của `\baselineskip` bạn có thể viết

```latex
\the\baselineskip
```

Để đặt `\baselineskip` thành một `giá trị` (một độ dài LaTeX như `pt`) bạn có thể viết

```latex
\setlength{\baselineskip}{value}
```

Ví dụ, để đặt `\baselineskip` sang `12pt` bạn có thể viết

```latex
\setlength{\baselineskip}{12pt}
```

Chúng ta có thể minh họa vai trò của `\baselineskip` bằng cách dùng đoạn văn (thông thường) sau:

![Một đoạn văn LaTeX ví dụ](/files/745ef5dbab37a1f4af677692511669be7f7e17a0)

và thêm các chú thích cho thấy khoảng cách từ đường cơ sở đến đường cơ sở được điều khiển bởi `\baselineskip`:

![Một đoạn văn LaTeX ví dụ có chú thích để cho thấy các khoảng cách đường cơ sở](/files/29fe4e25e733af3ffbfd388a6fbfedcc2b52606a)

Sơ đồ cũng cho thấy “keo” giữa các dòng: một lượng khoảng trắng được tính toán và thêm vào giữa các dòng — chúng ta sẽ bàn thêm về điều này sau trong bài viết.

#### \baselineskip và các tham số khác

`\baselineskip` là một trong bốn tham số cốt lõi điều khiển lượng khoảng trắng chèn giữa các dòng của một đoạn văn; các tham số còn lại là:

* `\lineskip`
* `\lineskiplimit`
* `\prevdepth`

Sau này trong bài viết chúng ta sẽ tìm hiểu [*cách bốn tham số này được dùng*](#paragraph-structure-and-line-space-calculations) để tính các giá trị keo giữa các dòng.

#### ví dụ \baselineskip (khoảng trắng cố định)

Ví dụ sau mở trong Overleaf để tạo một dự án chứa một tệp có tên là `text.tex` định nghĩa các lệnh `\mytextA` và `\mytextB`—cả hai lệnh đều dàn trang một đoạn văn. Vì thuận tiện, dự án Overleaf sử dụng kích thước trang nhỏ vì điều đó hỗ trợ việc chuẩn bị đồ họa và hình ảnh cho trang trợ giúp này.

```latex
\documentclass{article}
\title{Minh họa baselineskip}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Đặt giá trị của một số tham số liên quan đến đoạn văn (chúng ta sẽ bàn về những tham số này)
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
% Đặt giá trị của \baselineskip---hãy thay đổi giá trị để xem hiệu ứng
\setlength{\baselineskip}{12pt}

\begin{document}
\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, mỗi cái dàn trang một đoạn văn

% Trước hết, dàn trang hai đoạn văn với \baselineskip mặc định
\mytextA\mytextB

% Bây giờ thay đổi \baselineskip thành một giá trị lớn hơn và dàn trang
% một đoạn văn khác
\setlength{\baselineskip}{24pt}
\mytextA

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Tìm hiểu baselineskip trong TeX hoặc LaTeX](/files/6eebd7be02adbe8a05e51ba16f7c7f4958ae3572)

Đoạn văn ở trang 2 có các dòng cách xa nhau vì `\baselineskip` đã được đặt thành 24pt.

#### ví dụ \baselineskip (khoảng trắng linh hoạt)

Ví dụ sau xác định một `\baselineskip` giá trị có thành phần kéo giãn cực kỳ linh hoạt (cái gọi là “vô hạn”):

```latex
\baselineskip=12pt plus1fil
```

Do tính linh hoạt này, khoảng trắng giữa các dòng của đoạn văn có thể kéo giãn đến bất kỳ lượng nào cần thiết để lấp đầy trang. Sự linh hoạt như vậy sẽ làm cho các đoạn văn có những khoảng cách rất khác nhau giữa các dòng văn bản thành phần, điều này có thể không đẹp về mặt thẩm mỹ hoặc dễ đọc.

```latex
\documentclass{article}
\usepackage{blindtext}
\title{Bản trình diễn \texttt{\string\baselineskip} linh hoạt}
\author{Overleaf}
\date{Tháng 1 năm 2022}

\begin{document}

\maketitle
Chúng ta sẽ cung cấp cho \verb|\baselineskip| một thành phần “kéo giãn” rất linh hoạt bằng cách gán giá trị \texttt{12pt plus1fil}: \verb|\baselineskip=12pt plus1fil|.\baselineskip=12pt plus1fil
\section{Giới thiệu}
Thêm một đoạn văn giờ sẽ kéo giãn để lấp đầy trang. \blindtext

\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Flexible+baselineskip+demo\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bblindtext%7D%0A%5Ctitle%7BFlexible+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+demo%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BJanuary+2022%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0AWe%E2%80%99ll+provide+%5Cverb%7C%5Cbaselineskip%7C+with+a+very+flexible+%60%60stretch%27%27+component+by+assigning+the+value+%5Ctexttt%7B12pt+plus1fil%7D%3A+%5Cverb%7C%5Cbaselineskip%3D12pt+plus1fil%7C.%5Cbaselineskip%3D12pt+plus1fil+%0A%5Csection%7BIntroduction%7D%0AAdd+a+paragraph+that+will+now+stretch+to+fill+the+page.+%5Cblindtext%0A%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Minh họa keo baselineskip với tính linh hoạt vô hạn](/files/0c02c17d5ca3d1c8c893028b237ad4de1e1c100e)

**Một vài ghi chú về keo**

Một số ghi chú sau đây được lấy từ bài viết Overleaf [khám phá các hộp thiếu đầy hoặc quá đầy và các phép tính độ xấu](https://www.overleaf.com/latex/examples/exploring-underfull-or-overfull-boxes-and-badness-calculations/wpfsjnbkrfhv), được tái hiện ở đây cho tiện.

Khoảng trắng mà TeX chèn giữa các dòng của một đoạn văn, `\baselineskip`, là một dạng khoảng cách linh hoạt gọi là *keo*. Một giá trị glue có thể được chỉ định bằng ba thành phần:

* a *cố định* lượng;
* một lượng mà nó có thể *giãn*;
* một lượng mà nó có thể *co*,

Do đó, một `\baselineskip` giá trị có thể được chỉ định như sau:

`\baselineskip`=*lượng cố định* **cộng với** *lượng để kéo giãn* **trừ** *lượng để co lại*

trong đó

* **cộng với** và **trừ** là các từ khóa mà các bộ máy TeX hiểu;
* *lượng cố định* được gọi là *thành phần bình thường* của glue (còn gọi là *độ rộng tự nhiên* của glue);
* *lượng để kéo giãn* được gọi là *thành phần giãn* của glue;
* *lượng để co lại* được gọi là *thành phần co* của glue.

Tính năng *lượng cố định* là bắt buộc đối với mọi giá trị glue nhưng *lượng để kéo giãn* và *lượng để co lại* đều là tùy chọn—nếu một trong hai, hoặc cả hai, bị thiếu thì chúng được đặt thành 0.

Thông thường, `\baselineskip` glue được chỉ định bằng một *lượng cố định* chỉ, thì các thành phần giãn và co bằng 0; nếu không, các dòng đoạn văn sẽ có khoảng cách không đều (thay đổi), điều này có thể không đẹp mắt.

### \offinterlineskip và \nointerlineskip (các macro)

Các macro này thường được dùng để ngăn việc chèn glue giữa các dòng của một đoạn văn. Bạn đọc quan tâm đến chi tiết hơn có thể nhảy tới các phần bài viết liên quan giải thích cách các macro này hoạt động.

* **`\offinterlineskip`**: Xem mục bài viết [*Glue giữa dòng có kích thước bằng 0: \offinterlineskip*](#zero-sized-interline-glue-offinterlineskip).
* **`\nointerlineskip`**: Xem mục bài viết [*Ngăn glue giữa dòng: \prevdepth và \nointerlineskip*](#preventing-interline-glue-prevdepth-and-nointerlineskip).

## Cấu trúc đoạn văn và phép tính khoảng cách dòng

Bằng cách sử dụng các khả năng của LuaTeX, có thể [hậu xử lý một đoạn văn đã dàn trang](https://www.overleaf.com/latex/examples/luatex-parsing-typeset-paragraphs/mzbpwxtjshsj) để trực quan hóa ranh giới của các ký tự cấu thành (glyph), các dòng và các glue tạo nên nó. Chúng ta sẽ bắt đầu bằng một chuỗi đồ họa ngắn để giúp hình dung mô hình “boxes and glue” mà các bộ máy TeX dùng để dàn trang văn bản trong một đoạn văn.

### Cấu trúc đoạn văn

Khi TeX dàn trang một đoạn văn, nó coi từng ký tự như những hộp thu nhỏ, mỗi hộp có chiều rộng, chiều cao và độ sâu riêng, và độ rộng của các hộp ký tự đó được dùng để tính toán vị trí tối ưu cho các chỗ ngắt dòng. Ngoài ra, các ký tự khoảng trắng trong văn bản, vốn dùng để tách các từ riêng lẻ, được chuyển thành một dạng khoảng trắng linh hoạt (glue) cung cấp khoảng cách cần thiết để tạo ra từng chỗ ngắt dòng.

Chuỗi 7 đồ họa sau đây cho thấy các thành phần cốt lõi của một đoạn văn đã dàn trang: nhiều loại hộp và glue khác nhau. Hình đầu tiên cho thấy một đoạn văn đã dàn trang cùng với phiên bản có chú thích, làm nổi bật các thành phần khác nhau trong đoạn văn. Tuy nhiên, đoạn văn có chú thích chứa khá nhiều thông tin nên các đồ họa tiếp theo sẽ tách riêng từng thành phần để (hy vọng là) giúp chúng dễ hiểu hơn.

![Paragraphanatomy1b.png](/files/a8b43a6e93a21f8c6090035ac8ba5e80b465e62f)

* Đồ họa tiếp theo mô tả các dòng của đoạn văn như các hộp màu xám được ngăn cách bởi glue được biểu diễn bằng các dải xanh lá nằm ngang. Glue đó được tính để bảo đảm khoảng cách từ đường cơ sở đến đường cơ sở bằng (tức là, bằng giá trị của) `\baselineskip`:

![Paragraphanatomy2b.png](/files/693b4bd0657f5ad44790f040a9ff4aab5556df97)

* Hình tiếp theo biểu diễn các ký tự đã dàn trang như các hộp: để trực quan hóa cách các bộ máy TeX xử lý ký tự nhằm tạo ra các chỗ ngắt dòng:

![Paragraphanatomy3.png](/files/a3d966ffc3f5227484fe258189f554f310e3735d)

* Hình tiếp theo cho thấy các hộp nằm trong các hộp: các dòng đoạn văn lớn hơn (các hộp) chứa các hộp nhỏ hơn (các ký tự riêng lẻ):

![Paragraphanatomy5.png](/files/1ff95738f141d8f10441ea21382cbbf72afac95a)

* Hình tiếp theo cho thấy lượng khoảng trắng giữa các từ trong từng dòng: những khoảng giữa từ này được tạo ra bằng cách chuyển các ký tự khoảng trắng thành các glue linh hoạt, được giãn ra hoặc co lại để tạo độ dài đúng cho từng dòng văn bản. Hãy lưu ý kỹ rằng kích thước của các khoảng này thay đổi từ dòng này sang dòng khác:

![Paragraphanatomy4.png](/files/cbb3f46c7e7c47b127c18ecc4f4f7f6ffe1faa5f)

* Hình tiếp theo kết hợp các hộp ký tự và các glue (khoảng trắng) tương ứng được đặt giữa từng từ riêng lẻ:

![Paragraphanatomy6.png](/files/d8bf88ce56ea4de2f499f24f54b18e227d4b8a19)

### Trực quan hóa các loại keo đoạn văn khác

Các đoạn văn sau đây cũng được dàn trang và xử lý bằng LuaTeX để cho thấy các loại glue khác bên trong và giữa một cặp đoạn văn. Lưu ý rằng `\rightskip` và `\leftskip` đều được đặt thành 0pt, nên chúng không được hiển thị:

* **`\parskip`** glue (xanh dương nhạt) được đặt giữa hai đoạn văn đã dàn trang;
* các từ riêng lẻ được ngăn cách bởi ***glue giữa từ*** (vàng) được tạo ra bằng cách chuyển các ký tự khoảng trắng trong đầu vào thành khoảng trắng có kích thước thay đổi (glue) trong kết quả đã dàn trang. Glue phát sinh từ các khoảng giữa từ được giãn ra hoặc co lại để đạt được các chỗ ngắt dòng đẹp mắt;
* **`\baselineskip`** glue (xanh lá nhạt) được đặt giữa các dòng—lượng chính xác của `\baselineskip` glue được tính bằng cơ chế được thảo luận bên dưới;
* **`\lineskip`** glue (đỏ) được dùng trong đoạn văn thứ hai—do hộp thấp nằm ở dòng áp chót;
* **`\parfillskip`** glue (xanh lá đậm) được đặt ở cuối dòng cuối cùng trong mỗi đoạn văn.

![](/files/61731d99405b491700b0842483314b0561a01de9)

### Xử lý các dòng (hộp) có độ sâu lớn hơn (hoặc chiều cao lớn hơn)

Như được minh họa bởi các hình trong [phần trước](#paragraph-structure), một đoạn văn đã dàn trang là một chồng dọc các “hộp”, được ngăn cách bởi một ít khoảng trắng, mà TeX gọi là “glue”. Khi đoạn văn được xử lý và các dòng riêng lẻ (các hộp) được xếp chồng lên nhau, danh sách dọc (ngăn xếp) tăng theo một *hướng xuống* về phía cuối trang. Mặc dù TeX/LaTeX cố gắng bảo đảm các dòng của đoạn văn được xếp sao cho các đường cơ sở cách nhau một khoảng cố định là `\baselineskip`, nhưng không phải lúc nào cũng đạt được điều đó vì một số dòng có thể có chiều cao hoặc độ sâu lớn hơn bình thường.

Chiều cao và độ sâu của từng dòng trong đoạn văn được xác định bởi khoảng cách lớn nhất mà nội dung của dòng đó vươn lên trên hoặc xuống dưới đường cơ sở; do đó, các đoạn văn chứa vật liệu có chiều cao hoặc độ sâu tương đối lớn, như công thức toán học nội dòng hoặc hình ảnh, có thể tạo ra các dòng riêng lẻ có chiều cao và/hoặc độ sâu tương ứng lớn. Với những dòng như vậy, TeX/LaTeX có thể không thể xếp chúng sao cho các đường cơ sở của chúng cách các dòng khác một khoảng `\baselineskip` lượng. Rõ ràng, TeX/LaTeX cần một “cơ chế dự phòng” để xử lý các dòng như vậy bằng cách *tính toán* một lượng khoảng trống phù hợp để chèn giữa mỗi cặp dòng bị ảnh hưởng bởi chiều cao và/hoặc độ sâu lớn.

#### \lineskip và \lineskiplimit (các primitive của TeX)

Cơ chế dự phòng đó liên quan đến các lệnh tham số `\lineskip` và `\lineskiplimit` cùng với tham số thứ ba có tên là `\prevdepth`. Bạn đọc quan tâm đến chi tiết hơn có thể nhảy tới mục bài viết [*Cách không gian (glue) giữa các dòng của đoạn văn được tính*](#how-the-space-glue-between-paragraph-lines-is-calculated).

Ví dụ dự án bên dưới dàn trang một đoạn văn duy nhất mà dòng cuối cùng có độ sâu tương đối lớn do một hộp văn bản bị dịch chuyển (`\hbox`). Đoạn văn được dàn trang bằng các thiết lập sau:

```latex
\setlength{\baselineskip}{12pt}
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
```

Sử dụng liên kết bên dưới đoạn mã sau để mở một dự án Overleaf:

```latex
\documentclass{article}
% Dùng kích thước trang nhỏ tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
% Đặt một số tham số quan trọng
\setlength{\baselineskip}{12pt}
\setlength{\lineskip}{3.5pt}
\setlength{\lineskiplimit}{2pt}
\setlength{\parindent}{20pt}
% Tệp đầu vào định nghĩa \testpar
\input testpar.tex
\title{Một đoạn văn mẫu cho lineskip}
\begin{document}
\testpar % Một macro được tạo trong dự án Overleaf
\end{document}
```

&#x20;[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Set+some+important+parameters%0A%5Csetlength%7B%5Cbaselineskip%7D%7B12pt%7D%0A%5Csetlength%7B%5Clineskip%7D%7B3.5pt%7D%0A%5Csetlength%7B%5Clineskiplimit%7D%7B2pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B20pt%7D%0A%25+Input+file+defining+%5Ctestpar+%0A%5Cinput+testpar.tex%0A%5Ctitle%7BA+sample+paragraph+for+lineskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Ctestpar+%25+A+macro+created+in+the+Overleaf+project%0A%5Cend%7Bdocument%7D\&snip_name\[]=testpar.tex\&snip\[]=%5Cnewcommand%7B%5Ctestpar%7D%7B%5CTeX%7B%7D+uses+the+name+%60%60glue%27%27+to+describe+%60%60flexible+white+space%27%27+used+to+separate+any+typeset+item+which+can+appear+on+the+page.+For+example%2C+individual+words%2C+and+whole+lines%2C+within+a+typeset+paragraph+are+seperated+by+%60%60glue%27%27.+%5CTeX%7B%7D+engines+identify+%28give+a+name+to%29+different+types+of+glue+according+to+where+it+is+being+used.+For+example%2C+each+line+is+separated+by+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+glue+or%2C+occasionally%2C+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue%2C+depending+on+%5CTeX%27s+calculations.+Let%27s+trigger+use+of+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue+by+adding+an+%5Ctexttt%7B%5Cstring%5Chbox%7D+which+has+a+large+depth+due+to+the+%5Ctexttt%7B%5Cstring%5Clower%7D+command%3B+for+example%2C+the+box%0A+%5Clower5pt%5Chbox%7BLOW+BOX%7D+will+cause+%5CTeX%7B%7D+to+insert+%5Ctexttt%7B%5Cstring%5Clineskip%7D+glue+instead+of+%5Ctexttt%7B%5Cstring%5Cbaselineskip%7D+glue.%5Cpar%7D\&main_document=main.tex)

Ví dụ này tạo ra kết quả sau:

![Ví dụ minh họa glue \lineskip](/files/ae9296b394106e27a6b984e420197e73ae91af4f)

Hình sau đây sử dụng phiên bản có chú thích của đoạn văn được tạo bởi dự án Overleaf trước đó. Ở đây, chúng ta phóng to để tập trung vào dòng cuối của đoạn văn, cho thấy việc dùng `\lineskip` glue (được hiển thị bằng màu đỏ) do độ sâu của hộp văn bản bị dịch chuyển gây ra:

![Hình ảnh hiển thị glue \lineskip của TeX](/files/ea8179250dc7a908b44d70a2ea657635cafe1475)

Dòng cuối cùng của văn bản đoạn văn có độ sâu lớn hơn bình thường, khiến TeX không thể duy trì khoảng cách cố định giữa các đường cơ sở được chỉ định bởi giá trị `\baselineskip` (12pt). Như các mũi tên ở phía bên phải của hình chỉ ra, TeX/LaTeX cố gắng bảo đảm một khoảng cách cố định (12pt) giữa từng cặp dòng—giá trị của `\baselineskip`. Tuy nhiên, đối với cặp dòng cuối cùng, TeX đã tách chúng ra một khoảng lớn hơn 12pt và dùng giá trị của `\lineskip` cho glue giữa dòng thay vì một giá trị được tính bằng `\baselineskip`.

Các mục sau đây khám phá và giải thích chi tiết các phép tính của TeX đối với các giá trị glue giữa dòng.

### Cách không gian (glue) giữa các dòng của đoạn văn được tính

Cho mục đích hiện tại, chúng ta sẽ *rất ngắn gọn* đề cập đến quá trình xây dựng trang của TeX, dù theo một cách hết sức đơn giản! Khi TeX đã dàn xong một đoạn văn, bằng cách hoàn tất ngắt từ và xác định chỗ ngắt dòng, bạn có thể xem dữ liệu của đoạn văn đó như được lưu trong một vị trí bộ nhớ tạm thời. Sau đó TeX cần chuyển dữ liệu đoạn văn ấy, theo từng dòng, sang một vị trí bộ nhớ mới lưu trữ nội dung dành cho trang đầu ra hiện tại.

Khi TeX chuyển dữ liệu đoạn văn, theo từng dòng, nó thực chất đang xây dựng một chồng dọc các dòng (các hộp TeX) tăng dần *hướng xuống* về phía cuối trang. Khi chuyển các dòng của đoạn văn sang trang hiện tại, TeX cố gắng bảo đảm các dòng đó được giãn cách đều nhau, với khoảng cách dọc (từ đường cơ sở đến đường cơ sở) nhất quán bằng giá trị `\baselineskip`. Khi một dòng mới được chuyển sang trang hiện tại, bộ máy TeX tạm thời ghi lại *độ sâu* vì nó sẽ được dùng để tính lượng glue giữa dòng (khoảng trắng) giữa dòng đó và dòng được đặt sau nó.

#### Tính toán kích thước glue

Hãy bắt đầu bằng cách tóm tắt các đặc điểm giãn dòng giữa các dòng do các bộ máy TeX cung cấp:

* duy trì khoảng cách cố định giữa các đường cơ sở, một khoảng cách bằng `\baselineskip`;
* cung cấp khoảng cách cho mọi dòng có chiều cao hoặc độ sâu tương đối lớn;
* khả năng tắt việc chèn glue giữa dòng—tự động hoặc do người dùng điều khiển. Ví dụ:
  * Các bộ máy TeX tự động tắt việc chèn glue giữa dòng sau một rule trong chế độ dọc;
  * các macro `\offinterlineskip` và `\nointerlineskip` cho phép người dùng tạm thời tắt việc chèn glue giữa dòng—các macro đó có tác dụng khác nhau, như chúng ta sẽ thấy bên dưới.

Quyết định có thêm glue giữa dòng hay không, và nếu có thì thêm bao nhiêu của loại nào, diễn ra như sau:

* Có nên thêm glue giữa dòng không? TeX quyết định điều này bằng cách kiểm tra xem *độ sâu của dòng cuối cùng đã thêm* vào danh sách có nhỏ hơn giá trị đặc biệt `–1000pt` (điểm). Lưu ý rằng `–1000pt` là một giá trị “sentinel” tùy ý được các bộ máy TeX dùng nội bộ.
  * **Lưu ý**: Giá trị “độ sâu của dòng cuối cùng đã thêm”, được TeX ghi nội bộ, còn được gọi là “độ sâu trước đó”. Các bộ máy TeX cung cấp lệnh tham số `\prevdepth`—lệnh này trong một số trường hợp có thể được dùng để *lấy* hoặc *set* giá trị của “độ sâu trước đó”. `\nointerlineskip` tận dụng `\prevdepth`.
* TeX kiểm tra xem `độ sâu của dòng trước lớn hơn –1000pt`?
  * ***Đúng là vậy*** (cần thêm glue):
    * tính giá trị Δ, trong đó Δ = \baselineskip – (độ sâu của dòng trước) – (chiều cao của dòng tiếp theo)
    * so sánh Δ với giá trị của `\lineskiplimit`, một tham số dùng để xác định khoảng cách tối thiểu chấp nhận được giữa hai dòng, đo bằng khoảng cách giữa đáy của dòng trên và đỉnh của dòng dưới.
    * Nếu Δ < `\lineskiplimit`:
      * các dòng quá gần nhau nên chèn khoảng cách tối thiểu chấp nhận được là `\lineskip`
    * Nếu Δ >= `\lineskiplimit`:
      * các dòng không quá gần nhau nên dùng Δ làm lượng glue cần chèn
  * ***Không phải*** (không thêm glue):
    * Thêm dòng tiếp theo (hộp) mà không chèn glue nào

Đồ họa sau đây tóm tắt quy trình glue giữa dòng:

![Cách TeX xác định giá trị glue giữa dòng](/files/3116b92d740cea02aec92c7bbc38ae7569bf06c6)

### Một ví dụ về phép tính glue giữa dòng

Trong ví dụ sau, chúng ta giả sử TeX/LaTeX đang dùng các giá trị tham số lệnh sau:

```latex
\baselineskip=12pt
\lineskip=3.5pt
\lineskiplimit=2pt
```

Hãy xem phép tính glue giữa dòng cho hai dòng đầu tiên của đoạn văn này:

![OLV2glue-calcs-step0.png](/files/5ab0ecaee26014bd873566d26559a313f3147cfa)

Trong hình tiếp theo, bộ máy TeX đã xử lý dòng đầu tiên của đoạn văn và chuyển nó vào danh sách dọc mà nó đang xây dựng. Nó theo dõi độ sâu của dòng đó (`d<sub>1</sub>`) là `2.1528` (điểm):

![OLV2glue-calcs-step1.png](/files/7dcbf2dbe392e448c720dfd7043bfefd8eaffa3a)

Tiếp theo, TeX sẵn sàng thêm dòng thứ hai vào danh sách mà nó đang xây dựng: dòng đó có chiều cao (`h<sub>2</sub>`) là `6.9444` (điểm) và, nhân tiện, có độ sâu, `d<sub>2</sub>` của `0` (điểm):

![OLV2glue-calcs-step2.png](/files/5f74b07c63a44fed7e899a32a86a338ae063a05d)

Lúc này, TeX cần tính lượng khoảng trống (glue, `g<sub>1</sub>`) để chèn giữa hai dòng này:

![OLV2glue-calcs-step3.png](/files/9d3a1c295a8f628ca77881be2c90fd0916571457)

Hình ảnh sau cho thấy các phép tính glue cho cặp dòng này:

![OLV2glue-calcs-stepA3.png](/files/dcaa8677f514631105dfff12b5ba4c08f7d80459)

Hình ảnh cuối cùng cho thấy hai dòng được chuyển sang trang hiện tại với lượng glue giữa dòng đã tính được đặt giữa chúng:

![OLV2glue-calcs-step5.png](/files/aef33a033998ac2c9b1bd3706fb2885d5712109a)

### Một tham số nữa: \prevdepth

Như đã lưu ý ở trên, khi TeX tạo một chồng dọc (danh sách) các hộp, nó lưu độ sâu của hộp cuối cùng được thêm vào danh sách đó. Giá trị độ sâu đã lưu này được gọi là “độ sâu trước đó” và có thể truy cập qua lệnh tham số `\prevdepth`.

Tính năng `\prevdepth` lệnh này có thể được dùng ***chỉ*** khi TeX ở chế độ dọc; tức là, giữa các đoạn văn hoặc bên trong các hộp dọc: `\vbox`, `\vtop` hoặc `\vcenter` (lưu ý: `\vcenter` các hộp chỉ có thể được dùng trong chế độ toán học).

`\prevdepth` cung cấp quyền đọc và ghi đối với giá trị “độ sâu trước đó”:

* để đọc giá trị hiện tại của `\prevdepth` bạn có thể viết:

```latex
\the\prevdepth
```

* để đặt giá trị hiện tại của `\prevdepth` sang `một giá trị nào đó`, một độ dài tính bằng điểm, mm, v.v., bạn có thể viết:

```latex
\setlength{\prevdepth}{some value}
```

Nếu bạn cố dùng \verb`\prevdepth` trong những hoàn cảnh mà nó không được thiết kế cho, chẳng hạn trong một đoạn văn hoặc bên trong một `\hbox` bạn sẽ nhận được lỗi

```latex
\prevdepth không hợp lệ.
```

kèm thêm thông tin cho biết nó chỉ có thể được dùng trong chế độ dọc.

#### Ngăn glue giữa dòng: \prevdepth và \nointerlineskip

Một cách dùng của `\prevdepth` là để *ngăn* TeX thực hiện các phép tính đường cơ sở dùng để thêm glue giữa dòng giữa các mục trong một danh sách dọc, chẳng hạn các dòng của một đoạn văn. Sử dụng `\prevdepth` để biểu thị `độ sâu của dòng trước` chúng ta có thể viết lại các phép tính glue (như hình trên) như sau:

```latex
nếu(\prevdepth > –1000pt)
{
     Δ = \baselineskip — \prevdepth — (chiều cao của dòng hiện tại)

     nếu(Δ < \lineskiplimit)
       glue giữa dòng = \lineskip
     ngược lại
       glue giữa dòng = Δ
}
ngược lại
{
     Xếp hộp mà không thêm
     bất kỳ glue giữa dòng nào
}
```

Ở bên trong, các bộ máy TeX nhận biết một giá trị “sentinel” gọi là `\prevdepth` có thể được dùng để tắt việc tính toán và thêm glue giữa dòng. Giá trị sentinel đó là `–1000pt`, có thể thấy trong dòng đầu tiên của giả mã ở trên:

```latex
nếu(\prevdepth > –1000pt)
```

TeX sẽ không thêm glue giữa dòng trừ khi `\prevdepth` lớn hơn `–1000pt`— điều này cung cấp cơ chế được macro `\nointerlineskip` sử dụng để ngăn glue đường cơ sở được thêm giữa cặp hộp tiếp theo trong một danh sách dọc.

`\nointerlineskip` có định nghĩa tương đương với:

```latex
\def\nointerlineskip{
\prevdepth–1000pt
}
```

Lưu ý rằng `\nointerlineskip` cung cấp một *vô hiệu hóa một lần* các phép tính glue giữa dòng vì giá trị của `\prevdepth` được cập nhật liên tục khi các hộp mới được thêm vào danh sách dọc hiện tại, như minh họa trong ví dụ sau:

```latex
\noindent Các \verb|\hbox| sau đây được xử lý khi \TeX{} đang ở cái gọi là \textit{outer vertical mode}. Sau khi xử lý (dàn trang), các hộp này được nối vào trang hiện tại và xếp dọc với glue giữa dòng được chèn giữa chúng:

\hbox{j}
\hbox{p}
\hbox{g}

Ngay sau hộp \verb|\hbox{j}|, chúng ta đặt \verb|\prevdepth| thành \texttt{-1000pt} điều này ngăn glue giữa dòng được đặt giữa các hộp \verb|\hbox{j}| và \verb|\hbox{p}|:

\hbox{j}\setlength{\prevdepth}{-1000pt}
\hbox{p}
\hbox{g}

Hãy lưu ý rằng glue giữa dòng \textit{có} được đặt giữa các hộp \verb|\hbox{p}| và \verb|\hbox{g}| vì giá trị của \verb|\prevdepth| được cập nhật sau khi \verb|\hbox{p}| được xử lý và thêm vào danh sách: giá trị của \verb|\prevdepth| trở thành độ sâu của hộp \verb|\hbox{p}|. Khi \verb|\hbox{g}| được thêm vào danh sách dọc, giá trị của \verb|\prevdepth| không còn là \texttt{-1000pt} nữa; do đó, glue giữa dòng giờ có thể được thêm.
```

&#x20;[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=One-shot+use+of+nointerlineskip\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Cbaselineskip%7D%7B14pt%7D%0A%5Csetlength%7B%5Cparskip%7D%7B1pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%25+A+convenience+macro+to+typeset+%5Cprevdepth+in+an+%5Chbox%2C+although+TeX+has+to+be%0A%25+in+a+vertical+mode+when+this+macro+is+used.%0A%5Cnoindent+The+following+%5Cverb%7C%5Chbox%7Ces+are+processed+when+%5CTeX%7B%7D+is+in+so-called+%5Ctextit%7Bouter+vertical+mode%7D.+After+processing+%28typesetting%29%2C+these+boxes+are+appended+to+the+current+page+and+stacked+vertically+with+interline+glue+inserted+between+them%3A%0A%0A%5Chbox%7Bj%7D%0A%5Chbox%7Bp%7D%0A%5Chbox%7Bg%7D%0A%0ANow%2C+immediately+after+after+the+box+%5Cverb%7C%5Chbox%7Bj%7D%7C%2C+we+set+%5Cverb%7C%5Cprevdepth%7C+to+%5Ctexttt%7B-1000pt%7D+which+prevents+interline+glue+being+placed+between+the+boxes+%5Cverb%7C%5Chbox%7Bj%7D%7C+and+%5Cverb%7C%5Chbox%7Bp%7D%7C%3A+%0A%0A%5Chbox%7Bj%7D%5Csetlength%7B%5Cprevdepth%7D%7B-1000pt%7D%0A%5Chbox%7Bp%7D%0A%5Chbox%7Bg%7D%0A%0AObserve+that+interline+glue+%5Ctextit%7Bis%7D+placed+between+the+boxes+%5Cverb%7C%5Chbox%7Bp%7D%7C+and+%5Cverb%7C%5Chbox%7Bg%7D%7C+because+the+value+of+%5Cverb%7C%5Cprevdepth%7C+is+updated+after+%5Cverb%7C%5Chbox%7Bp%7D%7C+is+processed+and+added+to+the+list%3A+the+value+of+%5Cverb%7C%5Cprevdepth%7C+becomes+the+depth+of+the+box+%5Cverb%7C%5Chbox%7Bp%7D%7C.+When+%5Cverb%7C%5Chbox%7Bg%7D%7C+is+added+to+the+vertical+list+the+value+of+%5Cverb%7C%5Cprevdepth%7C+is+no+longer+%5Ctexttt%7B-1000pt%7D%3B+consequently%2C+interline+glue+can+now+be+added.%0A%5Cend%7Bdocument%7D)

Ví dụ này tạo ra kết quả sau:

![Ví dụ minh họa tham số \prevdepth của TeX](/files/4b668ce46703c1a203c70c31e172f8ab015c7003)

#### Glue giữa dòng có kích thước bằng 0: \offinterlineskip

Có thể loại bỏ toàn bộ khoảng cách giữa dòng thông qua lệnh macro `\nointerlineskip`, vốn có định nghĩa tương đương với:

```latex
\def\offinterlineskip{%
\baselineskip=-1000pt
\lineskip=0pt
\lineskiplimit=\maxdimen
}
```

Lưu ý rằng `\maxdimen` là `16383.99998pt`, độ dài lớn nhất mà TeX có thể dùng.

Đồ họa sau đây cho thấy các phép tính glue giữa dòng cốt lõi và các giá trị tham số khác nhau được macro `\nointerlineskip`:

![offinterlineskip](/files/6eb9cea545081c88f9ce23ae1c1c0b06b312b635)

Đồ họa sau đây cho thấy đoạn giả mã thu được sau khi thay các `\nointerlineskip` giá trị của macro vào các phép tính glue. Nó minh họa cách `\nointerlineskip` macro hoạt động bằng cách đặt giá trị cho `\baselineskip` và `\lineskiplimit` sao cho glue giữa dòng sẽ luôn là `\lineskip` glue của `0pt`.

![offinterlineskip](/files/f56231b31ca1ef197e71a86c9874ffac7c4b22dd)

#### \offinterlineskip và \lineskip khác 0

Tính năng `\nointerlineskip` macro đặt `\lineskip` về 0 nhưng, như dự án Overleaf sau minh họa, bạn có thể kết hợp `\nointerlineskip` với các giá trị khác 0 của `\lineskip` để tạo hiệu ứng giãn dòng.

```latex
\documentclass{article}
\title{Minh họa lineskip khác 0}
% Chọn cỡ trang đủ nhỏ một cách tiện lợi
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=8cm]{geometry}
\begin{document}

\offinterlineskip % Điều này đặt \lineskip thành 0pt

\setlength{\lineskip}{5pt} % Chúng ta muốn \lineskip khác 0

\input text.tex % Một tệp TeX được tạo tự động, định nghĩa các macro
% \mytextA và \mytextB, mỗi cái dàn trang một đoạn văn

\mytextA % Dàn trang một đoạn văn

% Bây giờ đổi \lineskip thành một giá trị glue linh hoạt và dàn trang
% một đoạn văn khác

\setlength{\lineskip}{5pt plus5pt minus5pt}

\mytextA

\end{document}
```

&#x20;Mở ví dụ này như một dự án LaTeX trên Overleaf

Ví dụ này tạo ra đầu ra sau:

![Minh họa macro \offinterlineskip của LaTeX](/files/a32c695f867a317cd6d2977899a47742398aaf11)

Bạn có thể giới hạn tác dụng của việc dùng `\offinterlineskip` và `\lineskip` (và các lệnh khoảng cách khác) bằng cách đặt chúng trong một nhóm:

```latex
\begingroup
\offinterlineskip
\setlength{\lineskip}{5pt}
...đoạn văn của bạn ở đây

\endgroup
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/vi/dinh-dang/04-articles-how-to-change-paragraph-spacing-in-latex.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
