> 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/cac-lenh/02-environments.md).

# Các môi trường

Các môi trường LaTeX được dùng để áp dụng một hay nhiều hiệu ứng dàn trang cụ thể cho một phần nội dung tài liệu của bạn. Bài viết này giải thích cách sử dụng các môi trường hiện có và định nghĩa các môi trường mới.

## Giới thiệu

Một môi trường bắt đầu bằng `\begin{name}` và kết thúc bằng `\end{name}`:

```
\begin{name}
Nội dung của bạn ở đây...
...điền vào đây...
\end{name}
```

trong đó “`tên`” là tên của môi trường đang được dùng—chẳng hạn như ví dụ sau sử dụng “`center`” để định dạng (canh giữa) một đoạn văn bản:

```latex
\documentclass{article}
\begin{document}
\begin{center}
Đây là minh họa cho môi trường \texttt{center}.
Đoạn văn bản này sẽ được \textit{canh giữa} vì nó
nằm trong một môi trường đặc biệt. Các môi trường cung cấp
một cách hiệu quả để chỉnh sửa các khối văn bản trong tài liệu của bạn.
\end{center}
\end{document}
```

[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Simple+environment+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Bcenter%7D%0AThis+is+a+demonstration+of+the+%5Ctexttt%7Bcenter%7D+environment.+%0AThis+paragraph+of+text+will+be+%5Ctextit%7Bcentred%7D+because+it+is+%0Acontained+within+a+special+environment.+Environments+provide+%0Aan+efficient+way+to+modify+blocks+of+text+within+your+document.%0A%5Cend%7Bcenter%7D%0A%5Cend%7Bdocument%7D)

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

![Hình minh họa căn chỉnh giữa](/files/101cb5e9528d907f042dfc09756c8f50604cca8c)

## Các môi trường

Ví dụ sau sử dụng `tabular` môi trường để dàn trang một bảng nhỏ. `tabular` có một đối số bổ sung `{ c c c }` quy định cách căn chỉnh của các ô—xem bài viết [Bảng](/latex/vi/hinh-va-bang/01-tables.md) để biết thêm thông tin.

```latex
\documentclass{article}
\begin{document}
\begin{tabular}{ c c c }
  cell1 & cell2 & cell3 \\
  cell4 & cell5 & cell6 \\
  cell7 & cell8 & cell9 \\
 \end{tabular}
\end{document}
```

[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Simple+tabular+environment+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Btabular%7D%7B+c+c+c+%7D+%0A++cell1+%26+cell2+%26+cell3+%5C%5C+%0A++cell4+%26+cell5+%26+cell6+%5C%5C+%0A++cell7+%26+cell8+%26+cell9+%5C%5C+%0A+%5Cend%7Btabular%7D%0A%5Cend%7Bdocument%7D)

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

![Ví dụ về môi trường tabular](/files/a53a89bbbe7e617ebc3471b989f44ce388d6c957)

Một số môi trường chấp nhận các đối số tùy chọn, thường được truyền trong dấu ngoặc vuông (`[...]`).

## Định nghĩa một môi trường mới

Để định nghĩa một môi trường mới, hãy dùng `\newenvironment` lệnh, có dạng tổng quát:

```
\newenvironment{name}[numarg][optarg_default]{begin_def}{end_def}
```

trong đó:

* `tên` là tên của đối số do người dùng định nghĩa này;
* `numarg` là số lượng đối số, từ 1 đến 9, mà môi trường này chấp nhận. Nếu `[numarg]` bị bỏ qua thì môi trường sẽ không chấp nhận đối số nào—chẳng hạn như môi trường [`boxed` được định nghĩa trong ví dụ tiếp theo](#defining-simple-environments);
* `optarg_default` làm cho đối số đầu tiên trở thành tùy chọn và cung cấp một giá trị mặc định—tức là giá trị được dùng nếu không cung cấp giá trị đối số tùy chọn;
* `begin_def` là mã LaTeX được thực thi khi môi trường bắt đầu (mở), tức là khi bạn viết `\begin{name}`. Trong mã này, bạn có thể dùng các đối số được môi trường chấp nhận—lưu ý rằng đối số tùy chọn là #1 và các đối số còn lại được truy cập bằng #2 đến #numarg;
* `end_def` là mã LaTeX được thực thi khi môi trường kết thúc (đóng); tức là khi bạn viết `\end{name}`. Bạn không thể dùng bất kỳ đối số nào trong phần mã này.

### Định nghĩa các môi trường đơn giản

Trong ví dụ đầu tiên này, chúng ta định nghĩa `boxed` môi trường không nhận bất kỳ đối số nào. Nó vẽ một khung bao quanh văn bản nằm trong môi trường:

```latex
\documentclass{article}
%Chúng ta có thể định nghĩa môi trường trong phần mở đầu
\newenvironment{boxed}
    {\begin{center}
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline\\
    }
    {
    \\\\\hline
    \end{tabular}
    \end{center}
    }
%
\begin{document}
Bây giờ chúng ta có thể dùng môi trường \texttt{boxed} trong tài liệu của mình:

\begin{boxed}
Đoạn văn bản này được định dạng trong môi trường \texttt{boxed}.
\end{boxed}

Đoạn văn bản này được dàn trang bên ngoài môi trường \texttt{boxed}.
\end{document}
```

[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+environment\&snip=%5Cdocumentclass%7Barticle%7D%0A%25We+can+define+the+environment+in+the+preamble%0A%5Cnewenvironment%7Bboxed%7D%0A++++%7B%5Cbegin%7Bcenter%7D%0A++++%5Cbegin%7Btabular%7D%7B%7Cp%7B0.9%5Ctextwidth%7D%7C%7D%0A++++%5Chline%5C%5C%0A++++%7D%0A++++%7B+%0A++++%5C%5C%5C%5C%5Chline%0A++++%5Cend%7Btabular%7D+%0A++++%5Cend%7Bcenter%7D%0A++++%7D%0A%25%0A%5Cbegin%7Bdocument%7D%0ANow+we+can+use+the+%5Ctexttt%7Bboxed%7D+environment+in+our+document%3A%0A%0A%5Cbegin%7Bboxed%7D%0AThis+text+is+formatted+within+the+%5Ctexttt%7Bboxed%7D+environment.%0A%5Cend%7Bboxed%7D%0A%0AThis+text+is+typeset+outside+the+%5Ctexttt%7Bboxed%7D+environment.%0A%5Cend%7Bdocument%7D)

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

![Minh họa một môi trường LaTeX tùy chỉnh](/files/eb0ff9559d053a8e2ff3c1c5fd8ee63501ec5f15)

Nếu chúng ta so sánh định nghĩa của `boxed` với dạng tổng quát của `\newenvironment` chúng ta có thể thấy:

* `tên` là `boxed`;
* cả `[numarg]` hoặc `[optarg_default]` đều không được cung cấp vì môi trường này không nhận đối số nào;
* `begin_def` là mã LaTeX—được đặt giữa một cặp dấu ngoặc nhọn `{...}`—được thực thi khi môi trường *bắt đầu* (mở):

```latex
\begin{center}
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline\\
```

* `end_def` là mã LaTeX—được đặt giữa một cặp dấu ngoặc nhọn `{...}`—được thực thi khi môi trường *ngừng* (đóng):

```latex
    \\\\\hline
    \end{tabular}
    \end{center}
```

Trong ví dụ, `begin_def` bắt đầu một `center` môi trường và trong đó một `tabular` môi trường được mở để vẽ các đường dọc và một đường ngang bao quanh phần văn bản chúng ta đặt trong môi trường. `end_def` vẽ thêm một đường ngang rồi đóng các `tabular` và `center` môi trường.

### Định nghĩa các môi trường nhận đối số

Hãy mở rộng ví dụ trước để thực hiện những việc sau:

* dùng một đối số tùy chọn để dàn trang một tiêu đề. Nếu không cung cấp tiêu đề, dùng giá trị mặc định `Đây là một hộp`;
* dùng một đối số thứ hai chứa nội dung cần dàn trang trước phần văn bản mà chúng ta cung cấp ngay trong môi trường.

Vậy chúng ta có 2 đối số:

* đối số thứ nhất (đối số 1) là tùy chọn;
* đối số thứ hai (đối số 2) thì không.

Điều này có nghĩa `numarg`=2.

Chúng ta có thể dùng định nghĩa sau cho phiên bản đã cập nhật của `boxed` môi trường:

```latex
\newenvironment{boxed}[2][This is a box]
    {\begin{center}
    Đối số 1 (\#1)=#1\\[1ex]
    \begin{tabular}{{{!}}p{0.9\textwidth}{{!}}}
    \hline\\
    Đối số 2 (\#2)=#2\\[2ex]
    }
    {
    \\\\\hline
    \end{tabular}
    \end{center}
    }
```

Phiên bản nâng cao này khác bản gốc ở những điểm sau:

* \[numarg] hiện diện và có giá trị 2;
* \[optarg\_default] cũng hiện diện, khiến đối số đầu tiên trở thành tùy chọn với một giá trị mặc định `Đây là một hộp`.

Ví dụ sau minh họa một số cách dùng của phiên bản nâng cấp của chúng ta `boxed` môi trường:

```latex
\documentclass{article}
% Lưu ý giá trị mặc định cho đối số thứ nhất
% được cung cấp bởi [This is a box]
\newenvironment{boxed}[2][This is a box]
    {\begin{center}
    Đối số 1 (\#1)=#1\\[1ex]
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline\\
    Đối số 2 (\#2)=#2\\[2ex]
    }
    {
    \\\\\hline
    \end{tabular}
    \end{center}
    }
\begin{document}
\textbf{Ví dụ 1}: Dùng giá trị mặc định cho đối số thứ nhất:

\begin{boxed}{Một số văn bản chuẩn bị}
Đoạn văn bản này \textit{nằm trong} môi trường.
\end{boxed}

Đoạn văn bản này \textit{nằm ngoài} môi trường.

\vskip12pt

\textbf{Ví dụ 2}: Cung cấp một giá trị cho đối số thứ nhất:

\begin{boxed}[Đây không phải giá trị mặc định]{Một số văn bản chuẩn bị thêm}
Đoạn văn bản này vẫn \textit{nằm trong} môi trường.
\end{boxed}

Đoạn văn bản này cũng \textit{nằm ngoài} môi trường.
\end{document}
```

[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Environment+with+an+optional+argument\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Note+the+default+value+for+the+first%0A%25+argument+is+provided+by+%5BThis+is+a+box%5D%0A%5Cnewenvironment%7Bboxed%7D%5B2%5D%5BThis+is+a+box%5D%0A++++%7B%5Cbegin%7Bcenter%7D%0A++++Argument+1+%28%5C%231%29%3D%231%5C%5C%5B1ex%5D%0A++++%5Cbegin%7Btabular%7D%7B%7Cp%7B0.9%5Ctextwidth%7D%7C%7D%0A++++%5Chline%5C%5C%0A++++Argument+2+%28%5C%232%29%3D%232%5C%5C%5B2ex%5D%0A++++%7D%0A++++%7B+%0A++++%5C%5C%5C%5C%5Chline%0A++++%5Cend%7Btabular%7D+%0A++++%5Cend%7Bcenter%7D%0A++++%7D%0A%5Cbegin%7Bdocument%7D%0A%5Ctextbf%7BExample+1%7D%3A+Use+the+default+value+for+the+first+argument%3A%0A+%0A%5Cbegin%7Bboxed%7D%7BSome+preliminary+text%7D%0AThis+text+is+%5Ctextit%7Binside%7D+the+environment.%0A%5Cend%7Bboxed%7D%0A%0AThis+text+is+%5Ctextit%7Boutside%7D+the+environment.%0A%0A%5Cvskip12pt%0A%0A%5Ctextbf%7BExample+2%7D%3A+Provide+a+value+for+the+first+argument%3A%0A+%0A%5Cbegin%7Bboxed%7D%5BThis+is+not+the+default+value%5D%7BSome+more+preliminary+text%7D%0AThis+text+is+still+%5Ctextit%7Binside%7D+the+environment.%0A%5Cend%7Bboxed%7D%0A%0AThis+text+is+also+%5Ctextit%7Boutside%7D+the+environment.%0A%5Cend%7Bdocument%7D)

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

![Môi trường với một tham số tùy chọn](/files/1c2b939f14f23a7a9ca0e3286b074335b202a14f)

### Các môi trường có đánh số

Các môi trường có đánh số có thể được tạo thủ công hoặc trực tiếp bằng lệnh `\newtheorem`, như được minh họa bởi ví dụ sau:

```latex
\documentclass{article}
% Định nghĩa môi trường có đánh số của chúng ta trong phần mở đầu
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
   \noindent \textbf{Ví dụ~\theexample. #1} \rmfamily}{\medskip}

% Một môi trường có đánh số khác được định nghĩa bằng \newtheorem
\usepackage{amsmath} % Dành cho lệnh \newtheorem
\newtheorem{SampleEnv}{Môi trường mẫu}[section]
\begin{document}

\section{Các môi trường có đánh số do người dùng định nghĩa}

\begin{example}
Môi trường có đánh số do người dùng định nghĩa đầu tiên (số \theexample).
\end{example}

\begin{example}
Môi trường có đánh số do người dùng định nghĩa thứ hai (số \theexample).
\end{example}

\section{Nhiều môi trường có đánh số do người dùng định nghĩa hơn}
Lưu ý rằng việc đánh số ví dụ đã bắt đầu lại từ 1:

\begin{example}
Môi trường có đánh số do người dùng định nghĩa đầu tiên (số \theexample).
\end{example}

\begin{SampleEnv}
Môi trường do người dùng định nghĩa được tạo bằng lệnh \verb|\newtheorem|.
\end{SampleEnv}
\end{document}
```

[Mở ví dụ này trong Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+numbered+environment\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Define+our+numbered+environment+within+the+preamble%0A%5Cnewcounter%7Bexample%7D%5Bsection%5D%0A%5Cnewenvironment%7Bexample%7D%5B1%5D%5B%5D%7B%5Crefstepcounter%7Bexample%7D%5Cpar%5Cmedskip%0A+++%5Cnoindent+%5Ctextbf%7BExample%7E%5Ctheexample.+%231%7D+%5Crmfamily%7D%7B%5Cmedskip%7D%0A%0A%25+Another+numbered+environment+defined+with+%5Cnewtheorem%0A%5Cusepackage%7Bamsmath%7D+%25+For+the+%5Cnewtheorem+command%0A%5Cnewtheorem%7BSampleEnv%7D%7BSample+Environment%7D%5Bsection%5D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Csection%7BUser-defined+numbered+environments%7D%0A%0A%5Cbegin%7Bexample%7D%0AFirst+user-defined+numbered+environment+%28number+%5Ctheexample%29.%0A%5Cend%7Bexample%7D%0A%0A%5Cbegin%7Bexample%7D%0ASecond+user-defined+numbered+environment+%28number+%5Ctheexample%29.%0A%5Cend%7Bexample%7D%0A%0A%5Csection%7BMore+user-defined+numbered+environments%7D%0ANote+how+the+example+numbering+has+restarted+at+1%3A%0A%0A%5Cbegin%7Bexample%7D%0AFirst+user-defined+numbered+environment+%28number+%5Ctheexample%29.%0A%5Cend%7Bexample%7D%0A%0A%5Cbegin%7BSampleEnv%7D%0AUser-defined+environment+created+with+the+%5Cverb%7C%5Cnewtheorem%7C+command.%0A%5Cend%7BSampleEnv%7D%0A%5Cend%7Bdocument%7D)

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

![Ví dụ minh họa các môi trường có đánh số do người dùng định nghĩa](/files/97449444dcf2d28e7584f0f928f58b26db5f1d7a)

#### Một số lưu ý

* Trong phần được định nghĩa thủ công, `ví dụ` môi trường, lệnh `\newcounter{example}[section]` tạo ra một bộ đếm, còn gọi là `ví dụ`. Gói `ví dụ` bộ đếm là:
  * tăng thêm 1 bằng cách dùng `\refstepcounter{example}` trong định nghĩa của môi trường;
  * được đặt lại mỗi khi một `\section{...}` mới được bắt đầu;
  * một biến mà giá trị hiện tại của nó có thể được dàn trang bằng `\theexample`. Xem [bài viết về các bộ đếm](/latex/vi/dinh-dang/10-counters.md) để tìm hiểu thêm.
* Lệnh `\newtheorem` trực tiếp tạo một môi trường có đánh số và nhận ba tham số:
  * tên của môi trường mới: `SampleEnv` trong ví dụ của chúng ta;
  * văn bản sẽ được in đậm ở đầu dòng: `Môi trường mẫu` trong ví dụ của chúng ta;
  * một tham số tùy chọn xác định khi nào bộ đếm được đặt lại; và nếu được dùng thì bộ đếm sẽ được đặt trước bởi giá trị của bộ đếm đặt lại đó: `section` trong ví dụ của chúng ta.

Tính năng [`amsthm` gói](https://ctan.org/pkg/amsthm?lang=en), cùng với `amsmath`, cung cấp các định nghĩa bổ sung hữu ích bên cạnh `\newtheorem`; xem [Định lý và chứng minh](/latex/vi/theo-linh-vuc/01-theorems-and-proofs.md) để biết chi tiết thêm.

## Định nghĩa lại các môi trường hiện có

Các môi trường có thể được định nghĩa lại bằng `\renewenvironment` với cú pháp giống như `\newenvironment`—xem mục [Định nghĩa một môi trường mới](#defining-a-new-environment) để biết giải thích về các tham số khác nhau:

```
\newenvironment{name}[numarg][optarg_default]{begin_def}{end_def}
```

Ví dụ tiếp theo định nghĩa lại `itemize` môi trường—đây chỉ là một ví dụ để minh họa quá trình, không nên coi là dùng trong một tài liệu thực sự. Môi trường `itemize` mới không còn tạo ra danh sách gạch đầu dòng nữa; thay vào đó, nó canh giữa và nhấn mạnh (in nghiêng) văn bản bên trong nó (sử dụng `\em` lệnh).

```latex
\documentclass{article}
% Định nghĩa lại môi trường trong phần mở đầu
\renewenvironment{itemize}
{\begin{center}\em}
{\end{center}}
\begin{document}

\begin{itemize}
Chúng ta đã định nghĩa lại môi trường \texttt{itemize} để mọi văn bản
bên trong nó được canh giữa và nhấn mạnh (in nghiêng). Nó không còn tạo ra
một danh sách gạch đầu dòng---đây chỉ là một ví dụ và không nhằm dùng
trong các tài liệu thực sự!
\end{itemize}
\end{document}
```

[Mở ví dụ này trong Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Redefining+an+existing+environment\&snip=%5Cdocumentclass%7Barticle%7D%0A%25+Redefine+the+environment+in+the+preamble%0A%5Crenewenvironment%7Bitemize%7D%0A%7B%5Cbegin%7Bcenter%7D%5Cem%7D%0A%7B%5Cend%7Bcenter%7D%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cbegin%7Bitemize%7D%0AWe+have+redefined+the+%5Ctexttt%7Bitemize%7D+environment+so+that+any+text+%0Awithin+it+is+centred+and+emphasised+%28italicized%29.+It+no+longer+creates%0Aa+bulleted+list---this+is+only+an+example+and+not+intended+for+use+%0Ain+real+documents%21%0A%5Cend%7Bitemize%7D%0A%5Cend%7Bdocument%7D)

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

![Ví dụ với môi trường itemize đã được định nghĩa lại](/files/df0bcbe5c0b1fcb15419b3f09379c42297cc83a7)

## Đọc thêm

Để biết thêm thông tin, xem:

* [Các lệnh](/latex/vi/cac-lenh/01-commands.md)
* [Hiểu về các gói và tệp lớp](/latex/vi/tep-lop/01-understanding-packages-and-class-files.md)
* [Viết gói của riêng bạn](/latex/vi/tep-lop/03-writing-your-own-package.md)
* [Viết lớp của riêng bạn](/latex/vi/tep-lop/04-writing-your-own-class.md)
* [Độ dài trong LaTeX](/latex/vi/dinh-dang/01-lengths-in-latex.md)
* [Sử dụng màu trong LaTeX](/latex/vi/dinh-dang/13-using-colors-in-latex.md)
* [Kích cỡ trang và lề](/latex/vi/dinh-dang/07-page-size-and-margins.md)
* [Danh sách các gói và tệp lớp](/latex/vi/tep-lop/02-overleaf-and-tex-live.md)
* [Phần giới thiệu về LaTeX2ε không quá ngắn](http://www.ctan.org/tex-archive/info/lshort/)
* [LaTeX/Creating\_Packages trên WikiBooks](http://en.wikibooks.org/wiki/LaTeX/Creating_Packages)


---

# 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/cac-lenh/02-environments.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.
