You are on page 1of 437

Nguyễn Hữu Điển

LATEX
THỰC HÀNH
NGUYỄN HỮU ĐIỂN

LATEX
THỰC HÀNH
(Phiên bản 1.0)

Nhà xuất bản Đại học Quốc gia Hà Nội 2022


LỜI GIỚI THIỆU

Cuốn sách LATEX tra cứu và soạn thảo-NXB ĐHQG -2001


và LATEX với gói lệnh và công cụ phần mềm-NXB ĐHQG -2004
chúng tôi đã giới thiệu những phần sử dụng cơ bản của LATEX
cùng với phần mềm. Nhiều bạn đọc đã sử dụng tốt trong thời
gian ngắn để làm chế bản các loại sách báo về Toán. Nhưng
cũng còn nhiều câu hỏi và những khó khăn khi sử dụng LATEX,
những vấn đề nhiều bạn đọc hỏi đều thuộc những công cụ kèm
theo của LATEX mà ở Việt Nam đều khó tìm được và không ai
phổ biến. Tôi biên soạn cuốn sách này nhằm nâng cao tay nghề
sử dụng LATEX cùng với công cụ của nó. Các bạn tìm thấy trong
cuốn sách này những cách làm, các thủ thuật thay đổi chính
trong LATEX cho phù hợp thiết kế văn bản của ta như thay đổi
tiêu đề, thay đổi số đếm, chú thích,... Những công cụ gần như
người sử dụng LATEX nào cũng nên có như các gói lệnh chuyên
về một chủ đề nào đó trong toán học như biểu bảng, vẽ hình,
đặt hình trong văn bản, ... Những gói lệnh cần thiết được giới
thiệu và cho ví dụ áp dụng cụ thể, các bạn có thể thử nghiệm.
Gắn liền với LATEX là những phần mềm trợ giúp soạn thảo,
in ấn, trong cuốn sách này chúng tôi giới thiệu và hướng dẫn
hai phần mềm MikTEX cùng với hệ soạn thảo VieTeX 4.0. Nội
dung của cuốn sách được chia làm 12 chương.
Mỗi chương đều có kiến thức mới, đặc biệt chương phông
4 LATEX với gói lệnh và phần mềm công cụ

chữ, lập trình trong LATEX, ...


Cuối cùng là các từ khóa của LATEX dùng để tra cứu khi cần
thiết.
Sử dụng cuốn sách này
Phần mềm và gói lệnh trong cuốn sách này được thử trên:
- Hệ điều hành: MS Window 10.
- Phần cứng: CPU Pentium IV tốc độ 850 Hz, RAM 252Mb.
- Hệ soạn thảo văn bản dành cho TEX: VieTeX 4.0.
- Phần mềm MiTEX 2.9.
- LATEX được cập nhất mới nhất lấy từ Internet.
- Gói lệnh VnTEX 2.0 phiên bản mới nhất được cập nhật.
Những ví dụ được mô tả theo chia đôi trang sách hoặc một
phần ở trên nguồn và dưới kết quả thật. Những ví dụ được gõ
vào trong dòng chấm chấm dưới đây:

\documentclass{article}
\usepackage{amsmath,amsxtra,amssymb,latexsym,
amscd,amsthm}
\usepackage[utf8]{vietnam}
\begin{document}
....................................................
\end{document}

Mọi liên lạc và trợ giúp với tác giả:


Nguyễn Hữu Điển
Điện thoại di động: 0989061951
Thư điện tử: nguyenhuudien@hus.edu.vn
website: https://vietex.blog.fc2.com/
Facebook: https://www.facebook.com/groups/vietex
Lời cảm ơn
Nhân đây tác giả cảm ơn các bạn đọc đã sử dụng LATEX trong
soạn thảo văn bản tiếng Việt và cho những lời khuyên bổ ích,
cần thiết để tôi hoàn thiện phần mềm của mình.
Hà Nội, ngày 15 tháng 12 năm 2021
Tác giả

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


MỤC LỤC
Lời giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Chương 1. Văn bản ở chế độ toán học . . . . . . . . . . . . . . . 11
1.1. Miền tác dụng, chỉ số dưới và trên . . . . . . . . . . . . . . . . . 12
1.2. Kích thước tự nhiên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3. Phân số và biểu thức hai cấp. . . . . . . . . . . . . . . . . . . . . . . 13
1.4. Tích phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5. Căn bậc hai và căn bậc cao . . . . . . . . . . . . . . . . . . . . . . . . . 15
Chương 2. Những cơ bản soạn thảo bằng LATEX . . . . 17
2.1. Các khái niệm cơ bản về LATEX . . . . . . . . . . . . . . . . . . . . . 19
2.2. Các lớp tài liệu tiêu chuẩn chính . . . . . . . . . . . . . . . . . . . 25
2.3. Gói lệnh babel.sty ngôn ngữ của tài liệu . . . . . . . . . . . 28
2.4. Các ký tự trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5. Chấm câu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.6. Các biến thể phông chữ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.7. Kích thước phông chữ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.8. Ngắt theo khối văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.9. Đoạn văn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.10. Chú thích . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6 LATEX Tra cứu và soạn thảo

2.11. Lề văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63


2.12. Quản lý màu sắc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.13. Đơn vị đo lường . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Chương 3. Danh sách và tham chiếu chéo . . . . . . . . . . 72
3.1. Danh sách không đánh số . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.2. Danh sách mô tả . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3. Danh sách được đánh số . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.4. Đặt tham số danh sách enumitem.sty . . . . . . . . . . . . . 88
3.5. Tham khảo chéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.6. Nguyên văn bản. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.7. Ghi văn bản vào một tệp . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.8. Gói lệnh url.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
3.9. Gói hyperref.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Chương 4. Bảng và hình với môi trường động . . . . . 120
4.1. Bảng trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.2. Hình trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.3. Đối tượng di động . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Chương 5. Hộp và khung hộp . . . . . . . . . . . . . . . . . . . . . . . 151
5.1. Hộp một hàng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
5.2. Hộp khối văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.3. Hộp dòng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.4. Hộp kéo dài và phản chiếu . . . . . . . . . . . . . . . . . . . . . . . . 157
5.5. Thay đổi kích thước hộp . . . . . . . . . . . . . . . . . . . . . . . . . . 158
5.6. Xoay hộp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
5.7. Đặt lại kích thước hộp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.8. Hộp vô hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Chương 6. Môi trường toán trong LATEX . . . . . . . . . . . . 163
6.1. Môi trường toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
6.2. Các phông chữ trong môi trường toán . . . . . . . . . . . . 168
6.3. Thư pháp, chữ viết hai nét và nét cong . . . . . . . . . . . 170

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


Mục lục 7

6.4. Chữ Hy Lạp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171


6.5. Ký tự có dấu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
6.6. Ký hiệu toán học thường dùng . . . . . . . . . . . . . . . . . . . . 172
6.7. Ký hiệu toán tử . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
6.8. Ký hiệu quan hệ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
6.9. Dấu ba chấm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
6.10. Dấu ngoặc đơn toán học . . . . . . . . . . . . . . . . . . . . . . . . . 176
6.11. Tách các trường hợp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
6.12. Các ký hiệu toán học giữ vai trò . . . . . . . . . . . . . . . . . 182
6.13. Ký hiệu co dãn chiều ngang . . . . . . . . . . . . . . . . . . . . . 183
6.14. Biểu thức căn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
6.15. Ma trận. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
6.16. Xếp chồng các dấu hiệu toán học . . . . . . . . . . . . . . . . 189
6.17. Chỉ số toán học . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
6.18. Phân số, hệ số nhị thức . . . . . . . . . . . . . . . . . . . . . . . . . . 191
6.19. Toán tử, hàm số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
6.20. Đóng khung công thức. . . . . . . . . . . . . . . . . . . . . . . . . . . 200
6.21. Biểu đồ giao hoán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
6.22. Đánh số các công thức chính . . . . . . . . . . . . . . . . . . . . 201
6.23. Ngắt công thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
6.24. Nhiều công thức bên dưới nhau . . . . . . . . . . . . . . . . . 206
6.25. Dóng nhiều công thức . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.26. Đánh số các công thức con . . . . . . . . . . . . . . . . . . . . . . . 217
6.27. Ngắt trang trong công thức nhiều dòng . . . . . . . . . 218
6.28. Tự động ngắt công thức dài dòng . . . . . . . . . . . . . . . . 218
6.29. Bảng ở chế độ toán học . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Chương 7. Tài liệu có cấu trúc . . . . . . . . . . . . . . . . . . . . . . 222
7.1. Dòng tiêu đề, trang tiêu đề, đoạn trích . . . . . . . . . . . 224
7.2. Các cấp độ của văn bản chính . . . . . . . . . . . . . . . . . . . . 224

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


8 LATEX Tra cứu và soạn thảo

7.3. Lỗi cấu trúc đoạn văn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227


7.4. Đầu trang và chân trang . . . . . . . . . . . . . . . . . . . . . . . . . 228
7.5. Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
7.6. Môi trường định lý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
7.7. Tài liệu tham khảo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.8. Chỉ mục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
7.9. Phụ lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.10. Tổ chức các tác phẩm dài hơn . . . . . . . . . . . . . . . . . . . 281
Chương 8. Trình chiếu trong LATEX . . . . . . . . . . . . . . . . . 283
8.1. Giao diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
8.2. Khung giao diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
8.3. Nhiều trang trình bày trong một khung . . . . . . . . . . 292
8.4. Trình chiếu với hiệu ứng hình ảnh . . . . . . . . . . . . . . . 298
8.5. Lập dàn ý cho bài thuyết trình . . . . . . . . . . . . . . . . . . . 299
8.6. Các yếu tố nội dung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Chương 9. Lập trình trong LATEX . . . . . . . . . . . . . . . . . . . . 318
9.1. Mã hóa ASCII và mã danh mục . . . . . . . . . . . . . . . . . . 319
9.2. Bộ đếm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.3. Kiểm soát định hướng . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
9.4. Định nghĩa macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
9.5. Định định môi trường. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.6. Mỏ neo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Chương 10. Viết gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
10.1. Phân loại gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
10.2. Tạo một gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
10.3. Tạo một lớp tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Chương 11. Chọn phông chữ . . . . . . . . . . . . . . . . . . . . . . . . 382
11.1. Danh mục phông chữ LATEX. . . . . . . . . . . . . . . . . . . . . . 383
11.2. Bảng mã phông chữ nguồn và nội bộ của LATEX. . 383

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


Mục lục 9

11.3. Thiết lập toàn cục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388


11.4. Khai báo mã họ phông. . . . . . . . . . . . . . . . . . . . . . . . . . . 396
11.5. Gói lệnh với thay đổi phông chữ . . . . . . . . . . . . . . . . . 398
11.6. Thông tin và kiểm tra phông chữ . . . . . . . . . . . . . . . . 399
Chương 12. Sử dụng thêm phông chữ . . . . . . . . . . . . . . 404
12.1. Chữ Hy Lạp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
12.2. Chữ cái Kirin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
12.3. Văn bản Gothic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
12.4. Viết chữ cái hoa đầu tiên . . . . . . . . . . . . . . . . . . . . . . . . 409
12.5. Có thể dùng phông đặc biệt thay cho ký tự đầu . 411
12.6. Các chữ cái có đường viền và tô bóng . . . . . . . . . . . . 412
12.7. Gạch chân và gạch ngang cùng một lúc . . . . . . . . . 413
12.8. TEX lôgô liên quan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
12.9. Trang có dòng kẻ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
12.10. Trang lưới ô vuông . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
12.11. Nối hai điểm bằng một đường mũi tên . . . . . . . . . 416
12.12. Văn bản đường cơ sở không nằm ngang . . . . . . . . 418
12.13. Thời gian tạo pdf tính bằng giờ và phút . . . . . . . . 421
12.14. Mã QR code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
12.15. Mã vạch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
12.16. Yếu tố trang trí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
12.17. Đoạn văn hình đặc biệt. . . . . . . . . . . . . . . . . . . . . . . . . 426
12.18. Đánh dấu tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
12.19. Thư viện chứa mẫu câu . . . . . . . . . . . . . . . . . . . . . . . . 430
12.20. Dấu cắt cho chế bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
12.21. Trang trí số đếm danh sách với TikZ . . . . . . . . . . . 432

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


DANH SÁCH CÁC HÌNH

3.4.1Thông số số của danh sách . . . . . . . . . . . . . . . . 90

4.3.1Bông hoa . . . . . . . . . . . . . . . . . . . . . . . . . . . 142


4.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.3.3Bông hoa1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.3.4Bông hoa . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.3.5Bó hoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
4.3.6Bó hoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
4.3.7Bông hoa . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Chương 1. VĂN BẢN Ở CHẾ ĐỘ
TOÁN HỌC

1.1. Miền tác dụng, chỉ số dưới và trên . . . . . . . . . . . . . . . . 12


1.2. Kích thước tự nhiên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3. Phân số và biểu thức hai cấp . . . . . . . . . . . . . . . . . . . . . 13
1.4. Tích phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5. Căn bậc hai và căn bậc cao . . . . . . . . . . . . . . . . . . . . . . . 15

Chúng ta hãy nhớ rằng văn bản toán học thường đi trong
môi trường $ ... $. Cũng có những môi trường khác không
yêu cầu các ký hiệu đô la này. Trong chương này, chúng ta sẽ
sử dụng các ký hiệu đặc biệt (ký hiệu là phông chữ) không có
trong bộ ký hiệu mà LATEX tải theo mặc định.
Ví dụ, để viết “sin( x) ∈ R ”, bạn cần xác định một lệnh \sin
và có quyền truy cập vào gói cho phép bạn xác định lệnh \R để
lấy R.
Để có được văn bản toán học của chương này, cần có các
ký hiệu mà LATEX tải theo mặc định và một số gói bổ sung:
amsmath, amssymb, amsfonts, latexsym, .... Chúng ta cũng cần
năm lệnh đặc biệt cho \sin, \arcsin, v.v. Mẫu sau đi kèm với
12 Chương 1. Văn bản ở chế độ toán học

mọi thứ chúng ta cần cho các ví dụ tiếp theo trong suốt chương
này:
Mẫu cho chương này
\documentclass{article} %o report o book
\usepackage[total={18cm,21cm},centering]{geometry}
\usepackage{amsmath,amssymb,amsfonts,latexsym,cancel}
\usepackage[utf8]{inputenc} %Acentos desde el teclado
% \usepackage[T1]{fontenc}
\usepackage[utf8]{vietnam}
\usepackage{palatino,eulervm} % fuentes
% Comandos personales - especiales
\newcommand{\arcsec}{\mathop{\rm arcsec}\nolimits}
\newcommand{\R}{\mathbb{R}}
\newcommand{\N}{\mathbb{N}}
\newcommand{\Z}{\mathbb{Z}}
\begin{document}
Công thức $\sin^2(x)=1-\cos^2(x)$ ...
\end{document}

Ở đây, chúng ta giả định rằng bạn có bản phân phối TeX
hoàn chỉnh và cập nhật (ví dụ như MiKTeX hoặc TeXLive).

1.1 Miền tác dụng, chỉ số dưới và trên

7 Ví dụ 1.1 8
Nhập mã Kết quả Nhập mã Kết quả
$x^p$ xp $x^{n+1}$ x n+1
n
$(2^2)^n$ (22 )n $2^{2^n}$ 22
$\sin^2(x)$ sin2 ( x) $x^{\sin(x)+\cos(x)}$ xsin(x)+cos(x)
$a _ n$ an $a _ {n+1}$ a n+1
$u _ {N+1}$ u N +1 $u _{ _{N+1}}$ u N +1
j Rb
$a _ i^j$ ai $\int_a^b f(x)\, dx$ a f ( x) dx
PN
$u _ {ij}$ ui j $\sum_{n=1}^{N}u_n $ n=1 u n

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


1.2. Kích thước tự nhiên 13

Các chỉ số dưới và chỉ số trên có thể được đặt như sau
Bình thường: $S _ {N _ j}$ tạo ra: S N j
Tốt hơn: $S _ { _ {N _ j}}$ mang lại: S N j

1.2 Kích thước tự nhiên

Như đã thấy trong bảng trên, văn bản toán học bao quanh
chiều rộng của hàng. Để mô tả để gấp nó về kích thước tự
nhiên, lệnh \displaystyle được sử dụng. Nếu bạn chỉ muốn
một phần văn bản toán học xuất hiện ở kích thước tự nhiên
write \displaystyle{} và giữa các dấu ngoặc nhọn văn bản
được đặt.

7 Ví dụ 1.2 8
Tổng từng phần $ N-$th $ S_N $ được xác định bằng đẳng thức
$ \displaystyle S_N = \sum _{k = 1}^{N} \; a _n $
: 2
Tổng từng phần N −th S N được xác định bằng đẳng thức
N
X
SN = an
k=1

1.3 Phân số và biểu thức hai cấp

Để tạo phân số, bạn có thể sử dụng các lệnh: {... \over .
..}, \frac{...}{...} hoặc {... \atop ...}, v.v. Hãy cũng xem
xét các "phân số" hữu ích khác.
7 Ví dụ 1.3 8
Nhập mã Kết quả
x+1
${x+1 \over x-1}$ x−1
x+1
$\frac{x+1}{x-1}$ x−1
x+1
$\dfrac{x+1}{x-1}$
x−1

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


14 Chương 1. Văn bản ở chế độ toán học
x+1
$\tfrac{x+1}{x-1}$ x−1
x+1
3
${{x+1 \over 3} \over x-1}$ x−1

$\displaystyle{\left(1+{1\over x}
¶ n+1
1 n
µ
\right)^{n+1 \over n}}$ 1+
x
$\displaystyle \left(1+\frac{1}{x}
¶ n+1
1 n
µ
\right)^\frac{n+1}{n}$ 1+
x
$\displaystyle{\left( 1+ {1 \over x}
¶n+1
1 n
µ
\right)}^{\displaystyle{n+1 \over n}}$ 1+
x
x+1
${x+1 \atop x-1}$ x−1
x+1
${x+1 \above 2pt x-1} (2pt là độ dày)$ (2pt độ dày)
x−1
© x+1ª
${x+1 \brace x-1}$ x−1
£ x+1¤
${x+1 \brack x-1}$ x−1
f
$\displaystyle{a\stackrel{f}{\rightarrow a→b
}b}$
$\displaystyle{\lim_{x\rightarrow 0}}f(x lim f ( x)
x→0
)$
à !
a
$\displaystyle{a \choose b}$
b
$\displaystyle{\sum_{
X
\substack{0<i< m\\0<j<n}}a_ib_j}$ ai b j
0< i < m
0< j < n

$\prod_{\overset{i=0}{i\neq k}}^{n}
Qn wi
\frac{w_i}{(w_i-w_k)}$ i =0 (w i −wk )
i ̸= k

7 Ví dụ 1.4 8
$$ L_{n,k}(x)

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


1.4. Tích phân 15

=\prod_{\overset{i=0}{i\neq k}}^{n}\,\frac{x-x_i}{x_k-x_i}$
$
$$= \frac{(x-x_0)(x-x_1)\cdots(x-x_{k-1})(x-x_{k+1})
\cdots(x-x_n)}{(x_k-x_0)\cdots(x_k-x_{k-1})(x_k-x_{k+1})
\cdots(x_k-x_n)} $$
: 2
n x−x
Y i
L n,k ( x) =
i =0 x k − x i
i ̸= k

( x − x0 )( x − x1 ) · · · ( x − xk−1 )( x − xk+1 ) · · · ( x − xn )
=
( xk − x0 ) · · · ( xk − xk−1 )( xk − xk+1 ) · · · ( xk − xn )

Lưu ý việc sử dụng \overset {i = 0}{i \neq k} để tạo:


i =0
i ̸= k .

1.4 Tích phân

7 Ví dụ 1.5 8
Nhập mã Kết quả
Z
$\displaystyle{\int _ C\boldsymbol{F}\ F · dr
C
cdot\, dr}$
I
$\displaystyle{\oint _ C\pmb{F}\cdot\, F · dr
C
dr}$
Ï
$\displaystyle{{\iint _ D f(x,y)\,dA}}$ f ( x, y) d A
D
Ñ
$\displaystyle{{\iiint _ Q f(x,y,z)\,dA} f ( x, y, z) d A
Q
}$

1.5 Căn bậc hai và căn bậc cao

7 Ví dụ 1.6 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
16 Chương 1. Văn bản ở chế độ toán học

Nhập mã Kết quả


p
$\sqrt{x+1}$ x+1
p
3
$\sqrt[3]{x+1}$ x+1
p
q
n
$\displaystyle{ \sqrt[n]{x+\sqrt{x}} }$ x+ x
p
n p
$\sqrt[n]{x+\sqrt{x}}$ x+ x

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


NHỮNG CƠ BẢN SOẠN
Chương 2.
THẢO BẰNG LATEX

2.1. Các khái niệm cơ bản về LATEX . . . . . . . . . . . . . . . . . . . . 19


LAT
2.1.1. Lệnh trong EX . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.2. Đối số bắt buộc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.3. Đối số tùy chọn . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.4. Môi trường . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.5. Khối văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.6. Lệnh khai báo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.7. Bình luận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.8. Lớp tài liệu, phần mở đầu, phần nội dung . 24
2.1.9. Gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2. Các lớp tài liệu tiêu chuẩn chính . . . . . . . . . . . . . . . . . . 25
2.2.1. Lớp tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2. Mẫu lớp tài liệu tiếng Việt . . . . . . . . . . . . . . . . . 26
2.3. Gói lệnh babel.sty ngôn ngữ của tài liệu . . . . . . . . . . . 28
2.4. Các ký tự trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.4.1. Ký tự là lệnh của LATEX . . . . . . . . . . . . . . . . . . . . 29
2.4.2. Chữ cái có dấu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.3. Chữ cái đặc biệt . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
18 Chương 2. Những cơ bản soạn thảo bằng LATEX

2.4.4. Nhân của ký tự . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31


2.4.5. Dấu nối trong ký tự . . . . . . . . . . . . . . . . . . . . . . . . 31
2.4.6. Ký tự là ký hiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4.7. Dấu cách . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.5. Chấm câu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.5.1. Dấu chấm, dấu phẩy, dấu hai chấm, dấu chấm
phẩy, dấu chấm hỏi, dấu chấm than . . . . . . . . . . . . . 36
2.5.2. Dấu gạch ngang và gạch nối . . . . . . . . . . . . . . . 37
2.5.3. Các dấu ngoặc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.4. Dấu ba chấm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.5.5. Dấu ngoặc kép . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.6. Các biến thể phông chữ . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.6.1. Phân loại . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.6.2. Điều chỉnh nghiêng . . . . . . . . . . . . . . . . . . . . . . . . 44
2.6.3. Điểm nhấn nổi bật chữ . . . . . . . . . . . . . . . . . . . . 45
2.7. Kích thước phông chữ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.7.1. Kích thước phông chữ cơ bản . . . . . . . . . . . . . . 47
2.7.2. Các lệnh khai báo kích thước phông chữ. . . 48
2.7.3. Kích thước phông chữ tương đối . . . . . . . . . . . 50
2.7.4. Kích thước phông chữ tuyệt đối . . . . . . . . . . . . 50
2.7.5. Đơn vị độ đo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.7.6. Khoảng cách ngang linh hoạt . . . . . . . . . . . . . . 51
2.7.7. Khoảng cách dọc cố định. . . . . . . . . . . . . . . . . . . 52
2.7.8. Khoảng cách dọc linh hoạt . . . . . . . . . . . . . . . . . 54
2.7.9. Khoảng cách dòng . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.8. Ngắt theo khối văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.8.1. Ngắt dòng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.8.2. Ngắt trang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.9. Đoạn văn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.9.1. Căn chỉnh các đoạn văn ở bên trái . . . . . . . . . 59
2.9.2. Căn chỉnh các đoạn văn ở bên phải . . . . . . . . 59
2.9.3. Căn chỉnh giữa các đoạn văn . . . . . . . . . . . . . . 60
2.9.4. Dấu ngoặc kép nhiều dòng. . . . . . . . . . . . . . . . . 61
2.9.5. Thể bài thơ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2.10. Chú thích . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
2.11. Lề văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.12. Quản lý màu sắc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.12.1. Mô hình màu và thông số . . . . . . . . . . . . . . . . 64
2.12.2. Tên màu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.1. Các khái niệm cơ bản về LATEX 19

2.12.3. Văn bản màu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67


2.12.4. Trong suốt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.12.5. Đánh dấu văn bản trên nền màu . . . . . . . . . 68
2.12.6. Đánh dấu văn bản với gạch chân màu. . . . 69
2.12.7. Đánh dấu văn bản bằng các nét màu . . . . . 70
2.12.8. Trang màu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
2.13. Đơn vị đo lường . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

2.1 Các khái niệm cơ bản về LATEX

2.1.1 Lệnh trong LATEX

Trong TEX, tất cả các định dạng của tài liệu được thực hiện
bằng các lệnh. Lệnh \ (dấu gạch chéo ngược) theo sau là tên
của lệnh với một chữ cái có dấu số và khoảng trắng không được
bao gồm và phân biệt chữ hoa chữ thường.
7 Ví dụ 2.1 8: 2
\LaTeX LATEX

2.1.2 Đối số bắt buộc

Có những lệnh chỉ hoạt động bằng cách chỉ định các tham
số nhất định. Các tham số này phải được nhập vào đối số lệnh
giữa {...}. Ví dụ
7 Ví dụ 2.2 8: 2
\textit{Cũng có khi vô cớ} Cũng có khi vô cớ

Không có dấu ngoặc đơn, tham số lệnh sẽ là một ký tự khác


với khoảng trắng đầu tiên tiếp theo, miễn là nó được mã hóa
1 byte. Các ký tự có mã hóa đa byte, chẳng hạn như mã hóa
UTF-8, là các chữ cái có dấu. Vì thế
\textit Cũng có khi vô cớ
trong từ “Cũng có khi vô cớ” chỉ lấy chữ C in nghiêng.
Nhưng nếu tệp nguồn được mã hóa UTF-8, thì

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


20 Chương 2. Những cơ bản soạn thảo bằng LATEX

\textit và một số thứ khác


trong trường hợp dịch, bản dịch sẽ dừng lại khi có lỗi. Một lệnh
có thể có nhiều tham số. Ví dụ
\setcounter{page}{1}
đặt số trang thành 1.

2.1.3 Đối số tùy chọn

Một lệnh cũng có thể có một đối số là tùy chọn. Nếu bạn
không nhập nó, tùy chọn mặc định có hiệu lực. Các tùy chọn
phải nằm trong đối số tùy chọn của lệnh được chỉ định giữa các
ký tự [...]. Ví dụ: một mục danh sách có thể được giới thiệu
trong
\item
với một lệnh đặt dấu mặc định trước mục danh sách, nhưng
bạn có thể nhập
\item[-]
cũng là một lệnh đặt dấu gạch ngang trước mục danh sách.
7 Ví dụ 2.3 8: 2
\begin{itemize} • Cũng có khi vô cớ
\item Cũng có khi vô cớ
\item[-] Biển ào ạt xô thuy - Biển ào ạt xô thuyền
ền
\end{itemize}

Một lệnh cũng có thể có một tùy chọn và một tham số.
7 Ví dụ 2.4 8: 2
\includegraphics[width = 1cm]{flower}

lệnh tải hình ảnh flower.jpg rộng 1cm. Bạn có thể chỉ định
nhiều tùy chọn cùng một lúc. Trong trường hợp này, các tùy
chọn phải được phân tách bằng dấu phẩy. Ví dụ
7 Ví dụ 2.5 8: 2
\includegraphics[width=1cm, angle=90]
{flower}

lệnh tải hình ảnh flower.jpg xoay 90 độ rộng 1cm.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.1. Các khái niệm cơ bản về LATEX 21

2.1.4 Môi trường

Cặp lệnh \begin{<tên môi trường>}, \end{<tên môi trường>}


được gọi là ngữ cảnh và phần giữa hai lệnh nằm bên trong ngữ
cảnh. Tên ngữ cảnh của các lệnh này phải được chỉ định. Ví dụ:
môi trường lặp lại là cặp lệnh \begin{itemize}, \end {itemize},
tạo một danh sách không được đánh số
7 Ví dụ 2.6 8: 2
\begin{itemize} • Vì tình yêu muôn thuở
\item Vì tình yêu muôn thuở
\item Có bao giờ đứng yên? • Có bao giờ đứng yên?
\end{itemize}

2.1.5 Khối văn bản

Có những lệnh có một số ảnh hưởng đến phần sau chúng. Ví


dụ, lệnh \itshape sẽ làm nghiêng văn bản sau. Nếu bạn muốn
hiệu ứng bị giới hạn ở một phần cụ thể, bạn cần phải chặn nó.
Khối có thể được chỉ định bằng dấu ngoặc đơn. Ví dụ
7 Ví dụ 2.7 8: 2
Một câu thơ hay {\itshape Một câu thơ hay Chỉ có biển
Chỉ có biển mới biết}. H mới biết. Hết nghiêng.
ết nghiêng.

trong trường hợp này, chỉ "Chỉ có biển mới biết" sẽ được in
nghiêng. Bạn có thể { } thay bằng sử dụng
\begingroup
\endgroup

nhưng điều này tốt hơn cho việc viết các tệp kiểu hoặc lớp. Một
nhóm cũng được xác định bởi một môi trường. Ví dụ
7 Ví dụ 2.8 8: 2
\begin{itemize}
• Chỉ có biển mới biết
\itshape
\item Chỉ có biển mới biết Không nghiêng nữa
\end{itemize}
Không nghiêng nữa

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


22 Chương 2. Những cơ bản soạn thảo bằng LATEX

Trong trường hợp \itshape, nó chỉ hoạt động trong môi


trường lặp lại. Các khối có thể được lồng vào nhau nhưng
không được giao nhau. Ví dụ
7 Ví dụ 2.9 8: 2
\begin{itshape} Thuyền đi đâu, về đâu
\begin{ttfamily}
Thuyền đi đâu, về đâu
\end{ttfamily}
\end{itshape}

là đúng, nhưng không chính xác khi viết như sau:


\begin{itshape}
\begin{ttfamily}
Thuyền đi đâu, về đâu
\end{itshape}
\end{ttfamily}

Trên thực tế, đối số bắt buộc của lệnh tham số cũng là một
nhóm, chính xác hơn là nội dung của nhóm theo sau tên lệnh
(không xác định với ngữ cảnh) sẽ là tham số của lệnh. Mỗi ký
tự được mã hóa 1 byte được tính là một nhóm. Vì vậy, ví dụ:

7 Ví dụ 2.10 8
\textit Thuyền đi hoài không mỏi
: 2
Thuyền đi hoài không mỏi
trong từ “Thuyền đi hoài không mỏi” chỉ có chữ T in
nghiêng, nhưng

7 Ví dụ 2.11 8
\textit{Thuyền đi hoài không mỏi}
: 2
Thuyền đi hoài không mỏi
Trong trường hợp này, toàn bộ "Thuyền đi hoài không mỏi"
sẽ được in nghiêng. Đây chỉ là trường hợp cho đối số bắt buộc.
Đối với một đối số tùy chọn, bắt buộc phải chỉ định dấu ngoặc
vuông ở ranh giới của khối.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.1. Các khái niệm cơ bản về LATEX 23

2.1.6 Lệnh khai báo

Nếu bản thân một lệnh không hiển thị bất cứ điều gì, không
có đối số bắt buộc hoặc tùy chọn, nhưng ảnh hưởng đến phần
sau nó, nó được gọi là lệnh khai báo. Một ví dụ là lệnh \itshape
đã đề cập trước đó. Mỗi lệnh khai báo cũng có một phiên bản
môi trường. Ví dụ: hai mã sau là tương đương:

7 Ví dụ 2.12 8
Một câu thơ {\itshape Biển vẫn xa ... còn xa}.\\
Một câu thơ \begin{itshape} Biển vẫn xa ... còn xa \end{
itshape}.
: 2
Một câu thơ Biển vẫn xa ... còn xa.
Một câu thơ Biển vẫn xa ... còn xa .

2.1.7 Bình luận

Nếu cái gọi là bạn muốn đặt một nhận xét, tức là, những
gì trình biên dịch LATEX bỏ qua, hãy viết dấu % ở đầu dòng đó.
Nhận xét kết thúc bằng ngắt dòng. Ví dụ:

7 Ví dụ 2.13 8
% Văn bản này sẽ không xuất hiện sau khi dịch!
Nó sẽ xuất hiện,% nhưng nó sẽ không!
: 2
Nó sẽ xuất hiện,
Nếu bạn muốn “bình luận” một phần nhiều dòng, hãy sử
dụng môi trường comment của gói comment.sty. Ví dụ,

7 Ví dụ 2.14 8
Điều này xuất hiện.
\begin {comment}
Điều này không xuất hiện, và cũng không!
\end {comment}
Nó sẽ xuất hiện một lần nữa!

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


24 Chương 2. Những cơ bản soạn thảo bằng LATEX

: 2
Điều này xuất hiện. Nó sẽ xuất hiện một lần nữa!

2.1.8 Lớp tài liệu, phần mở đầu, phần nội dung

Cấu trúc của tệp nguồn LATEX như sau:


\documentclass[<tùy chọn>]{<lớp tài liệu>}
<phần mở đầu>
\begin{document}
<thân tài liệu>
\end{document}

Trước tiên, bạn phải tải một lớp tài liệu bằng lệnh
\documentclass, lệnh này chỉ định kiểu cơ sở của tài liệu. Ví
dụ: để tải một lớp tài liệu article (bài báo) với tùy chọn 12pt:
\documentclass[12pt]{article}
Phần tiếp theo của môi trường tài liệu được gọi là <phần m
ở đầu>. Điều này bao gồm các lệnh ảnh hưởng đến toàn bộ tài
liệu, nhưng không thể chứa văn bản để hiển thị. Bên trong môi
trường tài liệu được gọi là <thân tài liệu>, chứa tất cả văn bản
và lệnh để hiển thị. Văn bản hoặc các lệnh được viết sau lệnh
\end{document} bị trình biên dịch LATEX bỏ qua.

2.1.9 Gói lệnh

Bạn có thể mở rộng khả năng và phong cách của lớp tài liệu
bằng các gói lệnh, gói lệnh có tên và có đuôi sty, ví dụ gói đưa
hình vào graphicx.sty. Những gói này được đặt trong phần mở
đầu bằng lệnh.
\usepackage[<tùy chọn>]{<tên gói lệnh>}

Ví dụ
\usepackage[utf8]{vietnam}
Đặt mã soạn thảo utf8 (unicode) cho tiếng Việt. Nếu không có

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.2. Các lớp tài liệu tiêu chuẩn chính 25

tùy chọn nào hoặc bạn đang sử dụng các tùy chọn mặc định,
bạn không cần dấu ngoặc vuông. Ví dụ
\usepackage{listings}
có thể hiển thị mã chương trình. Nếu bạn tải nhiều tùy chọn,
chúng phải được phân tách bằng dấu phẩy. Ví dụ
\usepackage[paperwidth=105mm,paperheight=75mm]{geometry}
chiều rộng trang sẽ là 105mm và chiều cao trang sẽ là 75mm.
Nếu bạn tải nhiều gói với các tùy chọn mặc định, bạn có thể
thực hiện như sau:
\usepackage{<gói 1>, <gói 2>, <gói 3>, ...}

Ví dụ
\usepackage{listings,fancyhdr}
tải listings.sty và gói fancyhdr, có thể được thực hiện theo
cách này:
\usepackage{lists}
\usepackage{fancyhdr}

2.2 Các lớp tài liệu tiêu chuẩn chính

2.2.1 Lớp tài liệu

Trước đây, chúng ta đã thấy rằng bạn cần tải một lớp tài
liệu trước tiên, lớp này xác định kiểu cơ sở của tài liệu:
\documentclass [<tùy chọn>]{<lớp tài liệu>}

Dưới đây là ba lớp tài liệu tiêu chuẩn đáp ứng nhu cầu của
chúng ta trong hầu hết các trường hợp.
article Bài giảng, thư mời, báo cáo nhỏ, tài liệu chương trình,
ấn phẩm, v.v.. Các tùy chọn chính:
10pt, 11pt, 12pt - Kích thước phông chữ mặc định của
tài liệu. Tùy chọn mặc định: 10pt
a4paper, a5paper, b5paper, letterpaper - Kích thước
trang. Tùy chọn mặc định là kích thước tiêu đề thư

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


26 Chương 2. Những cơ bản soạn thảo bằng LATEX

tiêu chuẩn cho tiếng Anh: letterpaper. Điều quan


trọng là bạn chọn kích thước nào, kích thước trang
vật lý sẽ luôn là A4 nếu bạn đã cài đặt hệ thống TEX
với cài đặt mặc định. Các tùy chọn này chỉ đặt lề
phù hợp với kích thước trang đã chọn. Nếu bạn cũng
muốn đặt kích thước trang về mặt vật lý, bạn phải
sử dụng gói geometry (xem phần 5.1).
oneside, twoside - Chọn in ra một mặt và hai mặt. Tùy
chọn mặc định: oneside.
twocolumn - Chọn trang có hai cột.
notitlepage, titlepage - Không trang có bìa, có. Tùy
chọn mặc định: notitlepage.
draft - Chỉ ra phần tràn cuối dòng và chỉ hộp số liệu
được hiển thị.
final - Không cho biết tràn cuối dòng và hiển thị số liệu.
Đây là một tùy chọn mặc định.
report - Có thể được sử dụng để chuẩn bị báo cáo, luận văn,
luận văn tốt nghiệp. Các tùy chọn của nó cũng giống
như đối với bài báo. Giá trị mặc định: 10pt, letterpaper,
oneside, titlepage, final. \part và \chapter trong lớp này
luôn bắt đầu trên một trang mới. Các tùy chọn cho việc
này:
openright - Các phần và chương phải bắt đầu trên một
trang được đánh số lẻ, để lại một trang trống.
openany - Số trang mở đầu của các phần và chương có thể
là bất kỳ thứ gì, không chỉ là số lẻ.
book - Để viết sách. Các tùy chọn của nó giống như lớp tài liệu
của báo cáo. Giá trị mặc định: 10pt, letterpaper, twoside,
titlepage, openright, final.

2.2.2 Mẫu lớp tài liệu tiếng Việt

Hiện nay các tài liệu soạn cho LATEX đều dựa trên mã Uni-
code, chính xác hơn là utf8. Tác giả Hàn Thế Thành có soạn ra
gói lệnh vntex.sty và đặt định nghĩa mã T5 dùng trong LaTeX.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.2. Các lớp tài liệu tiêu chuẩn chính 27

Khuôn tài liệu dùng gói này như sau


(các bạn tạo ra tệp soanthao1.tex rồi chạy thử)
\documentclass[12pt]{article}
\usepackage[utf8]{vietnam}
\begin{document}
<Soạn tiếng việt ở đây.>
\end{document}

Cách định dạng trên dùng mã T5, nên phải các gói lệnh có
phông mã T5, những gói lệnh sau đây có chữ đẹp:
mathpazo.sty, mathptmx.sty, charter.sty,...(các bạn tạo ra tệp
soanthao3.tex rồi chạy thử)
\documentclass[12pt]{article}
\usepackage{amsmath,amsxtra,amssymb,latexsym,amsthm}
\usepackage[utf8]{vietnam}
\usepackage{mathpazo}
\begin{document}
<Soạn tiếng việt ở đây.>
\end{document}

ta có soạn một gói lệnh chạy được với mọi phông mã của
LATEX như OT1, T1, T5, ... Các bạn vào
https://vietex.blog.fc2.com/blog-entry-153.html
\documentclass[12pt]{article}
\usepackage{amsmath,amsxtra,amssymb,latexsym,amsthm}
\usepackage[T1]{fontenc}
\usepackage[T1]{vietex}
\usepackage{jamtimes}
\begin{document}
<Soạn tiếng việt ở đây.>
\end{document}

Tương tự gói lệnh vntext.sty bao trùm gói lệnh trên với mõi
mã tiếng Việt trong nước TCVN, VNI, BK, .... và các phông
thư pháp.

Soan tiïng
ë viït úí àêy. .
.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


28 Chương 2. Những cơ bản soạn thảo bằng LATEX

2.3 Gói lệnh babel.sty ngôn ngữ của tài liệu

Ngôn ngữ của tài liệu có thể được đặt làm tùy chọn trong
gói babel.sty, gói này biết kiểu chữ của các ngôn ngữ sau, trong
số các ngôn ngữ khác:
bulgarian, croatian, czech, danish, dutch, english, es-
peranto, estonian, finnish, french, ngerman, greek, hebrew,
magyar, icelandic, irish, italian, latin, polish, portuges, ro-
manian, russian, scottish, serbian, slovak, slovene, spanish,
swedish, turkish, ukrainian, welsh, vietnamese.
Ví dụ: nếu bạn viết bằng tiếng Anh, mã sau là đúng:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\begin{document}
English text
\end{document}

Bạn có thể viết bằng nhiều ngôn ngữ trong một tài liệu.
Trong trường hợp này, các ngôn ngữ được sử dụng phải được
liệt kê trong tùy chọn gói babel.sty, được phân tách bằng dấu
phẩy. Ngôn ngữ cuối cùng sẽ là ngôn ngữ mặc định. Từ ngôn
ngữ cơ bản sang ngôn ngữ khác bạn có thể chuyển đổi bằng
lệnh.
\selectlanguage{<tên ngôn ngữ>}

Nếu bạn chỉ muốn tạm thời chuyển sang ngôn ngữ khác cho
một vài đoạn văn, hãy sử dụng môi trường.
\begin{otherlanguage}{<tên ngôn ngữ>}
<chữ của ngôn ngữ>
\end{otherlanguage}

Nếu bạn chỉ muốn chuyển đến một đoạn văn, bạn có thể sử
dụng lệnh.
\foreignlanguage{<ngôn ngữ>}{<văn bản ngôn ngữ>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.4. Các ký tự trong LATEX 29

Ví dụ: trong đoạn mã sau, ngôn ngữ mặc định là tiếng Đức,
trong đó chúng ta cũng chèn một đoạn trích bằng tiếng Anh:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}
\begin{document}
Deutsch Text
\foreignlanguage{english}{English text}
\end{document}

Tương tự dùng gói lệnh babel.sty cho tiếng Việt soạn theo mã
unicode (các bạn tạo ra tệp soanthao2.tex rồi chạy thử)
\documentclass[12pt]{article}
\usepackage[vietnamese]{babel}
\usepackage{mathpazo}
\begin{document}
Soạn tiếng việt ở đây.
\end{document}

Gói lệnh vẫn dùng mã T5 cho phông tiếng Việt.

2.4 Các ký tự trong LATEX

2.4.1 Ký tự là lệnh của LATEX

Có những ký tự có thể được nhập từ bàn phím không thể


hiển thị trực tiếp vì chúng có ý nghĩa đặc biệt trong tệp nguồn:
\ (gạch chéo ngược) lệnh bắt đầu bằng ký tự này.
% nhận xét bắt đầu bằng ký từ này.
{} nhóm và ranh giới đối số lệnh.
$ Dấu phân cách chế độ toán học.
& Dấu dóng cột cho bảng.
# (dấu thăng) Cần thiết để định nghĩa một lệnh có chứa đối
số.
_ chỉ số dưới.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


30 Chương 2. Những cơ bản soạn thảo bằng LATEX

^ chỉ số trên.
~ dấu trắng không thể ngắt.
Nếu bạn muốn hiển thị chúng trong pdf, bạn có thể sử dụng
các lệnh sau:
\ → \textbackslash hoặc \char \string‘\\
% → \%
{ → \{
} → \}
$ → \$
& → \&
# → \#
_ → \_
^ → \textasciicircum hoặc \char\string‘\^
~ → \textasciitilde hoặc \char\string‘\~

2.4.2 Chữ cái có dấu

Nó đã được đề cập trước đây rằng sau khi thiết lập mã hóa
của tệp nguồn, một chữ cái có dấu cũng có thể được nhập trực
tiếp từ bàn phím. Nhưng điều gì sẽ xảy ra nếu bạn viết một
tệp kiểu trong đó bạn để lại lựa chọn trang mã cho người dùng
hoặc bạn cần một chữ cái có dấu không có trên bàn phím?
Trong trường hợp này, bạn có thể sử dụng dấu.

ó \’{o} ô \^{o} ŏ \u{o} ọ \d{o}


ő \H{o} õ \~{o} ǒ \v{o} o \b{o}
ö \"{o} ō \={o} o̊ \r{o} o¯ o \t{oo}
ò \‘{o} ȯ \.{o} o̧ \c{o}

Tất nhiên, chữ o có thể được trao đổi cho bất cứ điều gì
ngoại trừ hai chữ cái tiếng Anh có dấu: i và j. Không nên đặt
dấu nào khác trên những chữ này, bởi vì kết quả của \H{i} là
i̋. Do đó, các chữ cái i và j cũng có phiên bản không có dấu, bạn
có thể truy cập bằng các lệnh \i và \j: ı, Ỷ. Điều này sẽ cho
phép bạn viết chữ ı̋ dưới dạng \H{\i}. Ngoại lệ cho điều này là

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.4. Các ký tự trong LATEX 31

hai chữ cái phổ biến hơn là í và ì, cũng có thể được viết thành
\’{i}, \’{i}.
Lệnh \k chỉ có sẵn cho bộ mã nội bộ T1.

2.4.3 Chữ cái đặc biệt

Œ \OE Æ \AE Ø \O Ỷ \j
œ \oe æ \ae ø \o L \L
Å \AA ß \ss ı \i l \l

Các chữ cái đặc biệt bổ sung chỉ có thể được sử dụng cho bộ
mã nội bộ T1:
Ð \DH Ð \DJ Ŋ \NG Þ \TH
ð \dh đ \dj ŋ \ng þ \th

2.4.4 Nhân của ký tự

Mục đích của nhân của ký tự là căn chỉnh hai chữ cái liền
kề để khoảng cách giữa các chữ cái giống nhau về mặt quang
học. Qua ví dụ sau, điều này trở nên dễ hiểu. Dòng đầu tiên
được tạo bằng nhân của ký tự và dòng thứ hai không có:
7 Ví dụ 2.15 8: 2
AVATÁR\\ AVATÁR
{A}V{A}T{Á}R AVATÁR

Nhân của ký tự hoạt động tự động trong LATEX. Nếu bạn


muốn tắt một ký tự cụ thể ở một vị trí cụ thể, hãy đặt nó trong
dấu ngoặc đơn. Ví dụ: dòng thứ hai của ví dụ trước có thể được
viết là: {A}V{A}T{Á}R.

2.4.5 Dấu nối trong ký tự

Dấu nối là một kết nối gần gũi hơn bình thường của các chữ
cái với nhau. Những điều được biết đến nhiều nhất sau đây cái
gọi là chữ ghép f:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


32 Chương 2. Những cơ bản soạn thảo bằng LATEX

7 Ví dụ 2.16 8: 2
{\Large \rm ff fi fl ffi ff fi fl ffi ffl
ffl}

LATEX xử lý các chữ ghép theo mặc định mà không cần phải
ra lệnh riêng.
Để tắt chữ ghép ở một chỗ, hãy đặt dấu {} giữa các chữ cái:
7 Ví dụ 2.17 8: 2
{\Large \rm f{}f f{}i f{}l ff fi fl ffi ffl
f{}f{}i f{}f{}l}

2.4.6 Ký tự là ký hiệu

Dưới đây là một số ký hiệu thú vị. Đọc thêm về điều này
trong symbol-a4.pdf
https://www.ctan.org/tex-archive/info/symbols/comprehensive/
Ký hiệu có trong eurosym.sty và textcomp.sty:

e \euro %trong eurosym.sty


£ \pounds
¢ \textcent %trong textcomp.sty
℗ \textcircledP
® \textregistered %trong textcomp.sty
© \textcopyright %trong textcomp.sty
« \textcopyleft %trong textcomp.sty
† \dag
‡ \ddag

* \textasteriskcentered
• \textbullet

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.4. Các ký tự trong LATEX 33

◦ \textopenbullet %trong textcomp.sty


␣ \textvisiblespace
!‘ ‘!
?‘ ?‘
% \textperthousand %trong textcomp.sty
% \textpertenthousand %trong textcomp.sty
℃ \textcelsius %trong textcomp.sty
l \textleaf %trong textcomp.sty
§ \S
¶ \P
№ \textnumero %trong textcomp.sty
※ \textreferencemark %trong textcomp.sty
5˙ 5\.{}

Ngoài textcomp.sty, gói wasysym.sty cũng chứa nhiều ký


hiệu. Các tùy chọn khác bao gồm gói utfsym.sty, fontawesome
.sty, fontawesome5.sty và pifont.sty. Với cái sau, bạn có thể in
cái gọi là ký tự PostScript bằng lệnh.
\ding{<một số>} %trong gói pifont.sty

Thay vì <một số>, chúng ta có thể viết các số từ 33 đến 254,


hiệu quả của chúng được thể hiện trong bảng sau:

✁ \ding{33} ✉ \ding{41} ✑ \ding{49} ✙ \ding{57}


✂ \ding{34} ☛ \ding{42} ✒ \ding{50} ✚ \ding{58}
✃ \ding{35} ☞ \ding{43} ✓ \ding{51} ✛ \ding{59}
✄ \ding{36} ✌ \ding{44} ✔ \ding{52} ✜ \ding{60}
☎ \ding{37} ✍ \ding{45} ✕ \ding{53} ✝ \ding{61}
✆ \ding{38} ✎ \ding{46} ✖ \ding{54} ✞ \ding{62}
✇ \ding{39} ✏ \ding{47} ✗ \ding{55} ✟ \ding{63}
✈ \ding{40} ✐ \ding{48} ✘ \ding{56} ✠ \ding{64}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


34 Chương 2. Những cơ bản soạn thảo bằng LATEX

✡ \ding{65} ❈ \ding{104} ⑥ \ding{177} ➘ \ding{216}


✢ \ding{66} ❉ \ding{105} ⑦ \ding{178} ➙ \ding{217}
✣ \ding{67} ❊ \ding{106} ⑧ \ding{179} ➚ \ding{218}
✤ \ding{68} ❋ \ding{107} ⑨ \ding{180} ➛ \ding{219}
✥ \ding{69} ● \ding{108} ⑩ \ding{181} ➜ \ding{220}
✦ \ding{70} ❍ \ding{109} ❶ \ding{182} ➝ \ding{221}
✧ \ding{71} ■ \ding{110} ❷ \ding{183} ➞ \ding{222}
★ \ding{72} ❏ \ding{111} ❸ \ding{184} ➟ \ding{223}
✩ \ding{73} ❐ \ding{112} ❹ \ding{185} ➠ \ding{224}
✪ \ding{74} ❑ \ding{113} ❺ \ding{186} ➡ \ding{225}
✫ \ding{75} ❒ \ding{114} ❻ \ding{187} ➢ \ding{226}
✬ \ding{76} ▲ \ding{115} ❼ \ding{188} ➣ \ding{227}
✭ \ding{77} ▼ \ding{116} ❽ \ding{189} ➤ \ding{228}
✮ \ding{78} ◆ \ding{117} ❾ \ding{190} ➥ \ding{229}
✯ \ding{79}
✰ \ding{80}
✱ \ding{81}
✲ \ding{82}
✳ \ding{83}
TEX
❖ \ding{118}
◗ \ding{119}
❘ \ding{120}
❙ \ding{121}
❚ \ding{122}
❿ \ding{191}
➀ \ding{192}
➁ \ding{193}
➂ \ding{194}
➃ \ding{195}
➦ \ding{230}
➧ \ding{231}
➨ \ding{232}
➩ \ding{233}
➪ \ding{234}
✴ \ding{84} ❛ \ding{123} ➄ \ding{196} ➫ \ding{235}
✵ \ding{85} ❜ \ding{124} ➅ \ding{197} ➬ \ding{236}
✶ \ding{86} ❝ \ding{125} ➆ \ding{198} ➭ \ding{237}
✷ \ding{87} ❞ \ding{126} ➇ \ding{199} ➮ \ding{238}
✸ \ding{88} ❡ \ding{161} ➈ \ding{200} ➯ \ding{239}
✹ \ding{89} ❢ \ding{162} ➉ \ding{201} ➱ \ding{241}
✺ \ding{90} ❣ \ding{163} ➊ \ding{202} ➲ \ding{242}
Vie

✻ \ding{91} ❤ \ding{164} ➋ \ding{203} ➳ \ding{243}


✼ \ding{92} ❥ \ding{165} ➌ \ding{204} ➴ \ding{244}
✽ \ding{93} ❦ \ding{166} ➍ \ding{205} ➵ \ding{245}
✾ \ding{94} ❧ \ding{167} ➎ \ding{206} ➶ \ding{246}
✿ \ding{95} ♣ \ding{168} ➏ \ding{207} ➷ \ding{247}
❀ \ding{96} ♦ \ding{169} ➐ \ding{208} ➸ \ding{248}
❁ \ding{97} ♥ \ding{170} ➑ \ding{209} ➹ \ding{249}
❂ \ding{98} ♠ \ding{171} ➒ \ding{210} ➺ \ding{250}
❃ \ding{99} ① \ding{172} ➓ \ding{211} ➻ \ding{251}
❄ \ding{100} ② \ding{173} ➔ \ding{212} ➼ \ding{252}
❅ \ding{101} ③ \ding{174} → \ding{213} ➽ \ding{253}
❆ \ding{102} ④ \ding{175} ↔ \ding{214} ➾ \ding{254}
❇ \ding{103} ⑤ \ding{176} ↕ \ding{215}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.4. Các ký tự trong LATEX 35

2.4.7 Dấu cách

Bạn có thể tạo khoảng trắng trong tệp nguồn bằng cách
nhấn phím [Dấu cách]. Nhiều khoảng trắng trong một hàng
trong tệp nguồn chỉ đại diện cho một khoảng trắng trong kết
quả cuối cùng, nhưng khoảng trắng ở đầu dòng không xuất
hiện trong kết quả cuối cùng. Nó cũng được tính là khoảng
trắng trong kết quả cuối cùng nếu có ngắt dòng trong tệp
nguồn. Điều này chỉ không đúng nếu có dấu % ở cuối dòng
không có dấu cách ngay trước nó. Ví dụ
7 Ví dụ 2.18 8: 2
Từ ngày nào chẳng Từ ngày nào chẳng biết
biết Thuyền nghe lời biển khơi
Thuyền nghe lời biển
khơi

Nếu một lệnh không có đối số, nó thường là khoảng trắng sau
nó. Nó không hiển thị. Ví dụ
7 Ví dụ 2.19 8: 2
\LaTeX Tra cứu và soạn thảo LATEXTra cứu và soạn thảo

Nếu điều này mang lại kết quả không mong muốn, bạn có thể
đặt lệnh trong dấu ngoặc đơn hoặc sử dụng lệnh \ để buộc có
khoảng trắng:

7 Ví dụ 2.20 8
LaTeX{} tra cứu, {\LaTeX} tra cứu, \LaTeX\ tra cứu.
: 2
LaTeX tra cứu, LATEX tra cứu, LATEX tra cứu.
Cũng có trường hợp bạn không nên ngắt dòng sau dấu cách.
Ví dụ, nếu chúng ta viết N. H. Điển, thì sau điểm chấm không
thể có ngắt dòng. Để ngăn điều này sau khi đặt chấm dùng
ngay ~ không gian không thể phá vỡ. Nguồn ~ dấu hiệu của ký
tự trắng và không ngắt dòng:
N.~H.~Điển
Điều này đáng làm sau mỗi chấm không cho biết kết thúc
câu. Do đó, các chấm như vậy không thể kết thúc ở cuối dòng.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


36 Chương 2. Những cơ bản soạn thảo bằng LATEX

Hãy cẩn thận, nếu bạn đã đặt một khoảng trống không thể
ngắt ở đâu đó, đừng thêm một khoảng trắng khác sau đó, vì
nó sẽ dẫn đến hai khoảng trắng và khả năng không thể ngắt
cũng sẽ biến mất:

7 Ví dụ 2.21 8
N.~H.~Điển (đặt đúng).\\
N. ~H.~ Điển (đặt dấu không ngắt sai).
: 2
N. H. Điển (đặt đúng).
N. H. Điển (đặt dấu không ngắt sai).
Ngoài ra còn có một phiên bản của ký tự trắng không thể
ngắt có kích thước bằng một nửa không gian bình thường. Điều
này thường được sử dụng giữa một đơn vị đo lường và một đơn
vị đo lường, hoặc khi nhóm hàng nghìn số. Trong mã nguồn \,
dấu hiệu của một nửa ký tự trắng không thể ngắt:
7 Ví dụ 2.22 8: 2
9\,cm, 14\,216\,123 9 cm, 14 216 123

2.5 Chấm câu

2.5.1 Dấu chấm, dấu phẩy, dấu hai chấm, dấu chấm
phẩy, dấu chấm hỏi, dấu chấm than

Các dấu ., , , :, ;, ?, ! đừng đặt dấu trắng trước các


dấu này, mà hãy đặt một khoảng trống sau chúng. ! Ngoại lệ
nếu nó được theo sau bởi dấu ngoặc kép đóng hoặc ). Trong
một văn bản tiếng Anh, phải có một khoảng trắng lớn hơn sau
khi kết thúc câu so với giữa hai từ. Điều này được giải quyết
bởi LATEX nếu tùy chọn tiếng Anh của gói babel.sty được bật.
Tuy nhiên, nếu một câu kết thúc bằng chữ hoa thì nó được coi
là viết tắt, vì vậy nó không bỏ dấu cách lớn hơn sau dấu chấm
tiếp theo. Giải pháp là đặt lệnh \@ trước một chấm như vậy. Ví
dụ

7 Ví dụ 2.23 8
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
2.5. Chấm câu 37

Xem các video yêu thích trên HBO của bạn bất cứ khi nào bạn
muốn, cho dù bạn ở đâu -- đó là mọi tập của mỗi mùa
hay nhất của HBO\@. Nhiều kênh hơn để xem. Tất cả đều c
ó ở dạng HD\@.
: 2
Xem các video yêu thích trên HBO của bạn bất cứ khi nào
bạn muốn, cho dù bạn ở đâu – đó là mọi tập của mỗi mùa
hay nhất của HBO. Nhiều kênh hơn để xem. Tất cả đều có
ở dạng HD.

2.5.2 Dấu gạch ngang và gạch nối

Dấu gạch ngắn. Dấu gạch ngắn có thể được chỉ định trong
tệp nguồn bằng -.

7 Ví dụ 2.24 8
lấy mẫu-không khí; tiền- tố hoặc hậu tố; phông chữ và kích
-thước; một hoặc hai-người; Có thể từ 5-6 tuổi; bạn có-
biết;
: 2
lấy mẫu-không khí; tiền- tố hoặc hậu tố; phông chữ và kích
-thước; một hoặc hai-người; Có thể từ 5-6 tuổi; bạn có-biết;
Dấu gạch nối. Dấu gạch nối có thể được chỉ định trong tệp
nguồn bằng dấu --. Ví dụ

7 Ví dụ 2.25 8
xem các trang 15--21; Đông--Tây; máy bay TU--154 của Nga;
trận Việt--Mỹ;
: 2
xem các trang 15–21; Đông–Tây; máy bay TU–154 của Nga;
trận Việt–Mỹ;
Tên của các cặp tác giả cũng được nối với nhau bằng dấu
gạch nối, nhưng trong trường hợp này phải đặt một nửa dấu
cách không thể ngắt được trước và sau dấu gạch nối.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


38 Chương 2. Những cơ bản soạn thảo bằng LATEX

7 Ví dụ 2.26 8
Định lý Bolzano\,--\,Weierstrass
: 2
Định lý Bolzano – Weierstrass
Dấu gạch ngang. Dấu gạch ngang trong tệp nguồn có thể
được chỉ định bằng --. Có một khoảng trắng trước và sau một
dấu gạch ngang, trừ khi nó được theo sau bởi một dấu chấm
câu. Ví dụ

7 Ví dụ 2.27 8
Anh ấy không -- dậy sớm như vậy, ít nhất là vào -- cuối tuầ
n.
: 2
Anh ấy không – dậy sớm như vậy, ít nhất là vào – cuối tuần.

7 Ví dụ 2.28 8
Họ đã tranh cãi nhiều lần --, hầu hết đều không có -- lý do
gì.
nhưng họ đã yêu nhau.
: 2
Họ đã tranh cãi nhiều lần –, hầu hết đều không có – lý do
gì. nhưng họ đã yêu nhau.
Dấu gạch ngang dài. Dấu (—) cũng có thể được sử dụng như
một dấu gạch ngang trong tiếng Anh, nhưng không được phép
có dấu cách trước và sau dấu này. Trong nguồn nhập vào ---.

2.5.3 Các dấu ngoặc

Các dấu (,), [,], {,}, <,> gọi là dấu ngoặc. Chúng tuân theo
của quy tắc đối với dấu gạch ngang.

7 Ví dụ 2.29 8
Thuyền và biển ( Xuân Quỳnh )

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.5. Chấm câu 39

: 2
Thuyền và biển ( Xuân Quỳnh )

2.5.4 Dấu ba chấm

Dấu ba chấm trong tệp nguồn có thể được chỉ định bằng
lệnh \dots. Thay vào đó, đừng bao giờ sử dụng ba dấu chấm
được viết liên tiếp. Ví dụ

7 Ví dụ 2.30 8
Dấu \dots đẹp hơn ... chỉ (\dots nên dùng \dots hơn là ...)
.
: 2
Dấu . . . đẹp hơn ... chỉ (. . . nên dùng . . . hơn là ...).

2.5.5 Dấu ngoặc kép

Dấu ngoặc kép và dấu ngoặc kép bên trong thay đổi tùy
theo ngôn ngữ. Cần có dấu ngoặc kép bên trong nếu có dấu
ngoặc kép trong phần trích dẫn

7 Ví dụ 2.31 8
,,văn bản >> văn bản << văn bản ’’ hoặc
: 2
„văn bản » văn bản « văn bản ” hoặc
Vì vậy, dấu ngoặc kép mở bên ngoài trong nguồn là hai dấu
phẩy, trong khi dấu ngoặc kép ngoài đóng trong nguồn là hai
dấu nháy đơn. Dấu ngoặc kép mở nội bộ » và dấu ngoặc kép nội
bộ đóng « trong nguồn. Trong văn bản tiếng Anh, theo quy tắc
của Anh, điều này nên được thực hiện:
7 Ví dụ 2.32 8: 2
‘văn bản ‘‘văn bản’’ văn b ‘văn bản “văn bản” văn bản’
ản’

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


40 Chương 2. Những cơ bản soạn thảo bằng LATEX

Vì vậy, dấu ngoặc kép mở bên ngoài trong nguồn là dấu nháy
đơn ngược, trong khi dấu ngoặc kép đóng bên ngoài trong
nguồn là dấu nháy đơn. Dấu ngoặc kép mở bên trong trong
nguồn là hai dấu nháy đơn ngược, trong khi dấu ngoặc kép
bên trong đóng trong nguồn là hai dấu nháy đơn.
Theo quy tắc của Mỹ, trật tự được đảo ngược. Nghĩa là,
dấu ngoặc kép mở bên ngoài trong nguồn là hai dấu nháy đơn
ngược, trong khi dấu ngoặc kép ngoài đóng trong nguồn là hai
dấu nháy đơn. Dấu ngoặc kép bên trong mở đầu trong nguồn là
dấu nháy đơn ngược, trong khi dấu ngoặc kép bên trong đóng
trong nguồn là dấu nháy đơn:
7 Ví dụ 2.33 8: 2
‘‘văn bản ‘văn bản’ văn bản “văn bản ‘văn bản’ văn bản”
’’

Ngoài những điều trên, có một giải pháp phổ quát. Tải gói
csquotes.sty với tùy chọn autostyle. Gói này hỗ trợ dấu ngoặc
kép cho các ngôn ngữ sau: Croatia, Đan Mạch, Hà Lan, Anh,
Phần Lan, Pháp, Đức, Hy Lạp, Ý, Na Uy, Ba Lan, Bồ Đào Nha,
Nga, Tây Ban Nha, Thụy Điển, Việt Nam.
\enquote{<văn bản> \enquote{<văn bản>} <văn bản>} %csquotes
.sty

7 Ví dụ 2.34 8
\enquote{văn bản \enquote{văn bản} văn bản}
: 2
“văn bản ‘văn bản’ văn bản”
mã sử dụng dấu ngoặc kép (cả bên ngoài và bên trong) theo
ngôn ngữ có hiệu lực. Nếu bạn muốn hiển thị trực tiếp dấu
ngoặc kép nội bộ, hãy sử dụng lệnh
\enquote*{<văn bản>} % csquotes.sty

7 Ví dụ 2.35 8: 2
\enquote{văn bản}\\ “văn bản”
\enquote*{văn bản} ‘văn bản’

Nhiều đoạn văn bản cũng có thể được sử dụng trong đối số của
lệnh \enquote và \enquote*.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.6. Các biến thể phông chữ 41

2.6 Các biến thể phông chữ

2.6.1 Phân loại

Các biến thể phông chữ được phân loại theo họ, nội dung
và hình dạng của chúng.
Họ phông chữ
Họ phông có chân (roman)
\textrm{<văn bản>} hoặc {\rmfamily <văn bản>}

Họ phông không chân (sans serif)


\textsf{<văn bản>} hoặc {\sffamily <văn bản>}

Họ phông đánh máy (typewriter)


\texttt{<văn bản>} hoặc {\ttfamily <văn bản>}

Theo mặc định, họ cổ là mặc định. Ví dụ

7 Ví dụ 2.36 8
Họ \textrm{có chân}, \textsf{không chân}, \texttt{đánh máy}
: 2
Họ có chân, không chân, đánh máy
Thân chữ (series)
Bình thường (medium)
\textmd{<văn bản>} hoặc {\mdseries <văn bản>}

In đậm (boldface)
\textbf{<văn bản>} hoặc {\bfseries <văn bản>}

Thân chữ bình thường là mặc định. Ví dụ

7 Ví dụ 2.37 8
Bình thường, \textmd{Bình thường}, \textbf{In đậm}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
42 Chương 2. Những cơ bản soạn thảo bằng LATEX

Bình thường, Bình thường, In đậm


Hình dạng chữ (shape)
Thẳng đứng (upright)
\textup{<văn bản>} hoặc {\uphape <văn bản>}

Chữ hoa/chữ thường (upper/lower case)


\textulc{<văn bản>} hoặc {\ulcshape <văn bản>}

Nghiêng (slanted)
\textsl{<văn bản>} hoặc {\slshape <văn bản>}

Nghiêng (italics)
\textit{<văn bản>} hoặc {\itshape <văn bản>}

Chữ hoa nhỏ (small caps)


\textsc{<văn bản>} hoặc {\scshape <văn bản>}

Theo mặc định, hình dạng chữ đứng là mặc định. Ví dụ

7 Ví dụ 2.38 8
Chữ, \textup{đứng}, \textsl{ngả}, \textit{nghiêng}, \textsc
{Hoa Nhỏ}
: 2
Chữ, đứng, ngả, nghiêng, HOA NHỎ
Nếu được hỗ trợ bởi bộ phông chữ hiện tại, hai hình dạng
có thể được kết hợp. Ví dụ: nếu bạn sử dụng bộ mã nội bộ T1
để chuyển từ bộ phông chữ Hiện đại của Máy tính Châu Âu
mặc định sang bộ phông chữ Hiện đại Latinh bằng cách tải gói
hiện đại, thì dạng viết hoa nghiêng nghiêng cũng có sẵn:

7 Ví dụ 2.39 8
{\bfseries \textsc{Chữ viết hoa nghiêng}}
: 2
CHỮ VIẾT HOA NGHIÊNG

Điều quan trọng cần lưu ý là trong trường hợp này, các lệnh
\uphape hoặc \textup chỉ là định dạng dọc được khôi phục, hình

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.6. Các biến thể phông chữ 43

thức vốn nhỏ không bị ảnh hưởng. Ví dụ

7 Ví dụ 2.40 8
{\slshape \bfseries Vốn nhỏ bị từ chối. \upshape Thường vốn
nhỏ.}
: 2
Vốn nhỏ bị từ chối. Thường vốn nhỏ.
Trong ví dụ trước, nếu bạn không muốn khôi phục hình
dạng nghiêng mà là hình dạng viết hoa/viết thường, hãy sử
dụng lệnh \textulc hoặc \ulcshape.

7 Ví dụ 2.41 8
{\bfseries\scshape Vốn nhỏ bị từ chối. \ulcshape In đạm/viế
t hoa}
: 2
VỐN NHỎ BỊ TỪ CHỐI . In đạm/viết hoa
Để trở về hình dạng mặc định (chữ thường/chữ hoa), hãy sử
dụng
{\normalshape <văn bản>}

lệnh tương đương với \uphape\ulcshape.

7 Ví dụ 2.42 8
{\bfseries\scshape Vốn nhỏ bị từ chối. \normalshape Chữ hoa
/chữ thường.}
: 2
VỐN NHỎ BỊ TỪ CHỐI . Chữ hoa/chữ thường.
Sự kết hợp giữa họ phông, thân chữ và hình dáng
Không chỉ có hai hình, mà cả họ phông, thân chữ và hình
giáng đều có thể được kết hợp với nhau. Ví dụ
7 Ví dụ 2.43 8: 2
\textit{\textbf{\textsf{Văn bản}}} Văn bản

Khi bạn muốn quay lại phông chữ mặc định, hãy sử dụng
các lệnh.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


44 Chương 2. Những cơ bản soạn thảo bằng LATEX

\textnormal{<văn bản>} hoặc {\normalfont <văn bản>}

\textup, \textsl, \textit, v.v. lệnh cho nhiều đoạn văn


ứng dụng. \upshape, \slshape, \itshape, v.v. các lệnh khai báo,
chẳng hạn như cũng có thể hoạt động như một môi trường. Ví
dụ
{\bfseries <văn bản>} hoặc \begin{bfseries} và \end{
bfseries}

Hiệu quả là như nhau.

2.6.2 Điều chỉnh nghiêng

Nếu một văn bản in nghiêng hoặc in nghiêng được theo sau
bởi một văn bản trong các chữ cái dọc, nên đặt một khoảng
trống lớn hơn một chút giữa chúng, nếu không, chữ cái in
nghiêng sẽ rất nghiêng về phía chữ sau. Đây được gọi là cân
bằng chữ thảo. Để minh họa điều này, câu sau đây được thực
hiện đầu tiên mà không cần cân bằng nghiêng và sau đó với
cân bằng nghiêng:
“Một tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
“Một tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
Các lệnh \textit và \textsl thực hiện cân bằng chữ
nghiêng tự động, vì vậy hai giải pháp sau đây cho kết quả
chính xác:

7 Ví dụ 2.44 8
‘‘Một tệp ảnh có đuôi \textit{*.tif} chứa các lệnh hoạt hì
nh.’’\\
‘‘Một tệp ảnh có đuôi \textsl{*.tif} chứa các lệnh hoạt hì
nh.’’
: 2
“Một tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
“Một tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
Tuy nhiên, các cặp khai báo, lệnh \itshape và \slshape và
các phiên bản ngữ cảnh của chúng không giải quyết được vấn

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.6. Các biến thể phông chữ 45

đề này. Do đó, người dùng phải giải quyết vấn đề này bằng lệnh
\/:

7 Ví dụ 2.45 8
‘‘Tệp ảnh có đuôi {\itshape *.tif\/} chứa các lệnh hoạt hì
nh.’’\\
‘‘Tệp ảnh có đuôi {\slshape *.tif\/} chứa các lệnh hoạt hì
nh.’’
: 2
“Tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
“Tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”

2.6.3 Điểm nhấn nổi bật chữ

Khi bạn muốn đánh dấu một từ hoặc ý nghĩ, hãy sử dụng
lệnh hoặc môi trường.
\emph{<văn bản>}, {\em <văn bản>}, \begin{em} <văn bản> \
end{em}

(Giải pháp đầu tiên không thể được sử dụng cho nhiều đoạn
văn.) Đối với các lớp tài liệu tiêu chuẩn, họ theo dõi phông chữ
hiện tại và đánh dấu phông chữ đó cho phù hợp. Trong trường
hợp của một hình dạng đứng, nó là nghiêng, trong trường hợp
một hình dạng không đứng, nó đã chuyển sang hình dạng
đứng. \emph thực hiện cân bằng chữ nghiêng tự động, nhưng
không phải lệnh \em hoặc môi trường em. Sau đó, chúng ta phải
giải quyết vấn đề này bằng lệnh \/.

7 Ví dụ 2.46 8
‘‘Tệp ảnh có đuôi \emph{*.tif} chứa các lệnh hoạt hình.’’\\
‘‘Tệp ảnh có đuôi {\em *.tif\/} chứa các lệnh hoạt hình.’’
: 2
“Tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
“Tệp ảnh có đuôi *.tif chứa các lệnh hoạt hình.”
Nếu có thể, không sử dụng kiểu in đậm để đánh dấu, vì nó
được dành riêng cho các tiêu đề. Trong thời đại của máy đánh

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


46 Chương 2. Những cơ bản soạn thảo bằng LATEX

chữ, chúng được đánh dấu với sự tiết kiệm phông chữ. Nó cũng
có thể được giải quyết trong LATEX:
\so{<văn bản>} %trong gói lệnh soulutf8.sty

7 Ví dụ 2.47 8
\so{Văn bản thưa thớt, có thể gồm nhiều đoạn văn.}
: 2
Vă n b ả n t h ư a thớt, có thể gồm nhiều
đoạn văn.
Các tùy chọn đánh dấu bổ sung bằng cách gạch chân hoặc
gạch chân:
văn bản \underline{văn bản}
văn bản \uline{văn bản} %trong gói ulem.sty
văn bản \uuline{văn bản} %trong gói ulem.sty
văn bản \uwave{văn bản} %trong gói ulem.sty
:::::::::
văn bản \sout{văn bản} %trong gói ulem.sty
văn
///// //////
bản \xout{văn bản} %trong gói ulem.sty

văn
   bản \cancel{văn bản} %trong gói cancel.sty
XXX
văn bản XX \bcancel{văn bản} %trong gói cancel.sty
XX 
văn
  X bản
XX \xcancel{văn bản} %trong gói cancel.sty
Nếu bạn đang sử dụng gói ulem.sty, lệnh \emph sẽ được gạch
dưới. Nếu bạn không muốn điều này, hãy sử dụng tùy chọn
normalem trong gói ulem.sty.
Nó có thể phù hợp để đánh dấu các từ và cụm từ bằng tất
cả các chữ cái viết hoa hoặc trong tất cả các chữ cái viết hoa
trong tất cả các chữ cái viết thường.
\MakeUppercase{<văn bản>}

Nó trích xuất <văn bản> bằng tất cả các chữ cái viết hoa.
7 Ví dụ 2.48 8: 2
\MakeUppercase{Hà Nội} HÀ NỘI

\MakeLowercase{<văn bản>}

Nó trích xuất <văn bản> bằng tất cả chữ thường.


7 Ví dụ 2.49 8: 2
\MakeLowercase{Hà Nội} hà nội

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.7. Kích thước phông chữ 47

\MakeTextUppercase{<văn bản>} %trong gói textcase.sty

Nó trích xuất <văn bản> bằng tất cả các chữ cái viết hoa, nhưng
không thay đổi các chữ cái của các công thức toán học.
\MakeTextLowercase{<văn bản>} %trong gói textcase.sty

Nó trích xuất <văn bản> bằng tất cả các chữ cái viết thường,
nhưng không thay đổi các chữ cái của các công thức toán học.
\NoCaseChange{<văn bản>} %trong gói textcase.sty

Nó không thay đổi các chữ cái.

2.7 Kích thước phông chữ


Bộ mã nội bộ T1 được tải theo mặc định từ bộ phông chữ
Máy tính Hiện đại của Châu Âu, trong đó kích thước phông
chữ chỉ có thể nhận các giá trị sau được đo bằng pt: 5, 6, 7,
8, 9, 10, 10,95, 12, 14,4, 17,28, 20,74, 24,88, 29,86, 35,83. Hạn
chế này có thể được khắc phục với gói anyfontsize.sty.
Bạn có thể sử dụng khác với bộ phông chữ European Com-
puter Modern. Để làm điều này, ví dụ, tải một trong các
gói lmodern, mlmodern, pxfonts, kpfonts, txfonts, newtxtext,
times, lxfonts, bera, cyklop trước gói fontenc. Các phông chữ
trong này có thể được sử dụng ở bất kỳ kích thước nào. Xem
Chương cuối để biết thêm thông tin về cách tải phông chữ mới.

2.7.1 Kích thước phông chữ cơ bản

Kích thước phông chữ mặc định có thể được đặt trong các
tùy chọn lớp tài liệu. Đối với các lớp bài báo, báo cáo và sách
tiêu chuẩn, có thể chỉ định ba kích thước: 10pt, 11pt và 12pt.
Nếu bạn muốn một kích thước khác, hãy viết phần mở đầu sau
khi tải gói fontenc.sty bằng
\usepackage[fontsize=<cỡ phông>]{scrextend}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


48 Chương 2. Những cơ bản soạn thảo bằng LATEX

hoặc

\usepackage[fontsize =<cỡ phông>] {fontsize}

Nếu bạn đang sử dụng bộ phông chữ Châu Âu Máy tính Hiện
đại mặc định, hãy đảm bảo loại bỏ giới hạn kích thước với gói
anyfontsize.sty. Bạn có thể thay đổi kích thước phông chữ mặc
định ở bất kỳ đâu trong tài liệu:

\KOMAoptions{fontsize =<cỡ phông>} %trong gói scrextend.


sty

hoặc

\changefontsizes{<cỡ phông>} %trong gói scrextend.sty

hoặc

\changefontsize{<cỡ phông>} %trong gói fontize.sty

Một tùy chọn khác để đặt bất kỳ kích thước phông chữ cơ sở
nào là ở phần sau. Tùy chọn cốt lõi của gói geometry được thảo
luận trong tùy chọn mag.

2.7.2 Các lệnh khai báo kích thước phông chữ

Các lệnh sau đặt kích thước phông chữ tùy thuộc vào kích
thước phông chữ mặc định:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.7. Kích thước phông chữ 49

văn bản {\tiny văn bản}


văn bản {\scriptsize văn bản}
văn bản {\footnotesize văn bản}
văn bản {\small văn bản}
văn bản {\normalsize văn bản}
văn bản {\large văn bản}
văn bản {\Large văn bản}

văn bản {\LARGE văn bản}

văn bản {\huge văn bản}

văn bản {\Huge văn bản}

Bảng sau đây cho thấy kích thước phông chữ của các lệnh này
đối với kích thước phông chữ cơ sở tiêu chuẩn:

10pt 11pt 12pt

\tiny 5 6 6
\scriptsize 7 8 8
\footnotesize 8 9 10
\small 9 10 10,95
\normalsize 10 10,95 12
\large 12 12 14,4
\Large 14,4 14,4 17,28
\LARGE 17,28 17,28 20,74
\huge 20,74 20,74 24,88
\Huge 24,88 24,88 24,88

Đây là các lệnh khai báo, vì vậy chúng có thể được sử dụng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


50 Chương 2. Những cơ bản soạn thảo bằng LATEX

như một môi trường. Ví dụ


{\large văn bản} và \begin{large} văn bản \end{large}

các mã có cùng tác dụng.

2.7.3 Kích thước phông chữ tương đối

Bạn cũng có thể đặt bất kỳ kích thước phông chữ tương đối
nào:
\scalefont{<tỷ lệ phóng>} %trong gói scalefnt.sty

trong đó <tỷ lệ phóng> chỉ định số lần bạn muốn kích thước
chữ cái cơ sở. Ví dụ {\scalefont {1.5} <văn bản>} văn bản được
hiển thị ở 1,5 lần kích thước phông chữ mặc định.
7 Ví dụ 2.50 8: 2
Hà Nội,{\scalefont{1.5} Hà
Nội}, Hà Nội
Hà Nội, Hà Nội, Hà Nội

2.7.4 Kích thước phông chữ tuyệt đối

Bạn có thể đạt được kích thước phông chữ tuyệt đối bằng
lệnh sau:
\fontsize{<kích thước phông>}{<khoảng cách dòng>}\
selectfont

Ví dụ: văn bản 25 chấm điểm với khoảng cách dòng 12 chấm
điểm có thể được viết như thế này:

7 Ví dụ 2.51 8
Đó là một câu dài không phù hợp với một dòng!\\
{\fontsize{20}{25}\selectfont
Đó là một câu dài không phù hợp với một dòng!}
: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
2.7. Kích thước phông chữ 51
Đó là một câu dài không phù hợp với một dòng!
Đó là một câu dài không phù hợp
với một dòng!
Nếu bạn muốn giữ khoảng cách dòng ở kích thước mặc định,
hãy thay thế <khoảng cách dòng> bằng \the\baselineskip.

2.7.5 Đơn vị độ đo

LATEX biết tất cả các đơn vị được sử dụng trong in ấn. Đây
chỉ là một vài độ đo:

pt điểm
mm milimét
cm cm
in inch, 1in = 25,4mm = 72,27pt
ex chiều cao của chữ x trong phông chữ hiện tại
em kích thước phông chữ hiện tại của

2.7.6 Khoảng cách ngang linh hoạt

Ví dụ, một khoảng cách linh hoạt có thể là một “lò xo” mà
độ bền của nó có thể được chỉ định bằng lệnh sau.
\stretch{<lực lò xo>}

Hoạt động của điều này được minh họa bằng ví dụ sau:

7 Ví dụ 2.52 8
A\hspace{\stretch{1}}B\hspace{\stretch{2}}C
: 2
A B C
Khi đó tỉ số khoảng cách giữa hai chữ A và B với khoảng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


52 Chương 2. Những cơ bản soạn thảo bằng LATEX

cách giữa hai chữ B và C là 1: 2. "Lực lò xo" cũng có thể là một


phần nhỏ. Các lệnh bổ sung:
\fill % = \stretch{1}
\hfill % = \hspace{\fill}

Bốn lệnh sau có tác dụng tương tự như \hfill, nhưng lấp đầy
khoảng trống theo các cách sau:

7 Ví dụ 2.53 8
A\hrulefill B C\dotfill D E\rightarrowfill F G\
leftarrowfill H
: 2
A B C . . . . . . . . . . D E−−−−−−−−−−→F G←−−−−−−−−−−H
Bạn cũng có thể chỉ định một khoảng cách linh hoạt như
sau:
\hspace{<kích thước trắng> plus <số thêm> minus <số bớt>}

7 Ví dụ 2.54 8: 2
A\hspace{12pt plus 4pt minus 2pt}B A B

Khi đó khoảng cách giữa các chữ A và B là 12pt nếu bố cục


của dòng cho phép, nhưng nếu bố cục tối ưu yêu cầu thì kích
thước này có thể thay đổi từ 12 − 2 = 10 đến 12 + 4 = 16 điểm.

2.7.7 Khoảng cách dọc cố định

Bạn có thể chỉ định kích thước của bỏ qua dọc bằng lệnh
sau:
\vspace{<kích thước khoảng trắng>}

Khi đó kích thước của không gian dọc là <kích thước khoảng
trắng> + khoảng cách dòng hiện tại. <kích thước khoảng trắng
> cũng có thể là số âm. Lệnh này chỉ hoạt động khi TEX ở chế
độ dọc. Điều này có sẵn, ví dụ, nếu có ít nhất một dòng trống
giữa văn bản và \vspace. Khoảng trống ở đầu và cuối trang bị
hấp thụ mất.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.7. Kích thước phông chữ 53

\vspace*{<kích thước khoảng trắng>}

lệnh biết giống như \vspace, nhưng cũng bỏ qua các khoảng
trắng có kích thước đó ở đầu và cuối trang.
Nếu <kích thước khoảng trắng> được chỉ định trong các lệnh
\vspace hoặc \vspace* lớn hơn khoảng trống còn lại ở cuối
gương văn bản, thì sự khác biệt sẽ không xuất hiện ở đầu trang
tiếp theo. Nếu điều này là cần thiết (ví dụ: đối với một loạt
nhiệm vụ mà bạn muốn bỏ qua một lượng không gian nhất
định cho giải pháp sau các tác vụ, ngay cả khi ngắt trang), hãy
sử dụng
\xvspace {<kích thước khoảng trắng>}

lệnh này sẽ được định nghĩa trong phần mở đầu như sau:
\newlength{\vspacex}
\newcommand{\xvspace}[1]{%
\par
\ifdim\dimexpr\pagegoal-\pagetotal<#1
\setlength{\vspacex}{\dimexpr#1+\pagetotal-\pagegoal}%
\pagebreak
\vspace*{\vspacex}
\else
\vspace*{#1}
\fi
}
Các lệnh bổ sung:
\lower <kích thước trắng> \hbox{<văn bản>}

<kích thước trắng> chỉ định <văn bản> thấp hơn bao nhiêu so
với mặc định.
\textuperscript{<văn bản>}

<văn bản> được viết trên kích thước \scriptsize.


\textubscript{<văn bản>}

<văn bản> được ghi dưới kích thước \scriptsize. Ví dụ

7 Ví dụ 2.55 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
54 Chương 2. Những cơ bản soạn thảo bằng LATEX

XX\lower0.5ex\hbox{xxx}, 17\textsuperscript{h},
H\textsubscript{2}O
: 2
XXxxx, 17h , H2 O

2.7.8 Khoảng cách dọc linh hoạt

Kích thước linh hoạt có thể được chỉ định ở đây chính xác
như trong trường hợp nằm ngang, chỉ \vspace. Các lệnh bổ
sung:
\smallskip % = \vspace{3pt plus 1pt minus 1pt}
\medskip % = \vspace{6pt plus 2pt minus 2pt}
\bigskip % = \vspace{12pt plus 4pt minus 4pt}
\vfill % = \vspace{\fill}

2.7.9 Khoảng cách dòng

Khoảng cách dòng sẽ được đặt tự động, nhưng nếu bạn


muốn thay đổi điều này, hãy sử dụng
\linespread{<tỷ lệ>}

lệnh nhân khoảng cách dòng mặc định với giá trị của <tỷ lệ>.
Lệnh này chỉ đặt trên phần mở đầu của một tệp mới có tác
dụng. nên khó sử dụng từng đoạn.
Người ta dùng gói lệnh setspace.sty, có hai lệnh:
\onehalfspacing và \doublespacing. Hệ số cho khoảng cách
dòng một và hai được sử dụng trong máy đánh chữ phụ thuộc
vào kích thước phông chữ cơ sở:
Khoảng cách một dòng rưỡi a
\onehalfspacing %trong gói setspace.sty

7
\onehalfspacing
Ví dụ 2.56 8

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.7. Kích thước phông chữ 55

10pt 11pt 12pt

\onehalfspacing 1,25 1,21 1,24


\doublespacing 1,67 1,62 1,66

Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi lấy
những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn nhất đờ
i người.

\singlespacing
: 2
Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn nhất đời người.

Khoảng cách dòng kép, có thể được thiết lập bằng lệnh.
\doublespacing %trong gói setspace.sty

7
\doublespacing
Ví dụ 2.57 8

Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi lấy
những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn nhất đờ
i người.

\singlespacing
: 2
Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn nhất đời người.

Khoảng cách dòng ba cũng có thể được chỉ định bằng lệnh.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


56 Chương 2. Những cơ bản soạn thảo bằng LATEX

\setstretch{3} %trong gói setspace.sty

Khi sử dụng gói setspace.sty và hyperref.sty cùng nhau,


setspace.sty phải được tải trước.

2.8 Ngắt theo khối văn bản

2.8.1 Ngắt dòng

LATEX thực hiện ngắt dòng tự động, nhưng bạn có thể buộc
ngắt nó nếu cần:
\\

Bắt đầu một dòng mới mà không có ngắt dòng.


\\[<kích thước>]

Tương tự như \\ nhưng khoảng cách đến dòng tiếp theo tăng
thêm <kích thước>. Ví dụ \\[2mm]
\\*

Tương tự như \\ nhưng không cho phép ngắt trang.


\\*[<kích thước>]

Giống như \\[<kích thước>] nhưng không cho phép ngắt


trang.
\linebreak

Bắt đầu một dòng mới với dấu ngắt dòng.


\nolinebreak

Tắt ngắt dòng tại vị trí đó.


\break

Ngắt dòng, nhưng dữ liệu trên dòng trải đều trên dòng đó.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.8. Ngắt theo khối văn bản 57

2.8.2 Ngắt trang

LATEX thực hiện tự ngắt trang. Nếu bạn muốn căn chỉnh
cuối cùng của các trang bão hòa, hãy sử dụng
\flushbottom

Tác dụng của việc này là có thể được hủy bỏ bằng lệnh.
\raggedbottom

Nếu cần, bạn có thể buộc ngắt trang:


\newpage

Bắt đầu một trang mới (hoặc một cột mới khi lấy hai cột). Điền
vào hàng cuối cùng theo chiều ngang và sau đó đến trang (hoặc
cột) theo chiều dọc với khoảng trống.
\clearpage

Nó khác với lệnh \newpage ở chỗ nó cũng bắt đầu một trang mới
khi nhập vào hai cột và hiển thị cái gọi là môi trường động.
\cleardoublepage

Tương tự như \clearpage, nhưng với cách nhập hai mặt, tài
liệu tiếp tục chỉ được hiển thị trên trang được đánh số lẻ tiếp
theo.
\pagebreak

Nó phá vỡ một trang với một trang mới.


\nopagebreak

Tắt ngắt trang.


\expandgethispage{<khoảng cách>}

Tăng kích thước dọc của trang hiện tại bằng <khoảng cách>,
nhưng không điều chỉnh vị trí của chân trang. Ví dụ
\enlargethispage{3mm}.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


58 Chương 2. Những cơ bản soạn thảo bằng LATEX

\expandgethispage*{<khoảng cách>}

Tương tự như không có dấu *, nhưng có thêm khoảng trắng để


tối đa hóa lượng văn bản bạn có thể viết trên một trang nhất
định.

2.9 Đoạn văn

Trong trường hợp đoạn văn mới, phải để lại một dòng trống
trong tệp nguồn hoặc lệnh
\par

(Đây là một lỗi phổ biến khi sử dụng ngắt dòng thay vì một
đoạn văn mới. Đây là một lỗi đánh máy, hãy tránh nó!)
Tất cả các đoạn văn đều bắt đầu bằng thụt lề, ngoại trừ
cái gọi là đoạn mở chương. Để bắt đầu những điều này với
thụt lề, hãy tải gói indentfirst.sty hoặc tùy chọn English.ldf
afterindent = force-yes:
\PassOptionsToPackage{defaults = hu-min, afterindent =
force-yes}{english.ldf}

Theo mặc định, đoạn văn là ngắt dòng, nghĩa là các dòng bắt
đầu ở lề trái và kết thúc ở lề phải, ngoại trừ đầu dòng đầu tiên
và cuối dòng cuối cùng.
Các lệnh bổ sung:
\indent

Buộc thụt lề ở đầu đoạn văn nhất định.


\noindent

Tắt thụt lề ở đầu đoạn văn đó.


\setlength{\parindent}{<kích thước>}

Đặt thụt lề của đoạn văn thành <kích thước>.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.9. Đoạn văn 59

\setlength{\parskip}{<kích thước>}

Tăng khoảng cách giữa hai đoạn văn bằng <kích thước>. Ví
dụ
\verb!\setlength{\parskip}{5pt}!

2.9.1 Căn chỉnh các đoạn văn ở bên trái

Trong trường hợp này, dòng bắt đầu đoạn văn cũng bắt đầu
ở lề trái và không có căn lề ở bên phải, do đó không có phân
cách từ. Thực hiện:
\begin {flushleft}
<văn bản>
\end{flushleft}

hoặc
{\raggedright <văn bản> \par}

Sự khác biệt giữa hai giải pháp là môi trường flushleft đặt
các khoảng trống dọc ở đầu và cuối văn bản.

2.9.2 Căn chỉnh các đoạn văn ở bên phải

Hãy tưởng tượng một văn bản được đóng ở bên trái, nhưng
bây giờ hãy dịch chuyển từng dòng để dòng kết thúc ở lề phải.
Đây là đóng cửa bên phải. Thực hiện:
\begin{flushright}
<văn bản>
\end{flushright}

hoặc
{\raggedleft <văn bản>\par}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


60 Chương 2. Những cơ bản soạn thảo bằng LATEX

Sự khác biệt giữa hai giải pháp là môi trường phẳng đặt các
khoảng trống dọc ở đầu và cuối văn bản.

2.9.3 Căn chỉnh giữa các đoạn văn

Hãy tưởng tượng một văn bản được đóng ở bên trái, nhưng
bây giờ di chuyển từng dòng vào giữa. Thực hiện:

\begin{center}
<văn bản>
\end{center}

hoặc

{\centering <văn bản> \par}

Sự khác biệt giữa hai giải pháp là môi trường định tâm có
khoảng cách thẳng đứng đặt nó ở đầu và cuối văn bản.

7 Ví dụ 2.58 8
\begin{center}
Đây là một văn bản dài hơn được đặt ở giữa,
vì vậy cũng không có phân tách từ trong đó.
Nhưng chúng ta cũng có thể chỉ định các điểm ngắt dòng: \\
Điều này sẽ nằm trên một dòng riêng biệt. \\ Điều này cũng
sẽ nằm trên một dòng riêng biệt. \\
\end {center}

: 2
Đây là một văn bản dài hơn được đặt ở giữa, vì vậy cũng
không có phân tách từ trong đó. Nhưng chúng ta cũng có
thể chỉ định các điểm ngắt dòng:
Điều này sẽ nằm trên một dòng riêng biệt.
Điều này cũng sẽ nằm trên một dòng riêng biệt.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.9. Đoạn văn 61

2.9.4 Dấu ngoặc kép nhiều dòng

Để làm nổi bật một trích dẫn nhiều dòng, hãy sử dụng môi
trường trích dẫn:

7 Ví dụ 2.59 8
\begin{quotation}
‘‘Ăn uống quý ở chỗ biết kiêng khem, đọc sách quý ở chỗ biế
t chọn cái hay để đọc, luyện tập quý ở chỗ duy trì bền
lâu’’
\end{quotation}
: 2
“Ăn uống quý ở chỗ biết kiêng khem, đọc sách
quý ở chỗ biết chọn cái hay để đọc, luyện tập quý ở
chỗ duy trì bền lâu”

2.9.5 Thể bài thơ

Bài thơ có thể được định dạng với môi trường verse:

7 Ví dụ 2.60 8
\begin{verse}
\textbf{Thuyền và biển} (Xuân Quỳnh)\\
Em sẽ kể anh nghe\\
Chuyện con thuyền và biển:\\
\quad\\
Từ ngày nào chẳng biết\\
Thuyền nghe lời biển khơi\\
Cánh hải âu, sóng biếc\\
Đưa thuyền đi muôn nơi\\
\dots\dots
\end{verse}
: 2
Thuyền và biển (Xuân Quỳnh)

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


62 Chương 2. Những cơ bản soạn thảo bằng LATEX

Em sẽ kể anh nghe
Chuyện con thuyền và biển:

Từ ngày nào chẳng biết


Thuyền nghe lời biển khơi
Cánh hải âu, sóng biếc
Đưa thuyền đi muôn nơi
......

2.10 Chú thích

Nơi bạn muốn viết chú thích cuối trang, hãy viết
\footnote{<văn bản chú thich>}

Điều này làm tăng số lượng chú thích lên một. Nếu
\footnote[<số>]{<văn bản chú thich>}

Nếu bạn sử dụng lệnh, số chú thích cuối trang không tăng,
nhưng số bạn đã nhập trong tùy chọn <số> sẽ được in.
Không được có khoảng trắng trước \footnote. Nếu ghi chú
dành cho một từ cụ thể, lệnh được viết ngay sau từ đó, nếu nó
dành cho một câu hoặc một phần của câu, sau dấu câu. Chú
thích cuối trang bao gồm các câu hoàn chỉnh. Vì vậy, bạn phải
bắt đầu bằng một chữ cái viết hoa và kết thúc bằng dấu chấm
câu.
Các lệnh bổ sung:
\footnotemark

Tăng số lượng chú thích lên một và đặt dấu chú thích vào vị
trí đó.
\footnotemark[<số>]

Nó giữ nguyên số chú thích cuối trang và hiển thị ký hiệu chú
thích ở vị trí đó, được cho bởi giá trị của <số>.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.11. Lề văn bản 63

\value{<số đếm>}

Chỉ định số chú thích hiện tại, số này có thể được nhập vào
lệnh trước đó thay vì <số đếm>.
\footnotetext{<văn bản chú thích>}

Viết văn bản trong chú thích cuối trang, nhưng không thay đổi
số chú thích và không để lộ dấu chú thích ở vị trí đó.
\footnotetext[<số>]{<văn bản chú thích>}

Viết văn bản trong chú thích cuối trang dưới <số>, nhưng
không thay đổi số chú thích và không để lộ dấu chú thích ở
vị trí đó.
Chú thích cuối trang chỉ có thể chiếm một tỷ lệ nhất định
của trang, vì vậy chú thích dài hơn có thể xuất hiện trên nhiều
trang. Nếu bạn muốn vô hiệu hóa giải pháp này, bạn phải phát
đưa ra
\interfootnotelinepenalty = 10000

2.11 Lề văn bản

Lề bạn có thể viết bằng lệnh.


\marginpar{<văn bản lề>}

Theo mặc định, lề được gọi là chúng được đặt ở ngoài văn
bản. Đối với văn bản hai mặt, lề ngoài ở bên trái đối với các
bên chẵn và ở bên phải đối với các bên được đánh số lẻ. Khi
chọn ở một bên, lề ngoài luôn ở bên phải
Nếu bạn muốn cái gọi là đặt lề ở lề trong, sau đó phát hành
lệnh
\reverseemarginpar

Trở về mặc định

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


64 Chương 2. Những cơ bản soạn thảo bằng LATEX

\normalmarginpar

Trong đánh máy hai mặt, các lề sẽ ở bên trái hoặc bên phải.
Nếu bạn muốn chú thích ở bên trái khác với chú thích ở bên
phải, bạn có thể sử dụng như sau:
\marginpar[<lề trái>]{<lề phải>}

Ví dụ: nếu bạn muốn văn bản lề bên trái được căn phải, hãy sử
dụng mã sau:
\marginpar[\raggedleft <văn bản>]{<văn bản>}

Nếu bạn viết ghi chú lề ở đầu đoạn văn, bạn phải đặt trước
lệnh \marginpar bằng lệnh \leftvmode, nếu không sẽ có sự
chênh lệch mức độ giữa ghi chú lề và dòng đầu tiên của đoạn
văn. Điều này là do \marginpar không bắt đầu một đoạn văn
mới.
Không thể sử dụng lệnh \marginpar trong một số trường
hợp. Một trong những trường hợp như vậy là việc sử dụng
nó trong các hộp được mô tả sau. Lệnh \marginnote trong gói
marginnote.sty, không áp dụng các hạn chế này, có thể là một
giải pháp. Lệnh này có thể được sử dụng theo cách tương tự
như \marginpar

2.12 Quản lý màu sắc

2.12.1 Mô hình màu và thông số

Gói xcolor.sty có thể được sử dụng để quản lý màu sắc.


Nó biết nhiều mô hình màu sắc, đây chỉ là một số:
RGB Khi sử dụng RGB, phải nhập ba tham số, phân tách bằng
dấu phẩy, cả ba số nguyên từ 0 đến 255. Đầu tiên là số
lượng màu đỏ, thứ hai là màu xanh lá cây và thứ ba là
màu xanh lam.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.12. Quản lý màu sắc 65

rgb Khi sử dụng rgb, ba tham số phải được chỉ định, phân
tách bằng dấu phẩy, cả ba đều là phân số từ 0 đến 1. Đầu
tiên là số lượng màu đỏ, thứ hai là màu xanh lá cây và
thứ ba là màu xanh lam.
HTML Tham số HTML là mã thập lục phân gồm sáu chữ số của
màu. (Xem ví dụ ở đây.) Hai chữ số đầu tiên là tham số
đầu tiên của mã RGB trong hệ thống số 16 chữ số, hai
chữ số tiếp theo là tham số thứ hai của mã RGB trong
hệ thống số 16 chữ số, và cuối cùng hai chữ số cuối cùng
là tham số thứ ba của mã RGB trong hệ thống số 16 chữ
số. Ví dụ: nếu mã RGB cho màu là 186, 85, 211, thì mã
HTML là BA55D3.
cmyk Khi sử dụng cmyk, bốn tham số phải được chỉ định, phân
tách bằng dấu phẩy, mỗi tham số nằm trong khoảng từ 0
đến 1. Đầu tiên là số lượng màu lục lam, thứ hai là màu
đỏ tươi, thứ ba là màu vàng và thứ tư là màu đen.
gray có nghĩa là thang màu xám. Ở đây bạn phải nhập một
tham số là một phân số từ 0 đến 1
số (0 = đen, 1 = trắng).
wave tham số là bước sóng của màu tính bằng nanomet. Giá
trị bước sóng là một phần nhỏ giữa 363 và 814.
Các bảng màu RGB, rgb và HTML về cơ bản giống nhau, ngoại
trừ cách chỉ định ba màu cơ bản là khác nhau. Việc trộn màu
của màn hình được thực hiện theo bảng màu RGB, nhưng máy
in sử dụng bảng màu cmyk. Do đó, nếu bạn muốn tài liệu đã
chỉnh sửa là một ấn phẩm điện tử, tức là để đọc nó trên màn
hình, thì màu sắc được pha trộn bởi gói xcolor.sty phải được
tạo ra tương ứng. Để thực hiện việc này, hãy sử dụng tùy chọn
rgb trong gói xcolor.sty. Nếu tài liệu được in, hãy sử dụng
tùy chọn cmyk trong gói xcolor

2.12.2 Tên màu

Gói xcolor.sty cũng chứa các màu được xác định trước,
chính xác hơn là bạn có thể tham khảo các màu có thông số

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


66 Chương 2. Những cơ bản soạn thảo bằng LATEX

nhất định dưới một tên nhất định. Đây là những điều sau đây:

black gray olive teal


blue green orange violet
brown lightgray pink white
cyan lime purple yellow
darkgray magenta red

Bạn cũng có thể định nghĩa tên màu bằng lệnh sau:
\definecolor{<tên màu>}{<mô hình>} {<tham số màu>} %trong g
ói xcolor.sty

7 Ví dụ 2.61 8: 2
\definecolor{xam}{gray}{0.8}
\definecolor{nau}{RGB}{128,64,0}
\color{xam}{\rule{1cm}{10pt}}\\
\color{nau}{\rule{1cm}{10pt}}

Bạn cũng có thể nhập tên màu khác bằng cách trộn hai
màu với một tên cụ thể:
<tên màu 1>!<số phần trăm>!<tên màu 2>

có nghĩa là để trộn màu <số phần trăm> phần trăm <tên


màu 1> (100 - <số phần trăm>) trộn màu<tên màu 2>. Ví dụ
green!30!yellow
7 Ví dụ 2.62 8: 2
\color{green!30!yellow}{\rule{1cm}{10
pt}}

Trong trường hợp này 30% xanh lục, chúng ta trộn 70%
vàng. Nếu bạn muốn trộn một màu khác với màu trắng, mã
đơn giản hơn:
<tên màu 1>!<số phần trăm> = <tên màu 1>!<số phần trăm>!
White

Ví dụ green!30

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.12. Quản lý màu sắc 67

7 Ví dụ 2.63 8: 2
\color{green!30}{\rule{1cm}{10pt}} \\
\color{green}{\rule{1cm}{10pt}}

trong trường hợp này 30% màu xanh lá cây, chúng ta trộn
70% màu trắng. Với kỹ thuật này, bạn thậm chí có thể chỉ định
một tên màu mới bằng cách trộn nhiều màu với một tên nhất
định. Ví dụ
green!30!yellow!20!black
trong trường hợp này 30% màu xanh lá cây, chúng ta trộn
20% màu vàng và 50% màu đen còn lại.
Bạn cũng có thể xác định tên màu với tên màu đã xác định
trước đó:
\colorlet{<tên màu mới>}{<tên màu cũ>} %trong gói xcolor.
sty

7 Ví dụ 2.64 8: 2
\colorlet{donhat}{red!80}
\colorlet{denthat}{black}
\color{donhat}{\rule{1cm}{10pt}} \\
\color{denthat}{\rule{1cm}{10pt}}

Nếu bạn muốn chỉ định phần bổ sung của tên màu, bạn
phải đặt trước nó bằng dấu gạch ngang. Ví dụ, -yellow có
nghĩa là màu bổ sung của màu vàng.
7 Ví dụ 2.65 8: 2
\color{-yellow}{\rule{1cm}{10pt}} \\
\color{yellow}{\rule{1cm}{10pt}}

2.12.3 Văn bản màu

Bạn có thể sử dụng các lệnh sau để tô màu văn bản:


\textcolor[<mô hình màu>]{<tham số màu>}{<một đoạn>} %trong
gói xcolor.sty
\textcolor{<tên màu>}{<một đoạn>} %trong gói xcolor.sty

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


68 Chương 2. Những cơ bản soạn thảo bằng LATEX

{\color[<mô hình màu>]{<thông số màu>} <thêm đoạn>} %trong


gói xcolor.sty
{\color{<tên màu>} <nhiều đoạn>} %trong gói xcolor.sty

7 Ví dụ 2.66 8: 2
\colorlet{red}{red!80} Văn bản màu đỏ.
\textcolor{red}{Văn bản màu đỏ.} Văn bản màu xanh
\\ lục.
\textcolor[RGB]{0,255,0} {Văn bản Văn bản màu xám.
màu xanh lục.}\\
{\color {black!50} Văn bản màu xá
m.}

2.12.4 Trong suốt

Bạn có thể điều chỉnh độ trong suốt của màu hiện tại của
văn bản bằng các lệnh sau:
\texttransparent{<thông số>}{<một đoạn>} %gói transparent.
sty
\transparent{<thông số>}<nhiều đoạn văn> %gói transparent.
sty

Giá trị của <thông số> là một số từ 0 đến 1. 0 có nghĩa là


hoàn toàn minh bạch và 1 có nghĩa là không minh bạch. Ví dụ

7 Ví dụ 2.67 8
\color{red}Hà Nội, \texttransparent {0.2}{Hà Nội}
: 2
Hà Nội, Hà Nội

2.12.5 Đánh dấu văn bản trên nền màu

Để thực hiện việc này, hãy sử dụng gói soulutf8.sty ngoài


gói xcolor.sty. Sau đó, bạn có thể sử dụng các lệnh sau:
\sethlcolor{<tên màu>}} %gói soulutf8.sty
\hl{<văn bản>} %gói soulutf8.sty

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.12. Quản lý màu sắc 69

Lệnh \sethlcolor chỉ định màu của vùng đánh dấu. Mặc
định là màu vàng. \hl sẽ tô màu nền của <văn bản>, có thể bao
gồm một số dòng hoặc một số đoạn văn.
7 Ví dụ 2.68 8: 2
\hl{Đây là văn bản quan trọ Đây là văn bản quan trọng,
ng, nó được đánh dấu!} nó được đánh dấu!

Nếu bạn đã tải gói xcolor.sty với một số tùy chọn bảng
màu (rgb, cmyk, v.v.), mã trước đó sẽ cho kết quả không chính
xác. Để giải quyết vấn đề này, hãy nhập mã sau sau khi tải
soulutf8.sty (nguồn tại đây):
\usepackage{etoolbox}
\makeatletter
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\newdimen\SOUL@dimen
\makeatother

2.12.6 Đánh dấu văn bản với gạch chân màu

Để thực hiện việc này, hãy sử dụng gói soulutf8.sty ngoài


gói xcolor.sty. Sau đó, bạn có thể sử dụng các lệnh sau:
\setul{<độ sâu>}{<độ dày đường viền>} %gói soulutf8.sty
\setulcolor{<tên màu>}} %gói soulutf8.sty
\ul{<văn bản>} %gói soulutf8.sty

Tham số <độ sâu> của lệnh \setul đặt mức độ dày của
đường gạch chân bên dưới đường cơ bản và <độ dày đường
viền> là độ dày của đường kẻ. Tham số <tên màu> của lệnh
\setulcolor chỉ định màu của gạch dưới. Mặc định là màu
đen. Lệnh \ul gạch dưới phần <văn bản>, phần này có thể bao
gồm một số dòng hoặc một số đoạn văn. Ví dụ

7 Ví dụ 2.69 8
\setul{1pt}{1pt}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


70 Chương 2. Những cơ bản soạn thảo bằng LATEX

\setulcolor{blue}
\ul{Đây là văn bản quan trọng, nó được gạch dưới màu xanh
lam!}
: 2
Đây là văn bản quan trọng, nó được gạch dưới màu xanh
lam!
Lệnh \ul có cùng vấn đề với lệnh \hl và cùng một giải pháp.

2.12.7 Đánh dấu văn bản bằng các nét màu

Để thực hiện việc này, hãy sử dụng gói soulutf8.sty ngoài


gói xcolor.sty. Sau đó, bạn có thể sử dụng các lệnh sau:
\setstcolor{<tên màu>} %gói soulutf8.sty
\st{<văn bản>} %gói soulutf8.sty

Tham số <tên màu> của lệnh \setstcolor chỉ định màu của
gạch ngang. Mặc định là màu đen. Lệnh \st kéo phần <văn
bản>, có thể bao gồm một số dòng hoặc một số đoạn văn. Ví dụ

7 Ví dụ 2.70 8
\setstcolor{blue}
\st{Văn bản này bị gạch ngang màu xanh lam.}
: 2
Văn bản này bị gạch ngang màu xanh lam.
Lệnh \st có cùng vấn đề với lệnh \hl và cùng một giải pháp.

2.12.8 Trang màu

Đây là cách đặt màu nền của trang:


\pagecolor[<mô hình màu>]{<tham số màu>} %gói xcolor.sty
\pagecolor{<tên màu>} %gói xcolor.sty

Đặt lại màu một trang bằng lệnh


\nopagecolor %gói xcolor.sty

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


2.13. Đơn vị đo lường 71

2.13 Đơn vị đo lường

Luôn phải có một nửa dấu trắng không thể tách rời giữa
một số và một đơn vị đo lường.

7 Ví dụ 2.71 8
123\,cm 1200\,km 50\,\% 1000\,Ft 500\,\$ 10\,\AA
: 2
123 cm 1200 km 50 % 1000 Ft 500 $ 10 Å

7 Ví dụ 2.72 8: 2
20\,\textcelsius %gói textcomp.sty 20 ℃1 %5 %
1\,\textperthousand %gói textcomp.sty
5\,\textpertenthousand %gói textcomp.
sty

Có một ngoại lệ cho quy tắc này khi viết một góc theo độ,
phút và giây. Sau đó, không có khoảng trống sau thước đo.
Cách dễ nhất để viết điều này là
\ang{<độ góc>;<độ phút>;<độ dây>} %góc siunitx.sty

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 3. DANH SÁCH
VÀ THAM KHẢO CHÉO

3.1. Danh sách không đánh số . . . . . . . . . . . . . . . . . . . . . . . . 73


3.1.1. Thay đổi dấu đầu dòng . . . . . . . . . . . . . . . . . . . . 74
3.1.2. Danh sách không đánh số với khoảng cách dọc .
76
3.2. Danh sách mô tả. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3. Danh sách được đánh số . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.3.1. Thay đổi kiểu đánh số cho danh sách được đánh
số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.3.2. Tham chiếu đến một mục đánh số . . . . . . . . . 85
3.3.3. Danh sách đánh số với khoảng trắng dọc . . 86
3.3.4. Danh sách được đánh số thứ tự ngang . . . . . 87
3.4. Đặt tham số danh sách enumitem.sty . . . . . . . . . . . . . 88
3.4.1. Những hạn chế của gói lệnh . . . . . . . . . . . . . . . 88
3.4.2. Định dạng danh sách toàn cục . . . . . . . . . . . . . 89
3.4.3. Định dạng cục bộ của danh sách. . . . . . . . . . . 92
3.4.4. Danh sách theo hàng . . . . . . . . . . . . . . . . . . . . . . 94
3.4.5. Định nghĩa môi trường danh sách mới . . . . 95
3.5. Tham khảo chéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.5.1. Gán thẻ nhãn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.1. Danh sách không đánh số 73

3.5.2. Liên kết đến các mục được gắn thẻ . . . . . . . . 97


3.6. Nguyên văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.7. Ghi văn bản vào một tệp . . . . . . . . . . . . . . . . . . . . . . . . 101
3.7.1. Gói lệnh newfile.sty . . . . . . . . . . . . . . . . . . . . . . 102
3.7.2. Gói lệnh answers.sty . . . . . . . . . . . . . . . . . . . . . 105
3.7.3. Mã chương trình . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.8. Gói lệnh url.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
3.9. Gói hyperref.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

3.1 Danh sách không đánh số

Môi trường lặp lại có thể được sử dụng cho các danh sách
không được đánh số. Mỗi mục trong danh sách được giới thiệu
bằng lệnh \item
\begin{itemize}
\item <nội dung thư mục>
\item <nội dung thư mục>
\end{itemize}

Các môi trường này có thể được lồng vào bốn cấp độ sâu. Ví dụ:

7 Ví dụ 3.1 8
Văn bản trước danh sách.
\begin{itemize}
\item Danh sách mục ở cấp độ đầu tiên.
\begin{itemize}
\item Danh sách mục ở cấp độ thứ hai.
\item Mục danh sách khác ở cấp độ thứ hai.
\end{itemize}
\item Mục danh sách khác ở cấp độ đầu tiên.
\end{itemize}
Văn bản sau danh sách.
: 2
Văn bản trước danh sách.
• Danh sách mục ở cấp độ đầu tiên.
– Danh sách mục ở cấp độ thứ hai.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


74 Chương 3. Danh sách và tham chiếu chéo

– Mục danh sách khác ở cấp độ thứ hai.


• Mục danh sách khác ở cấp độ đầu tiên.
Văn bản sau danh sách.

3.1.1 Thay đổi dấu đầu dòng

Nếu bạn chỉ muốn thay đổi ký hiệu của một mục danh sách
cụ thể, hãy sử dụng lệnh \item.
Trong tùy chọn, bạn có thể:

\item[<ký hiệu>]<phần tử danh sách>

7 Ví dụ 3.2 8
\begin{itemize}
\item[\textasteriskcentered] Ôi con sóng ngày xưa.
\item[\textbullet] Và ngày sau vẫn thế.
\item Nỗi khát vọng tình yêu.
\end{itemize}

: 2
* Ôi con sóng ngày xưa.
• Và ngày sau vẫn thế.
• Nỗi khát vọng tình yêu.

Nếu bạn muốn thay đổi ký hiệu cho một mức cụ thể trong
một danh sách nhất định, hãy sử dụng [label=<ký hiệu>] cho
gói lệnh enumitem.sty và [<ký hiệu>] cho gói paralist.sty sau
đây:

\begin{itemize}[label=<ký hiệu>] %trong gói enumitem.sty


\item <phần tử danh sách>
\item <phần tử danh sách>
\end {itemize}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.1. Danh sách không đánh số 75

7 Ví dụ 3.3 8: 2
\begin{itemize}[label=\ding{43}] ☞ Trước muôn
\item Trước muôn trùng sóng bể trùng sóng bể
\item Em nghĩ về anh, em
\end{itemize} ☞ Em nghĩ về anh,
em

Một cách khác


7 Ví dụ 3.4 8: 2
\renewcommand{\labelitemi}{\ding{
✍ Em nghĩ về biển
45}}
lớn
\begin{itemize}
\item Em nghĩ về biển lớn ✍ Từ nơi nào sóng
\item Từ nơi nào sóng lên? lên?
\end{itemize}

Nếu bạn muốn thay đổi các ký tự mặc định trong danh sách,
hãy nhập như sau thì là ở:
\renewcommand{\labelitemi}{<cấp độ 1.>}%trong gói enumitem
.sty
\renewcommand{\labelitemii}{<cấp độ 2.>}
\renewcommand{\labelitemiii}{<cấp độ 3.>}
\renewcommand{\labelitemiv}{<cấp độ 4.>}

Ví dụ: nếu bạn tải gói pifon.sty,

7 Ví dụ 3.5 8
\renewcommand{\labelitemi}{\ding{42}}
\renewcommand{\labelitemii}{\ding{43}}
\renewcommand{\labelitemiii}{\ding{44}}
\renewcommand{\labelitemiv}{\ding{45}}
\begin{itemize}
\item Mục danh sách.
\begin{itemize}
\item Mục danh sách.
\begin{itemize}
\item Mục danh sách.
\begin{itemize}
\item Mục cuối.
\end{itemize}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


76 Chương 3. Danh sách và tham chiếu chéo

\end{itemize}
\end{itemize}
\end{itemize}
: 2
☛ Mục danh sách.
☞ Mục danh sách.
✌ Mục danh sách.
✍ Mục cuối.

3.1.2 Danh sách không đánh số với khoảng cách dọc

Môi trường lặp lại để lại một khoảng trống bổ sung theo
chiều dọc giữa mỗi mục danh sách. Nếu bạn không muốn điều
này, hãy sử dụng lệnh \setlist{noitemsep} của gói enumitem.
sty. Điều này sẽ được sử dụng chính xác như môi trường lặp
lại được mô tả ở trên.
7 Ví dụ 3.6 8: 2
% \setlist{noitemsep} Văn bản trước danh
Văn bản trước danh sách. sách.
\begin{itemize}
☞ Mục danh sách
\item[\ding{43}] Mục danh sách
\item[\ding{47}] Mục danh sách ✏ Mục danh sách
khác khác
\end{itemize} Văn bản sau danh sách.
Văn bản sau danh sách.

3.2 Danh sách mô tả


Môi trường mô tả dành cho danh sách mô tả, tức là danh
sách giống như từ điển. Mỗi mục trong danh sách được đặt
trước bằng lệnh \item [<nhãn>]. Những môi trường này sâu tới
sáu cấp độ có thể được lồng vào nhau.
\begin{description}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.2. Danh sách mô tả 77

\item[<nhãn>] mục danh sách


\item[<nhãn>] mục danh sách
\end{description}

7 Ví dụ 3.7 8: 2
\begin{description} Ngày đêm không ngủ
\item[Ngày đêm] không ngủ đư
được
ợc
\item [Lòng em] nhớ đến anh Lòng em nhớ đến anh
\end{description}

Theo mặc định, nhãn được in đậm. Ví dụ: bạn có thể thay
đổi điều này thành chữ nghiêng bằng cách gõ lệnh sau
\renewcommand{\descriptionlabel}[1] {\hspace{\labelsep}
\normalfont\itshape#1}

7 Ví dụ 3.8 8
\renewcommand{\descriptionlabel}[1]{\hspace{\labelsep}
\normalfont\itshape#1}
\begin{description}
\item[Sai lầm] lớn nhất đời người là dùng sức khỏe để đánh
đổi lấy những vật ngoài thân.
\item [Bi ai] lớn nhất đời người là dùng sinh mệnh để đổi
lấy phiền não
\item[và lãng phí] lớn nhất đời người là dùng tính mạng để
giải quyết rắc rối do bản thân mình tạo ra!
\end{description}
: 2
Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân.
Bi ai lớn nhất đời người là dùng sinh mệnh để đổi lấy
phiền não
và lãng phí lớn nhất đời người là dùng tính mạng để giải
quyết rắc rối do bản thân mình tạo ra!

Nếu bạn muốn loại bỏ thêm khoảng trống theo chiều dọc
giữa các mục danh sách, hãy sử dụng môi trường lệnh lệnh \

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


78 Chương 3. Danh sách và tham chiếu chéo

setlist{noitemsep} của gói enumitem.sty, lệnh này ta đặt ngay


ở đầu nên có tác dụng với mọi danh sách.

7 Ví dụ 3.9 8
%\setlist{noitemsep}
\begin{description}
\item[Tiền bạc] khó mua được sức khỏe nhưng sức khỏe sẽ đượ
c tăng cường hơn nhờ tiền bạc.
\item [Tiền bạc] khó mua được hạnh phúc nhưng muốn có hạnh
phúc, buộc phải có sức khỏe.
\end{description}

: 2
Tiền bạc khó mua được sức khỏe nhưng sức khỏe sẽ được
tăng cường hơn nhờ tiền bạc.
Tiền bạc khó mua được hạnh phúc nhưng muốn có hạnh
phúc, buộc phải có sức khỏe.

3.3 Danh sách được đánh số

Môi trường liệt kê cho danh sách được đánh số. Mỗi mục
trong danh sách được đặt trước bằng lệnh \item

\begin{enumerate}
\item <phần tử danh sách>
\item <phần tử danh sách>
\end{enumerate}

Các môi trường này có thể được lồng vào bốn cấp độ sâu. Việc
đánh số các cấp trong trường hợp tùy chọn theo mặc định: chữ
số Ả Rập, chữ thường của bảng chữ cái Latinh, chữ thường của
bảng chữ cái Hy Lạp, chữ hoa của bảng chữ cái Latinh. Ví dụ:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.3. Danh sách được đánh số 79

7 Ví dụ 3.10 8: 2
Văn bản trước danh sách. Văn bản trước danh sách.
\begin{enumerate}
1. Ở ngoài kia đại dương
\item Ở ngoài kia đại dương
\begin{enumerate} 1.1. Trăm nghìn con
\item Trăm nghìn con sóng đ sóng đó
ó 1.2. Con nào chẳng tới
\item Con nào chẳng tới bờ bờ
\end{enumerate}
\item Dù muôn vời cách trở 2. Dù muôn vời cách trở
\end{enumerate} Văn bản sau danh sách.
Văn bản sau danh sách.

Ta có thể đánh số các cấp độ: chữ số La Mã viết hoa: \Roman,


chữ số Ả Rập \romant, chữ cái viết hoa của bảng chữ cái Latinh
\Alph, chữ cái viết thường của bảng chữ cái Latinh \alph. Nếu
bạn sử dụng tùy chọn label=\Roman*.
7 Ví dụ 3.11 8: 2
Văn bản trước danh sách. Văn bản trước danh sách.
\begin{enumerate}[label=\Roman
I. Ở ngoài kia đại
*.]
dương
\item Ở ngoài kia đại dương
\begin{enumerate}[label=\Alph* A. Trăm nghìn con
.] sóng đó
\item Trăm nghìn con sóng đó B. Con nào chẳng
\item Con nào chẳng tới bờ tới bờ
\end{enumerate}
\item Dù muôn vời cách trở II. Dù muôn vời cách trở
\end{enumerate} Văn bản sau danh sách.
Văn bản sau danh sách.

3.3.1 Thay đổi kiểu đánh số cho danh sách được


đánh số

Nếu bạn không muốn đánh số một mục danh sách cụ thể
trong danh sách được đánh số, nhưng chỉ thêm một ký tự, bạn
có thể chỉ định điều này trong tùy chọn lệnh \item:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


80 Chương 3. Danh sách và tham chiếu chéo

\item[<ký hiệu>]< phần tử danh sách>

Sau đó, số lượng không tăng. Ví dụ


7 Ví dụ 3.12 8: 2
\begin{enumerate}
1. Mây vẫn bay về xa
\item Mây vẫn bay về xa
\item[---] Làm sao được tan — Làm sao được tan ra
ra 2. Thành trăm con sóng
\item Thành trăm con sóng nhỏ
nhỏ — Giữa biển lớn tình yêu
\item[---] Giữa biển lớn tì
nh yêu 3. Để ngàn năm còn vỗ
\item Để ngàn năm còn vỗ
\end{enumerate}

Nếu bạn chỉ muốn thay đổi cách đánh số của một cấp cụ thể
trong một danh sách nhất định, hãy sử dụng cách sau:
\begin{enumerate} [<nhãn>] %trong gói enumitem.sty
\item <Danh sách 1>
\item <Danh sách 2>
\end{enumerate}

<nhãn> có thể chứa bất kỳ ký tự nào, nhưng năm lệnh chịu


trách nhiệm thiết lập kiểu đánh số:
\label=\arabic* đánh số Ả Rập:1,2,3,...
\label=\romam* đánh số la mã nhỏ:i,ii,iii,...
\label=\Romam* đánh số La Mã lớn, I,I,III,...
\label=\alph* đánh số chữ thường của bảng chữ cái Latinh.
\label=\Alph* Viết hoa bảng chữ cái Latinh (chữ và số).
<nhãn> chỉ có thể chứa một trong những chữ cái này.
7 Ví dụ 3.13 8: 2
\begin{enumerate}[ I. Con sóng dưới lòng
leftmargin=*,label={\
sâu
bfseries \Roman*. Con só
ng }] II. Con sóng trên mặt
\item dưới lòng sâu nước
\item trên mặt nước
\end{enumerate}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.3. Danh sách được đánh số 81
7 Ví dụ 3.14 8: 2
\begin{enumerate}[label=\
(i) Ôi con sóng nhớ bờ
itshape(\roman*)]
\item Ôi con sóng nhớ bờ (ii) Ngày đêm không ngủ
\item Ngày đêm không ngủ đư được
ợc
\end{enumerate}

Mỗi cấp độ trong số bốn cấp độ có một cái gọi là với bộ đếm:
enumi là tên của số đếm cấp 1
enumii là tên của số đếm cấp 2
enumiii là tên số đếm cấp 3
enumiv là tên của số đếm cấp 4
Có một số cách để hiển thị bộ đếm:
\arabic{<số đếm>} Với chữ số Ả Rập (1, 2, 3, ...).
\roman{<số đếm>} Với một chữ số La mã nhỏ (i, ii, iii, ...).
\Roman{<số đếm>} Với một chữ số La Mã lớn (I, II, III, ...).
\alph{<số đếm>} Với các chữ cái viết thường của bảng chữ cái
Latinh (a, b, c, ...).
\Alph{<số đếm>} Với các chữ cái viết hoa của bảng chữ cái Lat-
inh (A, B, C, ...).
\greek{<số đếm>} trong gói moreenum.sty. Với các chữ cái viết
thường của bảng chữ cái Hy Lạp (α, β, γ,, ...).
\Gree{<số đếm>} trong gói moreenum.sty. Các chữ cái viết hoa
trong bảng chữ cái Hy Lạp ( A, B, Γ...).Ví dụ
\Roman{enumii}
in số cấp thứ hai hiện tại của danh sách đã cho với một chữ số
La Mã lớn. Nếu bạn muốn thay đổi cách đánh số mặc định của
cấp đầu tiên thành đánh số La Mã lớn, bạn có thể làm như vậy
với mã sau:
\renecommand{\theenumi}{\Roman{enumi}}
Bạn thậm chí có thể đặt cách số này được hiển thị. Ví dụ:
nếu bạn muốn nó được in đậm sau dấu chấm, hãy làm như
sau:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


82 Chương 3. Danh sách và tham chiếu chéo

\renecommand{\labelenumi}{\bfseries \theenumi.}
Hãy thử mã sau
\renewcommand{\theenumi}{\arabic{enumi}}
\renewcommand{\theenumii}{\alph{enumii}}
\renewcommand{\theenumiii}{\roman{enumiii}}
\renewcommand{\theenumiv}{\Alph{enumiv}}
\renewcommand{\labelenumi}{\theenumi.}
\renewcommand{\labelenumii}{\itshape(\theenumii)}
\renewcommand{\labelenumiii}{\theenumiii.}
\renewcommand{\labelenumiv}{\theenumiv.}

7 Ví dụ 3.15 8: 2
\begin{enumerate}
1. Cuộc đời tuy dài thế
\item Cuộc đời tuy dài thế
\begin{enumerate} (a) Năm tháng vẫn đi
\item Năm tháng vẫn đi qua
qua
i. Như biển kia
\begin{enumerate}
\item Như biển kia dẫu dẫu
\begin{enumerate} A. Mây vẫn
\item Mây vẫn bay bay
\end{enumerate}
\item Như biển kia dẫu ii. Như biển kia
\end{enumerate} dẫu
\item Năm tháng vẫn đi (b) Năm tháng vẫn đi
qua qua
\end{enumerate}
\item Cuộc đời tuy dài thế 2. Cuộc đời tuy dài thế
\end{enumerate}

Một ví dụ khác
\renewcommand{\theenumi}{\arabic{enumi}}
\renewcommand{\theenumii}{\arabic{enumii}}
\renewcommand{\theenumiii}{\arabic{enumiii}}
\renewcommand{\labelenumi}{\theenumi.}
\renewcommand{\labelenumii}{\theenumi.\theenumii.}
\renewcommand{\labelenumiii}{\theenumi.\theenumii.\
theenumiii.}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.3. Danh sách được đánh số 83

7 Ví dụ 3.16 8: 2
\begin{enumerate}
1. Cuộc đời tuy dài thế
\item Cuộc đời tuy dài thế
\begin{enumerate} 1.1. Năm tháng vẫn đi
\item Năm tháng vẫn đi qua
qua
1.1.1. Như biển kia
\begin{enumerate}
\item Như biển kia dẫu dẫu rộng
rộng 1.2. Năm tháng vẫn đi
\end{enumerate} qua
\item Năm tháng vẫn đi
qua 2. Cuộc đời tuy dài thế
\end{enumerate}
\item Cuộc đời tuy dài thế
\end{enumerate}

Bạn có thể thêm các lệnh mới vào bộ đếm. Ví dụ: sau khi
tải gói pifon.sty, đoạn mã sau
\newcommand{\dingI}[1]
{\ifcase\value{#1}\or\ding{172}\or\ding{173}\or\ding{174}\
or\ding{175}\or\ding{176}\or\ding{177}\or\ding{178}\or\
ding{179}\or\ding{180}\or\ding{181}\else\ding{109}\fi}

định nghĩa lệnh \dingI{<số đếm>} hiển thị bộ đếm như sau: ①,
②,...,⑩, ❍,.... Một ví dụ khác, cũng sau khi tải gói pifon:
\newcommand{\dingII}[1]
{\ifcase\value{#1}\or\ding{182}\or\ding{183}\or\ding{184}\
or\ding{185}\or\ding{186}\or\ding{187}\or\ding{188}\or\
ding{189}\or\ding{190}\or\ding{191}\else\ding{108}\fi}

xác định lệnh \dingII{<số đếm>} hiển thị bộ đếm như sau:
❶,❷,...,❿, ●,... Sau đó đặt lại hai cấp đầu tiên như sau:
\renewcommand{\theenumi}{\dingI{enumi}}
\renewcommand{\theenumii}{\dingII{enumii}}
\renewcommand{\labelenumi}{\theenumi}
\renewcommand{\labelenumii}{\theenumii}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


84 Chương 3. Danh sách và tham chiếu chéo

7 Ví dụ 3.17 8: 2
\begin{enumerate}
①. Ôi con sóng ngày xưa.
\item Ôi con sóng ngày xưa.
\item Và ngày sau vẫn thế. ②. Và ngày sau vẫn thế.
\begin{enumerate} ❶. Em nghĩ về biển
\item Em nghĩ về biển lớn lớn
\item Từ nơi nào sóng lên?
\end{enumerate} ❷. Từ nơi nào sóng
\item Nỗi khát vọng tình yê lên?
u. ③. Nỗi khát vọng tình yêu.
\end{enumerate}

Có một cách khác để định hình lại toàn cầu kiểu đánh số
của các cấp:
\setdefaultenum{<dấu cấp 1>}{<dấu cấp 2>}{<dấu cấp 3>} {<dấu c
ấp 4>}
%%trong gói lệnh paralist

Nếu bạn không muốn xác định lại kiểu đánh số của một
cấp, hãy để trống khoảng trống của cấp đó. Sau đó. đánh <dấu
cấp ...> có thể chứa bất kỳ ký tự nào, nhưng năm ký tự chịu
trách nhiệm thiết lập kiểu đánh số:
1 đánh số Ả Rập
i đánh số la mã nhỏ
I đánh số La Mã lớn
a đánh số chữ thường của bảng chữ cái Latinh (chữ và số)
A chữ hoa bảng chữ cái Latinh (chữ và số)

7 Ví dụ 3.18 8
\setdefaultenum{\bfseries I. {Câu thơ.}}{\itshape (a)}{i)}{
A)}
\begin{enumerate}
\item Năm tháng vẫn đi qua
\begin{enumerate}
\item Năm tháng vẫn đi qua
\begin{enumerate}
\item Năm tháng vẫn đi qua
\begin{enumerate}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.3. Danh sách được đánh số 85

\item Năm tháng vẫn đi qua


\end{enumerate}
\item Năm tháng vẫn đi qua
\end{enumerate}
\item Năm tháng vẫn đi qua
\end{enumerate}
\item Năm tháng vẫn đi qua
\end{enumerate}
: 2
I. Câu thơ. Năm tháng vẫn đi qua
(a) Năm tháng vẫn đi qua
i) Năm tháng vẫn đi qua
A) Năm tháng vẫn đi qua
ii) Năm tháng vẫn đi qua
(b) Năm tháng vẫn đi qua
II. Câu thơ. Năm tháng vẫn đi qua

3.3.2 Tham chiếu đến một mục đánh số

Trong các tham chiếu chéo, chúng ta đã thấy cách tham


chiếu đến một mục danh sách.

7 Ví dụ 3.19 8
\begin{enumerate}
\item Đây là một mục trong danh sách.
\item \label{lite:01} Đây là một mục danh sách khác.
\end{enumerate}
Trong danh mục \ref{lite:01}. ~ Do mục danh sách \dots.
: 2
1. Đây là một mục trong danh sách.
2. Đây là một mục danh sách khác.
Trong danh mục 2. Do mục danh sách . . . .
Điều gì xảy ra nếu chúng ta muốn tham chiếu đến một phần

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


86 Chương 3. Danh sách và tham chiếu chéo

tử của mức thứ hai?

7 Ví dụ 3.20 8
\begin{enumerate}
\item Đây là một mục trong danh sách.
\begin{enumerate}
\item \label{lite:02} Đây là một mục danh sách khác.
\end{enumerate}
\end{enumerate}
Trong danh mục \ref{lite:02}. ~ Do mục danh sách \dots.
: 2
1. Đây là một mục trong danh sách.
(a) Đây là một mục danh sách khác.
Trong danh mục a. Do mục danh sách . . . .
Chúng ta thấy rằng không chỉ số lượng của mục danh sách
nhất định được hiển thị, mà còn hiển thị mục danh sách mà nó
nằm ở phía trước nó. Mục danh sách này được gọi là tiếp đầu
ngữ. Các tiền tố này có thể được thay đổi. Ví dụ
\makeatletter
\renewcommand{\p@enumii}{\theenumi} % tiếp đầu bậc 2.
\renewcommand{\p@enumiii}{\p@enumii(\theenumii)} % bậc 3.
\renewcommand{\p@enumiv}{\p@enumiii\theenumiii-} % bậc 4.
\makeatother

hình dạng của các tham chiếu:


Cấp độ 1: 1
Cấp độ 2: 1a
Cấp độ 3: 1 (a) β
Cấp độ 4: 1 (a) β-A

3.3.3 Danh sách đánh số với khoảng trắng dọc

Nếu bạn không muốn có thêm khoảng trống theo chiều


dọc giữa các mục trong danh sách, thì sử dụng môi trường
compactenum của gói paralist.sty thay vì môi trường liệt kê.
Việc sử dụng nó hoàn toàn giống với môi trường liệt kê.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.3. Danh sách được đánh số 87

\begin{compactenum} % paralist.sty
\item <danh mục danh sách>
\item <danh mục danh sách>
\end {compactenum}

7 Ví dụ 3.21 8: 2
Văn bản trước. Văn bản trước.
\begin{compactenum} 1. Dữ dội và dịu êm
\item Dữ dội và dịu êm (a) Ồn ào và lặng lẽ
\begin{compactenum}
văn bản sau.
\item Ồn ào và lặng lẽ
\end{compactenum}
\end{compactenum}
văn bản sau.

Trong gói lệnh enumitem.sty đặt ngay ở đầu: \setlist{


noitemsep} và \setlist{nolistsep} cũng tác dụng tương tự.

3.3.4 Danh sách được đánh số thứ tự ngang

Môi trường inparaenum của gói paralist.sty có thể được sử


dụng cho việc này:
\begin{inparaenum}[<nhãn>] % trong gói paralist.sty
\item <phần tử danh sách>
\item <phần tử danh sách>
\end {inparaenum}

<nhãn> có thể được đặt chính xác như được mô tả cho môi
trường liệt kê (mặc định câu lệnh: 1.).
7 Ví dụ 3.22 8 : 2
\begin{inparaenum}
1. Dữ dội và dịu êm. 2. Ồn ào và
\item Dữ dội và dịu êm
lặng lẽ
.
\item Ồn ào và lặng lẽ
\end{inparaenum}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


88 Chương 3. Danh sách và tham chiếu chéo
7 Ví dụ 3.23 8 : 2
\begin{inparaenum}[\
i. Dữ dội và dịu êm. ii. Ồn ào và
itshape i.]
lặng lẽ
\item Dữ dội và dịu êm
.
\item Ồn ào và lặng lẽ
\end{inparaenum}

3.4 Đặt tham số danh sách enumitem.sty

Bạn có thể muốn đọc phần này nếu bạn đã xem lại các mô
tả trước đó của danh sách. Chúng bao gồm một số tùy chọn cài
đặt. Bây giờ chúng ta giới thiệu gói enumitem, với các cài đặt
này và nhiều cài đặt khác có thể được chỉ định một cách thuận
tiện.

3.4.1 Những hạn chế của gói lệnh

Có ba hạn chế cần xem xét khi sử dụng gói enumitem.sty.


1. Không thể sử dụng với gói paralist.sty nếu đặt sau
enumitem.sty.
2. Khi sử dụng tùy chọn defaults một số ngôn ngữ các nhãn
không xuất hiện ở cấp 3 của danh sách được đánh số. Lý
do là trong trường hợp này, ở cấp độ này, bộ đếm là các
chữ cái viết thường của bảng chữ cái Hy Lạp, không được
xử lý theo mặc định bởi enumitem. Giải pháp là sau khi
tải enumitem, hãy nhập nội dung sau vào phần mở đầu:
\usepackage{moreenum}
\setlist[enumerate,3]{label=\textit{\greek*)}}

3. Các khoảng trắng ngang được đặt xung quanh các nhãn
của danh sách mô tả. Để giải quyết vấn đề, sau khi tải
enumitem, hãy nhập nội dung sau vào phần mở đầu:
\refreshcommand{\descriptionlabel}[1]{{\normalfont \
bfseries # 1}.}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.4. Đặt tham số danh sách enumitem.sty 89

3.4.2 Định dạng danh sách toàn cục

Để thiết lập danh sách chung, hãy sử dụng lệnh sau:


\setlist[<tùy chọn>] {<định dạng>} %trong gói enumitem.sty

Được sử dụng mà không có tùy chọn, <định dạng> được chỉ


định áp dụng cho tất cả các cấp của mỗi danh sách. Nếu <đị
nh dạng> chỉ áp dụng cho các cấp nhất định trong môi trường
danh sách nhất định, thì các tên ngữ cảnh và số cấp này phải
được chỉ định dưới dạng một tùy chọn. Ví dụ
\setlist[enumerate,itemize,1,2]{<định dạng>}
Nếu bạn không chỉ định số cấp, <định dạng> sẽ áp dụng cho
tất cả các cấp của môi trường danh sách được chỉ định. Ví dụ
\setlist[enumerate,itemize]{<định dạng>}
Nếu bạn không chỉ định môi trường danh sách, thì <định dạ
ng> sẽ áp dụng cho các mức được chỉ định cho từng môi trường
danh sách. Ví dụ
\setlist[1,2]{<định dạng>}
Bây giờ chúng ta chuyển sang các tham số có thể được chỉ
định trong <định dạng>.
Chỉ định khoảng trắng
Hình 1 cho thấy các tham số chỉ định khoảng cách của một
mức nhất định trong một danh sách nhất định. Trong hình,
partopsep nằm trong ngoặc đơn vì giá trị của nó được thêm vào
giá trị của topsep chỉ khi có một dòng trống trong nguồn trước
lệnh \begin của môi trường tạo mức đó.
Ví dụ:
\setlist[enumerate,1]{topsep=3pt,partopsep=0pt}
Nếu bạn chưa chỉ định tất cả các cài đặt giãn cách, những
cài đặt bị thiếu sẽ được xác định theo cài đặt mặc định hoặc
cài đặt trước đó.
leftmargin, itemindent, labelsep, labelwidth, labelindent và
labelsep* các tham số không độc lập với nhau vì
labelsep = labelsep* + itemindent và
leftmargin = labelindent + labelwidth + labelsep* .

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


90 Chương 3. Danh sách và tham chiếu chéo

Hình 3.4.1: Thông số số của danh sách

Do đó, các tham số này (ngoại trừ labelsep*) có thể được đặt
thành ! dấu, có nghĩa là nó tính toán giá trị của nó dựa trên
những gì bạn nhập. Ví dụ
\setlist[enumerate,1]{labelindent=1cm,labelwidth=1cm,
labelsep*=1cm,
itemindent=1cm,leftmargin=!}

hoặc
\setlist[enumerate,1]{labelindent=0cm,labelwidth=1cm,
labelsep=1cm,
leftmargin=0cm,itemindent=!}

Để có danh sách nhỏ gọn, bạn có thể đặt lại bằng hai thông số
sau
noitemsep Đặt lại phân tích cú pháp và itemsep. Ví dụ \setlist
[enumerate]{noitemsep}.
nosep Đặt lại tất cả khoảng cách theo chiều dọc trong danh
sách. Ví dụ \setlist{nosep}.
Định dạng nhãn
Sau đây là để thiết lập các nhãn danh sách.
align = <hướng> Căn chỉnh nhãn ở bên trái hoặc bên phải của

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.4. Đặt tham số danh sách enumitem.sty 91

hộp có độ rộng labelwidth nhãn dành riêng cho nhãn.


Theo đó, <hướng> có thể là left hoặc right. Mặc định là
right.
start = <một số> Số sê-ri của mục đầu tiên trong danh sách
được đánh số. Giá trị mặc định 1.
label = <lệnh ký hiệu> Định dạng nhãn cho danh sách được
đánh số hoặc không được đánh số. Ví dụ
\setlist[itemize,1]{label=\ddag}
\setlist[enumerate,1]{label=\textbf{\Roman{enumi}.}}

Trong ví dụ, \Roman* có thể được viết thay vì \Roman{enumi


}, vì phiên bản dấu hoa thị luôn đề cập đến bộ đếm hiện
tại. Tất nhiên, \Roman có thể được thay thế bằng \arabic,
\alph, v.v. Ví dụ
\setlist[enumerate,2]{label=\textit{(\alph*)}}
Các ký tự của gói pifon.sty cũng có thể được sử dụng
như một bộ đếm. Để thực hiện việc này, bạn có thể nhập
giá trị của bộ đếm hiện tại trong lệnh \ding dưới dạng
\value{<số đếm>}. Ví dụ
\setlist[enumerate,1]{start=172,label=\ding{\value{
enumi}}}
Giá trị bắt đầu là 172 vì \ding{172} là kết quả của ①, \
ding{173} là kết quả của ②, v.v. Lệnh \value cũng có phiên
bản dấu hoa thị, đây là bộ đếm hiện tại bao gồm. Do đó,
mã trước đó tương đương với:
\setlist[enumerate,1]{start=172,label=\ding{\value*}}
label* = <lệnh ký hiệu> Giống như label, nhưng trong trường
hợp này, nhãn được bổ sung với nhãn của cấp trước đó. Ví
dụ
\setlist[itemize]{label*=\textbullet}
\setlist[enumerate]{label*=\arabic*.}

trong trường hợp lặp lại các nhãn mức lần lượt là •, ••,
• • • và • • ••, trong khi các nhãn mức liệt kê tương ứng là
1, 1.1, 1.1.1. và 1.1.1.1, trong đó 1 được thay thế bằng số
tương ứng với mục danh sách.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


92 Chương 3. Danh sách và tham chiếu chéo

ref = <lệnh ký hiệu> Định dạng một tham chiếu chéo đến một
mục danh sách được đánh số nhất định. Ví dụ: sau khi tải
gói moreenum.sty
\setlist[enumerate,3]{label=\textit{\greek*)},
ref=\theenumi\theenumii\greek*}

font = <lệnh phông> Đặt loại phông chữ của nhãn. Nó chủ yếu
được sử dụng cho các danh sách mô tả. Ví dụ \setlist[
description]{font=\normalfont\itshape}
style = <tên phong cách> Kiểu nhãn danh sách mô tả. <tên
phong cách> có thể là:
standard Đây là cài đặt mặc định. Trong trường hợp này,
nhãn chỉ có thể là một dòng. Nội dung của danh sách
bắt đầu trên dòng nhãn.
unboxed Nó khác với giá trị tiêu chuẩn ở chỗ nhãn có thể
có nhiều dòng.
nextline Nó khác với giá trị không được đóng hộp ở chỗ
nội dung của danh sách bắt đầu trên dòng sau nhãn.
Cài đặt thêm
Một số cài đặt bổ sung:
first = <mã lệnh> Giải thích <mã l> trước lệnh \item đầu tiên
trong môi trường danh sách nhất định.
after = <mã lệnh> Giải thích <mã lệnh> trước lệnh \end đóng
danh sách trong môi trường danh sách nhất định. Ví dụ
\setlist[enumerate,1]{first=\item[]\hrulefill,after=\
item[]\hrulefill}

3.4.3 Định dạng cục bộ của danh sách

Bạn có thể định dạng cục bộ một danh sách cụ thể trong
tùy chọn môi trường danh sách:
\begin{<tên môi trường danh sách>} [<định dạng>]
\item ...
\end{<tên môi trường danh sách>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.4. Đặt tham số danh sách enumitem.sty 93

<định dạng> có thể được sử dụng chính xác như trong cài
đặt chung.
7 Ví dụ 3.24 8: 2
\begin{itemize}[nosep, • Chỉ có biển mới biết
label= \textbullet] • Thuyền đi đâu, về đâu
\item Chỉ có biển mới biết
\item Thuyền đi đâu, về đâu
\end{itemize}

Nhập các nhãn ngắn


Gói enumitem.sty có tùy chọn shortlabels đưa ra một mô
tả ngắn gọn về các nhãn (Nghĩa là khai báo \usepackage[
shortlabels]{enumitem}). Trong trường hợp này, ví dụ: đối với
danh sách không được đánh số
\begin{itemize}[label=\ddag]
nó cũng có thể được viết thay thế:
\begin{itemize}[\ddag]
Việc đánh số của một danh sách được đánh số cũng có thể
được viết tắt. Ví dụ
\begin{enumerate}[label=\roman*)]
Những điều sau có thể được sử dụng thay thế:
\begin{enumerate}[i)]
7 Ví dụ 3.25 8: 2
\begin{enumerate}[i)]
i) Chỉ có biển mới biết
\item Chỉ có biển mới biết
\item Thuyền đi đâu, về đâu ii) Thuyền đi đâu, về đâu
\end{enumerate}

Mục nhập ngắn cho nhãn danh sách được đánh số có thể
chứa bất kỳ ký tự nào, nhưng năm ký tự chịu trách nhiệm
thiết lập kiểu đánh số
1 đánh số Ả Rập
i đánh số la mã nhỏ
I đánh số La Mã lớn
a đánh số chữ thường của bảng chữ cái Latinh (chữ và số)
A chữ hoa bảng chữ cái Latinh (chữ và số)

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


94 Chương 3. Danh sách và tham chiếu chéo

Mục từ viết tắt chỉ có thể chứa một trong các chữ cái này.
Nếu bạn muốn nhập một trong năm ký tự này không phải dưới
dạng ký hiệu kiểu đánh số mà là một chữ cái thực, hãy đặt nó
trong dấu ngoặc đơn. Ví dụ
7 Ví dụ 3.26 8: 2
\begin{enumerate}[\bfseries I. Câu. Nếu từ giã
I. {Câu}., leftmargin=* thuyền rồi
,nosep] II. Câu. Biển chỉ còn
\item Nếu từ giã thuyền rồi
sóng gió
\item Biển chỉ còn sóng gió
\end{enumerate}
7 Ví dụ 3.27 8: 2
\begin{enumerate}[(\itshape (i) Nếu phải cách xa anh
i\normalfont ),nosep] (ii) Em chỉ còn bão tố
\item Nếu phải cách xa anh
\item Em chỉ còn bão tố
\end{enumerate}

Danh sách được đánh số liên tục


Với tham số danh sách chạy liên tục, có thể có số thứ tự đầu
tiên của danh sách được đánh số đã cho là sự tiếp nối của danh
sách được đánh số trước đó.
7 Ví dụ 3.28 8: 2
\begin{enumerate} 1. Cũng có khi vô cớ
\item Cũng có khi vô cớ
\item Biển ào ạt xô thuyền 2. Biển ào ạt xô thuyền
\end{enumerate} Vì tình yêu muôn thuở
Vì tình yêu muôn thuở 3. Có bao giờ đứng yên?
\begin{enumerate}[resume]
\item Có bao giờ đứng yên?
\end{enumerate}

3.4.4 Danh sách theo hàng

Nếu bạn muốn sử dụng danh sách theo hàng, bạn có thể
sử dụng tùy chọn inline trong gói enumitem.sty. (Nghĩa là phải
khai báo \usepackage[inline]{enumitem}) Sau đó, hiển thị danh

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.4. Đặt tham số danh sách enumitem.sty 95

sách enumerate* , itemize* và description* có thể thực hiện


được tùy thuộc vào việc nó được đánh số, không được đánh
số hoặc sử dụng danh sách.

7 Ví dụ 3.29 8: 2
\begin{enumerate*} 1. Cơm cá 2. Cá cơm
\item Cơm cá
\item Cá cơm
\end{enumerate*}

3.4.5 Định nghĩa môi trường danh sách mới

Bạn cũng có thể xác định môi trường danh sách của riêng
mình bằng lệnh sau:

\newlist{<tên môi trường danh sách>} {<loại dánh sách>} {<s


ố cấp tối đa>}} %%trong gói enumitem.sty

<loại dánh sách> có thể là liệt kê, lặp lại hoặc mô tả, tùy
thuộc vào việc bạn muốn xác định danh sách được đánh số,
không được đánh số hay mô tả. <Số cấp tối đa> chỉ định số cấp
mà danh sách đã xác định có thể được lồng vào nhau. Lệnh
này cũng tạo bộ đếm mức max cho <tên danh sách>i, <tên danh
sách>ii, <tên danh sách>iii, <tên danh sách>iv, v.v. đó sẽ là bộ
đếm cho các cấp độ khác nhau. Ví dụ
\newlist{steps}{enumerate}{2}
định nghĩa một môi trường danh sách được đánh số gọi là
các bước có thể lồng vào nhau sâu đến hai cấp. Sau đó, điều
này có thể được thiết lập bằng lệnh \setlist giống như với các
môi trường danh sách khác. Ví dụ
\setlist[steps,1]{label=\textbf{Bước \arabic*.},align=left}
\setlist[steps,2]{label=(\alph*)}

Bộ đếm cho cấp độ đầu tiên sẽ là stepsi và bộ đếm cho cấp


độ thứ hai sẽ là các stepsii.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


96 Chương 3. Danh sách và tham chiếu chéo

3.5 Tham khảo chéo

Có thể có nhiều phần tử trong một tài liệu mà chúng ta


đánh số. Nếu tài liệu có nhiều trang, bạn nên đánh số trang.
Nhưng chúng ta cũng đánh số các chương và phần. Ví dụ, đây
là Chương 6, bắt đầu từ trang 71. Các mục được đánh số bổ
sung: danh sách, hình, bảng, công thức toán học và định lý,
các yếu tố thư mục, v.v.
Các phần tử được đánh số như vậy được dùng để chỉ trong
nhiều trường hợp. Những cái gọi là các tham chiếu chéo. Tất
nhiên, những con số này không đáng để nhập cụ thể vào
nguồn, vì một số như vậy có thể vẫn thay đổi trong quá trình
chỉnh sửa, vì vậy chúng ta sẽ phải thay đổi nó liên tục, điều
này sẽ dẫn đến rất nhiều lỗi theo thời gian. Giải pháp cho điều
này là để LATEX để nhập các số thích hợp cho các phần tử được
đánh số và các tham chiếu chéo.

3.5.1 Gán thẻ nhãn

Nếu một mục được đánh số được tìm thấy cần được tham
chiếu, thì trước tiên nó phải được gắn nhãn
\label{<tên nhãn>}

bằng lệnh <tên nhãn> có thể là tùy ý, nhưng bạn nên tham
khảo một số lời khuyên. Trước tiên, nên chỉ ra loại phần tử
mà chúng ta đang đề cập đến (chương, phần, hình, bảng, v.v.).
Điều này sẽ giúp bạn tìm kiếm các thẻ sau này dễ dàng hơn
nhiều. Sau đó, bạn có thể muốn đặt một số dấu câu. Khuyến
nghị chung cho điều này là dấu hai chấm. Cuối cùng, nhãn
phải đề cập đến nội dung của phần tử, và không có nghĩa là
nó, bởi vì điều đó sẽ gây tổn hại đến bản chất của tham chiếu
chéo tự động. Bạn có thể ngăn ngừa nhiều lỗi khó hiểu bằng
cách không sử dụng các chữ cái có dấu, khoảng trắng và các ký
tự hoạt động trong nhãn . Ví dụ, sau này chúng ta sẽ thấy rằng
bạn có thể tạo một danh sách được đánh số với môi trường liệt
kê, trong đó bạn bắt đầu từng mục danh sách bằng lệnh \item:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.5. Tham khảo chéo 97

\begin{enumerate}
\item Một mục trong danh sách.
\item Một mục danh sách khác.
\end{enumerate}

Để tham chiếu mục 2 trong danh sách, hãy sửa đổi dòng
trong mã như sau:
\item \label{item:01} Đây là một mục danh sách khác.
Tiền tố trong nhãn là danh sách, cho biết rằng nó đề cập
đến một mục danh sách. Sau đó, nó không phải là dấu hai
chấm thường được khuyến khích. Sau đó đến tên của chính
nó, bây giờ là 01.
7 Ví dụ 3.30 8: 2
\begin{enumerate} 1. Một mục trong danh
\item Một mục trong danh sá sách.
ch.
\item \label{item:01} Một m 2. Một mục khác danh
ục khác danh sách. sách.
\end{enumerate}

3.5.2 Liên kết đến các mục được gắn thẻ

Câu hỏi duy nhất là làm thế nào để tham chiếu đến mục
được gắn thẻ. Theo mặc định, một
\ref{<tên nhãn>}

bạn có thể làm điều này bằng một lệnh. Tiếp tục ví dụ trước:
7 Ví dụ 3.31 8: 2
Xem \ref{item:01}.~Một mục Xem 2. Một mục khác...
khác...

Khi chúng ta dán nhãn một đối tượng, LATEX không chỉ biết
số sê-ri đã cho mà còn biết được đối tượng đó ở trang nào. Số
trang cho một nhãn cụ thể là
\pageref{<tên nhãn>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


98 Chương 3. Danh sách và tham chiếu chéo

7 Ví dụ 3.32 8: 2
Xem \ref{item:01}.~Một mục Xem 2. Một mục khác... ở
khác... trang 97.
ở trang \pageref{item:01}.

Vietex có thể xử lý các thẻ một cách độc lập với LATEX có
nghĩa là bạn có thể biết trước bản dịch LATEX nếu có thẻ mà
bạn đang đề cập đến hoặc nếu bạn đã gán thẻ cho hai mục
riêng biệt. Một trợ giúp khác để sử dụng các thẻ trong Vietex
4.0 là liệt kê các thẻ hiện có mà từ đó bạn có thể dễ dàng chọn
thẻ nào bạn muốn liên kết.
Kết quả của \pageref{<tên nhãn>} là số trang nơi lệnh \
label{<tên nhãn> được phát hành, trong khi kết quả của lệnh
\ref{<tên nhãn>} là hiện tại khi \label{<tên nhnã>} được phát
hành.
\@currentlabel

nội dung, là số sê-ri của mục đã cho theo mặc định. Điều
này cũng có thể được xác định lại. Ví dụ
\section{Luật số lớn}
\makeatletter
\def \@currentlabel {,, Luật số lớn ’’}
\makeatother
\label{sec:nszt}
phần \ref {sec-nszt}

1. Luật số lớn
phần „Luật số lớn”

3.6 Nguyên văn bản

Nguyên văn là một phần của tệp nguồn, không phần nào
được giải thích, dịch, nhưng xuất hiện trong tài liệu như trong
tệp nguồn. Nếu văn bản nguyên văn không dài hơn một dòng
đầu vào, hãy sử dụng

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.6. Nguyên văn bản 99

\verb|<nguyên văn bản>|


\verb*|<nguyên văn bản>|

Dấu phân cách | có thể là bất kỳ ký tự nào khác ngoài dấu


cách, * hoặc chữ cái không có trong văn bản nguyên văn. Ví dụ
7 Ví dụ 3.33 8: 2
\verb|sách \LaTeX hay|\\ sách \LaTeX hay
\verb+mã \LaTeX + mã \LaTeX

Nếu bạn nhập \verb* thay vì \verb, sẽ xuất hiện trong kết
quả thay vì dấu cách. Ví dụ
7 Ví dụ 3.34 8: 2
\verb*|sách \LaTeX\ hay|\\ sách␣\LaTeX\␣hay
\verb*+mã \LaTeX + mã␣\LaTeX␣

Lệnh \verb hoặc \verb* không thể được đặt trong đối số
của các lệnh khác. Nếu bạn nhập nhiều hơn một dòng đầu vào
dưới dạng nguyên văn, hãy sử dụng môi trường verbatim hoặc
verbatim*.
7 Ví dụ 3.35 8: 2
\begin{verbatim}
\LaTeX\ văn bản \LaTeX\ văn bản
\LaTeX\ mã lệnh \LaTeX\ mã lệnh
\end{verbatim}
\begin{verbatim*} \LaTeX\␣văn␣bản
\LaTeX\ văn bản \LaTeX\␣mã␣lệnh
\LaTeX\ mã lệnh
\end{verbatim*}

Các môi trường này không thể được đưa vào các đối số của
lệnh.
Chúng ta có thể thực hiện tất cả những điều này một cách
linh hoạt hơn nữa với gói fancyvrb.sty. Việc sử dụng gói không
được trình bày chi tiết, Người đọc sẽ tìm thấy mọi thứ trong
tài liệu của nó. Chúng ta minh họa kiến thức của bạn chỉ bằng
một ví dụ:

7 Ví dụ 3.36 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
100 Chương 3. Danh sách và tham chiếu chéo

\begin{Verbatim}[formatcom={\color{violet}\footnotesize},
showspaces,frame=single,rulecolor=\color{red},numbers=left]
\LaTeX: Nếu phải cách xa anh
\LaTeX: Em chỉ còn bão tố
\end{Verbatim}
: 2
1 \LaTeX:␣Nếu␣phải␣cách␣xa␣anh
2 \LaTeX:␣Em␣chỉ␣còn␣bão␣tố

Chúng ta đã sử dụng màu trong mã trước, vì vậy bạn


vẫn cần tải gói xcolor.sty để thực hiện việc này. Môi trường
Verbatim không thể được đặt trong một đối số lệnh. Cả hai môi
trường Verbatim và verbatim đều không thể lồng vào nhau. Ví
dụ: mã sau không chính xác:
\begin{verbatim}
\begin{verbatim}
...
\end{verbatim}
\end{verbatim}

Nhưng verbatim có thể được nhúng trong môi trường Verbatim


hoặc ngược lại:
\begin{Verbatim}
\begin{verbatim}
...
\end{verbatim}
\end{Verbatim}

Nếu bạn cần đặt một lệnh nguyên văn trong một đối số
cho một lệnh khác, gói fancyvrb.sty sẽ cung cấp một giải pháp
bằng cách sử dụng như sau:
\SaveVerb{<tên>}|<văn bản giữ nguyên>| %trong gói fancyvrb
.sty
\UseVerb[<tùy chọn>]{<tên>} %trong gói fancyvrb.sty

Đây là | dấu phân tách có quy tắc tương tự như lệnh \verb.
<tùy chọn> có thể giống như đối với môi trường Verbatim. Ví dụ:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 101

nếu bạn muốn thêm văn bản nguyên văn vào ghi chú bên, bạn
có thể làm như sau:
\SaveVerb{latex} | \LaTeX\ văn bản|
\marginpar{\UseVerb[formatcom = {\tiny}, showspaces] {latex
}}

Giải pháp trước đây cũng tốt cho chú thích cuối trang, chỉ
khi đó bạn cần nhập lệnh \footnote thay vì \marginpar. Nhưng
đối với phần chú thích cuối trang, gói fancyvrb cũng cung cấp
một giải pháp đơn giản hơn.
\VerbatimFootnotes %trong gói fancyvrb.sty

, sau đó nguyên văn có thể được sử dụng trong đối số của lệnh
\footnote, ví dụ: mã này cũng hoạt động:
\footnote{\verb|\LaTeX\ mã nguồn|}

3.7 Ghi văn bản vào một tệp

Nếu bạn không muốn mã L A T E X được phân tích cú pháp


thành một tệp trong khi biên dịch, hãy sử dụng môi trường
filecontents* với tùy chọn overwrite:

\begin{filecontents*}[overwrite] {<tên tệp>}

Ví dụ
\begin{filecontents*}[overwrite]{vidutep.tex}
\LaTeX
\end{filecontents*}

điều này tạo ra một tệp vidutep.tex trong thư mục hiện tại với
nội dung của nó
\LaTeX
Nếu tệp vidutep.tex đã tồn tại, nó sẽ ghi đè nội dung của
nó. Các tùy chọn bổ sung cho tác vụ này được bao gồm trong
gói newfile.sty và answers.sty.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


102 Chương 3. Danh sách và tham chiếu chéo

3.7.1 Gói lệnh newfile.sty

\newoutputstream{<tên dòng sử lý>} %trong gói newfile.sty


\openoutputfile{<tên tệp>}{<tên dòng sử lý>} %gói newfile.
sty
\begin {writeverbatim}{<tên dòng sử lý>} %trong gói newfile
.sty
\closeoutputstream{<tên dòng sử lý>} %trong gói newfile.sty

Môi trường writeverbatim không thể được đặt trong một đối
số lệnh. Việc sử dụng các lệnh này có thể được minh họa bằng
đoạn mã sau:
7
\newoutputstream{proba}
Ví dụ 3.37 8
\openoutputfile{sample.tex}{proba}
AAA
\begin {writeverbatim}{proba}
Nó lưu điều này dưới dạng nguyên văn trong \texttt{sample.
tex},
\end {writeverbatim}
BBB
\begin{writeverbatim}{proba}
sau đó thêm điều này.
\end{writeverbatim}
CCC
\closeoutputstream{proba}

Trong phần này, chúng ta đã đặt cho quá trình lưu một tên
proba, tên này sẽ lưu nội dung của môi trường writeverbatim
với proba trong tệp sample.tex dưới dạng văn bản nguyên văn.
Nếu có nhiều môi trường như vậy, chúng sẽ nối nội dung của
chúng. Nếu tệp sample.tex đã tồn tại, trước tiên, nội dung của
nó sẽ bị xóa bởi \openoutputfile{sample.tex}{proba}. Bạn có
thể đóng quá trình lưu bằng lệnh \closeoutputstream{proba}.
Vì vậy, dịch mã này là kết quả
: 2
AAA BBB CCC
và một tệp sample.tex sẽ được tạo trong thư mục tài liệu
chứa nội dung

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 103

Nó lưu điều này dưới dạng nguyên văn trong \texttt{sample.


tex},
sau đó thêm điều này.

Sử dụng lệnh sau để lưu văn bản cụ thể trong một tệp bằng
cách giải thích các lệnh trong đó:

\addtostream{<tên dòng xử lý>}{<văn bản>} %trong gói


newfile.sty

Ví dụ

\newoutputstream{proba}
\openoutputfile{minta.tex}{proba}
\addtostream{proba}{\thepage}
\closeoutputstream{proba}

Trong trường hợp này, số trang hiện tại được bao gồm trong
tệp sample.tex. Nếu bạn không muốn giải thích bất kỳ lệnh nào
có trong <văn bản> trong lệnh \addtostream, hãy chạy lệnh . Ví
dụ

\newoutputstream{proba}
\openoutputfile{minta.tex}{proba}
\addtostream{proba}{
\protect\section{Tiêu đề}
Số phần hiện tại: \thesection}
\closeoutputstream{proba}

Trong trường hợp này, nội dung của tệp minta.tex sẽ là:

\section{Title}
Số phần hiện tại: 13,2

Nếu bạn tạo tệp <tên tệp> theo cách trước đó, bạn có thể tải
nó tại một điểm cụ thể trong tệp nguồn bằng lệnh sau:

\input{<tên tệp>}

Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


104 Chương 3. Danh sách và tham chiếu chéo

7 Ví dụ 3.38 8: 2
\newoutputstream{dongthu} AAA BBB
\openoutputfile{minta.tex}{dongthu}
\begin{writeverbatim}{dongthu}
BBB
\end{writeverbatim}
\closeoutputstream{dongthu}
AAA
\input{minta.tex}

Trong mã trước, \input{minta.tex} chỉ có thể nằm sau \


closeoutputstream{dongthu}.
Nếu bạn cần tải tệp trước đó, bạn có thể sử dụng mã sau:
\newinputstream{<tên dòng xử lý>} %thuộc gói newfile.sty
\openinputfile{<tên tệp>}{<tên dòng xử lý>} %thuộc gói
newfile
\readstream{<tên dòng xử lý>} %thuộc gói newfile.sty
\closeinputstream{<tên dòng xử lý>} %thuộc gói newfile.sty

trong đó <tên dòng xử lý> không giống với đầu ra, nhưng <tên
tệp thì có. Ví dụ
7 Ví dụ 3.39 8: 2
\newinputstream{probainput} BBB
\openinputfile{minta.tex}{probainput} AAA
\readstream{probainput}
\closeinputstream{probainput}
AAA
\newoutputstream{donginput}
\openoutputfile{minta.tex}{donginput}
\begin{writeverbatim}{donginput}
BBB
\end{writeverbatim}
\closeoutputstream{donginput}

Nhược điểm của giải pháp này là sẽ báo lỗi ở lần dịch đầu
tiên, vì lúc đó nó không tìm được tệp sample.tex mà sẽ bị loại ở
lần dịch thứ hai. Nếu bạn cũng không muốn gặp lỗi trong bản
dịch đầu tiên, hãy nhập nội dung sau vào đầu phần mở đầu:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 105

\usepackage{silence}
\ErrorsOff*

Ví dụ ở trên có thể được sử dụng trong trường hợp sau.


Công việc của nó là viết một thư viện mẫu để các giải pháp
được đưa vào một tập riêng biệt. Việc đánh số tác vụ phải được
đặt thành tự động (xem phần sau), vì bạn có thể cần phải chèn
một phần ba vào giữa hai tác vụ mà bạn đã nhập. Trong trường
hợp này, việc đánh số sẽ bị trượt. Vấn đề là trong trường hợp
chèn như vậy, điểm chèn cũng phải được tìm ra trong các giải
pháp. Điều này sẽ gây ra sự hỗn loạn hầu như không rõ ràng
và nhiều sai lầm sau một thời gian. Giải pháp là nhập giải
pháp vào môi trường writeverbatim sau khi nhập một tác vụ
vào cùng một tệp nguồn. Sau khi biên dịch, chỉ các nhiệm vụ
được hiển thị, trong khi mã nguồn của các giải pháp sẽ theo
đúng thứ tự trong một tệp riêng biệt mà từ đó có thể tạo ra
khối lượng giải pháp.

3.7.2 Gói lệnh answers.sty

\Opensolutionfile{<tên dòng xử lý>}[<tên tệp>] %trong gói


answers.sty
\Closesolutionfile{<tên dòng xử lý>} %trong gói answers.sty
\begin {Filesave}{<tên dòng xử lý>} %trong gói answers.sty
\Newassociation{<môi trường nguyên văn>}{<môi trường>} {<tê
n dòng xử lý>} %trong gói answers.sty

Nếu <tên tệp> không được chỉ định làm tùy chọn, nó giống như
<tên dòng xử lý>. Ví dụ hiệu ứng tương tự như mã trước đó đạt
được khi tải gói answers.sty, sử dụng mã:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


106 Chương 3. Danh sách và tham chiếu chéo

7 Ví dụ 3.40 8: 2
\Opensolutionfile{minta} AAA BBB CCC
AAA
\begin{Filesave}{minta}
Nó lưu điều này dưới dạng nguyên văn
trong \texttt{minta.tex},
\end{Filesave}
BBB
\begin{Filesave}{minta}
sau đó thêm điều này.
\end{Filesave}
\Closesolutionfile{minta}
CCC

Ví dụ: để lưu tệp minta.tex vào thư mục subvidu, hãy sửa
đổi dòng đầu tiên của mã trước đó như sau:
\Opensolutionfile{minta}[subvidu/minta]
Có các tùy chọn bổ sung với lệnh \Newassociation trong gói
.sty. Ví dụ:
\Newassociation{solution}{megoldas}{megolda}
\renewcommand{\megoldaslabel}[1]{\textbf{Lời giả.} #1.}
\Opensolutionfile{megolda}
AAA
\begin{solution}
BBB
\end{solution}
\Closesolutionfile{megolda}
\input{megolda}

Trong đoạn mã trước, nếu môi trường giải pháp đã được


xác định trước đó, bạn sẽ không ghi đè nó, nhưng sau đó lệnh
\solutionasparams phải được hủy kích hoạt. Ví dụ

3.7.3 Mã chương trình

Gói listings.sty phù hợp để hiển thị mã cho các ngôn ngữ
lập trình khác nhau.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 107

\lstinline[<tùy chọn>]|<mã>| %trong gói lệnh listings.sty


\begin{ lstlisting}[<tùy chọn>] <mã> \end{ lstlisting} %gói
lệnh listings.sty
\lstinputlisting[<tùy chọn>]{<tệp mã>} %trong gói lệnh
listings.sty

Áp dụng cho mã nội tuyến \lstinline. Bạn cũng có thể chỉ


định các tùy chọn trong lệnh sau:
\lstset{<tùy chọn>} %trong gói lệnh listings.sty

Có các tùy chọn có thể bao gồm [ hoặc ]. Ví dụ: language = [


Sharp] C. Điều này có thể được đưa vào lệnh \lstset mà không
gặp bất kỳ sự cố nào
\lstset{language=[Sharp]C}
nhưng không còn trong các lệnh \lstinline, \
lstinputlisting hoặc các tùy chọn môi trường lstlisting.
Trong trường hợp này, giá trị phải được đặt trong dấu ngoặc
đơn. Ví dụ
\lstinputlisting[language={[Sharp]C}]{code.pas}
Môi trường lstlisting và lệnh \lstinline, \lstinputlisting
thể được đặt trong một đối số lệnh.
Khi sử dụng lệnh \lstinputlisting, hãy có một tệp chứa mã
chương trình được mã hóa theo cách tương tự như tệp nguồn
tex.
Gói danh sách có thể xử lý mã hóa 1 byte. Vì vậy, nếu bạn
làm việc với bảng mã Latin-2, các chữ cái có dấu trong mã
chương trình sẽ trông đẹp. Nhưng đối với UTF-8, nếu có các
chữ cái có dấu trong mã chương trình, bản dịch sẽ không chính
xác. Sau đó, sử dụng gói listsutf8 thay vì danh sách. Sau khi
tải gói, hãy nhập mã sau:
\lstset{inputencoding = utf8/latin2} %trong gói lệnh
listingsutf8.sty

Sau đó, gói listsutf8.sty hoạt động giống như các danh
sách khi bạn sử dụng lệnh \lstinputlisting, chỉ chuyển đổi
các ký tự được mã hóa UTF-8 đầu tiên sang Latin-2. Rất tiếc,

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


108 Chương 3. Danh sách và tham chiếu chéo

listsutf8 không hoạt động với lệnh \lstinline hoặc môi trường
lstlisting. Trong trường hợp này, hãy sử dụng mã sau để thay
thế:

\lstset{literate = {ö} {{\ "o}} 1 {ü} {{\" u}} 1 {ó}


{{\ ’o}} 1 {õ} {{\ H o}} 1 { ú} {{\ ’u}} 1 {} u} {{\
H u}} 1 {é} {{\’ e}} 1 {á} {{\ ’a}} 1 {í} {{\’ i}} 1
{Ö} {{\ "O}} 1 {Ü} {{\" U}} 1 {Ó} {{\ ’O}} 1 {Anh} {{\
HO}} 1 {Ú} {{\ ’U}} 1 {} u} {{\ HU}} 1 {É} {{\’ E}} 1
{Á} {{\ ’A}} 1 {Í} {{\’ I}} 1}

Điều này sẽ chuyển đổi các chữ cái có dấu thành dấu mũ,
giải quyết được vấn đề.
<tùy chọn> Hãy xem lại các tùy chọn cho các lệnh trước
đó. Các mã màu trong các giá trị hoạt động bằng cách tải gói
xcolor.sty.
basicstyle=<style> Phông chữ mã. Ví dụ basicstyle = \small
\ttfamily
columns = <giá trị> Nếu phông chữ trong mã có độ rộng thay
đổi, bạn vẫn có thể cột mã. Sau đó, <giá trị> phải được cố
định (mặc định). Nếu bạn muốn mỗi ký tự xuất hiện theo
chiều rộng tự nhiên của nó, thì giá trị> phải linh hoạt
hoàn toàn. Trong cả hai trường hợp, nó xử lý số lượng và
kích thước không gian một cách linh hoạt.
keepspaces Trong tùy chọn trước, chúng ta thấy rằng số lượng
khoảng trắng trong kết quả cuối cùng chắc chắn không
nhiều như trong nguồn. Nếu điều này mang lại kết quả
không mong muốn, hãy sử dụng tùy chọn này. Điều này
sẽ có chính xác bao nhiêu khoảng trắng mà chúng ta đặt
trong nguồn và sẽ đặt khoảng trắng vào vị trí của các tab.
breaklines ngắt câu mềm mại.
postbreak= \hbox {<dấu>} Ký tên sau khi ngắt các dòng dài.
Ví dụ: với một mũi tên màu đỏ chỉ sang bên phải
postbreak = \hbox{\textcolor{red}{\ rightarrowfill}}
prebreak=\hbox{<đấu>} Giống như trước, chỉ đặt tín hiệu trước
khi ngắt dòng.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 109

breakindent = <độ dài> Sau khi ngắt dòng dài, lượng thụt lề
của dòng tiếp theo. Ví dụ breakindent = 10pt
gobble = <một số> <một số> ký tự đầu tiên của các dòng mã bị
bỏ qua. Các lệnh \lstinline không có hiệu lực.
backgroundcolor = \color{<tên màu>} màu nền. Ví dụ
backgroundcolor = \color{red}
xleftmargin = <độ dài> Khoảng cách giữa cạnh trái của văn
bản và cạnh trái của mã. Ví dụ xleftmargin = 1 cm
xrightmargin = <độ dài> Khoảng cách giữa cạnh phải của văn
bản và cạnh phải của mã.
linewidth = <độ dài> Khoảng cách giữa cạnh trái của văn bản
và cạnh phải của mã.
showspaces Không gian được đánh dấu bằng | |.
showtabs Chỉ ra một tab.
tabsize = <độ dài tab> Kích thước tab dấu cách. Ví dụ tabsize
=2
tab = <ký hiệu> Dấu hiệu tab. Ví dụ tab = \rightarrowfill
number = <loại> Đánh số các dòng mã. Nếu <loại> là không
(mặc định), thì không có đánh số, nếu là bên trái, nó được
đánh số ở bên trái, nếu là bên phải, nó được đánh số ở bên
phải.
numbertyle = <phong cách> Đặt phông chữ cho các số sê-ri. Bộ
đếm là số lượng. Ví dụ numbertyle = \tiny; numberep = <đ
ộ dài> Khoảng cách giữa số thứ tự và mã.
stepnumber = <số nguyên> Ví dụ stepnumber = 2 chỉ mỗi số thứ
tự được hiển thị.
firstnumber = <số nguyên> Ví dụ firstnumber = 100
Trong trường hợp của, số dòng đầu tiên của mã là 100.
Nếu <số nguyên> cuối cùng được thay thế bằng số last, bộ
đếm không được đặt lại ở đầu, vì vậy trong trường hợp
này nó tiếp tục đánh số của mã trước đó.
frame = <giá trị> Vẽ các đường khung. Giá trị có thể là bất
kỳ tập con nào của trblTRBL. t: top, b: bottom, r: right, l:
left (các chữ in hoa có nghĩa tương tự nhau nhưng kẻ một
nét kép). Thậm chí có thể có một shadowbox và none có giá

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


110 Chương 3. Danh sách và tham chiếu chéo

trị. Ví dụ: nếu bạn muốn vẽ một đường thẳng ở trên cùng
và bên trái, thì frame=tl.
frameround = <giá trị> Kiểu của các góc khung. Giá trị có thể
là bất kỳ tập con bốn phần tử nào của ttttffff. t: góc bo
tròn, f: góc vuông. Trình tự: từ góc trên bên phải theo
chiều quay âm. Ví dụ frameround = tftf
framerule = <độ dài> Độ dày đường khung.
Frameep = <độ dài> Khoảng cách giữa khung và mã.
ruleep = <độ dài> Khoảng cách giữa các đường đôi của
khung.
rulecolor = \color{<tên màu>} Màu của đường khung. Ví dụ
rulecolor = \color {red}
ruleepcolor =\color{<tên màu>} Bạn có thể đặt màu của vùng
giữa các đường viền đôi.
fillcolor = \color{<tên màu>} Màu giữa khung và mã.
literate={<mit>}{{<mire>}}<một số> <mire> LATEX hiển thị mã
trong mã chương trình để nó chiếm <một số> ký tự trong
kết quả. Ví dụ: để chèn <= (≤) hoặc > = (≥) vào mã, hãy
nhập:
literate={<=}{{$\leq$}}1{>=}{{$\geq$}}1
Escapeinside = {<ký tự đầu>} {<ký tự cuối>} chạy lệnh
ngoài. Ví dụ: Escapeinside = {(*} {*)} trong mã (* \
pounds *) sẽ được thay thế bằng £ trong kết quả cuối
cùng, tức là lệnh LATEX giữa các dấu (* và *) sẽ được kết
thúc.
language = <ngôn ngữ lập trình> Đánh dấu các từ khóa và
nhận xét cho một ngôn ngữ lập trình. Bạn có thể tìm thấy
danh sách các ngôn ngữ được xác định trước trong phần
mô tả gói. Ví dụ
language=Delphi
Đây là cách xác định ngôn ngữ của riêng bạn:

\lstdefinelanguage{<tên>}{<tùy chọn>}

(<tùy chọn> xem sau.) Có những ngôn ngữ được xác định
trước có nhiều phương ngữ. Ví dụ, trong C#, hãy tải:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 111

language=[Sharp]C
Bạn có thể tìm thấy danh sách các phương ngữ cho các
ngôn ngữ được xác định trước trong phần mô tả gói. Để
hiện các ngôn ngữ đã tải trước đó, hãy sử dụng điều này:
language={}
Nếu bạn cũng sử dụng các tùy chọn được mô tả sau để
đặt vùng đánh dấu, hãy làm như vậy sau tùy chọn ngôn
ngữ, nếu không ngôn ngữ có thể ghi đè nó.
keywords=[<lớp>]{<danh sách>} Danh sách các từ khóa cần
đánh dấu trong lớp <lớp>, được liệt kê trong <danh sách
>, được phân tách bằng dấu phẩy. <lớp> là một số nguyên
dương. [1] có thể bị bỏ qua. Ví dụ:
keywords={begin,end} hay
keywords=[2]{procedure,function}.
morekeywords = [<lớp>]{<danh sách>} Điều này có thể được sử
dụng để mở rộng danh sách từ khóa cho lớp <lớp>. [1] có
thể bị bỏ qua.
keywordstyle = [<lớp>]<phong cách> Kiểu của các từ khóa
trong lớp <lopw>. [1] có thể bị bỏ qua. Ví dụ
keywordstyle=[2]\bfseries
comment = [s][<phong cách>]{<bắt đầu>}{<kết thúc>} Đánh
dấu nhận xét. Tùy chọn này xóa các kiểu nhận xét đã đặt
trước đó. Nếu bạn sử dụng tùy chọn thêm thông báo thay
vì nhận xét, các cài đặt nhận xét trước đó sẽ được giữ lại.
Ví dụ
comment=[s] [\itshape\color{red}]{/ *} {*/}
hiển thị phần /*...*/ của mã theo kiểu đó, bao gồm dấu
phân cách / * và */.
comment=[n][<phong cách>]<bắt đầu><đến hết> Giống như
trước đây, nhưng ở đây các nhận xét có thể được lồng vào
nhau.
comment=[l][<phong cách>]{<từ>} Đánh dấu các nhận xét một
dòng. Các kiểu bình luận đã đặt trước đó sẽ bị xóa. Nếu
bạn sử dụng tùy chọn thêm thông báo thay vì nhận xét,
các cài đặt nhận xét trước đó sẽ được giữ lại. Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


112 Chương 3. Danh sách và tham chiếu chéo

comment =[l][\itshape\color{red}]{//}
trong trường hợp //, dòng xuất hiện theo kiểu đó, bao
gồm cả //.
commentstyle =<phong cách> Ví dụ: nếu comment=[l]{//} nhận
xét được xác định, nó sẽ xuất hiện ở dạng nghiêng theo
mặc định. Bạn có thể thay đổi kiểu này sau với tùy chọn
này. Ví dụ:
commentstyle=\itshape\color{green}
delim=[s][<phong cách>] {<đến>}{<đến>} Đánh dấu phần giữa
các dấu phân cách. Các kiểu phân cách đã đặt trước đó
sẽ bị xóa. Nếu bạn sử dụng tùy chọn moredelim thay vì
delim, các cài đặt delim trước đó sẽ được giữ lại. Ví dụ
delim=[s][\color {red}]{"}{"}
hiển thị "..." trong mã theo kiểu đó, bao gồm " cả dấu
phân cách.
delim=[is][<phong cách>] {<khi đó>}{<tiếp tục>}} Nó khác
với cái trước ở chỗ các dấu phân cách không xuất hiện.
alsoletter = {<chuỗi ký tự>} Ví dụ: để xác định \chapter và
\section làm từ khoá, trước tiên bạn phải đặt \ ký
tự thành alsoletter = {\\} với một tùy chọn. Sau đó
morekeywords = {\\chapter, \\section} tùy chọn để xác
định từ khóa.
style = <tên phong cách> Gọi một kiểu được xác định trước.
Để xác định một kiểu, hãy sử dụng lệnh sau: \
lstdefinestyle{<tên phong cách>}{<tùy chọn>}
title = {<mã tiêu đề>} Tên mã không có số sê-ri. Điều này
không có trong danh sách mã.
caption = {<Mã tiêu đề>} Tên mã có số sê-ri, nhãn. Ví dụ: để
sử dụng từ "mã" làm nhãn, hãy sử dụng lệnh sau:
\def\lstlistingname{<mã>}
nolol Các mã được đánh số không được đưa vào danh sách
mã.
numberbychapter = false Các mã không được đánh số bằng số
chương.
label={<nhãn>} Nhãn tham chiếu chéo. Điều này sẽ được sử
dụng thay vì lệnh \label. Không thể sử dụng lệnh này vì

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.7. Ghi văn bản vào một tệp 113

LATEX đã coi nó là một phần của mã chương trình.


Các ví dụ
Hãy xem một số ví dụ ở cuối phần này.

7 Ví dụ 3.41 8
\begin{lstlisting}[language=Delphi,basicstyle=\footnotesize
]
function Trim(s:string):string;
var i:integer;
begin
result:=’’;
for i:=1 to length(s) do if s[i]<>’ ’
then result:=result+s[i];
end;
\end{lstlisting}
: 2
function Trim(s:string):string;
var i :integer;
begin
result:=’ ’ ;
for i :=1 to length(s) do if s[i]<>’ ’
then result:=result+s[i];
end;

7 Ví dụ 3.42 8
\def\lstlistingname{Thủ tục}
\lstset{language=Delphi,basicstyle=\footnotesize,
keywordstyle=\bfseries\color{blue},numbers=left,
frame=tRBl,frameround=tftt}
\begin{lstlisting}[caption={Hàm Trim cắt gọt ký tự trắng},
label={kod-trim}]
function Trim(s:string):string;
var i:integer;
begin
result:=’’;
for i:=1 to length(s) do if s[i]<>’ ’
then result:=result+s[i];
end;
\end{lstlisting}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


114 Chương 3. Danh sách và tham chiếu chéo

\ref{kod-trim}. Mã số \dots
: 2

 Thủ tục 3.1: Hàm Trim cắt gọt ký tự trắng 


1 function Trim(s:string):string;
2 var i:integer;
3 begin
4 result:=’ ’ ;
5 for i :=1 to length(s) do if s[i]<>’ ’
6 then result:=result+s[i];
7 end;


3.1. Mã số . . .

3.8 Gói lệnh url.sty

Địa chỉ Internet cũng có thể được coi là nguyên văn theo
một nghĩa nào đó.
\url{<địa chỉ URL>} %trong gói url.sty

Điều này khác với việc sử dụng \verb ở chỗ bạn có thể ngắt
URL ở cuối dòng. Nếu bạn đang tạo một ấn phẩm điện tử, hãy
sử dụng gói hyperref.sty được mô tả sau, gói này cũng có lệnh
\url, thay vì url. Ví dụ
7 Ví dụ 3.43 8: 2
\url{https://ctan.org/} https://ctan.org/

Gói hyperref.sty không ngắt các liên kết trong trường hợp
của một trình biên dịch latex. Sau đó tải gói breakurl.sty ngay
cả sau hyperref.sty.
Phông chữ của URL được lưu trữ trong lệnh \UrlFont. Ví dụ:
nếu bạn muốn URL xuất hiện bằng chữ cổ, hãy nhập:
\def\UrlFont{\rmfamily}
Bạn cũng có thể chỉ định các điểm ngắt có thể có cho URL
bằng lệnh \UrlBreaks. Ví dụ
\def \UrlBreaks{\do\. \do\@ \do\\ \do\/ \do\! \do\_ \do
\| \do\; \do\> \do\] \do\-}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.9. Gói hyperref.sty 115

3.9 Gói hyperref.sty

Bạn cũng có thể chuyển đổi tài liệu đã hoàn thành thành
một ấn phẩm điện tử. Để làm điều này, hãy tải gói hyperref.
sty. Sau đó, một cây phác thảo được tạo tự động trong tệp pdf
hoàn chỉnh (dấu trang) và hình thu nhỏ, và liên kết trở thành
liên kết các URL.
Đảm bảo đặt các gói setspace.sty và imakeidx.sty trước
hyperref.sty trong khi tải các gói hình học và babel sau
hyperref.sty.
Lệnh: Một số lệnh hữu ích trong gói hyperref.sty:
\url{<địa chỉ URL>} Điều này cho phép bạn nhập địa chỉ In-
ternet. Lệnh này không thể được tải vào các đối số lệnh.

7 Ví dụ 3.44 8
\url{https://nhdien.wordpress.com}
: 2
https://nhdien.wordpress.com
\nolinkurl {<địa chỉ URL>} Nhập một địa chỉ Internet không
trở thành một liên kết.

7 Ví dụ 3.45 8
\nolinkurl{https://nhdien.wordpress.com}
: 2
https://nhdien.wordpress.com
\href{<địa chỉ URL>}{<văn bản>} <văn bản> xuất hiện trong
pdf, bạn có thể nhấp vào để tải <địa chỉ URL>. Đây là lệnh
không thể được đặt trong đối số của lệnh.

7 Ví dụ 3.46 8
\href{https://vietex.blog.fc2.com/}{Web: LaTeX và ứng
dụng}
: 2
Web: LaTeX và ứng dụng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


116 Chương 3. Danh sách và tham chiếu chéo

<địa chỉ email> Nhập địa chỉ email.

7 Ví dụ 3.47 8
\href{mailto:nguyenhuudien@hus.edu.vn}{nguyenhuudien@
hus.edu.vn}
: 2
nguyenhuudien@hus.edu.vn
\href {run:<tệp>}{<văn bản>} Thay vào đó, <văn bản> xuất
hiện dưới dạng một liên kết. Nhấp vào đây sẽ tải bên
ngoài <tệp> không thể là tệp exe, bat, zip và các tệp tự
thực thi hoặc nén tương tự khác.
\hyperref[<đánh dấu>]{<văn bản>} Thay vào đó, <văn bản>
xuất hiện dưới dạng một liên kết. Nhấp vào \label {-
label} - chuyển đến nhãn được tạo bằng <đánh dấu>.
\hyperlink [<tag>] {<văn bản1>} Thay vào đó, <văn bản 1>
xuất hiện dưới dạng một liên kết. Bằng cách nhấp vào
đến <tag>
\hypertarget[<tag>]{<văn bản 2>} nhảy đến <văn bàn 2> được
gắn nhãn bởi <tag>.
\phantomsection Nếu bạn ghi vào mục lục bằng lệnh \
addcontentsline, liên kết số trang sẽ không hoạt động.
Để khắc phục điều này, hãy nhập \phantomsection trước
\addcontentsline.
Nó cũng có thể hữu ích khi sử dụng môi trường NoHyper,
trong đó gói hyperref trở nên không hiệu quả.
Tùy chọn. Một số tùy chọn trong gói hyperref.sty:
unicode (tùy chọn mặc định từ năm 2021.) Nếu không có điều
này, chỉ các phông chữ được mã hóa 1 byte mới có thể có
trong cây phác thảo và thông tin pdf. Tùy chọn này cũng
cho phép bạn đặt phông chữ nhiều byte. Kết quả là, ví
dụ, các chữ cái sẽ xuất hiện chính xác và có thể nhập các
ký tự toán học chẳng hạn (xem phần sau).
bookmarks = false Không tạo cây phác thảo. Nó được làm theo
mặc định.
bookmarksopen Theo mặc định, chỉ cấp cao nhất mới được hiển

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.9. Gói hyperref.sty 117

thị trong cây phác thảo. Với tùy chọn này, tất cả các cấp
sẽ được mở.
bookmarksopenlevel = <số bậc> Cây phác thảo sẽ mở cho đến
khi <số bậc> đã cho.
bookmarknumbered Các tiêu đề trong cây phác thảo phải được
đánh số.
linktocpage Số trang trong danh sách phải là các liên kết.
Theo mặc định, các tiêu đề là các liên kết.
breaklinks Cho phép ngắt dòng cuối dòng. (Tùy chọn cơ bản
cho trình biên dịch pdflatex.)
colorlinks Các liên kết phải được tô màu. Theo mặc định,
chúng xuất hiện với một khung màu.
hidelinks Các liên kết không được tô sáng bằng màu sắc hoặc
khung.
hyperfootnotes = false Điểm đánh dấu chú thích cuối trang
không được là một liên kết.
pdfpagemode = FullScreen Khi bạn mở pdf, chỉ trang được hiển
thị toàn màn hình ở độ phóng đại cao nhất có thể.
pdfstartview = <giá trị> Nếu <giá trị> Fit, hãy sử dụng độ
phóng đại cao nhất có thể trong cửa sổ khi mở pdf. Nếu
FitH, hãy phóng to toàn bộ chiều rộng của cửa sổ khi bạn
mở pdf. Nếu FitV, hãy phóng to toàn bộ chiều cao của cửa
sổ khi bạn mở pdf.
linkcolor = <màu> Màu của liên kết được tạo bởi \ref.
pagecolor = <màu> Màu của liên kết được tạo bởi \pageref.
citecolor = <màu> Màu của liên kết được tạo bởi \cite.
urlcolor = <màu> Màu của liên kết được tạo bởi \url và \href.
runcolor = <màu> Màu của đường dẫn giao thức run:.
allcolors = <màu> Màu của mỗi liên kết.
linkbordercolor = <màu> Màu của khung của liên kết được tạo
bởi \ref.
citebordercolor = <màu> Màu của khung của liên kết được tạo
bởi \cite.
urlbordercolor = <màu> Màu khung của liên kết được tạo bởi

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


118 Chương 3. Danh sách và tham chiếu chéo

\url và \href.
runbordercolor = <màu> Màu của khung chạy: liên kết giao
thức.
allbordercolors = <màu> Màu của khung của mỗi liên kết.
pdfborder = {0 0 <số>} Độ dày của khung liên kết là <số>
điểm (nếu là 0, không có khung).
Các tùy chọn gói hyperref a
\hypersetup{<tùy chọn 1>, <tùy chọn 2>, ...}

cũng có thể được chỉ định bằng lệnh. Ví dụ


\hypersetup{bookmarks = false, colorlinks}
Ví dụ: tiêu đề phần có thể chứa một ký tự không xuất hiện
trong cây phác thảo pdf. Ví dụ
\section{$\sigma$-vòng}
Trong trường hợp này, chỉ "-vòng" sẽ xuất hiện trong dấu
trang, σ sẽ không xuất hiện. Điều này được giải quyết trong
đoạn mã sau bằng cách sử dụng lệnh \texorpdfstring với tùy
chọn unicode trong gói hyperref.sty:
\section{\texorpdfstring{$\sigma$}{\textigma}- vòng}
Bạn cũng có thể viết \sigma thay vì \textigma nếu bạn sử
dụng tùy chọn psdextra cho gói hyperref.sty ngoài unicode. Ký
tự σ được mã hóa UTF-8 cũng có thể được chỉ định trực tiếp
bằng mã thập lục phân của nó:
\section{\texorpdfstring{$\sigma$}{\unichar{"03C3}} - vò
ng}
Xem tại đây để biết mã thập lục phân cho các ký tự được
mã hóa UTF-8. Các giải pháp trước đó vẫn chưa hoàn hảo, vì
vậy σ không xuất hiện in đậm trong tiêu đề. Điều này được
trợ giúp bởi tùy chọn lệnh \section và sự kết hợp của các điều
trên:
\section[\texorpdfstring{$\sigma$}{\textigma} vòng]
{$\boldsymbol{\sigma}$- vòng}

Tại thời điểm này, σ sẽ xuất hiện in đậm trong văn bản và
ở chế độ bình thường trong mục lục, cũng như trong đánh dấu

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


3.9. Gói hyperref.sty 119

pdf. Nói chung, một


\section[\texorpdfstring{<nội dung>}{<mô tả>}]{<văn bản>}

mã cho phép bạn nhập tiêu đề theo nhiều cách khác nhau
trong mục lục, cây phác thảo và văn bản.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 4. BẢNG VÀ HÌNH VỚI MÔI
TRƯỜNG ĐỘNG

4.1. Bảng trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121


4.1.1. Bảng ví dụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.1.2. Bàn dài . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
4.1.3. Bảng chất lượng của nhà xuất bản . . . . . . . 130
4.1.4. Căn chỉnh các bảng với đường cơ sở . . . . . . 132
4.2. Hình trong LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.2.1. Chèn một hình vào văn bản . . . . . . . . . . . . . . 133
4.2.2. Phù hợp phía sau và tiền cảnh . . . . . . . . . . . 137
4.2.3. Chèn các trang pdf vào văn bản . . . . . . . . . . 138
4.2.4. Lấy một số trang từ một tệp pdf . . . . . . . . . . 140
4.3. Đối tượng di động . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
4.3.1. Hình và bảng di động . . . . . . . . . . . . . . . . . . . . 140
4.3.2. Gắn nhãn các đối tượng di động . . . . . . . . . . 142
4.3.3. Tạo các đối tượng di động của riêng . . . . . . 144
4.3.4. Tránh thả nổi di động . . . . . . . . . . . . . . . . . . . . 145
4.3.5. Bao bọc các đối tượng bằng văn bản . . . . . . 146
4.1. Bảng trong LATEX 121

4.1 Bảng trong LATEX


Tạo bảng là một trong những nhiệm vụ khó trong trong
LATEX. Chúng ta không thảo luận về các lệnh liên quan nói
chung, chúng ta chỉ xem xét chúng thông qua các ví dụ cơ hội
mà không yêu cầu sự hoàn chỉnh.

4.1.1 Bảng ví dụ

Hãy bắt đầu với một ví dụ đơn giản


7 Ví dụ 4.1 8: 2
\begin{tabular}{lrr}
Hà Nội & sáng & 9:30\\
Hà Nội sáng 9:30
Hải Phòng & chiều & 14:30\\ Hải Phòng chiều 14:30
\end{tabular}

Vì vậy, một bảng có thể được tạo với môi trường tabular.
Trong tham số này, bạn phải chỉ định có bao nhiêu cột và nội
dung của chúng phải được căn chỉnh như thế nào.
Trong ví dụ, lrr có nghĩa là có 3 cột, cột đầu tiên được căn
bên trái (l ở bên trái) và 2 cột còn lại ở bên phải (r ở bên phải).
Nếu bạn muốn căn giữa một cột, hãy đánh dấu cột đó bằng c
(làm trung tâm). Cái & cá gọi là một ký hiệu cho biết sự phân
tách của hai cột. \\ biểu thị ngắt dòng. Ta cũng có thể kẻ các
đường trong bảng:
7 Ví dụ 4.2 8: 2
\begin{tabular}{|l|rr|} \
hline Hà Nội sáng 9:30
Hà Nội & sáng & 9:30\\ Hải Phòng chiều 14:30
\cline{2-3}
Hải Phòng & chiều & 14:30\\
\hline
\end{tabular}

Nơi bạn muốn vẽ một đường thẳng đứng, hãy đặt nó vào
tham số môi trường dạng bảng |. Bất cứ nơi nào bạn muốn vẽ
một đường ngang, hãy đặt nó trong môi trường bảng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


122 Chương 4. Bảng và hình với môi trường động

\hline

Nếu bạn không muốn vẽ hoàn toàn một đường ngang, chỉ
cần nói từ cột 2 đến cột 3, hãy thay thế \hline bằng
\cline{2-3}

Nhiều \cline{ } có thể được viết trong một hàng:


7 Ví dụ 4.3 8: 2
\begin{tabular}{|c|c|c|c|} \hline
A & B & C & D\\ \cline{1-1}\cline{3-4 A B C D
} E F G H
E & F & G & H\\ \hline
\end{tabular}

Ví dụ sau đây cho thấy cách kiểm soát những gì xảy ra giữa
hai cột:
7 Ví dụ 4.4 8: 2
\begin{tabular}{|@{\ 1\,}l@{ = }r@{,}
l@{\,mm}|} 1 pont = 0,35 mm
\hline 1 pica = 4,22 mm
pont & 0 & 35\\
pica & 4 & 22\\ 1 inch = 25,4 mm
inch & 25 & 4\\
\hline
\end{tabular}

Trong tùy chọn @{...} của môi trường bảng, bạn có thể chỉ định
những gì cần đặt trước hoặc sau một ô. @{} Kết quả không có
gì, thậm chí không phải là khoảng trắng:
7 Ví dụ 4.5 8: 2
\begin{tabular}{@{}lrr@{}}
\hline Hà Nội sáng 9:30
Hà Nội & sáng & 9:30\\ Hải Phòng chiều 14:30
Hải Phòng & chiều & 14:30\\
\hline
\end{tabular}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.1. Bảng trong LATEX 123
7 Ví dụ 4.6 8: 2
\begin{tabular}{@{}r@{}r@{}}
&12345\\
12345
& 1234\\ 1234
+& 123\\
\hline + 123
&13702\\
13702
\end{tabular}

Gói array.sty cũng xác định tùy chọn >{...} để mở rộng các
tùy chọn định dạng cột:
7 Ví dụ 4.7 8: 2
\begin{tabular}{c>{\bfseries}cc}
A & B & C\\
A B C
D & E & F\\ D E F
G & H & I\\
\end{tabular} G H I

Bạn cũng có thể hợp nhất các ô theo chiều ngang


\multicolumn{<số ô>}{<định dạng ô>}{<văn bản>}

<số ô> nghĩa là số ô đã hợp nhất. <định dạng ô> là định dạng
cho một ô đã hợp nhất nhất, được thực hiện chính xác như
trong tham số môi trường dạng bảng. Lệnh này hữu ích ngay
cả khi bạn không muốn hợp nhất, bạn chỉ muốn thay đổi định
dạng của ô đó so với định dạng chung. Trong trường hợp này,
<số ô> có nghĩa là 1.

7 Ví dụ 4.8 8
\begin{tabular}{|l|rr|}
\cline{2-3}
\multicolumn{1}{l|}{}&
\multicolumn{2}{c|}{Năm}\\ \cline{2-3}
\multicolumn{1}{l|}{}&
\multicolumn{1}{c}{2012}&
\multicolumn{1}{c|}{2013}\\ \hline
VCB(đ) &994\,000&1\,231\,500\\
BIVD(đ)&165\,000&194\,950\\ \hline
\end{tabular}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


124 Chương 4. Bảng và hình với môi trường động

: 2
Năm
2012 2013
VCB(đ) 994 000 1 231 500
BIVD(đ) 165 000 194 950

Lưu ý rằng dòng được vẽ cho "Năm". Ví dụ: bạn có thể


tăng khoảng trống phía trên văn bản lên 2pt bằng lệnh \
extrarowheight trong gói array, như sau:

7 Ví dụ 4.9 8
\setlength{\extrarowheight}{2pt}
\begin{tabular}{|l|rr|}
\cline{2-3}
\multicolumn{1}{l|}{}&
\multicolumn{2}{c|}{Năm}\\ \cline{2-3}
\multicolumn{1}{l|}{}&
\multicolumn{1}{c}{2012}&
\multicolumn{1}{c|}{2013}\\ \hline
VCB(đ) &994\,000&1\,231\,500\\
BIVD(đ)&165\,000&194\,950\\ \hline
\end{tabular}

: 2
Năm

2012 2013

VCB(đ) 994 000 1 231 500

BIVD(đ) 165 000 194 950

Bạn có thể hợp nhất các ô theo chiều dọc bằng lệnh sau

\multirow{<số ô>}*{<văn bản>} %trong gói lệnh multirow.sty


\multirow{<số ô>}{<chiều rộng>}{<văn bản>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.1. Bảng trong LATEX 125

7 Ví dụ 4.10 8: 2
\begin{tabular}{|l|c|}
\hline 1
Gộp 2 hàng
\multirow{2}*{Gộp 2 hàng} & 1\\ 2
& 2\\ \hline
\multirow{3}{3cm}{ Gộp 3 hàng c Gộp 3 hàng có 3
ó chiều rộng 3\,cm} & 3\\ chiều rộng 4
\cline{2-2}
3 cm
& 4\\ \cline{2-2} 5
& 5\\ \hline
\end{tabular}

Ví dụ sau đây cho thấy cách điều chỉnh độ rộng của mỗi cột.

7 Ví dụ 4.11 8
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\hline
Độ rộng cột 1 và căn phải \rightskip\fill &
Độ rộng cột 2 và căn trái \leftskip\fill &
Độ rộng cột 3 và căn giữa \leftskip\fill\rightskip\fill &
Độ rộng cột 4 và căn \\
\hline
\end{tabular}
: 2
Độ rộng Độ rộng Độ rộng Độ rộng
cột 1 và cột 2 và cột 3 và cột 4 và
căn phải căn trái căn giữa căn

Đoạn mã sau có tác dụng tương tự như đoạn trước khi tải
gói array.sty

7 Ví dụ 4.12 8
\begin{tabular}{|>{\raggedright\arraybackslash}p{2cm}
|>{\raggedleft\arraybackslash}p{2cm}
|>{\centering\arraybackslash}p{2cm}
|p{2cm}|}
\hline
Độ rộng cột 1 và căn phải&
Độ rộng cột 2 và căn trái &

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


126 Chương 4. Bảng và hình với môi trường động

Độ rộng cột 3 và căn giữa &


Độ rộng cột 4 và căn \\
\hline
\end{tabular}
: 2
Độ rộng Độ rộng Độ rộng Độ rộng
cột 1 và cột 2 và cột 3 và cột 4 và
căn phải căn trái căn giữa căn

Đoạn mã sau là một ví dụ về căn giữa nội dung của một ô


theo chiều dọc trong gói array.

7 Ví dụ 4.13 8
\begin{tabular}{|>{\raggedright\arraybackslash}m{2cm}
|>{\raggedleft\arraybackslash}m{2cm}
|>{\centering\arraybackslash}m{2cm}
|m{2cm}|}
\hline
cột 1 căn dọc, căn dọc&
cột 2 căn dọc,&
cột 3 &
Độ rộng cột 4 và dọc \\
\hline
\end{tabular}
: 2
cột 1 căn Độ rộng
cột 2 căn
dọc, căn cột 3 cột 4 và
dọc,
dọc dọc

Ta có thể xác định trước các loại cột với theo định nghĩa
\newcolumntype{<ký tự>}{<định nghĩa>} %trong gói array.sty

\newcolumntype{L}{>{\raggedright\arraybackslash}m{16mm}}
\newcolumntype{R}{>{\raggedleft\arraybackslash}m{16mm}}
\newcolumntype{C}{>{\centering\arraybackslash}m{16mm}}
\newcolumntype{M}{m{22mm}}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.1. Bảng trong LATEX 127

Sau đó, bảng trước đó vẫn có thể được sử dụng lại

7 Ví dụ 4.14 8
\begin{tabular}{|L|R|C|M|}
\hline
cột 1 căn dọc, căn dọc& cột 2 căn dọc,&
cột 3 & Độ rộng cột 4 và dọc \\
\hline
\end{tabular}

: 2
cột 1
cột 2 Độ rộng cột
căn dọc, cột 3
căn dọc, 4 và dọc
căn dọc

Trong ví dụ sau, tổng chiều rộng của bảng được cho là


(6cm).

7 Ví dụ 4.15 8
\begin{tabular*}{6cm}{|l@{ -- }l@{\extracolsep{\fill}}r|}
\hline
Hà Nội & sáng & 9:30\\
Hải Phòng & chiều & 14:30\\
\hline
\end{tabular*}

: 2
Hà Nội – sáng 9:30
Hải Phòng – chiều 14:30

Tại đây @{\externalolsep{\fill}} ép cột cuối cùng đến cạnh


của bảng rộng 5 cm.
Các đường kẻ trong bảng có độ dày 0,4pt theo mặc định.
Bạn có thể thay đổi giá trị này thành 1pt sau khi tải gói array
có mã sau,

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


128 Chương 4. Bảng và hình với môi trường động

7 Ví dụ 4.16 8: 2
\setlength{\arrayrulewidth}{1pt}
\begin{tabular}{|c|c|}\hline A B
A & B\\ \hline C D
C & D\\ \hline
\end{tabular}

Với gói array, bạn cũng có thể thay đổi độ dày của một đường
thẳng đứng:
7 Ví dụ 4.17 8: 2
\begin{tabular}{|c!{\vrule width 2pt}
c|}
A B
A & B\\ C D
C & D
\end{tabular}

Bạn có thể tô màu các cột bằng gói colortbl.sty:


7 Ví dụ 4.18 8: 2
\begin{tabular}{>{\columncolor{cyan}}
c
một hai ba
>{\color{red}\columncolor{green}}c bốn năm sáu
>{\columncolor{yellow}}c}
một & hai & ba\\ bẩy tám chín
bốn & năm& sáu\\
bẩy & tám & chín\\
\end{tabular}

Với gói colortbl.sty bạn có thể tô màu các dòng:


7 Ví dụ 4.19 8: 2
\begin{tabular}{c c c}
\rowcolor{cyan}một & hai & ba\\
một hai ba
\rowcolor{green}bốn & năm& sáu\\ bốn năm sáu
\rowcolor{yellow}bẩy & tám & chín\\
\end{tabular} bẩy tám chín

Bạn có thể sử dụng gói colortbl.sty để chỉ định màu nền của
ô:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.1. Bảng trong LATEX 129

7 Ví dụ 4.20 8: 2
\begin{tabular}{|c |c |c|} \hline
một & hai & ba\\ \hline một hai ba
bốn &\cellcolor{red}năm& sáu\\ \hline bốn năm sáu
\end{tabular}

Bạn có thể hiển thị một bảng với các hàng màu xen kẽ bằng
cách tải gói xcolor.sty với tùy chọn table.
7 Ví dụ 4.21 8: 2
\rowcolors{1}{green!30}{pink!50}
\begin{tabular}{ccc}
một hai ba
một & hai & ba\\ bốn năm sáu
bốn & năm& sáu\\
bẩy & tám & chín\\ bẩy tám chín
\end{tabular}

Đối số đầu tiên cho \rowcolors chỉ định số hàng bắt đầu tô màu
và hai đối số còn lại chỉ định màu sắc.

4.1.2 Bàn dài

Nếu bảng dài đến mức không vừa trên một trang, hãy sử
dụng gói longtable.sty.
\begin{longtable}[<vị trí>]{<định dạng cột>}% gói longtable
.sty
\endfirsthead
\endhead
\endfoot
\endlastfoot

<vị trí> có thể là r, l, c (c mặc định). Các thao tác này đặt bảng
lần lượt sang bên phải, bên trái và chính giữa. <định dạng cột>
chứa các hướng dẫn định dạng cột thông thường.

7 Ví dụ 4.22 8
\begin{longtable}{|l|l|}
\caption{Bảng tự ngắt theo trang}% tiêu đề bảng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


130 Chương 4. Bảng và hình với môi trường động

\label{longtable pattern} \\ % để tham khảo chéo


\hline
Tiêu đề cột 1 & cột 2 \\ \hline%
\endfirsthead
CCC & DDD \\ \hline% tiêu đề sau ngắt bảng
\endhead
\hline\multicolumn{2}{r}{tiếp tục trang}% ngắt thông tin
\endfoot
\hline
\endlastfoot
% đây là nhiều hàng trong bảng
11 & 22\\
... & ...\\
... & ...\\
22 & 33\\
\end{longtable}
: 2

Bảng 4.1.1: Bảng tự ngắt theo trang

Tiêu đề cột 1 cột 2


11 22
... ...
... ...
22 33

4.1.3 Bảng chất lượng của nhà xuất bản

Các bảng thảo luận ở trên có cấu trúc truyền thống. Tuy
nhiên, kiểu chữ của các bảng cấp nhà xuất bản có một chút
khác biệt. Sự khác biệt chính:
- Bạn cần một dòng dày hơn ở đầu và cuối bảng so với những
dòng ở giữa.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.1. Bảng trong LATEX 131

- Không được có khoảng trắng thừa ở hai cạnh của bảng,


điều này có thể được giải quyết bằng lệnh @{} được viết trên
mỗi cạnh của điều khiển định dạng.
- Không có đường thẳng đứng.
Tất cả điều này có thể được giải quyết với gói booktabs.sty.
Bây giờ chúng ta hãy xem xét một ví dụ.
7 Ví dụ 4.23 8: 2
\begin{tabular}{@{}lrr@{}}
\toprule Năm
&\multicolumn{2}{c}{Năm}\\
\cmidrule{2-3} 2012 2013
&\multicolumn{1}{c}{2012}&
\multicolumn{1}{c}{2013}\\ VCB(đ) 994 000 1 231 500
\midrule
VCB(đ) &994\,000&1\,231\,50 BIVD(đ) 165 000 194 950
0\\
BIVD(đ)&165\,000&194\,950\\
\bottomrule
\end{tabular}

Trong mã trước, thay vì dòng \cmidrule{2-3} thay bằng


\cmidrule(lr){2-3}

đường kẻ ngắn đi đẹp hơn


7 Ví dụ 4.24 8: 2
\begin{tabular}{@{}lrr@{}}
\toprule Năm
&\multicolumn{2}{c}{Năm}\\
\cmidrule(lr){2-3} 2012 2013
&\multicolumn{1}{c}{2012}&
\multicolumn{1}{c}{2013}\\ VCB(đ) 994 000 1 231 500
\midrule
VCB(đ) &994\,000&1\,231\,50 BIVD(đ) 165 000 194 950
0\\
BIVD(đ)&165\,000&194\,950\\
\bottomrule
\end{tabular}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


132 Chương 4. Bảng và hình với môi trường động

4.1.4 Căn chỉnh các bảng với đường cơ sở

Môi trường tabular và dạng tabular* không chỉ có các tham


số mà còn có các tùy chọn. Tại đây, bạn có thể chỉ định vị trí
của chúng so với đường cơ sở:
\begin{tabular}[<tùy chọn>]{<định dạng cột>}
\begin{tabular*}{<chiều rộng bảng>}[<tùy chọn>]{<định dạng
cột>}

Nếu không có tùy chọn (chính xác hơn là với tùy chọn cơ
bản), căn chỉnh được căn giữa:
7 Ví dụ 4.25 8: 2
chữ trước
\begin{tabular}{|cc|}\hline A B
A&B\\ A&B\\ A&B\\ \hline chữ trước A B chữ sau
\end{tabular}
chữ sau A B

Nếu <tùy chọn> là t (viết tắt top) thì phần đầu của bảng được
thêm vào đường cơ sở
7 Ví dụ 4.26 8: 2
chữ trước chữ trước chữ sau
\begin{tabular}[t]{|cc|}\ A B
hline
A&B\\ A&B\\ A&B\\ \hline A B
\end{tabular}
A B
chữ sau

Nếu <tùy chọn> là b (viết tắt bottom) thì phần cuối của bảng
được thêm vào đường cơ sở
7 Ví dụ 4.27 8: 2
chữ trước
\begin{tabular}[b]{|cc|}\ A B
hline A B
A&B\\ A&B\\ A&B\\ \hline
\end{tabular} A B
chữ trước chữ sau
chữ sau

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.2. Hình trong LATEX 133

Đối với hai kết quả khớp sau, có thể gây nhầm lẫn rằng đường
cơ sở của văn bản không trùng với đường cơ sở của hàng cuối
cùng hoặc đầu tiên của bảng, tương ứng. Điều này có thể được
giúp đỡ bởi
\firsthline %trong gói array.sty
\lasthline %trong gói array.sty

7 Ví dụ 4.28 8: 2
\begin{tabular}[t]{|cc|}\
firsthline A B
A&B\\ A&B\\ A&B\\ \hline A B
\end{tabular}
chữ A B chữ A B
\begin{tabular}[b]{|cc|}\
A B
hline
A&B\\ A&B\\ A&B\\ \ A B
lasthline
\end{tabular}

4.2 Hình trong LATEX


Sử dụng gói graphicx.sty khi dán hình ảnh. Đặt ảnh vào
thư mục chứa tệp nguồn hoặc thuận tiện hơn là trong một thư
mục con của nó. Do tính di động của nguồn tài liệu, bạn nên
đặt tên cho hình ảnh và thư mục con không có chữ cái hoặc
dấu cách có dấu.
Nếu tệp nguồn được dịch bởi trình biên dịch latex, tức là dvi
là mục tiêu, thì hình ảnh eps nên được sử dụng. Nếu pdflatex
là trình biên dịch, hãy sử dụng hình ảnh jpg, png hoặc pdf.
Nếu có thể dịch cả hai, hãy đặt một hình ảnh ở cả hai định
dạng (chẳng hạn như eps và jpg) vào thư mục thích hợp.

4.2.1 Chèn một hình vào văn bản

Khi bạn đến điểm trong tệp nguồn mà bạn muốn hiển thị
hình ảnh, hãy sử dụng lệnh sau:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


134 Chương 4. Bảng và hình với môi trường động

\includegraphics[<tùy chọn>]{<tệp ảnh>} %trong gói graphicx


.sty

<tệp ảnh> - Ta không cần chỉ định phần mở rộng khi chỉ
định tệp hình ảnh. Đó là, ví dụ: nếu ta cần chèn hình ảnh
flower.jpg, thì
7 Ví dụ 4.29 8: 2
\centering
\includegraphics[width=2cm]
{flower}

Bạn không cần chỉ định phần mở rộng vì bạn sẽ tìm kiếm
phần mở rộng pdf, jpg hoặc png nếu bạn đang sử dụng trình
biên dịch pdflatex và một phần mở rộng eps nếu bạn đang sử
dụng trình biên dịch latex. Vì vậy, nếu bạn đã chỉ định hình
ảnh ở cả hai định dạng, bạn có thể sử dụng bất kỳ trình biên
dịch nào mà không cần thay đổi nguồn. Điều quan trọng là
trong trường hợp này, tệp flower.jpg phải được đặt trong thư
mục hiện tại. Nếu hình ảnh nằm trong thư mục con của thư
mục hiện tại, chẳng hạn như thư mục con có tên hinh, bạn có
thể sử dụng mã sau:
\includegraphics{hinh/flower}
Đó là một sai lầm phổ biến để cung cấp cho con đường đầy
đủ. Ví dụ
\includegraphics{C:/sample/hinh/flower.jpg}%Không nên dùng

Đây là một giải pháp tồi, vì khi đó nguồn sẽ chỉ bật theo đường
dẫn này, tức là nó sẽ không di động được.
Cũng có thể không chỉ định tên thư mục con trong mỗi lệnh
\includegraphics. Sau đó, sử dụng
\graphicspath{{<thư mục con>/}} %trong gói graphicx.sty

chỉ huy. Ví dụ: nếu thư mục con được đặt tên là hinh, thì
\graphicspath{{hinh/}}
Trong trường hợp này, tệp flower.jpg trong thư mục con của
biểu đồ cũng có thể được hiển thị với mã sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.2. Hình trong LATEX 135

\includegraphics{flower}
Điều này làm cho nguồn rất linh hoạt, vì bạn chỉ cần sửa
thư mục con ở một nơi khi bạn đổi tên nó. Nếu bạn đã đặt hình
ảnh trong nhiều thư mục con, chẳng hạn như geometry ngoài
thư mục trước đó, hãy nhập:
\graphicspath{{hinh/}{geometry/}}
Bạn có thể nhập các thư mục con bổ sung với các thay đổi
thích hợp. Không đặt các tệp có cùng tên trong các thư mục
con khác nhau.
Thật không may, giải pháp này có một mối nguy hiểm. Điều
này là do trình biên dịch đầu tiên tìm kiếm hình ảnh trong thư
mục hiện tại, sau đó trong các gói đã cài đặt và chỉ cuối cùng
trong (các) thư mục con được chỉ định trong \graphicspath. Ví
dụ: một gói được gọi là notes chứa một tệp hình ảnh có tên là
info.pdf. Vì vậy, nếu bạn có tệp hình ảnh info.pdf của riêng
mình trong một thư mục con được gọi là hinh, thì
\graphicspath{{hinh/}}
\includegraphics{info}

mã sẽ tải hình ảnh trong gói notes.sty, không phải người dùng
của bạn. Điều này chỉ có thể được bảo vệ theo một cách bằng
cách đặt cho mỗi hình ảnh một tiền tố duy nhất mà chắc chắn
không thể nằm trong số các gói đã cài đặt. Nó cũng có thể
là một chuỗi số hoặc tên, chẳng hạn như tomacs-info.pdf. Về
phần mình, ta không thích giải pháp này, vì vậy ta không sử
dụng lệnh \graphicspath.
Lệnh \includegraphics có các <tùy chọn> sau, trong số các
tùy chọn khác:
width = <chiều rộng> Chiều rộng của hình ảnh (ví dụ: width
= 5cm).
height = <chiều cao> Chiều cao của hình ảnh (ví dụ: height =
5cm). Bạn cũng có thể làm sai lệch hình ảnh bằng cách
chỉ định chiều rộng và chiều cao cùng nhau.
scale = <số tỷ lệ> Tỷ lệ phóng đại/thu nhỏ (ví dụ: scale = 2).
trim = <trái><dưới><phải><trên> Xác định khung trong hình
ảnh. Sau đó, hình ảnh được định vị trên hình ảnh còn

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


136 Chương 4. Bảng và hình với môi trường động

lại sau khi khung được cắt, nhưng toàn bộ hình ảnh sẽ
được hiển thị, tức là không xảy ra hiện tượng cắt xén thực
tế nào. Ví dụ: nếu bạn nhập trim = 10mm 11mm 12mm 13mm,
khung sẽ là 10mm ở bên trái, 11mm ở dưới cùng, 12mm
ở bên phải và 13mm ở trên cùng.
clip Nếu cái này được tải bên cạnh phần cắt, một phần cắt
thực sự sẽ được thực hiện.
page = <trang> Đối với tệp pdf nhiều trang, hãy chọn trang (ví
dụ: trang = 5).
angle = <độ đo góc> Góc mà hình ảnh được quay theo độ. Giá
trị dương ngược chiều kim đồng hồ.
origin = <vị trí tâm quay> Tâm quay. Các giá trị của 〈origó〉
có thể là tl, t, tr, l, c, r, bl, b, br (mặc định: bl). Chúng được
giải thích trong hình sau:

Trong ví dụ sau, chúng ta điều chỉnh chiều rộng của hình


ảnh thành 3cm và xoay nó 90 độ theo chiều kim đồng hồ xung
quanh tâm của nó:

7 Ví dụ 4.30 8: 2
\centering
\includegraphics[width=2cm,
angle=-90,origin=c]{
flower}

Chúng ta cắt hình ảnh đi 10mm và sau đó cắt nó làm đôi:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.2. Hình trong LATEX 137

7 Ví dụ 4.31 8: 2
\centering
\includegraphics[trim=10mm
10mm 10mm 10mm,clip,
scale=0.5]{flower}

Hiển thị trang 5 của tệp tabular.pdf nhiều trang dưới dạng
hình ảnh cao 10 cm:
\includegraphics[height=10cm,page=5]{tabular}

4.2.2 Phù hợp phía sau và tiền cảnh

Bạn có thể chèn hình nền trên một trang nhất định với gói
eso-pic.sty được tải sau graphicx.sty bằng lệnh sau:
\AddToShipoutPictureBG*{<tệp ảnh>} %trong gói eso-pic.sty

Ví dụ
\AddToShipoutPictureBG*{%
\AtPageLowerLeft{%
\setlength{\unitlength}{1mm}%
\put(10,20){%
\includegraphics[width=15cm]{hatter}%
}%
}%
}

đặt một hình ảnh rộng 15cm gọi là biasach làm nền của
trang đó sao cho góc dưới bên trái của hình ảnh ở điểm (10,20)
so với góc dưới bên trái của trang làm điểm gốc, trong đó một
đơn vị là 1 mm.
Trên các hệ thống được cài đặt sau tháng 10 năm 2020, bạn
cũng có thể nhập lệnh độ dài hoặc độ dài trực tiếp trong lệnh
\put, vì vậy mã sau sẽ tương đương với mã trước đó:
\AddToShipoutPictureBG*{%
\AtPageLowerLeft{%

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


138 Chương 4. Bảng và hình với môi trường động

\put(10mm,20mm){%
\includegraphics[width=15cm]{hatter}%
}%
}%
}

Lệnh \AtPageLowerLeft đặt điểm gốc ở góc dưới bên trái của
trang. Thay vào đó, nguồn gốc có thể được định vị lại bằng các
lệnh sau:
\AtPageUpperLeft gốc ở góc trên bên trái của trang,
\AtTextUpperLeft gốc ở góc trên bên trái của gương văn bản,
\AtTextLowerLeft gốc ở góc dưới bên trái của gương văn bản,
\AtPageCenter nguồn gốc ở giữa trang.
Nếu không có các mã * trước đó, hình ảnh được hiển thị
dưới dạng nền trên mỗi trang. Ví dụ, bạn có thể tạo một hình
mờ. Tác dụng của việc này là
\ClearShipoutPictureBG %trong gói eso-pic.sty

có thể được hủy bỏ bằng lệnh. Tất nhiên, thay vì một hình ảnh,
bất kỳ văn bản nào cũng có thể được chèn tương tự làm nền.
Nếu bạn muốn đưa thứ gì đó lên nền trước (chẳng hạn như
con dấu), hãy thay thế các chữ cái BG (nền) bằng FG (nền
trước) trong các lệnh trước đó.

4.2.3 Chèn các trang pdf vào văn bản

Nếu bạn muốn chèn các trang từ tệp pdf bên ngoài, hãy sử
dụng
\includepdf[<tùy chọn trang>]{tệp pdf} %trong gói
pdfpages.sty

Ví dụ,
\includepdf[pages={3,8-11,15}]{ebook.pdf}
chèn các trang 3, 8, 9, 10, 11, 15 trong ebook.pdf. Sau
\includeepdf [pages = -]{ebook.pdf}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.2. Hình trong LATEX 139

chèn tất cả các trang ebook.pdf. Sau


\includeepdf[pages = last-1]{ebook.pdf}
chèn tất cả các trang ebook.pdf theo thứ tự ngược lại.
Các trang PDF được chèn như mô tả ở trên cũng sẽ hiển thị
đầu trang và chân trang phù hợp với kiểu tài liệu đó. Nếu bạn
không muốn điều này, tức là bạn muốn xem chính xác những
gì bạn thấy trong bản pdf gốc trên các trang được chèn, hãy sử
dụng tùy chọn pagecommand={\thispagestyle{blank}}. Ví dụ
\includeepdf pagecommand={\thispagestyle{blank}}, pages
= -]{ebook.pdf}
Nếu ebook.pdf trong ví dụ trước có chứa các liên kết bên
trong hoặc bên ngoài (tham chiếu chéo, url, v.v.), thì việc tải và
dịch nó sang tệp nguồn theo cách trước đó, các liên kết này sẽ
không hoạt động trong tệp pdf kết quả. Để giải quyết vấn đề
này, trước tiên bạn phải cài đặt phiên bản cũ hơn của tập lệnh
Java PDFBox (Java PDFLibrary):

pdfannotextractor --install

Pdfannotextractor là một tập lệnh Perl. Điều này, tất nhiên,


chỉ cần được thực hiện một lần. Sau đó, trong thư mục của tệp
nguồn, nơi doc.pdf cũng được đặt:

pdfannotextractor ebook.pdf

Thao tác này sẽ tạo tệp ebook.pax chứa dữ liệu cho các liên
kết doc.pdf. Sau đó tải các gói hyperref (xem phần 18.1) và pax
vào tệp nguồn. Sau đó, bằng cách tải tệp ebook.pdf như trước
và sau đó chuyển đổi tệp nguồn sang pdf bằng trình biên dịch
pdflatex, kết quả thu được sẽ chứa các liên kết ebook.pdf chính
xác.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


140 Chương 4. Bảng và hình với môi trường động

4.2.4 Lấy một số trang từ một tệp pdf

4.3 Đối tượng di động

Chúng ta có thể chèn các bảng và hình ảnh trên cơ sở của


những lệnh đã biết. Nhưng nó có thể không còn phù hợp trên
trang đó nữa và việc chuyển nó sang trang tiếp theo sẽ khiến
phần cuối của trang không có tài liệu. Để giải quyết vấn đề
này, một cái gọi là "phao" đã ra đời. Điều này có nghĩa là di
chuyển đối tượng sự cố đến một vị trí mà chúng ta chỉ định
(dưới cùng, trên cùng hoặc trang riêng biệt của trang hiện tại)
và điền đầy trang bằng văn bản tiếp theo.

4.3.1 Hình và bảng di động

Môi trường figure có thể được sử dụng để làm hình ảnh di


động, trong khi môi trường table có thể được sử dụng để làm
bảng di động.
\begin{figure}[<tùy chọn>] <đặt hình> \end{figure}
\begin{table}[<tùy chọn>] <đặt hình> \end{table}

Các <tùy chọn> trong các môi trường này:


h Giữ nguyên vị trí nếu có thể.
t Di chuyển lên đầu trang hiện tại.
b Di chuyển xuống cuối trang hiện tại.
p Đặt trên một trang riêng biệt.
! Điều này sẽ loại bỏ một số hạn chế, do đó, đối tượng có nhiều
khả năng được đặt đến nơi chúng ta muốn.
Bất kỳ sự kết hợp nào của các chữ cái này đều có thể được
sử dụng như một tùy chọn. Thứ tự của các chữ cái không quan
trọng, bởi vì đối tượng được đặt ở vị trí đầu tiên mà tùy chọn
cho phép. Dưới nó chỉ ngoại lệ của h, được ưu tiên hơn tất cả
mọi thứ. Hãy xem một số ví dụ:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.3. Đối tượng di động 141

7 Ví dụ 4.32 8 : 2
\begin{figure}
\centering
\includegraphics{flower}
\end{figure}

Vì chúng ta không chỉ định tùy chọn ở đây nên giá trị mặc định
là tbp. Điều này có nghĩa là trong trường hợp này, trước tiên
bạn sẽ cố gắng đặt hình ảnh ở đầu trang, nếu không thể đặt
hình ảnh ở đó, thì ở cuối trang, nếu không ở đó, trên một trang
tính riêng biệt.
Trong trường hợp này, nó sẽ
\begin{figure}[ht] cố gắng đăt hình tại đây trước,
\centering
nhưng nếu nó không thể được, nó
\includegraphics{flower}
sẽ đặt hình ở đầu trang sau.
\end{figure}
Cố gắng giữ hình ảnh đúng vị trí
\begin{figure}[ht!] với một số hạn chế được dỡ bỏ,
\centering
nhưng nếu không thể đến được
\includegraphics{flower}
đó, hãy đặt hình ảnh ở đầu trang.
\end{figure}

Trong hầu hết các trường hợp, ta sử dụng tùy chọn này trong
tài liệu của riêng mình. Trong những trường hợp như vậy, có
vẻ như bạn nên thay đổi tùy chọn tbp cơ bản thành ht! giá trị.
Ví dụ: trong môi trường figure, bạn có thể thực hiện điều này:
\makeatletter \def\fps@figure{ht!} \makeatother

hoặc
\floatplacement{figure}{ht!} %trong gói float.sty

Có thể xảy ra trường hợp một đối tượng di động được đặt ở đầu
trang trong các hàng của chủ đề trước đó, điều này thật đáng
tiếc. Trong trường hợp này, hãy sử dụng
\suppressfloats[<tùy chọn>]

Đối tượng di động tiếp theo không thể xuất hiện ở vị trí của
trang theo <tùy chọn>, có thể là t hoặc b. Nếu tùy chọn này
không được chỉ định, không có đối tượng di động nào có thể

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


142 Chương 4. Bảng và hình với môi trường động

xuất hiện ở bất kỳ đâu trên trang. Tác dụng của lệnh này được
giới hạn trong một trang và chỉ áp dụng cho đối tượng di động
tiếp theo trong mã nguồn.
Nếu bạn muốn các đối tượng di động bắt đầu từ trước đến
nay được hoàn thành cho đến một thời điểm nhất định, hãy sử
dụng
\FloatBarrier %trong gói lệnh placeins.sty

Chúng ta sẽ mô tả việc phân chia các tác phẩm dài hơn thành
các phần sau. Sau đó, sẽ là may mắn nếu tất cả các đối tượng
di động trong các giai đoạn được hoàn thành. Điều này được
thực hiện bằng tùy chọn phần trong gói placeins.sty. Đối với
các chương, đây không phải là vấn đề, vì mỗi chương đóng lại
bằng lệnh \clearpage, lệnh này sẽ hiển thị các bước đang chờ
xử lý.

4.3.2 Gắn nhãn các đối tượng di động

Nhiều khi chúng ta muốn tham khảo hình ảnh và bảng


biểu. Trong trường hợp này, nên cung cấp cho đối tượng một
số sê-ri và địa chỉ tự động. Mặt khác, nếu có một số lượng lớn
các đối tượng này, vì lý do rõ ràng, nên đưa các tiêu đề này vào
một bảng hoặc mục lục hình có đánh số trang, tương tự như
mục lục. Nó được sử dụng để thực hiện các nhiệm vụ này
\caption[<nhãn đưa vào danh sách>] {<nhãn chú thích>}

Giá trị mặc định của tùy chọn nhãn đưa vàodanh sáchgiống như
<nhãn chú thích>.
7 Ví dụ 4.33 8: 2
\begin{figure}[ht!]
\centering
\includegraphics[scale=0.2]{
flower}
\caption{Bông hoa}\label{fig:01} Hình 4.3.1: Bông hoa
\end{figure} Hình 4.3.1 hoa đẹp.
Hình \ref{fig:01} hoa đẹp

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.3. Đối tượng di động 143

Kết quả là, hình ảnh được hiển thị ở trung tâm và được gắn
nhãn. Nhãn sẽ cho biết "hình" hoặc "bảng" tùy theo việc chúng
ta đặt lệnh \caption vào môi trường hình hoặc bảng. Số sê-ri
là tự động. Địa chỉ được chỉ định sẽ được thêm vào danh sách
tương ứng.
Nếu bạn không muốn đánh số, chỉ cần một nhãn chú thích,
hãy sử dụng lệnh sau:
\caption*{<nhãn chú thích>} %trong gói lệnh caption.sty

Nếu bạn không muốn cung cấp <nhãn chú thích>, chỉ cần
đánh số, hãy làm như sau trong khi sử dụng gói caption.sty:
7 Ví dụ 4.34 8: 2
\begin{figure}[ht!]
\centering
\includegraphics[scale=0.2]{
flower}
\caption{}\label{fig:02} Hình 4.3.2
\end{figure} Hình 4.3.2 hoa đẹp
Hình \ref{fig:02} hoa đẹp.

Nếu bạn muốn một <nhãn khác> khác được đưa vào danh
sách ngoài nhãn, hãy chỉ định <nhãn khác> sẽ được đưa vào
danh sách như một tùy chọn cho lệnh \caption. Ví dụ
\caption[<nhãn khác>]{<nhãn chú thích>}

Tiêu đề xuất hiện bên dưới hình ảnh trong ví dụ trước vì


lệnh \caption được gọi sau khi hình ảnh được tải. Nếu chúng ta
viết trước nó, tiêu đề sẽ ở phía trên hình. Ví dụ: nếu bạn luôn
muốn nhãn phía trên bảng cho các bảng, bất kể lệnh \caption
được đưa vào ở đâu, hãy sử dụng mã sau:
\floatstyle{plaintop}\restylefloat{table} %trong gói float
.sty
\floatstyle{plaintop}\restylefloat{figure} %trong gói
float.sty

Không thể đặt chú thích cuối trang trong lệnh \caption như
bình thường. Đó là, ví dụ, mã sau đây không biên dịch được:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


144 Chương 4. Bảng và hình với môi trường động

\begin{figure}[ht!]
\centering
\includegraphics[scale=0.2]{flower}
\caption{Bông hoa\footnote{Dưới chân trang}}\label{fig:03}
\end{figure}

Có thể có hai giải pháp tùy thuộc vào việc bạn có muốn một
danh sách hình hoặc bảng hay không:
7 Ví dụ 4.35 8: 2
\begin{figure}[ht!]
\centering
\includegraphics[scale=0.2]{
flower}
\caption{Bông hoa Hình 4.3.3: Bông hoa1
\footnotemark}\label{fig:03}
\end{figure} Dưới chân trang
\footnotetext{Dưới chân trang}

Hoặc
\begin{figure}[ht!]
\centering
\includegraphics[scale=0.2]{flower}
\caption[]{Bông hoa \footnotemark}\label{fig:03}
\end{figure}
\footnotetext{Dưới chân trang}

trong trường hợp sau


\caption[]{<Tiêu đề hình ảnh> \footnotemark}
có thể được thay thế bởi:
\caption{<Tiêu đề hình ảnh> \protect\footnotemark}
Nếu bạn muốn thay đổi kiểu của các thẻ, hãy sử dụng gói
lệnh caption.sty. Chi tiết về điều này không được mô tả, mọi
thứ có thể được tìm thấy trong tài liệu của gói.

4.3.3 Tạo các đối tượng di động của riêng

Theo mặc định, chúng ta có thể làm di động các bảng và số


liệu với nhãn và danh sách của riêng chúng ta. Nhưng chúng

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.3. Đối tượng di động 145

ta cũng có thể xác định môi trường nổi của riêng của mình. Ví
dụ, chúng ta muốn tạo đồ thị. Tên môi trường phải là graph,
nhãn phải là "graph" và tiêu đề danh sách phải là "Danh sách
các đồ thị". Sau đó, viết những điều sau trong phần mở đầu:
\DeclareCaptionType{graph}[graph][<Danh sách các đồ thị>] %
trong caption.sty

Sau đó, bạn có thể sử dụng môi trường graph chính xác như
môi trường table hoặc figure.

4.3.4 Tránh thả nổi di động

Nếu bạn không muốn di động một đối tượng, nhưng muốn
“giữ” vị trí của nó, hãy sử dụng tùy chọn H cho môi trường di
động, có sẵn bằng cách tải gói float.sty. Ví dụ
7 Ví dụ 4.36 8: 2
\begin{figure}[H]
\centering
\includegraphics[scale=0.2]{
flower}
\caption{Bông hoa}\label{fig:04} Hình 4.3.4: Bông hoa
\end{figure}

Trong trường hợp này, đối tượng chắc chắn sẽ xuất hiện ở
nơi nó phải ở theo mã. Nhưng theo cách này, độ bão hòa của
các trang sẽ không nhất thiết phải đủ, vì vậy giải pháp này đòi
hỏi nhiều thử nghiệm, tức là nó không thuận tiện. Câu hỏi đặt
ra là tại sao, nếu chúng ta không muốn di động một thứ gì đó,
chúng ta lại đặt nó trong một môi trường di động. Câu trả lời
là lệnh \caption từ môi trường di động biết cần nhập nhãn và
số sê-ri nào. Một cách khác để giải quyết vấn đề này là
\captionof{<môi trường đi động>}[<danh mục>]{<chú giải>} %
trong caption.sty

sử dụng mà không cần phải đặt trong môi trường di động vì


bạn biết loại và số nhãn do đặc điểm kỹ thuật của “môi trường
di động”. Ví dụ: mã sau có cùng tác dụng với mã trước:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


146 Chương 4. Bảng và hình với môi trường động

7 Ví dụ 4.37 8: 2
\begin{center}
\centering
\includegraphics[scale=0.2]{flower}
\captionof{figure}{Bó hoa}\label{fig:
05}
\end{center} Hình 4.3.5: Bó hoa

Hoàn toàn tương tự dùng ngoài môi trường di động có sử


dụng gói lệnh nonfloat.sty
\figcaption[<danh sách hình>]{<chú giải>} %gói nonfloat.sty
\tabcaption[<danh sách bảng>]{<chú giải>} %gói nonfloat.sty

7 Ví dụ 4.38 8: 2
\begin{center}
\centering
\includegraphics[scale=0.2]{flower}
\figcaption{Bó hoa}\label{fig:06}
\end{center}
Hình 4.3.6: Bó hoa

4.3.5 Bao bọc các đối tượng bằng văn bản

Bao bọc các đối tượng xung quanh bằng văn bản, điều này
có thể được thực hiện với môi trường window hoặc figwindow của
gói picinpar.sty cho hình ảnh. Điều này được tạo thành từ các
hình, nhưng cũng có thể được áp dụng cho các bảng hoặc bất
kỳ đối tượng di động nào của riêng bạn bằng lệnh \captionof
trong gói caption.sty.
\begin{window}[<số nguyên>,<vị trí>,{<tệp hình hoặc bảng>},
{}]
...Nội dung ....văn bản...
\end{window}

2 Đối số <số nguyên> là 0, 2, 3,...hình đặt sau dòng 0,1,2,3,...

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.3. Đối tượng di động 147

2 Đối số <vị trí> là chữ cái l đặt bên trái, r đặt bên phải và
c đặt trung tâm.
2 <tệp hình> là đoạn mã của TikZ hoặc các tệp bằng lệnh
\includegraphics[scale=0.7]{<tệp hình>} hoặc một bảng.

7 Ví dụ 4.39 8

\begin{window}[0,l,{\includegraphics[scale=0.3]{flower}},{}
]
\vnlipsum[1-2]
\end{window}

: 2
1. Sai lầm lớn nhất đời người là dùng sức khỏe
để đánh đổi lấy những vật ngoài thân. Bi ai
lớn nhất đời người là dùng sinh mệnh để đổi
lấy phiền não và lãng phí lớn nhất đời người
là dùng tính mạng để giải quyết rắc rối do bản
thân mình tạo ra!
2. Dù rất chua chát nhưng sự thật là, nhà ở có sửa to, rộng
hơn thế nào đi nữa cũng chỉ là nơi ở tạm thời. Cái quách
sành mới là nhà ở vĩnh hằng của tất cả chúng ta. Thế nên,
nhà rộng chẳng bằng tâm rộng, tấm lòng rộng mở, bề ngoài
an yên không bằng cõi lòng an yên.

7 Ví dụ 4.40 8

\begin{window}[2,r,{\includegraphics[scale=0.3]{flower}},{}
]
\vnlipsum[1-2]
\end{window}

: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
148 Chương 4. Bảng và hình với môi trường động

1. Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn
nhất đời người là dùng tính mạng để giải quyết
rắc rối do bản thân mình tạo ra!
2. Dù rất chua chát nhưng sự thật là, nhà ở có
sửa to, rộng hơn thế nào đi nữa cũng chỉ là nơi
ở tạm thời. Cái quách sành mới là nhà ở vĩnh hằng của tất
cả chúng ta. Thế nên, nhà rộng chẳng bằng tâm rộng, tấm
lòng rộng mở, bề ngoài an yên không bằng cõi lòng an yên.
Môi trường có đánh số
\begin{figwindow}[<số nguyên>,<vị trí>,{<tệp hình>},{<chú
giải>}]
...Nội dung ....văn bản...
\end{figwindow}
\begin{tabwindow}[<số nguyên>,<vị trí>,{<tệp hình>},{<chú
giải>}]
...Nội dung ....văn bản...
\end{tabwindow}

Hoath động môi trường này giống như môi trường window.

7 Ví dụ 4.41 8
\begin{figwindow}[2,r,{\includegraphics[scale=0.3]{flower}}
,{Bông hoa}]
\vnlipsum[1-2]
\end{figwindow}
: 2
1. Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân. Bi ai lớn nhất đời người là dùng sinh
mệnh để đổi lấy phiền não và lãng phí lớn nhất đời
người là dùng tính mạng để giải quyết rắc rối do
bản thân mình tạo ra!
2. Dù rất chua chát nhưng sự thật là, nhà ở
có sửa to, rộng hơn thế nào đi nữa cũng chỉ là
Hình 4.3.7:
nơi ở tạm thời. Cái quách sành mới là nhà ở vĩnh
Bông hoa
hằng của tất cả chúng ta. Thế nên, nhà rộng chẳng

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


4.3. Đối tượng di động 149

bằng tâm rộng, tấm lòng rộng mở, bề ngoài an yên


không bằng cõi lòng an yên.

7 Ví dụ 4.42 8
\begin{tabwindow}[1,c,{%
\begin{tabular}[t]{|r|l|r@{:}l|}%
\hline
1&HSV&12&0\\
\hline
2&MSV&11&1\\
\hline
3&VfB&10&2\\
\hline
\end{tabular}},{Tài liệu}]
\vnlipsum[1-2]
\end{tabwindow}
: 2
1. Sai lầm lớn nhất đời người là dùng sức khỏe để đánh
đổi lấy những vật 1 HSV 12:0 ngoài thân. Bi ai lớn
nhất đời người là dùng sinh mệnh để
đổi lấy phiền não và 2 MSV 11:1 lãng phí lớn nhất đời
người là dùng tính 3 VfB 10:2 mạng để giải quyết
rắc rối do bản thân mình tạo ra!
2. Dù rất chua chát Bảng 4.3.1: Tài nhưng sự thật là,
nhà ở có sửa to, rộng liệu hơn thế nào đi nữa
cũng chỉ là nơi ở tạm thời. Cái quách sành mới là nhà ở vĩnh
hằng của tất cả chúng ta. Thế nên, nhà rộng chẳng bằng tâm
rộng, tấm lòng rộng mở, bề ngoài an yên không bằng cõi lòng
an yên.

\begin{floatingfigure}[r]{4cm}
\centering
\includegraphics[scale=0.2]{flower}
\figcaption{Bông hoa}\label{fig:07}
\end{floatingfigure}

Tùy chọn:
r Di chuyển đối tượng sang phải.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


150 Chương 4. Bảng và hình với môi trường động

l Di chuyển đối tượng sang trái.


p (mặc định) Di chuyển đối tượng sang phải ở phía lẻ và sang
trái ở phía chẵn, nghĩa là, ra lề ngoài.
Nếu bạn muốn tùy chọn mặc định là r, hãy tải gói floatflt
.sty với tùy chọn rflt. Nếu bạn muốn tùy chọn mặc định là l,
hãy tải gói floatflt với tùy chọn lflt. Không có tùy chọn nào
được chỉ định để đặt ở lề bên trong, nhưng điều này cũng có
thể được thực hiện với mã sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


Chương 5. HỘP VÀ KHUNG HỘP

5.1. Hộp một hàng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152


5.2. Hộp khối văn bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.3. Hộp dòng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.4. Hộp kéo dài và phản chiếu . . . . . . . . . . . . . . . . . . . . . . 157
5.5. Thay đổi kích thước hộp . . . . . . . . . . . . . . . . . . . . . . . . 158
5.6. Xoay hộp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
5.7. Đặt lại kích thước hộp . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.8. Hộp vô hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

Hộp là một phần của tài liệu mà nội dung của nó không thể
bị chia nhỏ ở cuối dòng hoặc ở cuối trang, nghĩa là, không theo
chiều dọc cũng như chiều ngang. Đó là các đối tượng di động,
nhưng một hộp cũng là một chữ cái hoặc một dòng chẳng hạn.
Có ba loại hộp:
- Hộp một hàng: hộp một hàng tải từ trái sang phải không
quá một dòng.
- Hộp đoạn văn: tối đa một hộp nhiều dòng.
- Hộp dòng: dòng có thể điều chỉnh kích thước.
152 Chương 5. Hộp và khung hộp

Chúng ta giới thiệu các từ sau cho các kích thước của hộp:

Tổng chiều cao và chiều sâu được gọi là tổng chiều cao.

5.1 Hộp một hàng

1. Để tạo một hộp một dòng, hãy sử dụng lệnh sau:


\makebox[<bề rộng hộp>] [<vị trí văn bản>] {<văn bản>}

Nếu <vị trí văn bản> là c, nó căn giữa văn bản trong hộp
(mặc định), nếu l, thì sang trái, nếu r, sang phải và đối với
s, kéo dài/nén đến hết chiều rộng của hộp. Nếu bạn không chỉ
định chiều rộng và vị trí, chiều rộng của hộp sẽ giống với chiều
rộng của văn bản:
7 Ví dụ 5.1 8: 2
\makebox{Hà Nội} Hà Nội

Do đó, từ ’Hà Nội’ thu được là không thể tách rời, vì LATEX
coi nó như một chiếc hộp. Một vi dụ khác
7 Ví dụ 5.2 8: 2
\makebox[5cm][s]{Hà Nội}\\ Hà Nội
\makebox[5cm][s]{H à N ộ i} H à N ộ i

2. Bạn cũng có thể đóng khung một hộp một dòng bằng lệnh
sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


5.1. Hộp một hàng 153

\framebox[<bề rộng hộp>] [<vị trí văn bản>] {<văn bản>}

Điều này sẽ được sử dụng chính xác như lệnh \makebox.


7 Ví dụ 5.3 8: 2
\makebox{Hà Nội}\\ Hà Nội
\makebox[5cm][s]{Hà Nội}\\ Hà Nội
\makebox[5cm][s]{H à N ộ i} H à N ộ i

Độ dày đường kẻ khung, theo mặc định là 0,4pt, có thể được


đặt bằng lệnh sau, ví dụ: đối với 1pt.
\setlength{\fboxrule}{1pt}

Khoảng cách giữa khung và văn bản, theo mặc định là 3pt, có
thể được điều chỉnh bằng lệnh sau ví dụ: đối với 2pt.
\setlength{\fboxsep}{2pt}

Nếu ta sử dụng lệnh \makebox mà không có tùy chọn, tất cả


những gì bạn phải làm là
\mbox{<văn bản>}

Tương tự, nếu bạn sử dụng lệnh \framebox mà không có tùy


chọn, chỉ phải được viết.
\fbox{<văn bản>}

Hộp một tô màu cũng có thể được sản xuất. Chúng được thể
hiện trong gói lệnh xcolor.sty:
7 Ví dụ 5.4 8: 2
\colorbox{pink}{Hà Nội} Hà Nội Hà Nội
\colorbox[RGB]{128,0,128}{Hà Nội}
\fcolorbox{red}{yellow}{Hà Nội} Hà Nội

3. Lệnh sau tạo một hộp một dòng cao hơn/thấp hơn đường
cơ sở:
\raisebox{<khoảng nâng>}{<văn bản>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


154 Chương 5. Hộp và khung hộp

7 Ví dụ 5.5 8: 2
Con cò\raisebox{4pt}{bay}lả Con còbaylả bayla.
\raisebox{-4pt}{bay}la.

Bạn cũng có thể sử dụng các ộ đo của hộp


\width %độ rộng hộp
\height %độ cao hộp
\depth %độ sâu hôp
\totalheight %tỏng độ cao

cũng là các lệnh chiều dài, là chiều rộng, chiều cao, chiều sâu
và chiều cao tổng thể của hộp được tạo bởi <văn bản>. Ví dụ
7 Ví dụ 5.6 8: 2
Con cò\raisebox{0.5\height}{bay}lả
Con còbaylả la.
\raisebox{-\height}{bay}la. bay

5.2 Hộp khối văn bản

Bạn có thể đặt nhiều dòng hoặc nhiều đoạn văn bản trong
các hộp khối văn bằng lệnh hoặc ngữ cảnh sau:
\parbox[<vị trí>][<chiều cao>][<vị trí văn bản>]{<độ rộng>}{<văn
bản>}

hoặc
\begin {minipage}[<vị trí>][<chiều cao>][<vị trí văn bản>]{<độ rộ
ng>}
<văn bản>
\end{minipage}

<vị trí> kiểm soát cách định vị hộp so với đường cơ sở của môi
trường. Theo mặc định, tâm của hộp là điểm căn chỉnh,
đối với t là đường cơ sở của hàng trên cùng của hộp và đối
với b là đường cơ sở của hàng dưới cùng.
[<chiều cao>] là tổng chiều cao của hộp.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


5.2. Hộp khối văn bản 155

[<vị trí văn bản>] có thể được sử dụng nếu chiều cao cũng
được chỉ định. Chỉ định cách văn bản được định vị theo
chiều dọc trong hộp. Các giá trị của nó là t, b, c, s, đặt văn
bản theo chiều dọc ở giữa và ở trên cùng và dưới cùng của
hộp, và trải rộng nó trên toàn bộ chiều cao của hộp. Tùy
chọn s chỉ hoạt động nếu bạn đặt các khoảng trống dọc
linh hoạt trong văn bản (ví dụ: medskip).
<độ rộng> là chiều rộng của hộp.
<văn bản> nội dung của hộp.

7 Ví dụ 5.7 8: 2
\textbf{SÓNG} SÓNG Ôi con sóng ngày xưa
\begin{minipage}[t][2cm][s] Và ngày sau vẫn thế
{4cm}
Ôi con sóng ngày xưa\\ Nỗi khát vọng tình yêu
Và ngày sau vẫn thế Bồi hồi trong ngực trẻ
\par\medskip
Nỗi khát vọng tình yêu
Bồi hồi trong ngực trẻ
\end{minipage}

Hộp đoạn văn cũng có thể được đóng khung mà không cần lệnh
khác, vì hộp đoạn văn có thể được đặt trong hộp có khung một
dòng, vì nó đã được coi là một đơn vị, một hộp:
7 Ví dụ 5.8 8: 2
\textbf{SÓNG} SÓNG
\fbox{\begin{minipage}[t][2
Ở ngoài kia đại dương
cm][s]{4.5cm}
Trăm nghìn con sóng
Ở ngoài kia đại dương
Trăm nghìn con sóng đó
đó
\par\medskip Con nào chẳng tới bờ
Con nào chẳng tới bờ \\ Dù muôn vời cách trở
Dù muôn vời cách trở
\end{minipage}}

Lệnh \parbox và môi trường minipage có thuộc tính khó chịu,


được minh họa trong ví dụ sau:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


156 Chương 5. Hộp và khung hộp

7 Ví dụ 5.9 8: 2
\fbox{\begin{minipage}{5cm} Trước muôn trùng sóng
Trước muôn trùng sóng bể\\
bể
Em nghĩ về anh, em
Em nghĩ về anh, em
\end{minipage}}

Ở đây, do phông chữ và kích thước đã cho, chiều rộng 6cm


không phải là tối ưu, vì vậy kích thước của khoảng trắng ở
dòng đầu tiên là quá lớn. Một giải pháp khả thi cho vấn đề này
là môi trường varwidth trong gói lệnh varwidth.sty
\begin{varwidth}[<vị trí>][<chiều cao>][<vị trí văn bản>]{<độ rộ
ng>}
<văn bản>
\end{varwidth}

Điều này hoạt động chính xác giống như môi trường minipage,
nhưng chiều rộng của hộp chiếm giá trị tối đa không lớn hơn
<chiều rộng> mà tại đó bố cục vẫn là tối ưu. Ví dụ: hãy xem
đoạn mã trước với môi trường varwidth:
7 Ví dụ 5.10 8: 2
\fbox{\begin{varwidth}{5cm} Trước muôn trùng sóng
Trước muôn trùng sóng bể\\
bể
Em nghĩ về anh, em
Em nghĩ về anh, em
\end{varwidth}}

Ở đây, các khoảng trống ở hàng trước có kích thước phù hợp,
nhưng để làm được điều đó, chiều rộng của hộp phải giảm một
chút từ 5cm.
Môi trường varwidth cũng có thể được sử dụng nếu các điểm
ngắt được chúng ta chỉ định, do đó chiều rộng của hộp là không
xác định. Sau đó thay thế <đ rộng> bằng \textwidth.
7 Ví dụ 5.11 8: 2
\fbox{\begin{varwidth}{\
Sóng bắt đầu từ gió
textwidth}
Sóng bắt đầu từ gió\\ Gió bắt đầu từ đâu?
Gió bắt đầu từ đâu?\\ Em cũng không biết nữa
Em cũng không biết nữa\\ Khi nào ta yêu nhau
Khi nào ta yêu nhau
\end{varwidth}}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


5.3. Hộp dòng 157

5.3 Hộp dòng

Bạn có thể tạo các hộp dòng bằng lệnh sau:


\rule[<khoảng nâng>] {<chiều rộng>} {<chiều cao>}

Thao tác này vẽ một hình chữ nhật có chiều rộng <chiều rộng>
và chiều cao <chiều cao>, phần đáy của nó sẽ cao hơn mức cơ
bản theo số lượng <khoảng nâng>. Ví dụ
7 Ví dụ 5.12 8: 2
xx\rule[1ex]{2cm}{2mm}xx\\ xx xx
x\rule[0.5ex]{3cm}{1pt}x\\ x x
x\rule[-0.5ex]{3cm}{1pt}x
x x

5.4 Hộp kéo dài và phản chiếu

Ta có thể kéo dài các hộp bằng cách sử dụng lệnh sau:
\scalebox{<x>}[<y>] {<hộp>} %trong gói graphicx.sty

<hộp> Hộp được cung cấp. Điều này có thể được thay thế bằng
văn bản thuần túy, đó là những gì sau đó coi như một cái
hộp.
<x> Hệ số giãn ngang (có thể âm).
<y> Hệ số giãn dài dọc (có thể âm) với giá trị mặc định là <x>.
7 Ví dụ 5.13 8: 2
sóng
\scalebox{1.5}{\fbox{sóng}} sóng sóng sóng
\scalebox{1.5}[1]{\fbox{só gnós sóng sóng
ng}}\\
\scalebox{-1}[1]{sóng}
\scalebox{1}[-1]{sóng}
\scalebox{-1}[-1]{sóng}

Như chúng ta thấy, chúng ta có thể phản ánh điều này. Ngoài
ra còn có một lệnh riêng để phản chiếu trục dọc:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


158 Chương 5. Hộp và khung hộp

\reflectbox{<hôp>} %gói graphicx.sty

Tương đương với lệnh \scalebox{-1}[1]{<hộp>}.

5.5 Thay đổi kích thước hộp


\resizebox{<chiều rộng>}{<chiều cao>}{<hộp>} %trong gói
graphicx
\resizebox*{<chiều rộng>}{<chiều cao>}{<hộp>} %trong gói
graphicx

<hộp> Hộp đã thay đổi kích thước. Điều này có thể được thay
thế bằng văn bản thuần túy, đó là những gì sau đó coi
như một cái hộp.
<chiều rộng> Chiều rộng của hộp đã thay đổi kích thước.
<chiều cao> Chiều cao của hộp đã thay đổi kích thước. Đây
là cho \resizebox từ đường cơ sở chiều cao đo được, trong
khi đối với \resizebox* nó có nghĩa là tổng chiều cao.
Nếu <chiều rộng> hoặc <chiều cao> tại chỗ ký hiệu ! , kích
thước tỷ lệ với khác thiết lập đúng cách.
7 Ví dụ 5.14 8: 2
sóng
\resizebox{!}{0.5cm}{sóng}
sóng
sóng sóng
\resizebox*{!}{0.5cm}{sóng} sóng
\resizebox{3cm}{0.5cm}{sóng
}

5.6 Xoay hộp

Bạn có thể xoay các hộp bằng lệnh sau:


\rotatebox[origin=<tâm quay>]{<góc quay>}{<hộp>} %trong gó
i graphicx.sty

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


5.7. Đặt lại kích thước hộp 159

<hộp> Hộp để xoay. Văn bản này có thể được thay thế bằng văn
bản thuần túy, sau đó được coi như một hộp.
<góc quay> Góc quay theo độ. Nếu là giá trị dương, nó sẽ quay
ngược chiều kim đồng hồ.
<tâm quay> Tâm quay, có thể nhận các giá trị tl, t, tr, l, c, r,
Bl, B, Br, bl, b, br (mặc định là Bl). Chúng được giải thích
trong hình sau

7 Ví dụ 5.15 8
Hà Nội \rotatebox[origin=c]{90}{\fbox{Hà Nội}}
Hà Nội \rotatebox{90}{\fbox{Hà Nội}}
Hà Nội \rotatebox[origin=bl]{60}{\fbox{Hà Nội}}
Hà Nội \rotatebox[origin=Br]{-60}{Hà Nội}
Hà Nội
: 2
Hà Nội


Nộ
Hà Nội

Nộ

Hà Nội Hà Nội Hà Nội Hà Nội Hà Nội


i

5.7 Đặt lại kích thước hộp

\smash{<văn bản>} %trong gói mathtools.sty

Hiển thị hộp đã tạo, nhưng coi tổng chiều cao của nó là 0pt.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


160 Chương 5. Hộp và khung hộp

7 Ví dụ 5.16 8: 2
\setlength{\fboxsep}{0pt} gg
\fbox{g} \fbox{\smash{g}}

\smash[t]{<văn bản>} %trong gói mathtools.sty

Hiển thị hộp đã tạo, nhưng xử lý nó như thể chiều cao của nó
là 0pt.
7 Ví dụ 5.17 8: 2
\setlength{\fboxsep}{0pt} gg
\fbox{g} \fbox{\smash[t]{g}}

\smash[b]{<văn bản>} %trong gói mathtools.sty

Hiển thị hộp đã tạo, nhưng xử lý nó như thể độ sâu của nó là


0pt.
7 Ví dụ 5.18 8: 2
\setlength{\fboxsep}{0pt} gg
\fbox{g} \fbox{\smash[b]{g}}

\llap{<văn bản>}

Nó xử lý hộp đã tạo như thể chiều rộng của nó là 0pt. Căn


chỉnh nội dung của hộp với mặt trái của hộp. Vì thế
<hộp1>\llap{<văn bản>}<hộp2>
Trong trường hợp <hộp1> nằm ngay sau <hộp2>, vì chiều
rộng của hộp <văn bản> là 0pt. Hộp văn bản xuất hiện với phía
bên phải của nó được căn chỉnh với phía bên phải của hộp.

7 Ví dụ 5.19 8
ooooooooooooooo\llap{\rule[0.5ex]{2cm}{0.4pt}}aaaaa
: 2
oooooooooooooooaaaaa
Lệnh \mathllap trong mathtools.sty có thể được sử dụng
theo cách tương tự như \llap, ngoại trừ trong chế độ toán học
(xem sau).
\rlap{<văn bản>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


5.8. Hộp vô hình 161

Nó xử lý hộp đã tạo như thể chiều rộng của nó là 0pt. Nội dung
của hộp phù hợp với bên phải của hộp. Vì thế
<hộp1>\rlap{<văn bản>}<hộp2>
Trong trường hợp <hộp1> nằm ngay sau <hộp2>, vì chiều
rộng của hộp <văn bản> là 0pt. Hộp văn bản xuất hiện với phía
bên trái của nó ở bên trái của hộp hộp là cân đối.

7 Ví dụ 5.20 8
ooooooooooooooo\rlap{\rule[0.5ex]{2cm}{0.4pt}}aaaaa
: 2
oooooooooooooooaaaaa
Lệnh \mathrlap trong gói mathtools.sty có thể được sử dụng
theo cách tương tự như \rlap, chỉ trong chế độ toán học (xem
sau).
\clap{<văn bản>}

Nó xử lý hộp đã tạo như thể chiều rộng của nó là 0pt. Căn


chỉnh nội dung của hộp với tâm của hộp. Vì thế
<hộp1>\clap{<văn bản>}<hộp2>
Trong trường hợp <hộp1> nằm ngay sau <hộp2>, vì chiều
rộng của hộp <văn bản> là 0pt. Hộp văn bản xuất hiện với căn
giữa của nó với phía bên phải của hộp.

7 Ví dụ 5.21 8
ooooooooooooooo\clap{\rule[0.5ex]{2cm}{0.4pt}}aaaaa
: 2
oooooooooooooooaaaaa
Lệnh \mathclap trong mathtools.sty có thể được sử dụng
theo cách tương tự như \clap, chỉ trong chế độ toán học (xem
sau).

5.8 Hộp vô hình


\phantom{<văn bản>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


162 Chương 5. Hộp và khung hộp

Hộp được hoạt động như thể nó được viết bằng các chữ vô
hình.
7 Ví dụ 5.22 8: 2
\noindent Con sóng dưới lòng sâ Con sóng dưới lòng sâu
u\\ trên mặt nước
\phantom{Con sóng} trên mặt nướ
c

\vphantom{<văn bản>}

Tạo cái gọi là chiều rộng 0pt với chiều cao đầy đủ bằng tổng
chiều cao của <văn bản> và không xuất hiện.
7 Ví dụ 5.23 8: 2
\setlength{\fboxsep}{0pt} g
\fbox{g} \fbox{\vphantom{g}}

\hphantom{<văn bản>}

Tạo một hộp có chiều rộng bằng <văn bản>, cao 0pt và sâu 0pt.
<văn bản> không xuất hiện.
7 Ví dụ 5.24 8: 2
\setlength{\fboxsep}{0pt} g
\fbox{g} \fbox{\hphantom{g}}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


MÔI TRƯỜNG TOÁN
Chương 6.
TRONG LATEX

6.1. Môi trường toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164


6.2. Các phông chữ trong môi trường toán . . . . . . . . . . . 168
6.3. Thư pháp, chữ viết hai nét và nét cong . . . . . . . . . . 170
6.4. Chữ Hy Lạp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
6.5. Ký tự có dấu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
6.6. Ký hiệu toán học thường dùng . . . . . . . . . . . . . . . . . . 172
6.7. Ký hiệu toán tử . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
6.8. Ký hiệu quan hệ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
6.9. Dấu ba chấm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
6.10. Dấu ngoặc đơn toán học . . . . . . . . . . . . . . . . . . . . . . . 176
6.11. Tách các trường hợp . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
6.12. Các ký hiệu toán học giữ vai trò . . . . . . . . . . . . . . . . 182
6.13. Ký hiệu co dãn chiều ngang . . . . . . . . . . . . . . . . . . . . 183
6.14. Biểu thức căn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
6.15. Ma trận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
6.16. Xếp chồng các dấu hiệu toán học . . . . . . . . . . . . . . . 189
6.17. Chỉ số toán học. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
6.18. Phân số, hệ số nhị thức . . . . . . . . . . . . . . . . . . . . . . . . 191
6.19. Toán tử, hàm số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
6.19.1. Các toán tử lớn . . . . . . . . . . . . . . . . . . . . . . . . . . 193
6.19.2. Các hàm "không giới hạn". . . . . . . . . . . . . . . 194
164 Chương 6. Môi trường toán trong LATEX

6.19.3. Các hàm có giới hạn . . . . . . . . . . . . . . . . . . . . . 195


6.19.4. Xác định các hàm mới . . . . . . . . . . . . . . . . . . . 198
6.19.5. Đạo hàm và toán tử đạo hàm . . . . . . . . . . . 199
6.20. Đóng khung công thức . . . . . . . . . . . . . . . . . . . . . . . . . 200
6.21. Biểu đồ giao hoán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
6.22. Đánh số các công thức chính . . . . . . . . . . . . . . . . . . . 201
6.23. Ngắt công thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
6.24. Nhiều công thức bên dưới nhau . . . . . . . . . . . . . . . . 206
6.25. Dóng nhiều công thức . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.26. Đánh số các công thức con . . . . . . . . . . . . . . . . . . . . . 217
6.27. Ngắt trang trong công thức nhiều dòng . . . . . . . . . 218
6.28. Tự động ngắt công thức dài dòng . . . . . . . . . . . . . . 218
6.29. Bảng ở chế độ toán học . . . . . . . . . . . . . . . . . . . . . . . . 221

6.1 Môi trường toán

Nếu bạn muốn chỉnh sửa một công thức toán học, hãy sử
dụng các gói mathtools.sty và amssymb.sty. Nếu một lệnh chỉ có
thể được truy cập bằng cách tải một trong hai gói này, nó sẽ
không còn được chỉ định riêng nữa.
Cần lưu ý rằng mathtools.sty là một phần mở rộng của gói
amsmath.sty. Điều này được thực hiện bằng cách để mathtools
.sty tải gói amsmath.sty trước, sau đó thêm các tính năng bổ
sung và sửa một số lỗi. Chúng ta sẽ không thảo luận về việc
mỗi lệnh được định nghĩa bởi amsmath.sty hay mathtools.sty.
Để làm điều này, hãy đọc mô tả gói.
Trong một công thức, các hằng và biến phải được lấy bằng
một chữ cái khác với chữ nghiêng. Để giải thích điều này, hãy
quan sát hai câu sau.
"Nếu a là dương và z là âm, thì az là âm."
"Nếu a là dương và z là âm, thì az là âm."
Nhưng đó không phải là tất cả. Chỉnh sửa biểu thức toán
là một trong những công việc sắp chữ phức tạp nhất. Do đó,
chúng ta cần cho LATEX biết rằng một biểu thức sau đây.
1. Nếu một biểu thức là bình thường như một từ, chúng tôi

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.1. Môi trường toán 165

chèn nó vào văn bản, như trong trường hợp sin 2β + cos 2β = 1.
Cái gọi là chế độ toán học liền văn bản. Nếu biểu thức toán lớn
hơn, phức tạp hơn hoặc cần được đánh dấu vì tầm quan trọng
của nó, thì biểu thức đó nên được ghi trên một dòng riêng biệt,
chẳng hạn như
∞ xn
ex = , ∀ x ∈ R.
X
n! n!

Cái này gọi là chế độ công thức toán. Bạn có thể nhập chế độ
toán học liền văn bản bằng cách sử dụng bất kỳ dòng nào trong
ba dòng sau:
$<biểu thức toán>$
\(<biểu thức toán>\)
\begin{math}<biểu thức toán>\end{math}

7 Ví dụ 6.1 8
Phép cộng $2+3=5$; Phép nhân \(ab\);
Phép trừ \begin{math}a-b\end{math}
: 2
Phép cộng 2 + 3 = 5; Phép nhân ab; Phép trừ a − b
Bạn có thể chỉ định chế độ toán học ưa thích bằng bất kỳ
dòng nào trong bốn dòng sau:
$$<biểu thức toán>$$
\[<biểu thức toán>\]
\begin{displaymath}<biểu thức toán>\end{displaymath}
\begin{equation*}<biểu thức toán>\end{equation*}

7 Ví dụ 6.2 8
Phép cộng $$2+3=5;$$ Phép nhân \[ab;\]
Phép trừ \begin{equation*}a-b.\end{equation*}
: 2
Phép cộng
2 + 3 = 5;
Phép nhân
ab;

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


166 Chương 6. Môi trường toán trong LATEX

Phép trừ
a − b.

2. Theo mặc định, các công thức toán học sẽ được căn
giữa. Tuy nhiên, bạn có thể sử dụng tùy chọn fleqn trong gói
mathtools.sty để căn chỉnh nó sang trái sao cho công thức bắt
đầu cách lề trái 2,5em. Giá trị này có thể được thay đổi bằng
lệnh sau:
\setlength{\mathindent}{<độ dài>}

Lệnh này chỉ tác dụng khi ta chọn \documentclass[fleqn]{


article} và biểu thức toán không trong $$...$$.
3. Lệnh sau rất hữu ích để viết macro:
\ensuremath{<biểu thức toán>}

Điều này bất kể là \ensuremath được kích hoạt ở chế độ toán


học hay văn bản, công thức trong đối số của nó sẽ luôn ở chế
độ toán học. Ví dụ

7 Ví dụ 6.3 8
\newcommand{\kp}{\ensuremath{2\pi}}
Côsin của \kp\ là tuần hoàn, vì vậy $\cos(x+\kp)=\cos x$.
: 2
Côsin của 2π là tuần hoàn, vì vậy cos( x + 2π) = cos x.
4. Trong một số trường hợp, có thể cần đưa văn bản giải
thích hoặc kết nối vào công thức. Trong trường hợp này, chúng
ta cần tạm thời thoát khỏi chế độ toán học, bằng đưa vào lệnh
\text{<văn bản>} hoặc \mbox{<văn bản>}

7 Ví dụ 6.4 8: 2
$3+4=7 \text{và} 2+5=7$ 3 + 4 = 7và2 + 5 = 7

Như chúng ta có thể thấy, văn bản xuất hiện kém trong
công thức, mặc dù có một khoảng trống trong nguồn trước và
sau văn bản. Điều này được giải thích bởi thực tế là trong chế
độ toán học, khoảng trắng được bỏ qua. Trong trường hợp này,

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.1. Môi trường toán 167

giải pháp là xuất ra các khoảng trắng trong chế độ văn bản
hoặc thêm lệnh khoảng trằng trong toán.
7 Ví dụ 6.5 8: 2
$3+4=7 \text{ và } 2+5=7$\\ 3 + 4 = 7 và 2 + 5 = 7
$3+4=7\quad\mbox{và}\quad 2+5=7$ 3 + 4 = 7 và 2 + 5 = 7

5. Không chỉ có sự khác biệt về bố cục giữa chế độ liên văn


bản và công thứ toán học.
7 Ví dụ 6.6 8: 2
$\frac{31}{54}$ 31
54
\[\frac{31}{54}\] 31
54

Như chúng ta thấy, kích thước không giống nhau. Để hiển


thị nội dung nào đó ở chế độ công thức toán học với kích thước
và kiểu phông chữ như thể nó đang ở chế độ toán học liên văn
bản, hãy sử dụng lệnh
\textstyle

và ngược lại dùng lệnh


\displaystyle

7 Ví dụ 6.7 8: 2
$\frac{31}{54}{\displaystyle\frac{31}{54}}$ 31 31
54 54
7 Ví dụ 6.8 8: 2
\[\frac{31}{54}{\textstyle\frac{31}{54}}\]
31 31
54 54

Các chỉ số giống nhau trong cả hai chế độ toán học, cũng
như chỉ số của chỉ số. Nếu bạn không ghi vào chỉ mục nhưng
muốn chuyển sang kiểu chỉ mục, hãy sử dụng
\scriptstyle

Bạn có thể chuyển sang chế độ chỉ số index phong cách với lệnh
sau đây:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


168 Chương 6. Môi trường toán trong LATEX

\scriptscriptstyle

7 Ví dụ 6.9 8: 2
$2^x {\scriptstyle 2^x} {\scriptscriptstyle 2 2x 2x 2x
^x}$

Các lệnh khai báo thay đổi kích thước phông chữ không
hiệu quả khi trong môi trường toán học, nhưng khi được cho ở
chế độ văn bản, chúng cũng thay đổi kích thước của các công
thức toán tiếp theo.

7 Ví dụ 6.10 8
Định lý Pitagore: $a^2+b^2=c^2$\\
{\Large Định lý Pitagore: $a^2+b^2=c^2$}
: 2
2 2 2
Định lý Pitagore: a + b = c
Định lý Pitagore: a2 + b2 = c2

6.2 Các phông chữ trong môi trường toán

1. Trong chế độ toán học, khoảng cách giữa các chữ cái và
khoảng trắng được xử lý khác với ở chế độ văn bản. Do đó,
phông chữ không được sử dụng lệnh \textit, \textrm, v.v. các
lệnh được chọn thay thế
\mathit{<Các ký tự>}
\mathrm{<Các ký tự>}
\mathbf{<Các ký tự>}
\mathsf{<Các ký tự>}
\mathtt{<Các ký tự>}
\mathnormal{<Các ký tự>}

Ví dụ, các hằng số phải được sử dụng với một chữ cái đứng:
7 Ví dụ 6.11 8: 2
$\mathrm{e}^{\mathrm{i}\pi}+1=0$ eiπ + 1 = 0

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.2. Các phông chữ trong môi trường toán 169

Lệnh \mathbf không nhất thiết hoạt động tốt. Ví dụ, nếu
bạn bạn muốn thực hiện nó trên tiêu đề, như trong các trường
hợp sau:

7 Ví dụ 6.12 8
\subsubsection*{Tổng điều hòa $ \mathbf{\sum\frac{1}{n}} $}
: 2
P1
Tổng điều hòa n

Biểu thức toán trên có lỗi: n không in nghiêng, dấu tổng


và dấu gạch ngang không đậm. Trong trường hợp này, hãy sử
dụng
\pmb{<các ký tự>}

7 Ví dụ 6.13 8
\subsubsection*{Tổng điều hòa \( \pmb{\sum\frac{1}{n}} \) }
: 2
P1
Tổng điều hòa n

\pmb in đối số của nó gần nhau nhiều lần để đạt được hiệu
ứng đậm. Điểm yếu của giải pháp này xuất hiện khi phóng đại.
7 Ví dụ 6.14 8: 2
$ {\Huge \pmb{\Omega}} $

Lệnh \pmb hoạt động tương tự như
\bm{<các ký tự>} %trong gói bm.sty

lệnh này thường cho kết quả đẹp hơn nhiều.


7 Ví dụ 6.15 8: 2
$ {\Huge \bm{\Omega}} $ Ω

Rất nhiều ký hiệu toán học và có một phiên bản táo bạo, đó

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


170 Chương 6. Môi trường toán trong LATEX

\boldsymbol{<các ký tự>}

Một số ký hiệu, chẳng hạn như tổng hoặc tích phân, không có
phiên bản in đậm. Trong trường hợp này, \boldsymbol không
hiệu quả. Trong trường hợp này, hãy sử dụng đoạn mã sau
trong phần mở đầu:
\usepackage{pdfrender}
\def\boldsymbolx#1{\textpdfrender{TextRenderingMode=2,
LineJoinStyle=1,LineWidth=.3pt}{#1}}

Sau đó, \boldsymbolx có thể được sử dụng theo cách tương tự


như \boldsymbol, nhưng nó đã hoạt động trong mọi trường hợp,
ngay cả trong chế độ văn bản.

7 Ví dụ 6.16 8
\subsubsection*{Tổng điều hòa \(\boldsymbolx{\sum\frac{1}{n
}}\)}
: 2
P1
Tổng điều hòa n

6.3 Thư pháp, chữ viết hai nét và nét cong

\mathcal{<các ký tự>}
\mathscr{<các ký tự>} %trong gói lênh mathrsfs.sty
\mathbb{<các ký tự>}
\mathds{<các ký tự>} %trong gói lênh dsfont.sty
\mathds{<các ký tự>} %%[sans]dsfont.sty
\mathfrak{<các ký tự>}

$\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$\\
$\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$\\
$\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$\\
$\mathds{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$\\
$\mathfrak{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$

A BC DE F G H I J K L M N O P QRS T U V W X Y Z
A BC DE F G H I J K L M N OPQRS T U V W X Y Z

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.4. Chữ Hy Lạp 171

ABCDEFGHIJKLMNOPQRSTUVWXYZ

6.4 Chữ Hy Lạp

α \alpha υ \upsilon Π \Pi


β \beta φ \phi Σ \Sigma
γ \gamma χ \chi Υ \Upsilon
δ \delta ψ \psi Φ \Phi
ϵ \epsilon ω \omega Ψ \Psi
ζ \zeta 𭟋 \digamma Ω \Omega
η \eta ε \varepsilon Γ \varGamma
θ \theta ϑ \vartheta ∆ \varDelta
ι \iota Å \varkappa Θ \varTheta
κ \kappa ϖ \varpi Λ \varLambda
λ \lambda ϱ \varrho Ξ \varXi
µ \mu ς \varsigma Π \varPi
ν \nu ϕ \varphi Σ \varSigma
ξ \xi Γ \Gamma Υ \varUpsilon
π \pi ∆ \Delta Φ \varPhi
ρ \rho Θ \Theta Ψ \varPsi
σ \sigma Λ \Lambda Ω \varOmega
τ \tau Ξ \Xi

6.5 Ký tự có dấu
...
ô \hato ò \graveo o \dddoto
....
õ \tildeo ŏ \breveo o \ddddoto
ō \baro ǒ \checko o̊ \mathringo

o \veco ȯ \doto
ó \acuteo ö \ddoto

Nếu bạn muốn đặt các dấu trên i và j trong chế độ toán
học, hãy sử dụng lệnh \imath và \jmath thay vì các lệnh \i và
\j đã biết trước đây.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


172 Chương 6. Môi trường toán trong LATEX

7 Ví dụ 6.17 8: 2
$\check{\imath}\quad\ddot{\jmath}$ ı̌ ȷ̈

6.6 Ký hiệu toán học thường dùng

% \% ∇ \nabla ∢ \sphericalangle
⊥ \bot ∂ \partial ♭ \flat
⊤ \top ð \eth ♯ \sharp
∥ \| ; \emptyset ♮ \natural
¬ \neg ∞ \infty # \#
∀ \forall △ \triangle 1◦ 1^\circ
∃ \exists □ \square 1′ 1’
Ø \nexists ■ \blacksquare 1′′ 1”
ℜ \Re ∠ \angle
ℑ \Im ∡ \measuredangle

6.7 Ký hiệu toán tử

+ + \ \setminus • \bullet
− - ∩ \cap ⊕ \oplus
/ / ∪ \cup ⊖ \ominus
± \pm ∧ \wedge ⊙ \odot
∓ \mp ∨ \vee ⊘ \oslash
· \cdot ⋆ \star ⊗ \otimes
× \times ∗ *
÷ \div ◦ \circ
7 Ví dụ 6.18 8: 2
$a+b$ a+b

lưu ý rằng không có khoảng trống trong mã nguồn, nhưng


có trong kết quả. Điều này là do quy tắc phải có một khoảng
trắng trước và sau các toán tử. LATEX biết điều này. Tuy nhiên,
để làm điều này, bạn cần biết những gì được coi là toán tử.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.8. Ký hiệu quan hệ 173

Những ký hiệu khác muốn có khoảng trắng nhỏ như vậy phải
dùng
\mathbin{<ký hiệu>}

7 Ví dụ 6.19 8: 2
$a\dag ab$\quad $a\mathbin{\dag}ab$ a†ab a † ab

6.8 Ký hiệu quan hệ

= = : : (dấu tỷ lệ) Ê \geqslant


.
:= \coloneqq = \doteq ≪ \ll
::= \Coloneqq ≡ \equiv ≫ \gg
:− \coloneq ∼ \sim ∈ \in
::− \Coloneq ≃ \simeq ∋ \ni
=: \eqqcolon ≈ \approx ⊂ \subset
=:: \Eqqcolon ∼
= \cong ⊃ \supset
−: \eqcolon < < ⊆ \subseteq
−:: \Eqcolon > > ⊇ \supseteq
:≈ \colonapprox ≤ \leq | \mid
::≈ \Colonapprox ≥ \geq ∥ \parallel
:∼ \colonsim ≦ \leqq ⊥ \perp
::∼ \Colonsim ≧ \geqq
:: \dblcolon É \leqslant

Lệnh có dấu : phải kèm theo gói lệnh mathtools.sty.


Trong trường hợp quan hệ tương đương, ngay cả ký hiệu
của mô đun phải là:
7 Ví dụ 6.20 8: 2
$a \bmod m$\\ a mod m
$a \equiv b \pmod{m}$\\ a ≡ b (mod m)
$a \equiv b \mod{m}$\\ a ≡ b mod m
$a \equiv b \pod{m}$ a ≡ b ( m)

Mũi tên cũng là biểu tượng quan hệ:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


174 Chương 6. Môi trường toán trong LATEX

← \leftarrow ) \leftharpoondown
←− \longleftarrow * \rightharpoonup
→ \rightarrow + \rightharpoondown
−→ \longrightarrow ↑ \uparrow
↔ \leftrightarrow ↓ \downarrow
←→ \longleftrightarrow ↕ \updownarrow
⇐ \Leftarrow ⇑ \Uparrow
⇐= \Longleftarrow ⇓ \Downarrow
⇒ \Rightarrow ⇕ \Updownarrow
=⇒ \Longrightarrow ↗ \nearrow
⇔ \Leftrightarrow ↘ \searrow
⇐⇒ \Longleftrightarrow ↙ \swarrow
7 → \mapsto ↖ \nwarrow
7−→ \longmapsto
( \leftharpoonup

Ký hiệu quan hệ phủ định (gạch bỏ)


\not

7 Ví dụ 6.21 8: 2
$a\not=b$, $a\not\in A$ a ̸= b, a ̸∈ A

Trong một số trường hợp, điều này không thực hiện tốt:
7 Ví dụ 6.22 8: 2
$ \not\mid \quad \not\parallel \quad ̸| ̸∥ ̸↓ ̸↑
\not\downarrow \quad \not\uparrow$

Một ký hiệu quan hệ phủ định thiết kế đặc biệt nên được
sử dụng thay thế:
7 Ví dụ 6.23 8: 2
$ \nmid \quad \nparallel \quad

∤ ∦
\ndownarrow \quad \nuparrow $

Quy tắc tương tự áp dụng cho khoảng trắng xung quanh


các ký hiệu quan hệ như một toán tử:
7 Ví dụ 6.24 8: 2
$a=b$ a=b

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.9. Dấu ba chấm 175

LATEX coi bất kỳ ký hiệu như toán tử, khi ta đưa nó vào
lệnh.
\mathrel{<ký hiệu>}

7 Ví dụ 6.25 8: 2
$a|b$,\quad $a\mathrel{|}b$ a| b , a|b

Bạn cũng có thể tạo một tín hiệu quan hệ bằng cách chồng các
ký hiệu lên nhau:
\stackrel{<ký hiệu trên>}{<ký hiệu dưới>}

7 Ví dụ 6.26 8: 2
$A\stackrel{f}{\longrightarrow}B$ f
A −→ B

6.9 Dấu ba chấm


R R
1, 2, . . . , n 1,2,\ldots,n ··· \int\dotsi\int
..
1+2+···+ n 1+2+\cdots+n . \vdots
..
12 · · · n 12\cdots n . \ddots
\ldots căn chỉnh ba điểm với đường cơ sở, trong khi \cdots
hoặc \dotsi căn chỉnh ba điểm theo tâm dòng. Trong một số
trường hợp, điều này có thể được tự động hóa bằng lệnh \dots
ba chấm.

7 Ví dụ 6.27 8
$1,2,\dots,n$, $\quad 1+2+\dots+n$, $\quad \int\dots\int$
: R R 2
1, 2, . . . , n , 1 + 2 + · · · + n, ···

Nhưng không đúng khi không có dấu kèm

7 Ví dụ 6.28 8
$12\dots n$, $\quad 1\times 2\times\dots\times n$
: 2
12 . . . n, 1×2×···× n

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


176 Chương 6. Môi trường toán trong LATEX

6.10 Dấu ngoặc đơn toán học

1. Các dạng dấu ngoặc ký hiệu biên.

( ( 〉 \rangle ⌞ \llcorner
) ) ⌈ \lceil ⌟ \lrcorner
[ [ hoặc \lbrack ⌉ \rceil | | hoặc \vert
] ] hoặc \rbrack ⌊ \lfloor ∥ \| hoặc \Vert
{ \{ hoặc \lbrace ⌋ \rfloor
} \} hoặc \rbrace ⌜ \ulcorner
〈 \langle ⌝ \urcorner

2. Tất cả các dấu ngoặc đơn đều có phiên bản trái (mở) và
phải (đóng), ngoại trừ | và dấu ||. Do đó, việc sử dụng cái sau
xấu hơn trong một số trường hợp.
7 Ví dụ 6.29 8: 2
$|-1|$ | − 1|

cho kết quả không tốt vì chương trình giải thích điều này là
| trừ 1 khỏi dấu, để lại khoảng trắng xung quanh dấu -. Một
giải pháp cho điều này là chặn -1
7 Ví dụ 6.30 8: 2
$|{-1}|$ |−1|

Các giải pháp khác là để có được hiểu như một dấu ngoặc
đơn mở với lệnh:
\mathopen

7 Ví dụ 6.31 8: 2
$\mathopen|-1|$ |−1|

Nếu bạn muốn diễn giải một ký tự như một dấu ngoặc đóng,
hãy đặt một ký tự ở trước nó
\mathclose

Để sử dụng các lệnh \mathopen và \mathclose, hãy xem xét


những điều sau

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.10. Dấu ngoặc đơn toán học 177

7 Ví dụ 6.32 8: 2
$]-1, 1[\setminus\{0\}$ ] − 1, 1[\{0}

Có thể thấy, kết quả là không tốt, vì dấu ] được hiểu là dấu
ngoặc đóng, nên dấu sau nó được hiểu là một phép trừ, ngược
lại, dấu [ được hiểu là dấu ngoặc mở, nên dấu sau \ không
được coi là một quan hệ. Một giải pháp khả thi là tạm thời giải
thích ] như một dấu ngoặc mở và [ như một dấu ngoặc đóng:
7 Ví dụ 6.33 8: 2
$\mathopen]-1, 1\mathclose[\setminus\{0\ ]−1, 1[ \ {0}
}$\\ ]−1, 1[ \ {0}
${]{-1}, 1[}\setminus\{0\}$\\ [−1, 1] \ {0}
$[-1, 1]\setminus\{0\}$

3. Kích thước của các dấu ngoặc đơn phía trước không phù
hợp với công thức. Ví dụ, mã sau trả về một kết quả không
chính xác:
7 Ví dụ 6.34 8: 2
\[f(\frac{1}{2})=0\] 1
f( )=0
2

Trong trường hợp này, hãy đặt trước dấu ngoặc đơn mở và
trước dấu ngoặc đơn đóng
\left <ngoặc mở>
\right <ngoặc dóng>

7 Ví dụ 6.35 8: 2
\[f\left(\frac{1}{2}\right)=0\] 1
µ ¶
f =0
2

Bằng cách sử dụng các lệnh \left và \right, bạn đã có thể


chỉ định đâu là mở và đâu là dấu ngoặc đóng, vì vậy bạn không
nên sử dụng các lệnh \mathopen và \mathclose với chúng. Vì vậy,
ví dụ, đoạn mã sau cho kết quả chính xác:
7 Ví dụ 6.36 8: 2
\[\left|-\frac{1}{2}+a\right|\]
¯ ¯
¯ 1 ¯
¯− + a ¯
¯ 2 ¯

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


178 Chương 6. Môi trường toán trong LATEX

Các lệnh \left và \right không chỉ ảnh hưởng đến kích
thước mà còn tăng khoảng cách xung quanh dấu ngoặc đơn.
Nếu bạn không muốn điều này, hãy sử dụng các lệnh sau thay
vì \left và \right
\mleft %trong gói mleftright.sty
\mright %trong gói mleftright.sty

7 Ví dụ 6.37 8 :¡ 2
$f\mleft(-\frac{1}{2}\mright)=0$,\\ − 1 = 0,
¢
f
$f\left(-\frac{1}{2}\right)=0$ ¡ 21 ¢
f −2 = 0

Nếu bạn muốn đạt được hiệu ứng tương tự với các lệnh \
left và \right, hãy nhập
\mleftright %trong gói mleftright.sty

Nếu bạn cần một dấu ngoặc đơn cần được định kích thước
để vừa với công thức và bạn không muốn hiển thị cả đôi ngoặc
đơn, Giới hạn này được đưa ra bởi một dấu ngoặc đơn vô hình
\left. \right.

7 Ví dụ 6.38 8 :¡ 2
$\left.\left(1+x^2\right)’\right|_{x=1}
¯
2 ′¯
¢
1+ x ¯ =2
=2$ x=1

Nếu có một công thức trong ngoặc đơn có kích thước tự động
chỉ có thể vừa với nhiều hàng hơn và công thức cao hơn ở hàng
đầu tiên so với ở hàng thứ hai, thì dấu ngoặc đóng sẽ không có
kích thước chính xác.
7 Ví dụ 6.39 8: 2
$\left(\frac1{1+\frac12},1,
µ
1
2, , 1, 2, . . . ,
1+ 12
\ldots,\right.$\\ n − 1, n )
\hfill $\left.n-1,n\right)$

Một phương pháp khắc phục

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.10. Dấu ngoặc đơn toán học 179

7 Ví dụ 6.40 8: 2
$\left(\frac1{1+\frac12},1,
µ
1
2, , 1, 2, . . . ,
1+ 12
\ldots,\right.$\\

\hfill $\left.n-1,n\ n − 1, n
vphantom{
\frac1{1+\frac12}}\right)$

Trong một số trường hợp, tự động chia tỷ lệ dấu ngoặc đơn


không hoạt động tốt.
7 Ví dụ 6.41 8: 2
$\left\{\left\{a,b\right\},\left\{c,d\ {{a, b} , { c, d }}
right\}\right\}$

Dấu ngoặc đơn bên ngoài phải lớn hơn một chút, nhưng
điều này không được tạo ra bởi công thức trên. Trong trường
hợp này, bạn cũng có thể sử dụng tăng kích thước cố định. Tăng
bên trái \left, tăng cho bên phải \right
\bigl \Bigl \biggl \Biggl
\bigr \Bigr \biggr \Biggr

Kích thước các lệnh trên


7 Ví dụ 6.42 8 :µ 2
$\Biggl(\biggl(\Bigl(\bigl(\left(\cdot ³³¡ ¢´´¶
\right)\bigr)\Bigr)\biggr)\Biggr)$ (·)

Trở lại ví dụ trên


7 Ví dụ 6.43 8 :© 2
$\bigl\{\left\{a,b\right\},\left\{c,d\
ª
{a, b} , { c, d }
right\}\bigr\}$

Để sử dụng dấu ngoặc có kích thước cố định như một dấu toán
học thông thường, hãy sử dụng các lệnh sau:
\big \Big \bigg \Bigg

7 Ví dụ 6.44 8 :¡ 2
$\left(1+x^2\right)’\Big|_{x=1}=2$
¯
2 ′¯
¢
1+ x ¯ =2
x=1

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


180 Chương 6. Môi trường toán trong LATEX

Để sử dụng dấu ngoặc cố định làm quan hệ, hãy sử dụng các
lệnh sau:
\bigm \Bigm \biggm \Biggm

7 Ví dụ 6.45 8 :½ 2¾
$\left\{\frac{2^{n^2}}{n^2}\bigm| n \ n2
2
¯
¯ n nguyên
text{ nguyên}\right\}$ n2

Các dấu ngoặc đơn có kích thước cố định trước được xác định
theo sơ đồ sau:
\makeatletter
\def\<tên>{\bBigg@{<kích cỡ>}}
\def\<tên>m{\mathrel\<tên>}
\def\<tên>l{\mathopen\<tên>}
\def\<tên>r{\mathclose\<tên>}
\makeatother

Giá trị mặc định

<tên> big Big bigg Bigg

<kích cỡ> 1 1.5 2 2.5

Kích thước 3 và 3.5 không còn được xác định, nhưng bạn có thể
làm như vậy với mã sau:
\makeatletter
\def\biggg{\bBigg@{3}}
\def\bigggm{\mathrel\biggg}
\def\bigggl{\mathopen\biggg}
\def\bigggr{\mathclose\biggg}
\def\Biggg{\bBigg@{3.5}}
\def\Bigggm{\mathrel\Biggg}
\def\Bigggl{\mathopen\Biggg}
\def\Bigggr{\mathclose\Biggg}
\makeatother

Sau đó, có thể sử dụng các lệnh \biggg, \bigggm, \bigggl,


\bigggr, \Biggg, \Bigggm , \Bigggl , \Bigggr theo cách tương tự
như đã mô tả trước đây.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.11. Tách các trường hợp 181

4.Bạn có thể xác định một lệnh cho phép tham số của các
dấu ngoặc đã chọn. Để làm điều này, hãy sử dụng
\DeclarePairedDelimiter{\<tên lệnh>}{<ngoặc đơn trái>}{<ngo
ặc đơn phải>}

Vis dụ: \DeclarePairedDelimiter{\abs}{\vert}{\vert}


7 Ví dụ 6.46 8: 2
\[\abs{\frac{a}{b}}\quad a ¯a¯ ¯ ¯
¯a¯
| |
¯ ¯
\abs*{\frac{a}{b}}\quad ¯ ¯ ¯ ¯
b b ¯b¯
\abs[\Bigg]{\frac{a}{b}}\]

Ta có thể định nghĩa lệnh để không cần gõ nhiều


\newcommand{\dbr}[1]{\ensuremath{\left(#1\right)}}
\newcommand{\dbs}[1]{\ensuremath{\left[#1\right]}}
\newcommand{\dbc}[1]{\ensuremath{\left\{#1\right\}}}
\newcommand{\dba}[1]{\ensuremath{\left\langle#1\right\
rangle}}
\newcommand{\dbp}[1]{\ensuremath{\left|#1\right|}}
\newcommand{\dbdp}[1]{\ensuremath{\left\|#1\right\|}}

7 Ví dụ 6.47 8: 2
$\dbr{1+\dfrac{1}{2}}$, 1 1 1
µ ¶ · ¸ ½ ¾
$\dbs{1+\dfrac{1}{2}}$, 1+ , 1+ , 1+
2 2 2
$\dbc{1+\dfrac{1}{2}}$

6.11 Tách các trường hợp

Việc phân tách các trường hợp trong đó dấu ngoặc đơn
không hoạt động như một dấu ngoặc đơn đã được thảo luận
phần trước. Trong số những cách thứ khác nhau, môi trường
cases có thể được sử dụng cho việc này.
7 Ví dụ 6.48 8: 2
\[f(x)=\begin{cases}
0,&\text{nếu }x\in\mathbb{Q},\\
(
0, nếu x ∈ Q,
1,&\text{ngược lại}. f ( x) =
\end{cases}\] 1, ngược lại.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


182 Chương 6. Môi trường toán trong LATEX

Môi trường cases hoạt động giống như một bảng hai cột,
với cả hai cột ở chế độ toán học theo kiểu \textstyle. Do đó,
cần phải ghi văn bản vào lệnh \text trong cột thứ hai. Các môi
trường khác:
dcases Nó khác với cases ở chỗ trong cả hai cột, chúng ta đang
ở chế độ toán học theo kiểu \displaystyle.
7 Ví dụ 6.49 8: 2
\[f(x)=\begin{dcases}
0,&\text{nếu }x=\frac{1}{2} 1

\\
0, nếu x =
f ( x) = 2
1,&\text{ngược lại}. 
1, ngược lại.
\end{dcases}\]

rcase Nó khác với cases ở chỗ dấu ngoặc đơn ở bên phải.
7 Ví dụ 6.50 8: 2
\[\begin{rcases}
x = 12
)
x=\frac{1}{2}&\\
y=1& là nghiệm
y=1
\end{rcases}
\text{là nghiệm}\]

drcase Nó khác với dcases ở chỗ dấu ngoặc đơn ở bên phải.
Mỗi môi trường phân tách chữ hoa chữ thường cũng có một
phiên bản * khác với phiên bản bình thường ở chỗ cột thứ hai
ở chế độ văn bản.
7 Ví dụ 6.51 8: 2
\[f(x)=\begin{cases*}
0,&nếu $x$ là số hữu tỷ,\\
(
0, nếu x là số hữu tỷ,
1,&nếu $x$ là số vô tỷ. f ( x) =
\end{cases*}\] 1, nếu x là số vô tỷ.

6.12 Các ký hiệu toán học giữ vai trò

Có những ký hiệu toán học có thể có nhiều vai trò. Những


điều này được tóm tắt trong bảng sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.13. Ký hiệu co dãn chiều ngang 183

toán thường toán tử quan hệ ký hiệu dấu ngặc


\ \backslash \setminus
: : \colon
| | \mid \left| \right|
∥ \| \parallel \left\| \right\|
< < \left\langle
> > \right\langle
⊥ \bot \perp
† \dag \dagger
‡ \ddag \ddagger

7 Ví dụ 6.52 8: 2
$f\colon A\rightarrow B$ (ký hiệu f : A → B (ký hiệu)
)\\ f : A → B (toán
$f:A\rightarrow B$ (toán thường) thường)

Giải pháp thứ hai là không tốt vì f cách xa :.


Có trường hợp dấu , vừa là dấu ngắt câu, vừa là số thập
phân, khi đó để dấu phẩy là dấu thập phân dùng {,}
7 Ví dụ 6.53 8: 2
$2,5\cdot2=5$\\ 2, 5 · 2 = 5
$2{,}5\cdot2=5$ 2, 5 · 2 = 5

6.13 Ký hiệu co dãn chiều ngang


xdyz \widehat{xyz}
x yz \overline{xyz}
xgyz \widetilde{xyz}
x yz \overline{xyz}
x yz \underline{xyz}

x− −
yz \overleftarrow{xyz}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


184 Chương 6. Môi trường toán trong LATEX

x yz \underleftarrow{xyz}
←−−

x−yz
→ \overrightarrow{xyz}
x yz \underrightarrow{xyz}
−−→
← →
x yz \overleftrightarrow{xyz}
x yz \underleftrightarrow{xyz}
←→
tren
←−−− \xleftarrow[duoi]{tren}
duoi
tren
−−−→ \xrightarrow[duoi]{tren}
duoi
tren
←−−→ \xleftrightarrow[duoi]{tren}
duoi
tren
⇐=== \xLeftarrow[duoi]{tren}
duoi
tren
===⇒ \xRightarrow[duoi]{tren}
duoi
tren
⇐==⇒ \xLeftrightarrow[duoi]{tren}
duoi
tren
←−−−- \xhookleftarrow[duoi]{tren}
duoi
tren
7−−−→ \xmapsto[duoi]{tren}
duoi
tren
,−−−→ \xhookrightarrow[duoi]{tren}
duoi
tren
(−−− \xleftharpoonup[duoi]{tren}
duoi
tren
)−−− \xleftharpoondown[duoi]{tren}
duoi
tren
−−−* \xrightharpoonup[duoi]{tren}
duoi
tren
−−−+ \xrightharpoondown[duoi]{tren}
duoi
tren
)
−−−*
−−− \xrightleftharpoons[duoi]{tren}
duoi
tren
(
−−−+
−−− \xleftrightharpoons[duoi]{tren}
duoi

|xxxxxx
{z } \underbrace{xxxxxx}
xxxxxx
| {z } \underbrace{xxxxxx}_{n}
n
xxxxxx \underbracket{xxxxxx}
xxxxxx \underbracket{xxxxxx}_{n}
n
z }| {
xxxxxx \overbrace{xxxxxx}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.14. Biểu thức căn 185
n
z }| {
xxxxxx \overbrace{xxxxxx}^{n}
xxxxxx \overbracket{xxxxxx}
n
xxxxxx \overbracket{xxxxxx}^{n}
xxxxxx \overbracket[0.4pt][7pt]{xxxxxx}
n
xxxxxx \overbracket[0.4pt][7pt]{xxxxxx}^{n}
xxxxxx \underbracket[0.4pt][7pt]{xxxxxx}
xxxxxx \underbracket[0.4pt][7pt]{xxxxxx}_{n}
n

6.14 Biểu thức căn

1. Biểu thức của căn bậc n của x:


\sqrt[<n>]{<biểu thức toán>}

Bỏ tùy chọn sẽ cho một căn bậc hai.


7 Ví dụ 6.54 8: p p 2
$\sqrt{3}\sqrt[5]{7}$ 5
3 7

Cũng có thể điều chỉnh <n>:


\uproot{<cao lên>}
\leftroot{<sang trái>}

<cao lên> là một số gnuyên, <n> trượt lên <cao18lên> mm.


<sang trái>
<sang trái> là một số nguyên,<n>trượt trái 18 mm.
7 Ví dụ 6.55 8: p p
n
2
$\sqrt[n]{2}$, n
2, 2
$\sqrt[\uproot{1}\leftroot{1}n]{2}$

2. Đoạn mã sau không cung cấp giải pháp hoàn hảo.


7 Ví dụ 6.56 8: p p
2
$\sqrt{x}+\sqrt{y}$ x+ y

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


186 Chương 6. Môi trường toán trong LATEX

Độ sâu của y là dương, trong khi độ sâu của x là 0. Do đó,


kích thước dọc của hai ký hiệu gốc không khớp nhau. Điều này
có thể được giải quyết bằng mã sau:
7 Ví dụ 6.57 8: p p 2
$\sqrt{x}+\sqrt{\smash[b]{y}}$ x+ y

Trong phần sau, lệnh \smash[b] lấy độ sâu từ y đến 0, để


hai ký hiệu gốc có cùng kích thước.
Nếu, giống như chữ viết tay, dấu gốc có một kết thúc đóng,
tức là p biểu mẫu bạn muốn sử dụng, bạn nên viết như sau
trong phần mở đầu sau khi tải gói mathtools.sty:
\usepackage{letltxmacro}
\makeatletter
\let\oldr@@t\r@@t
\def\r@@t#1#2{%
\setbox0=\hbox{$\oldr@@t#1{#2\,}$}\dimen0=\ht0
\advance\dimen0-0.2\ht0
\setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
{\box0\lower0.04em\box2}}
\LetLtxMacro{\oldsqrt}{\sqrt}
\renewcommand*{\sqrt}[2][]{\oldsqrt[#1]{#2}}
\makeatother

6.15 Ma trận

1. Môi trường tổng quát:


\begin{<môi trường ma trận>}
<phần tử>& <phần tử> & <phần tử> & ... \\
<phần tử> & <phần tử> & <phần tử> & ... \\
...
<phần tử> & <phần tử> & <phần tử> & ... \\
<phần tử> & <phần tử> & <phần tử> & ...
\end{<môi trường ma trận>}

R
trong đó các giá trị có thể có của <môi trường ma trận> là:
matrix Không có dấu ngoặc biên.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


RR
6.15. Ma trận 187

pmatrix Dấu biên có dạng dấu ngoặc đơn ( ).


bmatrix
Bmatrix RR Dấu biên có dạng [ ].
Dấu biên có dạng { }.
vmatrix
Vmatrix R Dấu biên |có hình dạng | |.
Dấu biên có hình || ||.

7 Ví dụ 6.58 8
\[\begin{pmatrix} a & b\\ c & d \end{pmatrix}
\begin{bmatrix} a & b\\ c & d \end{bmatrix}
\begin{vmatrix} a & b\\ c & d \end{vmatrix}\]
:  ¯ ¯
2
a b a b ¯a b ¯
¯ ¯
   ¯ ¯
¯ ¯
c d c d ¯ c d¯

 
a b
2. Trong khi văn trên dòng văn bản   để đẹp hơn thay
c d
¡a b¢
vào đó ma trận c d . Đối với điều này, mỗi môi trường ma trận

RR
trước đó có một phiên bản nhỏ:
smallmatrix Không có dấu ngoặc biên.
psmallmatrix
bsmallmatrix RR Dấu biên có dạng dấu ngoặc đơn ( ).
Dấu biên có dạng [ ].
Bsmallmatrix
vsmallmatrix
Vsmallmatrix
R
R
Dấu biên có dạng { }.
Dấu biên |có hình dạng | |.
Dấu biên có hình || ||.

7 Ví dụ 6.59 8
\[\begin{psmallmatrix} a & b\\ c & d \end{psmallmatrix}
\begin{bsmallmatrix} a & b\\ c & d \end{bsmallmatrix}
\begin{vsmallmatrix} a & b\\ c & d \end{vsmallmatrix}\]
: ¡ a b ¢£ a b ¤¯ a b ¯ 2
¯ ¯
c d c d c d

3. Môi trường ma trận trước đó cũng có phiên bản *, trong

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


188 Chương 6. Môi trường toán trong LATEX

trường hợp này bạn có thể chỉ định tùy chọn căn chỉnh các cột
sang phải (r) hoặc sang trái (l). V

7 Ví dụ 6.60 8
\[\begin{bmatrix*}[r] -a & b\\ c & -d \end{bmatrix*}
\begin{vmatrix*}[l] 1.2 & 1\\ 2 & 2.23 \end{vmatrix*}\]
:  ¯ ¯
2
−a b ¯1 . 2 1 ¯
¯ ¯
 ¯ ¯
¯ ¯
c −d 2
¯ 2.23¯

4. Thay vì ba điểm, chuỗi điểm dài hơn có thể được viết


\hdotsfor[<độ dày>]{<số cột>}

bằng lệnh trong đó <độ dày> là mật độ của hàng điểm (mặc
định 1) và <số cột> là số cột được chấm điểm.
7 Ví dụ 6.61 8: 2
\[\begin{pmatrix}
 
1&2&3&\hdotsfor[2]{3}&n\\
1 2 3 ...... n
2&3&\hdotsfor{2}&n&n+1\\  
3&\hdotsfor{2}&n&n+1&n+2 2 3
 . . n n + 1 

\end{pmatrix}\]  
3 .. n n+1 n+2

7 Ví dụ 6.62 8: 2
\[\begin{pmatrix}  
1&2&3&\ldots&n\\ 1 2 3 . . . n 
0&1&2&\ldots&n-1\\
 
0 1 2 . . . n − 1
\hdotsfor[0.5]{5}\\
 
 
0&0&0&\ldots&1

 ........... 

 
\end{pmatrix}\]
0 0 0 ... 1

Lệnh \hdotsfor không hoạt động tốt nếu bạn cũng sử dụng gói
colortbl.sty. Trong trường hợp này, sau khi tải gói mathtools,
hãy viết như sau trong phần mở đầu:
\makeatletter
\def\hdots@for#1#2{\multicolumn{#2}c%

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.16. Xếp chồng các dấu hiệu toán học 189

{\m@th\dotsspace@1.5mu\mkern-#1\dotsspace@
\xleaders\hbox{$\m@th\mkern#1\dotsspace@.\mkern#1\dotsspace
@$}%
\hskip\z@\@plus 1filll
\mkern-#1\dotsspace@}%
}
\makeatother

6.16 Xếp chồng các dấu hiệu toán học

1. Chúng tôi đã thấy những khả năng này trước đây với các
ký hiệu ngang có độ dài khác nhau và các ký hiệu quan hệ.
Mỗi lệnh được mô tả ở đó dẫn đến một kiểu quan hệ. Bây giờ
chúng tôi mô tả hai lệnh khác:
\overset{<trên>}{<dưới>}
\underset{<dưới>}{<trên>}

7 Ví dụ 6.63 8: 2
$a\overset{*}{+}b\underset{\mathrm{d}}{=}c$ ∗
a+b = c
d

Một ví dụ khác phức tạp hơn:

7 Ví dụ 6.64 8
\[P(A)+P(\overline{A})
\underset{\underset{\mathclap{\text{sự bổ sung}}}{\Uparrow}
}{=}
P(\Omega)\overset{\overset{\mathclap{\text{5.~tiên đề}}}
{\Downarrow}}{=}1\Longrightarrow P(\overline{A})=1-P(A)\]
: 2
5. tiên đề

P ( A ) + P ( A ) = P (Ω) = 1 =⇒ P ( A ) = 1 − P ( A )

sự bổ sung

Để biết mô tả về \mathclap hãy xem chương ? hoặc trong


mathtools.sty.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


190 Chương 6. Môi trường toán trong LATEX

2.Nếu bạn muốn xây dựng một cụm ký tự toán học bình
thường theo kiểu \scriptstyle, ít nhất đa hai dòng, hãy sử
dụng
\substack{<dong1>\\ <dong2>\\ ...}

hoặc môi trường


v\begin{subarray}{<Căn chỉnh>}
<dong1>\\ <dong2>\\ ...
\end{subarray}

<Căn chỉnh> có thể là c (giữa) l (trái) và r (phải).


7 Ví dụ 6.65 8: 2
\[\sum_{\substack{i=1,2,\ X
a i jk
ldots\\ j\in\mathbb{Z}\\ i =1,2,...
k=j,j+1,\ldots}}a_{ijk} j ∈Z
\] k= j, j +1,...

7 Ví dụ 6.66 8: 2
\[\sum_{\begin{subarray}{l} X
a i jk
i=1,2,\ldots\\ i =1,2,...
j\in\mathbb{Z}\\ j ∈Z
k=j,j+1\ldots k= j, j +1...

\end{subarray}} a_{ijk}\]

6.17 Chỉ số toán học

1. Các dạng chỉ số


<biểu thức>_{<chỉ số dưới>} hoặc <biểu thức>\sb{<chỉ số dướ
i>}
<biểu thức>^{<chỉ số trên>} hoặc <biểu thức>\sp{<chỉ số trê
n>}
<biểu thức>_{<chỉ số dưới>}^{<chỉ số trên>} hoặc <biểu thức
>
\sb{<chỉ số dưới>}\sp{<chỉ số trên>}

7 Ví dụ 6.67 8: 2
$x_{n+1}, x^{n+1}, x_{k}^{n+1}$ xn+1 , x n+1 , xkn+1

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.18. Phân số, hệ số nhị thức 191

Các chỉ số trên được di chuyển xuống thấp hơn bằng cách sử
dụng lệnh \cramped.
7 Ví dụ 6.68 8: x x
2
$\cramped{{x^2}^x} {x^2}^x$ x2 x2

2. Toán tử có thể lập chỉ số tất cả bốn góc hoặc thấp hơn và
cao hơn.
\sideet{_{<dưới trái>}^{<trên trái>}}{_{<dưới phải>}^{<trên
phải>}}{<toán tử>}
<toán tử>\limit_{<dưới>}^{<trên>}

7 Ví dụ 6.69 8: 2
$\sideset{_{a}^{b}}{_{c}^{d}}{\prod}$ b Yd 2

Q
và $\prod\limits_{1}^{2}$ a c
1

3. Nếu không muốn làm điều tương tự với một toán tử, ta
phải tạm thời tạo ký hiệu để được lập chỉ số một toán tử bằng
lệnh.
\mathop{<ký hiệu>}

7 Ví dụ 6.70 8: 2
$\sideset{_{a}^{b}}{_{c}^{d}}{\mathop{X}}$ b d
2
và $\mathop{X}\limits_{1}^{2}$ aXc và X
1

Chỉ số phía dưới bên trái và phía trên cũng có thể được viết
như sau:
\prescript{<trên trái>}{<dưới trái>}{<ký hiệu>}

7 Ví dụ 6.71 8: 2
$\prescript{14}{2}{C}$, 14 3
2 C , 12 H
$\prescript{3}{12}{H}$

6.18 Phân số, hệ số nhị thức


1. Lệnh thường dùng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


192 Chương 6. Môi trường toán trong LATEX

\frac{<tử số>}{<mẫu số>}


\dfrac{<tử số>}{<mẫu số>}=\displaystyle\frac{<tử số>}{<mẫu
số>}
\tfrac{<tử số>}{<mẫu số>}=\textstyle\frac{<tử số>}{<mẫu số>
}

7 Ví dụ 6.72 8: 2
$\frac{x^2}{x+1}$,$\tfrac{x^2}{x+1}$, 2
x2 x2 x
$\dfrac{x^2}{x+1}$ x+1 , x+1 , x+1

\binom{<số trên>}{<số dưới>}


\dbinom{<số trên>}{<số dưới>}=\displaystyle\binom{<số trên>}{<
s.dưới>}
\tbinom{<số trên>}{<số dưới>}=\textstyle\binom{<số trên>}{<số
dưới>}

7 Ví dụ 6.73 8: !2
$\binom{n+1}{m}$,$\tbinom{n+1}{m}$,
Ã
¡n+1¢ ¡n+1¢ n+1
$\dbinom{n+1}{m}$ m , m ,
m

2. Ta cũng có thể tạo các phân số theo phong cách của riêng
mình:
\genfrac{<biên trái>}{<biên phải>}{<độ dày>}{<kiểu>}{<số trên>}{<số d
ưới>}

<biên trái> Dấu ngoặc đơn bên trái,


<biên phải> Dấu ngoặc đơn phải,
<độ dày> là độ dày của đường ngang (nếu rỗng: 0,4pt),
<kiểu> là một số, 0 : \displaystyle, 1 : \textstyle, 2 : 1, 3 :
\scriptscriptstyle
7 Ví dụ 6.74 8 :( 2
\(\genfrac{\{}{\}}{1pt}{0}{n+1}{m},
)
n+1 £n+1¤
\genfrac{[}{]}{0pt}{1}{n+1}{m}\) , m
m

3.Phân số liên tục có thể được viết bằng lệnh sau:


\cfrac[<căn chỉnh tử>]{<count>}{<nominer>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.19. Toán tử, hàm số 193

trong đó <căn chỉnh tử> có thể là l (trái), r (phải) và c (giữa,


mặc định).
7 Ví dụ 6.75 8: 2
$\cfrac{1}{1+ 1
\cfrac{1}{1+
\cfrac{1}{1+\cdots}}}$ 1
1+
1
1+
1+···
7 Ví dụ 6.76 8: 2
$\cfrac[l]{1}{1+ 1
\cfrac[l]{1}{1+
\cfrac[l]{1}{1+\cdots}}}$ 1
1+
1
1+
1+···

4. Nếu tử số hoặc mẫu số của một phân số quá dài, nó có


thể được chia thành hai dòng bằng lệnh
\splitfrac{<dòng 1>}{<dòng 2>}

7 Ví dụ 6.77 8
\[A=\frac{\splitfrac{xy+xy+xy+xy+xy+{}}{+xy+xy+xy+xy}}{z}\]
: 2
xy+ xy+ xy+ xy+ xy+
+ xy+ xy+ xy+ xy
A=
z

Lệnh \splitdfrac hoạt động tương tự như \splitfrac, chỉ


khác là khoảng cách giữa hai dòng lớn hơn.

6.19 Toán tử, hàm số

6.19.1 Các toán tử lớn

X Y a
\sum \prod \coprod

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


194 Chương 6. Môi trường toán trong LATEX
M Z
G
\bigoplus \bigsqcup \int
Ï
\ [
\iint \bigcap \bigcup
K I Ñ
\bigodot \oint \iiint
^ _ O
\bigwedge \bigvee \bigotimes

×
]
\biguplus \bigtimes

Trong các tài liệu đòi hỏi dấu tích phân không được viết
nghiêng mà ở dạng đứng. Để thực hiện việc này, hãy tải gói
cmupint.sty nếu bạn đang sử dụng phông chữ Hiện đại Máy
tính Châu Âu hoặc Hiện đại La tinh. Có các gói thay đổi phông
chữ trong đó việc này được thực hiện tự động hoặc tùy chọn. Ví
dụ như các gói pxfonts.sty, newtxmath.sty, newpxmath.sty.
Ngoài ra còn có một phiên bản lớn hơn của toán tử \bigtimes
là \varprod trong gói lệnh pxfonts.sty.
Gói pxfonts.sty cũng thay đổi bộ phông chữ cơ sở. Nếu
không sử dụng gói này, bạn có thể xác định toán tử \varprod
bằng cách nhập thông tin sau vào phần mở đầu:
\DeclareSymbolFont{largesymbolsA}{U}{pxexa}{m}{n}
\DeclareMathSymbol{\varprod}{\mathop}{largesymbolsA}{16}

7 Ví dụ 6.78 8 :P 2
$\sum i^2$ \[\sum i^2\] 2
i
i2
X

6.19.2 Các hàm "không giới hạn"

Trong LATEX tên một hàm luôn luôn viết đứng.

arccos \arccos arcsin \arcsin arctan \arctan


arg \arg cos \cos cosh \cosh
cot \cot coth \coth csc \csc

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.19. Toán tử, hàm số 195

deg \deg dim \dim exp \exp


hom \hom ker \ker lg \lg
ln \ln log \log sec \sec
sin \sin sinh \sinh tan \tan
tanh \tanh lim \varliminf lim \varlimsup
R
lim \varinjlim lim \varprojlim \int
−−→ ←−−

Chỉ số của các hàm “không giới hạn” luôn xuất hiện bên
cạnh tên hàm. Ví dụ
7 Ví dụ 6.79 8: 2
\[\int_a^bf(x)dx\] Z b
$\int_a^bf(x)dx$ f ( x) dx
a
Rb
a f ( x) dx

LATEX cho phép dãy ký tự là hàm thông qua lệnh


\operatorname{<các ký tự>}

7 Ví dụ 6.80 8: 2
$\operatorname{cotg}(x)$ cotg( x)

6.19.3 Các hàm có giới hạn

det \det gcd \gcd inf \inf


inj lim \injlim lim \lim lim inf \liminf
lim sup \limsup max \max min \min
proj lim \projlim Pr \Pr sup \sup
Các chỉ số của các toán tử lớn (ngoại trừ ký hiệu tích phân)
và các hàm "giới hạn" xuất hiện bên cạnh chúng trong chế độ
toán học liên văn bản, nhưng bên dưới và bên trên chúng ở chế
độ công thức toán học.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


196 Chương 6. Môi trường toán trong LATEX

7 Ví dụ 6.81 8 :P∞ 2
$\sum_{n=1}^\infty a_n$ n=1 a n
\[\sum_{n=1}^\infty a_n\] ∞
X
an
n=1
7 Ví dụ 6.82 8: 2
$\lim_{n\rightarrow\infty}a_n limn→∞ a n
$
\[\lim_{n\rightarrow\infty}a_ lim a n
n→∞
n\]

Nếu bạn muốn thay đổi điều này tại một vị trí cụ thể, bạn
có thể làm như vậy với lệnh \limits và \nolimits.
7 Ví dụ 6.83 8: 2
$\sum\limits_{n=1}^\infty a_n ∞
P
an
$ n=1
\[\sum\nolimits_{n=1}^\infty X∞
a_n\] n=1
an

Lệnh \limits không ảnh hưởng đến các hàm "không giới
hạn", ngoại trừ dấu tích phân:

7 Ví dụ 6.84 8
$\log\limits_2x, \int\limits_a^bf(t)dt$
\[\log\limits_2x, \int\limits_a^bf(t)dt\]
: 2
Rb
log2 x, f ( t) dt
a
Zb
log2 x, f ( t) dt
a

Ký hiệu tích phân có thể được tạo thành một hàm “giới hạn”
với tùy chọn intlimits trong gói mathtools.sty. Sau đó, tích
phân hoạt động chính xác như bất kỳ tín hiệu toán tử lớn nào
khác.
LATEX coi bất cứ ký tự là một hàm "giới hạn" mà nó sử dụng
với * của lệnh

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.19. Toán tử, hàm số 197

\operatorname*{<dãy ký tự>}

7 Ví dụ 6.85 8: 2
$\operatorname*{Max}_{k}$ Maxk
\[\operatorname*{Max}_{k}\] Max
k

Khoảng trắng xung quanh các hàm "giới hạn" có thể trở
nên quá lớn đối với các chỉ số dài.
7 Ví dụ 6.86 8: 2
\[X=\sum_{1\leq i\leq j\leq X
X= Vi j
n}V_{ij}\] 1≤ i ≤ j ≤ n

Lệnh \smashoperator cung cấp giải pháp cho việc này:


7 Ví dụ 6.87 8: 2
\[X=\smashoperator{\sum_{1 X
X= Vi j
\leq i\leq j\leq n}}V_{ij} 1≤ i ≤ j ≤ n
\]

Tùy chọn r hoặc l loại bỏ khoảng trống thừa ở bên phải hoặc
bên trái.

7 Ví dụ 6.88 8
\[X=\smashoperator[r]{\sum_{1\leq i\leq j\leq n}}V_{ij}\
quad
X=\smashoperator[l]{\sum_{1\leq i\leq j\leq n}}V_{ij}\]
: X X 2
X= Vi j X= Vi j
1≤ i ≤ j ≤ n 1≤ i ≤ j ≤ n

Các hàm "giới hạn" cũng không cho kết quả hoàn hảo trong
trường hợp sau:
7 Ví dụ 6.89 8: 2
\[\limsup_{n\to\infty}\max_{p\geq n}\
]
lim sup max
n→∞ p≥ n

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


198 Chương 6. Môi trường toán trong LATEX

Chỉ số của hai chức năng không cùng cấp vì độ sâu của hộp
chức năng là khác nhau. Lệnh \adjustlimits giúp giải quyết
vấn đề này.
7 Ví dụ 6.90 8: 2
\[\adjustlimits\limsup_{n\
lim sup max
to\infty}\max_{p\geq n}\ n→∞ p≥ n
]

6.19.4 Xác định các hàm mới

Bạn có thể cần một hàm không có sẵn theo mặc định. Ví dụ,
trong tiếng Việt, hàm Tang và Côtang là tg và cotg, trong đó
chỉ có phiên bản tiếng Anh (tan và cot) được định nghĩa. Trong
trường hợp này, chúng ta có thể tự làm những cái mới. Chức
năng "giới hạn" với các lệnh sau
\newcommand{<lệnh>}{\mathop{\mathrm{<tên lệnh>{}}}} hoặc
\DeclareMathOperator*{<lệnh>}{<tên lệnh>} %Chỉ viết trong m
ở đầu

Ví dụ
\newcommand{\Min}{\mathop{\mathrm{Min{}}}}
\DeclareMathOperator*{\Min}{Min}

Ta có thể sử dụng
7 Ví dụ 6.91 8: 2
$\Min_{k\in\mathbb{N}}$ Mink∈N
\[\Min_{k\in\mathbb{N}}\] Min
k∈N

Một chức năng "giới hạn" hiện có có thể được xác định lại.
\renewcommand{<lệnh>}{\mathop{\mathrm{<tên lệnh>{}}}}

Ví dụ: \renewcommand{\min}{\mathop{\mathrm{Min{}}}}
7 Ví dụ 6.92 8: 2
$\min_{k\in\mathbb{N}}$ Mink∈N
\[\min_{k\in\mathbb{N}}\] Min
k∈N

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.19. Toán tử, hàm số 199

Một hàm "không giới hạn" mới có thể được xác định bằng các
lệnh sau:
\newcommand{<lệnh>}{\mathop{\mathrm{<tên lệnh>{}}}\nolimits
} hoặc
\DeclareMathOperator{<lệnh>}{<tên lệnh>} % ở đầu tệp

Ví dụ
\newcommand{\tg}{\mathop{\mathrm{tg{}}}\nolimits} hoặc
\DeclareMathOperator{\tg}{tg}
7 Ví dụ 6.93 8: 2
$\tg^2x$ \[\tg^2x\] tg2 x
tg2 x

Một chức năng “không giới hạn” hiện có, có thể được định nghĩa
lại.
\renewcommand{<lệnh>}{\mathop{\mathrm{<tên lệnh>{}}}\
nolimits}

Ví dụ \renewcommand{\tan}{\mathop{\mathrm{tg{}}}\nolimits}
7 Ví dụ 6.94 8: 2
$\tan^2x$ \[\tan^2x\] 2
tg x
tg2 x

6.19.5 Đạo hàm và toán tử đạo hàm


7 Ví dụ 6.95 8: 2
$f’(x), f’’(x)$\\ ′ ′′
f ( x ), f ( x )
$\dfrac{\partial f(x,y)}{\partial y}$ ∂ f ( x, y)
∂y

Ký hiệu toán tử khác biệt tiêu chuẩn cho tích hợp và dẫn
xuất phải được xác định trong phần mở đầu như:
\DeclareMathOperator{\diff}{d\!}
7 Ví dụ 6.96 8: 2
\[\int f(x)\diff x \text{ v Z
d f ( x)
à } f ( x) d x và
dx
\frac{\diff f(x)}{\diff x}\
]

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


200 Chương 6. Môi trường toán trong LATEX

6.20 Đóng khung công thức

Ta có thể sử dụng \fcolorbox, \framebox và \fbox để đóng


khung hoặc tô mầu \colorbox các công thức như trong văn bản.
7 Ví dụ 6.97 8 :P 2
\colorbox{pink}{$\sum_{n=1}^\infty$} ∞ P∞
n=1 n=1
\fbox{$\sum_{n=1}^\infty$}
\[\colorbox{pink}{$\displaystyle\sum_
∞ ∞
{n=1}^\infty$}\text{ và }
X X

\fbox{$\displaystyle\sum_{n=1}^\infty n=1 n=1
$}\]

Có một lệnh \boxed đặc biệt để đóng khung một công thức
có chế độ toán học \displaystyle bên trong. Độ dày khung và
khoảng cách từ công thức có thể được điều chỉnh theo cách
tương tự như đối với \framebox.
7 Ví dụ 6.98 8: 2
\boxed{\sum_{n=1}^\infty} ∞
X P∞ ∞
X
\boxed{\textstyle\sum_{n=1}^\infty} n=1
$\boxed{\sum_{n=1}^\infty}$ n=1 n=1

Không có giải pháp tương tự cho một hộp màu, nhưng chúng
ta có thể tự xác định nó. Ví dụ
\newcommand{\colorboxed}[2]{%
\colorbox{#1}{\ensuremath{\displaystyle #2}}} % trong
xcolor.sty

7 Ví dụ 6.99 8: 2
\colorboxed{red}{\sum_{n=1}^\infty} ∞
X P∞ ∞
X
\colorboxed{red}{\textstyle\sum_{n=1} n=1
^\infty} n=1 n=1
$\colorboxed{red}{\sum_{n=1}^\infty}$

6.21 Biểu đồ giao hoán

Ví dụ sau được tạo bằng môi trường CD của gói amscd.sty.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.22. Đánh số các công thức chính 201

7 Ví dụ 6.100 8: 2
\[\begin{CD}
A @>>> B @<<< C \\ A −−−−→ B ←−−−− C
@VVV @AAA @| \\ 

x

°
°
D @>f>l> E @= F \\ y  °
@VbVjV @AbAjA \\ f
D −−−−→ E F
G @<f<l< H l
 x
\end{CD}\] j
by b j

f
G ←−−−− H
l

Gói xy.sty biết nhiều hơn thế, điều này không được trình bày
chi tiết ở đây.

6.22 Đánh số các công thức chính

1. Sử dụng môi trường phương trình để đánh số các công


thức. Trong trường hợp tham khảo chéo sử dụng lệnh \eqref
thay vì \ref:
\begin{equation}\label{<tên nhãn>}
<biểu thức>
\end{equation}
\eqref{<tên nhãn>}

7 Ví dụ 6.101 8: 2
\begin{equation}\label{pt1} 2
x + 3x − 5 = 0 (6.1)
x^2+3x-5=0
\end{equation} Phương trình (6.1). . .
Phương trình \eqref{pt1}\
dots

Nếu bạn muốn đánh số ở bên trái, hãy tải gói mathtools.sty
với tùy chọn leqno.
2. Đánh số trước đây được lấy trong lớp bài viết (article.cls).
Trong trường hợp này, việc đánh số liên tục trong toàn bộ tài

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


202 Chương 6. Môi trường toán trong LATEX

liệu, tức là nó không bắt đầu lại từ 1 khi một phần mới được
mở.
Nếu bạn sử dụng báo cáo (report.cls) hoặc lớp sách
(book.cls), số công thức được kèm theo số thứ tự của chương
hiện tại. Ví dụ, công thức 2 (1.2) trong Chương 1 được đánh
số. Mặt khác, số công thức sẽ khởi động lại khi bạn mở một
chương mới. Vì vậy, ví dụ, công thức 1 trong Chương 2 được
đánh số (2.1).
Nếu bạn muốn đạt được hiệu quả tương tự trong lớp bài
viết (chỉ với phần thay vì chương), hãy sử dụng mã sau:
\numberwithin{equation}{section}

3. Nếu nhanh chóng phát hiện ra rằng công thức không


cần phải đánh số, tất cả những gì bạn phải làm là sử dụng
equation* môi trường thay vì phương trình.
Nếu tài liệu có một vài công thức được đánh dấu mà bạn
tham khảo, bạn có thể sử dụng các ký hiệu tùy chỉnh khác
thay vì số bằng cách sử dụng các lệnh.
\tag hoặc \tag*

7 Ví dụ 6.102 8: 2
\begin{equation}\label{pt2}
x2 + 3 x − 5 = 0 (*)
x^2+3x-5=0\tag{*}
\end{equation} Phương trình (*). . .
Phương trình \eqref{pt2}\
dots

7 Ví dụ 6.103 8: 2
\begin{equation}\label{pt3} 2
x + 3x − 5 = 0 T
x^2+3x-5=0\tag*{\fbox{T}}
\end{equation} Phương trình T . . .
Phương trình \refeq{pt3}\
dots

Nếu bạn đánh số bằng lệnh \tag*, không tham chiếu nó


bằng lệnh \eqref, vì nó bao gồm số công thức trong dấu ngoặc
đơn. Sử dụng lệnh \refeq hoặc \ref để thay thế.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.23. Ngắt công thức 203

Chúng tôi đã thấy rằng đánh số mặc định được hiển thị
trong dấu ngoặc đơn ở phông chữ bình thường. Nếu bạn muốn
thay đổi điều này, hãy sử dụng
\newtagform{<tên>}[<định dạng>]{<ngoặc trái>}{<ngoặc phải>}

Từ nơi bạn muốn kích hoạt cài đặt này, hãy nhập
\usetagform{<tên>}

7 Ví dụ 6.104 8: 2
\newtagform{brackets}[\ 2
x + 3x − 5 = 0 [6.2]
textbf]{[}{]}
\usetagform{brackets} Phương trình [6.2]. . .
\begin{equation}\label{pt4}
x^2+3x-5=0
\end{equation}
Phương trình \eqref{pt4}\
dots

Bạn có thể quay lại cài đặt mặc định bằng lệnh sau
\usetagform{default}

6.23 Ngắt công thức

Nếu một công thức không phù hợp với một hàng, nó cũng
có thể bị ngắt với môi trường multline.
\begin{multline}\label{multilevel}
<Dòng 1 của công thức> \\
<Dòng 2 của công thức> \\
...
<Dòng n của công thức>
\end{multline}

Trong môi trường này, hàng đầu tiên sẽ được căn bên trái,
hàng cuối cùng bên phải và những hàng khác sẽ được căn giữa
và đánh số ở hàng cuối cùng sẽ ở bên phải.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


204 Chương 6. Môi trường toán trong LATEX

Nếu bạn đã tải gói mathtools.sty với tùy chọn fleqn để căn
chỉnh các công thức được đánh dấu ở bên trái, các hàng căn
giữa sẽ được căn ở bên trái.
Nếu bạn đã tải gói mathtools.sty với tùy chọn leqno để đánh
số ở bên trái, thì việc đánh số sẽ ở bên trái của dòng đầu tiên.
Để căn chỉnh một hàng ở bên trái, hãy đặt
\shoveleft{<dòng công thức>}

Nếu bạn muốn làm cho nó sang phải, hãy sử dụng


\shoveright{<dòng công thức>}

Các lệnh \tag hoặc \tag* cũng có thể được sử dụng ở đây cho
ký hiệu công thức tùy chỉnh.
Nếu bạn không muốn đánh số công thức, hãy sử dụng môi
trường multline*. Ví dụ
7 Ví dụ 6.105 8: 2
\begin{multline}\label{dt1}
1+8+27+64=\\
=1+3+5+7+{}\\ 1 + 8 + 27 + 64 =
+9+11+13+{}\\ = 1+3+5+7+
+15+17+19 + 9 + 11 + 13 +
\end{multline}
+ 15 + 17 + 19 (6.3)

7 Ví dụ 6.106 8: 2
\begin{multline}\label{dt2}
1+8+27+64=\\
\shoveleft{=1+3+5+7+{}}\\ 1 + 8 + 27 + 64 =
+9+11+13+{}\\ = 1+3+5+7+
+15+17+19 + 9 + 11 + 13 +
\end{multline}
+ 15 + 17 + 19 (6.4)

7 Ví dụ 6.107 8: 2
\begin{multline}\label{dt3}
1+8+27+64=\\
=1+3+5+7+{}\\ 1 + 8 + 27 + 64 =
\shoveright{+9+11+13+{}}\\ = 1+3+5+7+
+15+17+19 + 9 + 11 + 13 +
\end{multline}
+ 15 + 17 + 19 (6.5)

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.23. Ngắt công thức 205

Nếu bạn cũng muốn điều chỉnh công thức gẫy với các điểm
cụ thể, bạn có thể sử dụng môi trường split.

\begin{equation}\label{method}
\begin{split}
<Dòng 1 của công thức> &<Dòng 1 của công thức> \\
<Dòng 2 của công thức> & <Dòng 2 của công thức> \\
...
<Dòng n của công thức> & <Dòng n của công thức>
\end{split}
\end{equation}

Một phần tách hoạt động tương tự như một bảng. Cột xác
định bằng & và ngắt dòng bằng \\. Không giống như môi trường
multline, điều này không cung cấp một môi trường toán học, vì
vậy điều này cần được quan tâm riêng. Do đó, trong đoạn mã
trước, nó được bao bọc trong một môi trường equation. Nhưng,
tất nhiên, nó có thể được đặt trong một môi trường equation*,
cho chúng ta một trường hợp mà không cần đánh số. Đánh số
của phương trình sẽ được căn giữa theo chiều dọc. Nếu ta tải
gói mathtools.sty với tùy chọn tbtags, số công thức sẽ xuất hiện
trên dòng cuối cùng. Nếu bạn thậm chí sử dụng tùy chọn leqno
để đánh số ở bên trái, thì đánh số công thức sẽ ở bên trái của
dòng đầu tiên. Ví dụ

7 Ví dụ 6.108 8: 2
\begin{equation}\label{sp1}
\begin{split} 50 = 1 + 24 + 25 =
50 &=1+24+25=\\
= 1+3+5+7+ (6.6)
&=1+3+5+7+{}\\
&\quad+9+11+11 + 9 + 11 + 11
\end{split}
\end{equation}

Nếu bạn muốn đóng khung một phần của công thức bị ngắt
có chứa & dùng \Aboxed.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


206 Chương 6. Môi trường toán trong LATEX

7 Ví dụ 6.109 8: 2
\begin{equation*}
\begin{split} 50 = 1 + 24 + 25 =
\Aboxed{50 &=1+24+25}=\\
= 1+3+5+7+
&=1+3+5+7+{}\\
&\quad+9+11+11 + 9 + 11 + 11
\end{split}
\end{equation*}

6.24 Nhiều công thức bên dưới nhau

Nếu bạn viết nhiều công thức dưới nhau, sử dụng liên tiếp
các môi trường \[... \], displaymath, equation* hoặc equation
sẽ không hoạt động tốt vì khoảng cách dọc giữa chúng sẽ quá
lớn. Trong trường hợp này, hãy sử dụng môi trường gather.

\begin{gather}
<1. công thức>\label{<label 1>} \\
<2. công thức>\label{<label 2>} \\
...
<n. công thức>\label{<label n>} \\
\end{gather}

Các lệnh \tag hoặc \tag* cũng có thể được sử dụng ở đây
cho ký hiệu công thức tùy chỉnh. Nếu bạn không muốn đánh
số công thức, hãy sử dụng môi trường gather*. Nếu bạn không
muốn chỉ đánh số một dòng, hãy đặt ở cuối dòng

\notag

7 Ví dụ 6.110 8: 2
\begin{gather}
(a+b)^2 \label{ct1}\\
(a + b)2 (6.7)
a^2+2ab+b^2\label{ct2}
\end{gather} a2 + 2ab + b2 (6.8)

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.24. Nhiều công thức bên dưới nhau 207
7 Ví dụ 6.111 8: 2
\begin{gather}
(a+b)^2 \notag\\
(a + b)2
a^2+2ab+b^2\label{ct3}
\end{gather} a2 + 2ab + b2 (6.9)

Môi trường gather* được gọi là phiên bản hình thành công
thức con của môi trường gathered. Điều này có nghĩa là nó hoạt
động giống như gather*, nhưng cần được đặt ở chế độ toán
học liên văn bản, equation hoặc equation*. Môi trường gathered
cũng có một tùy chọn, giá trị có thể là c (mặc định), t hoặc b,
tùy thuộc vào việc bạn muốn căn giữa, đường cơ sở hay cuối
đường cơ sở. Hãy xem một số ví dụ

7 Ví dụ 6.112 8: 2
\[\left.\begin{gathered} (a + b) 2
)
(a+b)^2\\
a^2+2ab+b^2 a + 2ab + b2
2

\end{gathered}\right\}\]

7 Ví dụ 6.113 8: 2
\begin{equation}\label{ct4} (a + b)2
)
\left.\begin{gathered} (6.10)
(a+b)^2\\ a2 + 2ab + b2
a^2+2ab+b^2
\end{gathered}\right\}
\end{equation}

7 Ví dụ 6.114 8 : 2
\[\left.\begin{
gathered} (a + b)2 ( a − b )2
) )
(a+b)^2\\ và
a^2+2ab+b^2 a2 + 2ab + b2 a2 − 2ab + b2
\end{gathered}\right\}
\text{ và }
\left.\begin{gathered}
(a-b)^2\\
a^2-2ab+b^2
\end{gathered}\right\}
\]

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


208 Chương 6. Môi trường toán trong LATEX
7 Ví dụ 6.115 8: 2
văn bản $\begin{gathered} (a + b)2
(a+b)^2\\ văn bản văn bản
a^2+2ab+b^2 a2 + 2ab + b2
\end{gathered}$ văn bản
7 Ví dụ 6.116 8: 2
văn bản $\begin{gathered}[t 2
văn bản (a + b) văn bản
] 2 2
(a+b)^2\\ a + 2ab + b
a^2+2ab+b^2
\end{gathered}$ văn bản
7 Ví dụ 6.117 8: 2
văn bản $\begin{gathered}[b 2
(a + b)
]
(a+b)^2\\ văn bản a + 2ab + b2 văn bản
2

a^2+2ab+b^2
\end{gathered}$ văn bản

Thay vì gathered, bạn thậm chí có thể sử dụng môi trường


lgathered và rgathered, chỉ khác với gathered ở chỗ các hàng
không được căn giữa mà là trái và phải.
7 Ví dụ 6.118 8: 2
\[\left.\begin{rgathered} (a + b) 2
)
(a+b)^2\\
a^2+2ab+b^2 a2 + 2ab + b2
\end{rgathered}\right\}\]

6.25 Dóng nhiều công thức

Các công thức phụ có thể chứa các phần tử cần được dóng
với nhau theo cột. Có một số môi trường cho việc này. Trong
môi trường align, căn chỉnh là r@{}lr@{}l ... như đã học trong
bảng, trong đó khoảng cách trước cột đầu tiên, sau cột cuối
cùng và giữa các cột l và r được phân bổ đồng đều.
\begin{align}
<1. căn bên phải>&<trái>&<phải>&<trái>&<phải>...\label{<
label 1>}\\

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.25. Dóng nhiều công thức 209

<2. căn bên phải>&<trái>&<phải>&<trái>&<phải>...\label{<


label 2>}\\
...
<n. căn bên phải>&<trái>&<phải>&<trái>&<phải>...\label{<
label n>}\\
\end{align}

7 Ví dụ 6.119 8
\begin{align}
x&=y+z & y&=bd & z&=bc \label{al1}\\
b&=10 & 2c&=56 & d&=44 \label{al2}
\end{align}
: 2

x = y+ z y = bd z = bc (6.11)
b = 10 2 c = 56 d = 44 (6.12)

Các lệnh \tag, \tag*, \notag có thể được sử dụng ở đây theo
cách tương tự như trong môi trường gather. Môi trường align*
thực hiện chính xác những gì align làm, nhưng không hiển thị
số công thức.
7 Ví dụ 6.120 8: 2
\begin{align*}
a&=(b+c)^2\\
a = ( b + c)2
&=(b+c)(b+c)\\
&=b^2+2bc+c^2 = ( b + c)( b + c)
\end{align*} = b2 + 2 bc + c2

7 Ví dụ 6.121 8
\begin{align*}
a&=(b+c)^2 && \text{bình phương một tổng}\\
&=(b+c)(b+c) &&\text{chuyển về tích}\\
&=b^2+2bc+c^2&&\text{kết quả nhân ra}
\end{align*}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
210 Chương 6. Môi trường toán trong LATEX

a = ( b + c)2 bình phương một tổng


= ( b + c)( b + c) chuyển về tích
2 2
= b + 2 bc + c kết quả nhân ra

7 Ví dụ 6.122 8
\begin{align*}
a&=(b+c)^2 & \text{bình phương một tổng}\\
&=(b+c)(b+c) &\text{chuyển về tích}\\
&=b^2+2bc+c^2&\text{kết quả nhân ra}
\end{align*}

: 2

a = ( b + c)2 bình phương một tổng


= ( b + c)( b + c) chuyển về tích
= b2 + 2 bc + c2 kết quả nhân ra

Môi trường align* được gọi là phiên bản hình thành công
thức con của môi trường aligned. Điều này có nghĩa là nó hoạt
động giống như align*, nhưng phải được đặt ở chế độ toán
học liên văn bản, equation hoặc equation*. Môi trường aligned
cũng có một tùy chọn, giá trị có thể là c (mặc định), t hoặc b,
tùy thuộc vào việc bạn muốn căn chỉnh đường cơ sở cho chính
giữa, lên hay xuống. Hãy xem một số ví dụ

7 Ví dụ 6.123 8 : 2
dòng $\begin{aligned} x = y+ z y = bd z = bc
x&=y+z & y&=bd & z&=bc dòng chữ
b = 10 2 c = 56 d = 44
\\
b&=10 & 2c&=56 & d&=44
\end{aligned}$ chữ

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.25. Dóng nhiều công thức 211
7 Ví dụ 6.124 8 : 2
dòng $\begin{aligned}[ dòng x = y + z y = bd z = bc chữ
t]
b = 10 2 c = 56 d = 44
x&=y+z & y&=bd & z&=bc
\\
b&=10 & 2c&=56 & d&=44
\end{aligned}$ chữ

7 Ví dụ 6.125 8 : 2
dòng $\begin{aligned}[ x = y+ z y = bd z = bc
b]
dòng b = 10 2 c = 56 d = 44 chữ
x&=y+z & y&=bd & z&=bc
\\
b&=10 & 2c&=56 & d&=44
\end{aligned}$ chữ

7 Ví dụ 6.126 8 : 2
\begin{equation}
)
\left.\begin{aligned} x = y+ z y = bd z = bc
x&=y+z & y&=bd & z&=bc (6.13)
b = 10 2 c = 56 d = 44
\\
b&=10 & 2c&=56 & d&=44
\end{aligned}\right\}
\end{equation}

7 Ví dụ 6.127 8 : 2
\[\left.\begin{aligned
) )
x = y+ z a = bc
} và
x&=y+z\\ z&=100 z = 100 c = 50
\end{aligned}\right\}
\quad\text{và}\quad
\left.\begin{aligned}
a&=bc\\ c&=50
\end{aligned}\right\}\
]

Môi trường flalign và flalign* hoạt động giống hệt như


môi trường align và align*, nhưng độ rộng của khoảng trắng
trước cột đầu tiên và sau cột cuối cùng là 0pt.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


212 Chương 6. Môi trường toán trong LATEX

7 Ví dụ 6.128 8 : 2
\begin{flalign*}
x&=y+z & y&=bd & z&=bc
x = y+ z y = bd z = bc
\\
b&=10 & 2c&=56 & d&=44 b = 10 2 c = 56 d = 44
\end{flalign*}

Ngoài ra trong môi trường alignat có r@{}lr@{}l ... sự phù


hợp, nhưng ở đây chỉ có các khoảng trắng trước cột đầu tiên
và sau cột cuối cùng được phân bố đều, mặt khác bạn cũng
phải chỉ định là tham số như thế nào. nhiều r@{}l có một cặp
cột. Các lệnh \tag, \tag*, \notag có thể được sử dụng ở đây theo
cách tương tự như trong môi trường gather. Môi trường alignat
* thực hiện chính xác những gì một alignat làm, nhưng không
hiện số công thức.

7 Ví dụ 6.129 8
\begin{alignat}{3}
1&=1 &\qquad 2&=2 &\qquad 2&=1+1 \label{al3}\\
3&=3 & 3&=1+2& 3&=1+1+1 \label{al4}
\end{alignat}

: 2

1=1 2=2 2 = 1+1 (6.14)


3=3 3 = 1+2 3 = 1+1+1 (6.15)

Điều này cũng có thể được sử dụng để viết các hệ phương


trình tuyến tính:

7 Ví dụ 6.130 8: 2
\begin{alignat*}{3}
13&x+{} & 4&y & &=9\\
13 x + 4 y =9
3&x-{} & 12&y+{} & 23z&=14
\end{alignat*} 3 x − 12 y + 23 z = 14

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.25. Dóng nhiều công thức 213
7 Ví dụ 6.131 8: 2
\begin{alignat*}{4}
13&x+{} & 4&y & &={} & 9\\
13 x + 4 y = 9
3&x-{} & 12&y+{} & 23z&={}
&14 3 x − 12 y + 23 z = 14
\end{alignat*}

Hệ phương trình tuyến tính dễ thực hiện hơn nhiều với lệnh
\systeme trong gói lệnh systeme.sty. Để có mô tả chung về điều
này, hãy xem mô tả của gói systeme.sty, bây giờ chúng tôi sẽ
minh họa hoạt động của nó chỉ với một vài ví dụ.
7 Ví dụ 6.132 8: 2
\[\systeme{2a-b+4c=2, 
a+8b+5c=8,  2a − b + 4 c = 2

a + 8b + 5 c = 8
-a+2b+c=-5}\] 

−a + 2 b + c = −5

7 Ví dụ 6.133 8: 2
\sysdelim{.}{\rbrace} 2a − b + 4 c = 2 

\[\systeme{2a-b+4c=2, 
a + 8b + 5 c = 8
a+8b+5c=8, 

-a+2b+c=-5}\] −a + 2 b + c = −5

7 Ví dụ 6.134 8: 2
\[\systeme[][;]{1,5x-0,4y=0 ½
1, 5 x − 0, 4 y = 0, 7
,7;
x − 0,18 y = 1,4
x-0,18y=1,4}\]

7 Ví dụ 6.135 8
\[\systeme{(2\+\sqrt2)x-(1\-\sqrt2)y=1, x+(1\+\sqrt2)y=-1}\
]
: ( p p
2
(2 + 2) x − (1 − 2) y = 1
p
x + (1 + 2) y = −1

7 Ví dụ 6.136 8: 2
\[\systeme[xy]{mx-y=3, ½
mx − y=3
x-m^2y=1}\]
x − m2 y = 1

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


214 Chương 6. Môi trường toán trong LATEX
7 Ví dụ 6.137 8: 2
\[\systeme{x+y=125@(L_1), ½
x + y = 125 (L 1 )
x-y=12@(L_2)}\]
x − y = 12 (L 2 )

Quay trở lại môi trường alignat*, bây giờ nó có cái gọi là
phiên bản alignedat môi trường được căn chỉnh. Điều này có
nghĩa là nó hoạt động giống như alignat*, nhưng phải được
đặt ở chế độ toán học liên văn bản, equation hoặc equation*.
Môi trường alignedat cũng có một tùy chọn, giá trị có thể là c
(mặc định), t hoặc b, tùy thuộc vào việc bạn muốn căn chỉnh
đường cơ sở cho chính giữa, trên cùng hay dưới cùng. Hãy xem
một số ví dụ
7 Ví dụ 6.138 8: 2
\begin{equation}\label{al5}
)
11 x − 4 y = 7
\left.\begin{alignedat}{2} (6.16)
11&x-{} & 4y&=7\\ x− y=0
&x-{} & y&=0
\end{alignedat}\right\}
\end{equation}

7 Ví dụ 6.139 8: 2
\[\left.\begin{alignedat}{2
)
} 11 x − 4 y = 7
11&x-{} & 4y&=7\\ ⇒x= y=1
x− y=0
&x-{} & y&=0
\end{alignedat}\right\}
\Rightarrow x=y=1\]

7 Ví dụ 6.140 8: 2
dòng $\begin{alignedat}{2} 11 x − 4 y = 7
11&x-{} & 4y&=7\\ dòng văn bản
x− y=0
&x-{} & y&=0
\end{alignedat}$ văn bản

7 Ví dụ 6.141 8: 2
dòng $\begin{alignedat}[t]{ dòng 11 x − 4 y = 7 văn bản
2}
x− y=0
11&x-{} & 4y&=7\\
&x-{} & y&=0
\end{alignedat}$ văn bản

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.25. Dóng nhiều công thức 215
7 Ví dụ 6.142 8: 2
dòng $\begin{alignedat}[b]{ 11 x − 4 y = 7
2}
dòng x − y = 0 văn bản
11&x-{} & 4y&=7\\
&x-{} & y&=0
\end{alignedat}$ văn bản

Có ba cột trong môi trường eqnarray, cột đầu tiên ở bên


phải, cột thứ hai ở giữa và cột thứ ba ở bên trái. Một nửa
khoảng cách giữa các cột là lệnh độ dài.
\arrayycolsep

Ở đây không thể sử dụng thẻ \tag và \tag* và thay vào đó


là \notag,
\nonumber

Môi trường eqnarray* thực hiện chính xác những gì eqnarray


thực hiện, nhưng không hiển thị số công thức.

7 Ví dụ 6.143 8
\begin{eqnarray}
2x=2y & \Rightarrow & x=y \label{ar1}\\
6z=600 & \Rightarrow & z=100\nonumber
\end{eqnarray}
: 2
2x = 2 y ⇒ x = y (6.17)
6 z = 600 ⇒ z = 100

Môi trường này thường bị sử dụng sai trong các trường hợp
sau:
7 Ví dụ 6.144 8: 2
\begin{eqnarray*}
1+3 &=& 4\\
1+3 = 4
1+3+5 &=& 9
\end{eqnarray*} 1+3+5 = 9

Như bạn có thể thấy, ở đây dấu đẳng thức không được coi là
một dấu hiệu quan hệ, mà chỉ đặt nó ở giữa với quá nhiều

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


216 Chương 6. Môi trường toán trong LATEX

khoảng trống xung quanh nó. Môi trường này không được phát
minh cho các nhiệm vụ như vậy. Giải pháp đúng:
7 Ví dụ 6.145 8: 2
\begin{align*}
1+3 &=4\\
1+3 = 4
1+3+5 &=9
\end{align*} 1+3+5 = 9

Nếu số lượng công thức phù hợp được mở, nghĩa là, chỉ có thể
được biểu thị bằng ba điểm đặt thẳng đứng, hãy sử dụng các
giải pháp được hiển thị trong các ví dụ sau:
7 Ví dụ 6.146 8: 2
\begin{align*}
a_1 &= b_1 \\
a1 =
. b1
\shortvdotswithin{=} ..
a_n &= b_n an = bn
\end{align*}

7 Ví dụ 6.147 8: 2
\begin{alignat*}{3}
A&+ B &&= C &&+ D \\
A+
. B =. C +. D
\MTFlushSpaceAbove .. .. ..
&\vdotswithin{+} C+D =Y +K
&&\vdotswithin{=} &&\
vdotswithin{+}
\MTFlushSpaceBelow
C &+ D &&= Y &&+K
\end{alignat*}

Bạn cũng có thể đặt văn bản giữa các hàng công thức phù hợp.
Đó là nó
\intertext{text}
\shortintertext{text}

các lệnh hoạt động trong các môi trường sau: align, align*,
flalign, flalign*, alignat, alignat*.

7 Ví dụ 6.148 8
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
6.26. Đánh số các công thức con 217

\begin{align*}
f(x) &=\int4x\ln x\,\mathrm{d}x=
\shortintertext{sau khi tích hợp một phần}
&=2x^2\ln x-x^2+C=x^2\left(2\ln x-1\right)+C.
\end{align*}
: 2
Z
f ( x) = 4 x ln x d x =

sau khi tích hợp một phần


= 2 x2 ln x − x2 + C = x2 (2 ln x − 1) + C.

\intertext khác với lệnh \shortintertext ở chỗ có nhiều


khoảng trống hơn giữa các công thức và văn bản.

6.26 Đánh số các công thức con

Nếu các công thức phù hợp có những công thức con và
bạn muốn đánh số chúng, bạn có thể sử dụng môi trường
subequations, trong đó các ngữ cảnh sau có thể được nhúng
vào nó: gather, align, flalign, alignat, eqnarray.
7 Ví dụ 6.149 8: 2
\begin{subequations}
\begin{gather}
x = ac + bc (6.18a)
x=ac+bc \label{ga1}\\
y>dc \label{ga2} y > dc (6.18b)
\end{gather}
\end{subequations}

Ví dụ: để thay đổi kiểu đánh số của công thức con thành (1/a),
hãy sao chép mã sau sau khi tải gói mathtools.sty:
\let\Subequations\subequations
\renewenvironment{subequations}
{\begin{Subequations}
\renewcommand{\theequation}{\theparentequation/\alph{
equation}}}{\end{Subequations}}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


218 Chương 6. Môi trường toán trong LATEX

6.27 Ngắt trang trong công thức nhiều dòng

Theo mặc định, ngắt trang không được phép trong công
thức nhiều dòng. Có thể ngắt dong trong khối công thức nhiều
dòng bằng cách đặt ở đầu khối

\allowdisplaybreak

Việc ngắt trang sau đó sẽ tự động xảy ra. Ở một nơi nhất định
như vậy có thể buộc ngắt trang nếu \\ thay vào đó

\displaybreak \\

Bạn có thể tắt ngắt trang tại một vị trí cụ thể bằng cách nhập
\\* thay vì \\.

6.28 Tự động ngắt công thức dài dòng

Dùng gói lệnh autobreak.sty dùng môi trường autobreak


kết hợp với equation, equation*, align, align*,... có thể làm:
1. Ngắt khối công thức nhiều dòng khi cuối trang (như phần
trước).
2. Tự động ngắt dòng dài

7 Ví dụ 6.150 8
\begin{align*}
\begin{autobreak}
\zeta(3) =1
+ \frac{1}{8}+ \frac{1}{27}+ \frac{1}{64}+ \frac{1}{125}
+ \frac{1}{216}+\frac{1}{343}+\frac{1}{512}+\frac{1}{729}
+ \frac{1}{1000}+ \frac{1}{1331}+ \cdots
\end{autobreak}
\end{align*}

: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
6.28. Tự động ngắt công thức dài dòng 219

1 1 1 1 1 1 1 1
ζ(3) = 1 + + + + + + + +
8 27 64 125 216 343 512 729
1 1
+ + +···
1000 1331

7 Ví dụ 6.151 8
\begin{align}
\begin{autobreak}
\zeta(3) =1
+ \frac{1}{8}+ \frac{1}{27}+ \frac{1}{64}+ \frac{1}{125}
+ \frac{1}{216}+\frac{1}{343}+\frac{1}{512}+\frac{1}{729}
+ \frac{1}{1000}+ \frac{1}{1331}+ \cdots
\end{autobreak}
\end{align}

: 2
1 1 1 1 1 1 1 1
ζ(3) = 1 + + + + + + + +
8 27 64 125 216 343 512 729
1 1
+ + +··· (6.19)
1000 1331

3. Dùng lệnh \MoveEqLeft[<số>] dòng hai thụt vào <số đo>


mặc định là 2em:

7 Ví dụ 6.152 8
\begin{align*}
\begin{autobreak}
\MoveEqLeft
(n_1+n_2+n_3+n_4)^3 =n_1^3+ 3 n_1^2 n_2+ 3 n_1 n_2^2+ n_2^3
+ 3 n_1^2 n_3+ 6 n_1 n_2 n_3+ 3 n_2^2 n_3+ 3 n_1 n_3^2
+ 3 n_2 n_3^2+n_3^3+3 n_1^2 n_4+6 n_1 n_2 n_4+3 n_2^2 n_4
+ 6 n_1 n_3 n_4+ 6 n_2 n_3 n_4+ 3 n_3^2 n_4+ 3 n_1 n_4^2
+ 3 n_2 n_4^2+ 3 n_3 n_4^2+ n_4^3 .
\end{autobreak}
\end{align*}

: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
220 Chương 6. Môi trường toán trong LATEX

( n 1 + n 2 + n 3 + n 4 )3 = n31 + 3 n21 n 2 + 3 n 1 n22 + n32


+ 3 n21 n 3 + 6 n 1 n 2 n 3 + 3 n22 n 3 + 3 n 1 n23
+ 3 n 2 n23 + n33 + 3 n21 n 4 + 6 n 1 n 2 n 4 + 3 n22 n 4
+ 6 n 1 n 3 n 4 + 6 n 2 n 3 n 4 + 3 n23 n 4 + 3 n 1 n24
+ 3 n 2 n24 + 3 n 3 n24 + n34 .

4. Mỗi chỗ ngắt đều thêm dấu

\everybeforeautobreak {<dấukí hiệu>}


\everyaftereautobreak{<dấukí hiệu>}

7 Ví dụ 6.153 8

\begin{align}
\everyafterautobreak{\times}
\begin{autobreak}
\cos\left(\frac{\pi x}{2}\right) =\left(1-x^2\right)
\left(1-\frac{x^2}{9}\right)\left(1-\frac{x^2}{25}\right)
\left(1-\frac{x^2}{49}\right)\left(1-\frac{x^2}{81}\right)
\left(1-\frac{x^2}{121}\right)\left(1-\frac{x^2}{169}\right
)
\dots
\end{autobreak}
\end{align}

: 2
³ πx ´ x2 x2 x2 x2
µ ¶µ ¶µ ¶µ ¶
2
¡ ¢
cos = 1− x 1− 1− 1− 1−
2 9 25 49 81
x2 x2
µ ¶µ ¶
× 1− 1− ... (6.20)
121 169

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


6.29. Bảng ở chế độ toán học 221

6.29 Bảng ở chế độ toán học

Trong chế độ toán học, một bảng phải được tạo bằng môi
trường mảng thay vì một bảng, có cùng cách sử dụng với môi
trường bảng, nhưng nội dung của các ô không cần phải được
đặt trong một chế độ toán học riêng biệt. Ví dụ
7 Ví dụ 6.154 8: 2
\[A\to
\begin{array}{|c|c|} \hline a 11 a 12
A→
a_{11} & a_{12}\\ \hline a 21 a 22
a_{21} & a_{22}\\ \hline
\end{array}\]
7 Ví dụ 6.155 8: 2
\[\begin{array}[t]{|ccc|}\
hline α β
1 & 2 & 3\\ γ δ
4 & 5 & 6\\
7 & 8 & 9\\ \hline 1 2 3
\end{array}
4 5 6
\begin{array}[b]{|cc|} \
hline 7 8 9
\alpha & \beta\\
\gamma & \delta\\ \hline
\end{array}\]

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 7. TÀI LIỆU CÓ CẤU TRÚC

7.1. Dòng tiêu đề, trang tiêu đề, đoạn trích . . . . . . . . . . . 224
7.2. Các cấp độ của văn bản chính . . . . . . . . . . . . . . . . . . . 224
7.3. Lỗi cấu trúc đoạn văn . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
7.4. Đầu trang và chân trang . . . . . . . . . . . . . . . . . . . . . . . . 228
7.4.1. Cài đặt cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
7.4.2. Tùy chỉnh đầu trang và chân trang . . . . . . 230
7.4.3. Tùy chỉnh với gói fancyhdr.sty . . . . . . . . . . . 235
7.5. Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
7.5.1. Nội dung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
7.5.2. Danh sách các bảng . . . . . . . . . . . . . . . . . . . . . . 240
7.5.3. Danh sách các hình ảnh . . . . . . . . . . . . . . . . . . 240
7.5.4. Danh sách các mã . . . . . . . . . . . . . . . . . . . . . . . . 241
7.5.5. Danh sách các đối tượng nổi của riêng bạn . . . . .
242
7.5.6. Chỉnh sửa kiểu danh sách . . . . . . . . . . . . . . . . 243
7.5.7. Chú thích . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
7.6. Môi trường định lý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
7.6.1. Thiết lập môi trường định lý . . . . . . . . . . . . . 245
223

7.6.2. Môi trường định lý trong amsthm.sty . . . . 247


7.7. Tài liệu tham khảo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

7.7.1. Tạo thư mục với môi trường . . . . . . . . . . . . . . 254


7.7.2. Gói lệnh biblatex.sty . . . . . . . . . . . . . . . . . . . . . 257
7.8. Chỉ mục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

7.8.1. Gói lệnh imakeidx . . . . . . . . . . . . . . . . . . . . . . . . 274


7.8.2. Nhập từ khóa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
7.8.3. Hiển thị chỉ mục. . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.8.4. Một ví dụ về tạo chỉ mục bằng tiếng Việt . 278
7.8.5. Dịch tệp nguồn sang pdf. . . . . . . . . . . . . . . . . . 280
7.9. Phụ lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.10. Tổ chức các tác phẩm dài hơn . . . . . . . . . . . . . . . . . . 281

Các tài liệu có cấu trúc dài hơn thường có cấu trúc như sau:
- Tên tài liệu
- tóm tắt (không có trong lớp sách (book))
- nội dung
- danh sách các đối tượng di động
- cấp độ văn bản chính
+ các phần của tài liệu
+ chương (không thuộc lớp bài báo (article))
+ phần đoạn
+ phần đoạn phụ
+ phần đoạn phụ con
+ đoạn văn
+ đoạn văn con
+ trong mỗi đoạn văn giống như mục
- Phụ lục
- Thư mục
- mục lục

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


224 Chương 7. Tài liệu có cấu trúc

7.1 Dòng tiêu đề, trang tiêu đề, đoạn trích

Sử dụng các lệnh sau để nhập tên sách, tác giả và ngày
tháng của tác phẩm.
\title{<Title>}
\author{<author>}
\date {<date>}

\maketitle

Các lệnh \title, \author và \date cũng có thể được viết trong
phần mở đầu, nhưng chỉ \maketitle trong nội dung tài liệu.
Giá trị mặc định cho <date>
\today

có nghĩa là ngày hiện tại tại thời điểm dịch. Chú thích cho các
đối số của các lệnh này cũng có thể được viết một
\thanks{text}

bằng lệnh. Nó được đánh số độc lập với \footnote. \maketitle


có sẵn tạo địa chỉ từ dữ liệu. Theo mặc định cho các lớp article
.cls, report.cls và book.cls tiêu đề được đặt trên một trang
riêng biệt, trong khi trong trường hợp của article.cls thì
không. Được cung cấp với tùy chọn trang titlepage thì article
.cls cũng sẽ được đặt trên một trang riêng trong trường hợp
này. Sau đó, bạn có thể mở một môi trường abstract (ngoại trừ
lớp sách) mà tác phẩm sẽ hoạt động, bạn có thể viết một đoạn
trích ngắn.

7.2 Các cấp độ của văn bản chính

Thứ bậc các cấp trong văn bản chính được tóm tắt trong
bảng sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.2. Các cấp độ của văn bản chính 225

Tên Lệnh cấp độ article book


report
Phần \part[<Tđ ngắn>]{<Tiêu đề>} 0 -1
Chương \chapter[<Tđ ngắn>]{<Tiêu đề>} - 0
Mục \section[<Tđ ngắn>]{<Tiêu đề>} 1 1
Tiểu mục \subsection[<Tđ ngắn>]{<Tđ>} 2 2
Tiểu mục con \subsubsection[<Tđ ngắn>]{<Tđ>} 3 3
Đoạn văn \paragraph[<Tđ ngắn>]{<Tđ>} 4 4
Đoạn văn con \subparagraph[<Tđ ngắn>]{<Tđ>} 5 5
<Tiêu đề> là tiêu đề của cấp độ đã cho, trong khi <Tđ ngắn>
là tiêu đề xuất hiện trong mục lục và tiêu đề. Giá trị mặc định
là <Tiêu đề>, có nghĩa là nếu bạn không chỉ định nó, tiêu đề
có trong văn bản sẽ được đưa vào mục lục và tiêu đề. Nếu bạn
muốn hiển thị các tiêu đề khác nhau trong văn bản, mục lục
và tiêu đề, hãy sử dụng mã sau:
\chapter[<Tiêu đề Mục lục>]{<Tiêu đề>}
\chaptermark{<Tiêu đề chạy>}
\section[<Tiêu đề Mục lục>] {<Tiêu đề>}
\sectionmark{<Tiêu đề chạy>}
\subsection[<Tiêu đề Mục lục>]{<Tiêu đề>}
\subsectionmark{<Tiêu đề chạy>}

Các cấp độ được tự động đánh số theo số cấp độ được chỉ


định bởi bộ đếm secnumdepth (trong bài viết là 3, trong bài viết
khác là 2.) Nếu bạn muốn thay đổi điều này, chẳng hạn như
bạn muốn đánh số các đoạn văn chẵn (có số cấp độ là 4) , hãy
nhập nội dung sau vào phần mở đầu:
\setcounter{secnumdepth}{4}

Nếu bạn không muốn một số sê-ri chỉ cho một cấp cho một cấp
được đánh số, hãy sử dụng cái gọi là phiên bản sao (ví dụ: \
section*{<Tiêu đề>}). Trong trường hợp này, tiêu đề không có
trong mục lục hoặc tiêu đề.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


226 Chương 7. Tài liệu có cấu trúc

Các phần được đánh số theo mặc định bằng số La Mã và


các chương bằng tiếng Ả Rập. Trong trường hợp của tiếng Việt,
việc đánh số có thể xuất hiện chính tả. Để thực hiện việc này,
hãy sử dụng tệp vietnam.ldf
partnumber = Viordinal, chapternumber = Viordinal
phải được tải với các tùy chọn. Sau đó, chẳng hạn
7 \part{Cơ sở}
Ví dụ 7.1 8
: 2
Phần một
Cơ sở
7 \chapter{Thực Ví dụ 7.2
hành tính toán} 8
: 2
Chương một
Thực hành tính toán
Các mức có thể được tham chiếu chính xác như được mô tả
cho trường hợp chung. Ví dụ
7 Ví dụ 7.3 8
\subsection{Đây là tiêu đề phụ đề} \label{subsec:vd}
...
Xem \aref{subsec:vd}.
: 2
1.1. Đây là tiêu đề phụ đề
...
Xem 1.1.
Bạn cũng có thể kiểm soát sự xuất hiện của tiêu đề của các
cấp độ bằng gói titlesec.sty. Điều này không được trình bày
chi tiết ở đây, chỉ có một ví dụ được đề cập trong đó tiêu đề
chương được đặt ở giữa. Trong nội dung tài liệu, nhập:
\titleformat {\chapter} [display] {\normalfont \bfseries \
filcenter}
{\huge \thechapter.~\chaptertitlename}{20pt}{\Huge} (trong
titlesec.sty)

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.3. Lỗi cấu trúc đoạn văn 227

Có ba lệnh nữa trong lớp sách về cấu trúc sách: Các trang
được đánh số La mã, các chương không có số thứ tự:
\frontmatter

Các trang được đánh số Ả Rập từ 1:


\mainmatter

Các chương không có số sê-ri:


\backmatter

Vị trí của họ:


\begin {document}
<Mở đầu>
\frontmatter
<Danh sách, lời nói đầu, giới thiệu>
\mainmatter
<Một phần chính của văn bản, phụ lục>
\backmatter
<Tài liệu, chỉ mục>
\end {document}

Trong kiểu chữ Việt Nam, trong trường hợp \frontmatter, việc
đánh số trang được thực hiện bằng các chữ số La Mã lớn, trong
khi bằng tiếng Anh với các chữ số La Mã nhỏ. Để giải quyết vấn
đề này, hãy phát hành \aftermatter sau
\pagenumbering{Roman}.

7.3 Lỗi cấu trúc đoạn văn

Một lỗi nghiêm trọng trong bố cục của các tài liệu dài trong
kiểu chữ là cái gọi là dòng lỗi cuối hoặc đầu đoạn. Nó có hai
kiểu xuất hiện,
dòng quả phụ: một trang hoặc cột bắt đầu bằng dòng cuối cùng
của đoạn văn;

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


228 Chương 7. Tài liệu có cấu trúc

dòng mồ côi: một đoạn văn bắt đầu ở dòng cuối cùng của trang
hoặc cột.
Để vô hiệu hóa chúng, hãy sử dụng gói nowidow.sty với tùy
chọn all. Bạn cũng có thể đặt số dòng tối thiểu, nếu có, cho một
đoạn ở đầu hoặc cuối trang hoặc cột. Ví dụ: nếu bạn muốn con
số này là 4, bạn thậm chí có thể sử dụng tùy chọn defaultlines
= 4.

7.4 Đầu trang và chân trang

7.4.1 Cài đặt cơ bản

Trong một tài liệu dài hơn, bạn nên tìm một tài liệu tham
khảo trên mỗi trang về phần nào của tài liệu: trên bao nhiêu
trang, ở cấp độ nào và cấp độ bán lại nào. Chúng tự động xuất
hiện trong lớp sách. Trong hai lớp còn lại (article, report), hãy
phát hành yêu cầu:
\pagestyle{headings}

Hiệu quả là:


2 chân trang trống
2 số trang ở lề ngoài của tiêu đề
2 thông tin cấp trong tiêu đề
a để chọn một mặt ở lề trong của mỗi mặt
a để chọn hai mặt ở mặt chẵn ở lề trong
2 thông tin cấp phụ trong tiêu đề
a không có sẵn để sử dụng một mặt
a để chọn hai mặt ở mặt lẻ ở lề trong.
Các kiểu trang khác:
\pagestyle{empty}

Đầu trang và chân trang trống.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.4. Đầu trang và chân trang 229

\pagestyle{{plain}

Đầu trang trống, số trang ở giữa chân trang.


\pagestyle{myheadings}
\markboth{<tiêu đề chạy 1>} {<tiêu đề chạy 2>}

2 chân trang trống


2 số trang ở lề ngoài của tiêu đề
2 <tiêu đề chạy 1> trong tiêu đề
a không có sẵn để sử dụng một mặt
a để chọn hai mặt ở mặt chẵn ở lề trong
2 <tiêu đề chạy 2> trong tiêu đề
a để chọn một mặt ở lề trong của mỗi mặt
a để chọn hai mặt ở mặt lẻ ở lề trong
2 <tiêu đề chạy 1> và <tiêu đề chạy 2> có thể được thay đổi
bất kỳ lúc nào bằng lệnh \markboth. Chỉ <tiêu đề chạy 2>
có thể được chỉ định riêng biệt bằng lệnh
\markright{<tiêu đề chạy 2>}

Để thay đổi kiểu trang cho một trang cụ thể, hãy nhập:
\thispagestyle{<style>}

trong đó <style>: headings, myheadings, empty hoặc plain. Trong


các lớp báo cáo và sách, các trang mở phần mới và chương mới
chuyển sang kiểu đơn giản, sau đó trở lại kiểu ban đầu từ trang
tiếp theo.
Nếu bạn đã tải book hoặc lớp report bằng tùy chọn openright
, có thể có một trang trống trong tài liệu. Quy tắc đánh máy
của Việt Nam quy định rằng đầu trang và chân trang trên các
trang này cũng phải để trống. vietnam.ldf không giải quyết
được điều này. Để làm điều này, hãy tải gói emptypage.sty. Nếu
chúng ta buộc một trang trống, hãy nhập
\thispagestyle{empty}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


230 Chương 7. Tài liệu có cấu trúc

7.4.2 Tùy chỉnh đầu trang và chân trang

Các lệnh sau có thể được sử dụng để đặt đầu trang và chân
trang:
\thepage

In số trang hiện tại.


\thechapter

In số chương hiện tại.


\thesection

In số phần hiện tại.


\thesubsection

In số của tiểu mục hiện tại.


\@chapapp

In nhãn của chương hiện tại: "chương" hoặc "phụ lục".


\markboth{<tiêu đề chạy 1>}{<tiêu đề chạy 2>}

Kết quả là,


\leftmark

kết quả là <tiêu đề chạy 1>, trong khi một


\rightmark

kết quả sẽ là <tiêu đề chạy 2>.


\markright{<tiêu đề chạy>}

Do đó, kết quả của \rightmark sẽ là <tiêu đề chạy>. Thông tin


cấp hiện tại và cấp phụ được lưu trữ trong các lệnh \rightmark
và \leftmark. Kiểu tiêu đề này như sau theo bảng:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.4. Đầu trang và chân trang 231

article report/book
một mặt hai mặt một mặt hai mặt
\leftmark section chapter
\rightmark section section chapter section

\chaptermark{<tiêu đề chạy 1>}

Thực thi lệnh \chapter[<tiêu đề chạy 1>] {<tiêu đề 2>}.


\sectionmark{<tiêu đề chạy 1>}

Thực thi lệnh \section[<tiêu đề chạy 1>]{<tiêu đề 2>}.


\subsectionmark{<tiêu đề chạy 1>}

Thực thi lệnh \subsection[<tiêu đề chạy 1>]{<tiêu đề 2>}.


\@oddfoot

Nội dung của nó được đặt ở chân trang trên một trang để in
một mặt và trên trang được đánh số lẻ để in hai mặt.
\@evenfoot

Nội dung của nó được đặt ở chân trang để in hai mặt ở mặt
chẵn.
\@oddhead

Nội dung của nó được chèn vào tiêu đề trên một trang để in
một mặt và trên trang được đánh số lẻ để in hai mặt.
\@evenhead

Nội dung của nó được chèn vào tiêu đề khi in trên cả hai mặt.
\ps@<stylename>

Thực thi khi ra lệnh \pagestyle{<stylename>} hoặc


\thispagestyle{<stylename>}.
Trong ví dụ sau, chúng ta xác định một phong cách được
gọi là mystyle, có

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


232 Chương 7. Tài liệu có cấu trúc

\pagestyle{mystyle}
các cài đặt sau áp dụng cho báo cáo hoặc lớp sách:
1. chân trang trống
2. số trang ở lề ngoài của tiêu đề
3. Thông tin chương trong tiêu đề
(a) để chọn một mặt ở lề trong của mỗi mặt
(b) để chọn hai mặt ở mặt chẵn ở lề trong
4. thông tin phần trong tiêu đề
(a) không có sẵn để sử dụng một mặt
(b) để chọn hai mặt ở mặt lẻ ở lề trong.
\makeatletter
\def\ps@sajat{%
\def\chaptermark##1{\markboth{%
\thechapter.~\@chapapp.\enspace##1}{}}
\def\sectionmark##1{\markright{\thesection.\enspace##1}}
\def\@oddfoot{}
\def\@evenfoot{}
\def\@oddhead{\rightmark\hfill\thepage}
\def\@evenhead{\thepage\hfill\leftmark}}
\makeatothe

Các lệnh \makeatletter và \makeatother chỉ cần thiết cho các


lệnh có chứa dấu @ (xem phần sau).
Nếu bạn nhập mã sau vào nội dung tài liệu, các cài đặt sau
là nhiều ưu thế:
1. chân trang trống
2. số trang ở lề ngoài của tiêu đề
3. thông tin phần trong tiêu đề
(a) để chọn một mặt ở lề trong của mỗi mặt
(b) để chọn hai mặt ở mặt chẵn ở lề trong
4. Thông tin tiểu mục trong tiêu đề
(a) không có sẵn để sử dụng một mặt
(b) để chọn hai mặt ở mặt lẻ ở lề trong.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.4. Đầu trang và chân trang 233

\makeatletter
\def\sectionmark#1{\markboth{\thesection.\enspace#1}{}}
\def\subsectionmark#1{\markright{\thesubsection.\enspace#1}
}
\def\@oddfoot{}
\def\@evenfoot{}
\def\@oddhead{\rightmark\hfill\thepage}
\def\@evenhead{\thepage\hfill\leftmark}
\makeatother

\nouppercase được định nghĩa trong ví dụ sau sẽ ghi đè lệnh


\MakeUppercase. \HeadRule gạch dưới nội dung của tiêu đề bằng
một dòng dày 0.4pt có tên là dòng kẻ. Đường cơ sở của dòng
và văn bản tiêu đề sẽ cách xa 1ex. Sau đó, anh ấy tải kiểu tiêu
đề. Trong phần này, bạn xác định lại các lệnh \@oddhead, \@
evenhead để thông tin cấp không xuất hiện bằng tất cả các chữ
cái viết hoa (như bạn sẽ làm khi không có mã này) và dòng kẻ
cũng xuất hiện.
\newcommand{\nouppercase}[1]
{{\let\uppercase\relax\let\MakeUppercase\relax
\expandafter\let\csname MakeUppercase \endcsname\relax#1}}
\newcommand{\HeadRule}[1]
{\lower-1ex\hbox{\makebox[\textwidth]{#1}}%
\llap{\rule{\textwidth}{0.4pt}}}
\pagestyle{headings}
\makeatletter
\def\@oddhead{%
\HeadRule{\nouppercase{\rightmark}\hfill\thepage}}
\def\@evenhead{%
\HeadRule{\thepage\hfill\nouppercase{\leftmark}}}
\makeatother

Trong ví dụ sau, không có thông tin cấp trong đầu trang và


chân trang. Số trang sẽ ở lề ngoài trong tiêu đề. Cuối cùng, nó
vô hiệu hóa kiểu plain để kiểu trang không thay đổi trên các
trang mở phần và chương.
\makeatletter
\def\@oddfoot{}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


234 Chương 7. Tài liệu có cấu trúc

\def\@evenfoot{}
\def\@oddhead{\hfill\thepage}
\def\@evenhead{\thepage\hfill}
\def\ps@plain{}
\makeatother

Trong các ví dụ cho đến nay, bạn có thể muốn chỉ định
phông chữ cho số trang và thông tin cấp. Ví dụ: bạn có thể nhập
{\normalsize \normalfont \thepage} thay vì \thepage hoặc {\
footnotesize \sffamily \leftmark} thay vì \leftmark.
Theo mặc định, đánh số trang bằng chữ số Ả Rập. Bạn có
thể di chuyển nó bằng các lệnh sau:
\pagenumbering{arabic} Đánh số Ả Rập.
\pagenumbering {roman} Chữ số La mã nhỏ.
\pagenumbering{Roman} Chữ số La Mã lớn.
\pagenumbering{alpha} Chúng được đánh số bằng chữ thường
của bảng chữ cái tiếng Anh.
\pagenumbering{Alpha} Chúng được đánh số bằng chữ in hoa
của bảng chữ cái tiếng Anh.
Những điều này không chỉ thay đổi kiểu đánh số trang mà còn
đặt lại giá trị của nó thành 1. Nếu bạn không muốn đánh số
trang, hãy nhập lệnh sau:
\pagenumbering{gobble}

Khi tệp vietnam.ldf được tải với tùy chọn chapternumber =


Viordinal cho báo cáo hoặc lớp sách, đánh số chương trong tiêu
đề là Viordinal (Thứ nhất, Thứ hai, v.v.). Nhưng nếu có nhiều
chương, ví dụ, viết "Chương mười lăm" cùng với tiêu đề có thể
không còn phù hợp với tiêu đề. Đoạn mã sau đặt lại số chương
trong tiêu đề thành tiếng Ả Rập:
\refreshcommand{\chaptermark}[1]{%
\markboth{\MakeUppercase{\arabic{chapter}. Chương .~#1}}{}}

Khi sử dụng các lệnh \chapter*, \section*


, hoặc \subsection*, tức là các cấp không được
đánh số, chúng không xác định lại các lệnh

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.4. Đầu trang và chân trang 235

\leftmark và \rightmark cho địa chỉ hiện tại. Vì vậy, nếu


trước đó các lệnh này đã chứa một số thông tin, các tiêu đề
xấu sẽ xuất hiện trong tiêu đề. Để chứng minh điều này, hãy
thử mã sau:
\documentclass[12pt]{book}
\usepackage[utf8]{vietnam}
\usepackage{vnlipsum}
\begin {document}
\chapter{Tên chương được đánh số}
\vnlipsum[1] \newpage \vnlipsum[2]
\chapter*{Tên chương không được đánh số}
\vnlipsum[3] \newpage \vnlipsum[4]
\end {document}

Trong những trường hợp như vậy, nội dung của \leftmark
và \rightmark phải được xác định lại bằng các lệnh \markboth và
\markright tương ứng. Ví dụ: trong trường hợp trước đây, nếu
bạn không muốn thông tin cấp trong chương chưa được đánh
số, hãy nhập \markboth{}{} sau \chapter*{Tiêu đề chương chưa
được đánh số}.

7.4.3 Tùy chỉnh với gói fancyhdr.sty

Có thể sử dụng gói fancyhdr.sty thay vì các gói trước đó để


tùy chỉnh. Gói này phải được tải trước babel. Khi sử dụng gói
này, thông tin cấp được nạp theo bảng bên dưới:

article report/book Ví dụ
\leftmark section chapter Chương 7. Tài liệu có cấu trúc
\rightmark section section 7.4. Đầu trang và chân trang

Gói này có phong cách riêng của nó được gọi là fancy. Hiệu quả
là:
4 chân trang ở giữa số trang
4 thông tin cấp trong tiêu đề

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


236 Chương 7. Tài liệu có cấu trúc

b để chọn một mặt ở lề ngoài


b để chọn hai mặt ở lề trong
4 thông tin cấp phụ trong tiêu đề
b để chọn một mặt ở lề trong
b để hái hai mặt ở lề ngoài.
Bạn có thể tùy chỉnh phong cách này với
\fancyhead[<địa điểm>]{<Tiêu đề chạy>}
\fancyfoot[<địa điểm>]{<Tiêu đề chạy>}

Các giá trị <địa điểm> có thể có cho vị trí: L, C, R, LE, CE, RE,
LO, CO, RO. (Mặc định: LCR.) Ý nghĩa chữ cái: L = trường bên
trái, C = trường trung tâm, R = trường bên phải, E = trang
chẵn, O = trang lẻ. Vì vậy, ví dụ, LE có nghĩa là trường bên
trái trên các trang chẵn.
Vấn đề trước mỗi tùy chỉnh
\fancyhf{}

lệnh xóa cài đặt đầu trang và chân trang đã xác định trước đó.
Có thể tách văn bản chính bằng một dòng, cái gọi là với một
dòng, từ đầu trang và chân trang. Bạn có thể điều chỉnh độ
dày của các đường này bằng các lệnh sau:
\refreshcommand{\headrulewidth}{<thickness>}

Độ dày của dòng dưới tiêu đề. Giá trị mặc định là 0,4pt.
\refreshcommand{\footrulewidth}{<thickness>}

Độ dày của dòng phía trên chân trang. Giá trị mặc định là 0pt.
Bạn có thể xác định lại kiểu hiện có hoặc tạo kiểu mới bằng
lệnh sau:
\fancypagestyle{<stylename>}{<style>}

Nếu bạn nhập mã sau vào nội dung tài liệu, các cài đặt sau sẽ
áp dụng cho nạp hai mặt:
4 Không có dòng
4 chân trang trống

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.4. Đầu trang và chân trang 237

4 số trang ở lề ngoài của tiêu đề


4 thông tin cấp trong tiêu đề trên các trang chẵn ở lề trong
4 thông tin cấp phụ trong tiêu đề trên một trang lẻ ở lề
trong.
\pagestyle{fancy}
\fancyhf{}
\fancyhead[LE,RO]{\normalfont\normalsize\thepage}
\fancyhead[LO]{\sffamily\small\rightmark}
\fancyhead[RE]{\sffamily\small\leftmark}
\renewcommand{\headrulewidth}{0pt}

Nếu bạn nhập mã sau vào nội dung của tài liệu, tiêu đề
sẽ trống để chọn hai mặt và đánh số trang sẽ ở lề ngoài của
chân trang. Khi chúng ta đến trang bắt đầu của chương, các
lớp report và book chuyển sang kiểu plain, do đó, số trang được
căn giữa, điều này có thể gây nhầm lẫn với cài đặt này. Lệnh
\fancypagestyle{plain}{}có thể được sử dụng để tắt kiểu plain.
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[LE,RO]{\normalfont\normalsize\thepage}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{}

Nếu bạn muốn đánh số trang m/n, trong đó m là số trang


hiện tại và n là trang cuối cùng, hãy tải gói trang cuối cùng rồi
nhập như sau:
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[C]{\normalfont\normalsize\thepage/\pageref{
LastPage}}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{}

hoặc
\fancypagestyle{mystyle}{
\fancyhf{}
\fancyfoot[C]{\normalfont\normalsize\thepage/\pageref{
LastPage}}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


238 Chương 7. Tài liệu có cấu trúc

\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{}}

Sau đó, bạn có thể sử dụng lệnh \pagestyle{my} hoặc \


thispagestyle{my} ở bất kỳ đâu. Trong các ví dụ trước, bạn
không chỉ có thể hiển thị số trang và thông tin cấp mà còn hiển
thị thông tin của riêng bạn. Bạn có thể đặt phông chữ của họ
như bạn muốn. Bạn cũng có thể sử dụng lệnh \nouppercase {
<text>} đã biết trước đây, lệnh này được định nghĩa theo mặc
định trong gói favourite, vì vậy chúng ta không cần phải làm
như trước đây.

7.5 Mục lục

7.5.1 Nội dung

Tại điểm trong tài liệu mà bạn muốn mục lục xuất hiện,
đưa ra yêu cầu.
\tableofcontents

Ví dụ: nếu bạn muốn thay đổi tiêu đề thành "Nội dung", hãy
nhập trước tiêu đề tiếp theo:
\def\contentname{Mục lục}

Khi biên dịch, các tiêu đề cấp và số trang tương ứng được ghi
vào tệp có phần mở rộng toc (mục lục) (tên và thư mục giống
với tệp nguồn). Vào cuối bản dịch, tệp này thực sự hiển thị mục
lục.
Độ sâu của mục lục, tức là cấp độ của tiêu đề xuất hiện
trong mục lục, được bao gồm trong bộ đếm tocdepth. Di chuyển
v.d. 4:
\setcounter{tocdepth}{4}

Các đầu sách có số cấp từ 4 trở xuống sẽ xuất hiện trong mục
lục.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.5. Mục lục 239

Khi bạn sử dụng phiên bản sao của lệnh mở cấp, tiêu đề
này sẽ không được đánh số, nó sẽ không có trong tiêu đề và
mục lục. Để vẫn được đưa vào mục lục cùng với số trang, hãy
nhập dòng sau vào lệnh mở cấp:
\addcontentsline{toc}{<level>}{<Nội dung>}

Ví dụ
\section*{Lời nói đầu}
\addcontentsline{toc}{section}{Lời nói đầu}

Nếu bạn sử dụng gói hyperref.sty, nếu bạn ghi vào mục lục
bằng lệnh \addcontentsline, liên kết số trang sẽ không hoạt
động. Cải tiến của điều này là \addcontentsline cũng phải được
đặt trước lệnh \phantomsection (trong hyperref.sty).
Chú thích và lệnh không có số trang cũng có thể được hiển
thị trong mục lục tại bằng lệnh
\addtocontents{toc}{<text>}

Nếu có một lệnh trong <text> mà bạn muốn nhập vào tệp toc
mà không cần giải thích, hãy đặt lệnh \protect trước lệnh đó.
Ví dụ
\addtocontents{toc}{\protect\vspace*{10pt}}
Vị trí lệnh \addtocontents sẽ có hiệu lực trong mục lục phụ
thuộc vào nơi nó được phát hành trong tệp nguồn.
Theo mặc định, các bảng (mục lục, bảng và số liệu, thư
mục) và chỉ mục tên và chủ đề không xuất hiện trong mục lục.
Nếu bạn vẫn cần, gói tocbibind sẽ hiển thị tất cả những điều
này. Nó có thể hoạt động với các lớp tài liệu sau: book, report,
article, proc, ltxdoc. Các tùy chọn có thể có:
notbib Thư mục không xuất hiện trong mục lục.
notindex Chỉ mục không xuất hiện trong mục lục.
nottoc Mục lục không xuất hiện trong mục lục.
notlot Danh sách các bảng không xuất hiện trong mục lục.
notlof Danh sách các số liệu không xuất hiện trong mục lục.
numbib Thư mục được đánh số tiêu đề.
numindex Chỉ mục được đánh số tiêu đề.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


240 Chương 7. Tài liệu có cấu trúc

7.5.2 Danh sách các bảng

Bạn cũng có thể tạo danh sách tiêu đề bảng hiển thị số
bảng, tiêu đề và số trang. Để làm điều này, hãy nhập
\listoftables

yêu cầu. Ví dụ: nếu bạn muốn thay đổi tiêu đề thành "Danh
sách Bảng", hãy thêm nội dung sau:
\def\listtablename{Danh sách bảng}

Khi biên dịch, lệnh \caption được viết trong môi trường bảng,
hoặc tùy chọn \captionof{table} được viết ở bất kỳ đâu, hoặc
đối số của nó, được ghi với số trang hiện tại vào một tệp có
nhiều phần mở rộng (danh sách bảng) (tên của nó và thư mục
giống với tệp nguồn). Vào cuối bản dịch, tệp này thực sự hiển
thị một danh sách các bảng.
Để thêm văn bản có số trang vào danh sách bảng, hãy sử
dụng lệnh sau:
\addcontentsline{lot}{table}{<text>}

Thông tin không có số trang cũng có thể được ghi vào danh
sách tại
\addtocontents{lot}{<text>\par}

bằng lệnh. Vị trí lệnh \addtocontents có tác dụng trong danh


sách xác định nơi nó được phát hành trong tệp nguồn.

7.5.3 Danh sách các hình ảnh

Để tạo danh sách các số liệu, hãy nhập một vào phần thích
hợp của tài liệu yêu cầu
\listoffigures

Ví dụ: nếu bạn muốn thay đổi tiêu đề thành "Danh sách hình",
hãy thêm nội dung sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.5. Mục lục 241

\def\listfigurename{Danh sách hình}

Khi biên dịch, lệnh \caption trong môi trường figure hoặc tùy
chọn \captionof{figure} ở bất kỳ vị trí nào hoặc khi không có,
đối số của nó được ghi với số trang hiện tại vào tệp có phần mở
rộng lof (danh sách các hình) (tên và thư mục của nó giống với
tệp nguồn). Ở cuối bản dịch, tệp này thực sự hiển thị một danh
sách các số liệu.
Để thêm văn bản có số trang vào danh sách hình, hãy sử
dụng lệnh sau:
\addcontentsline{lof}{figure}{<text>}

Thông tin không có số trang cũng có thể được hiển thị trong
danh sách
\addtocontents{lof}{<text>\par}

bằng lệnh. Vị trí lệnh \addtocontents có tác dụng trong danh


sách xác định nơi nó được phát hành trong tệp nguồn.

7.5.4 Danh sách các mã

Để có danh sách các mã chương trình được tạo bằng


listings.sty hoặc gói listingsutf8.sty, điểm thích hợp trong
tài liệu các lệnh
\def\lstlistlistingname{Danh sách mã lệnh}
\lstlistoflistings

Khi dịch, tiêu đề của các mã được đánh số được hiển thị cùng
với số trang hiện tại một tệp *.lol (danh sách các lệnh) với tên
và thư mục với tệp nguồn của nó trận đấu). Vào cuối bản dịch,
việc sử dụng tệp này sẽ thực sự hiển thị danh sách các mã.
Nếu bạn muốn thêm văn bản có số trang vào danh sách mã,
hãy sử dụng cách sau yêu cầu:
\addcontentsline{lol}{lstlisting}{<text>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


242 Chương 7. Tài liệu có cấu trúc

Thông tin không có số trang cũng có thể được ghi vào danh
sách bằng lệnh
\addtocontents{lol}{<text>\par}

Bạn có thể quyết định vị trí lệnh \addtocontents sẽ có hiệu lực


trong danh sách nơi nó được phát hành trong tệp nguồn.

7.5.5 Danh sách các đối tượng nổi của riêng bạn

Trước đây, chúng ta đã thấy rằng với gói phụ đề, chúng ta
cũng có thể tạo môi trường nổi của riêng mình. Bạn cũng có
thể tạo một danh sách các đối tượng được thả nổi với một môi
trường như vậy bằng lệnh
\listof<enosystem>

Khi biên dịch, tùy chọn \caption hoặc \captionof được viết
trong môi trường <enosystem> hoặc, trong trường hợp không
có, đối số với số trang hiện tại sẽ được ghi vào một tệp có danh
sách mở rộng môi trường (danh sách <enosystem>) (tên và thư
mục của nó). tương ứng với kho nguồn). Vào cuối bản dịch, tệp
này thực sự được hiển thị bằng cách sử dụng tệp này. Để thêm
văn bản có số trang vào danh sách các đối tượng nổi, hãy sử
dụng lệnh sau:
\addcontentsline{lo<enosystem>}{<enosystem>}{<text>}

Thông tin không có số trang cũng có thể được hiển thị trong
danh sách bằng lệnh
\addtocontents{lo<enosystem>}{<text>\par}

Vị trí lệnh \addtocontents có tác dụng trong danh sách xác


định nơi nó được phát hành trong tệp nguồn.
Ví dụ, để môi trường nổi mà chúng ta định nghĩa được gọi
là prog. Trong trường hợp này, để tạo danh sách, hãy nhập a
vào phần thích hợp của tài liệu yêu cầu
\listofprogs

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.5. Mục lục 243

Dữ liệu trong danh sách nằm trong tệp có phần mở rộng là


loprog (danh sách các progs). Để thêm văn bản vào danh sách
của bạn, hãy sử dụng các lệnh sau:
\addcontentsline {loprog} {prog} {<text>}
\addtocontents {loprog} {<text>\par}

7.5.6 Chỉnh sửa kiểu danh sách

Bạn cũng có thể tạo phong cách của riêng mình bằng đoạn
mã sau.
\makeatletter
\def \l@<stylename>{<found style>\@dottedtocline{<level
number>}} {<indent1>}{<indent2>}}
\makeatother

Ví dụ
\makeatletter
\def\l@my{\large\@dottedtocline{1}{2em}{3em}}
\makeatother

mã được sử dụng để xác định một kiểu được gọi là bản thân
cấp 1. Sau đó
\addcontentsline{toc}{my}{<text>}
làm cho <text> xuất hiện trong mục lục (kích thước lớn) nếu
giá trị tocdepth không nhỏ hơn 1. "Địa chỉ" bắt đầu bằng thụt
lề 2em. Nếu tiêu đề dài đến mức cần ngắt dòng, dòng thứ hai và
các dòng tiếp theo bắt đầu bằng khoảng thụt lề 3em so với dòng
đầu tiên. Phần cuối của tiêu đề và số trang được nối với nhau
bằng một loạt dấu chấm.
Nếu bạn không muốn có một đường chấm giữa cuối tiêu đề
và số trang, thì mã phức tạp hơn. Để thực hiện việc này, trước
tiên bạn phải xác định lệnh \@nodottedtocline được mô hình
hóa trên lệnh \@dottedtocline:
\makeatletter
\def\@nodottedtocline#1#2#3#4#5{%

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


244 Chương 7. Tài liệu có cấu trúc

\ifnum #1>\c@tocdepth \else


\vskip \z@ \@plus.2\p@
{\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\
rightskip
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{#4}\nobreak
\leaders\hbox{}\hfill
\nobreak
\hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
\par}%
\fi}
\makeatother

Sau đó
\makeatletter
\def\l@<stylename>{<found style>\@nodottedtocline{intslevel
number}}{<indent1>} {<indent2>}}
\makeatother

có thể được sử dụng chính xác như trước đây.

7.5.7 Chú thích

Thay vì chú thích cuối trang, có thể cũng tạo các chú thích
cuối không xuất hiện ở cuối mỗi trang, nhưng trên một trang
riêng biệt mà chúng ta chỉ định, chẳng hạn như ở cuối mỗi
chương. Để thực hiện việc này, hãy sử dụng thay vì lệnh \
footnote
\endnote{<text>} (trong endnotes.sty).

Nơi bạn muốn chú thích xuất hiện, hãy nhập


\theendnotes (trong endnotes.sty).

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.6. Môi trường định lý 245

7.6 Môi trường định lý

7.6.1 Thiết lập môi trường định lý

Thông thường có thể cần phải viết các đoạn văn yêu cầu
tiêu đề loại hoặc số sê-ri. Ví dụ là các định lý, chứng minh,
định nghĩa trong toán học hoặc các đoạn văn trong Quy tắc,
v.v. Những cái gọi là các đoạn văn giống như mục mà bạn có
thể tạo với các môi trường được xác định bằng lệnh \newtheorem
.
\newtheorem {<tên môi trường>} {<tên tiêu đề>}
\newtheorem {<tên môi trường>} {<tên tiêu đề>} [<đếm theo
khung>]
\newtheorem {<tên môi trường>} [<đếm chung>] {<tên tiêu đề>
}

<tên môi trường> Tên môi trường và bộ đếm tên mặt hàng
được tăng lên mỗi khi bạn mở một môi trường như vậy.
<tên tiêu đề> Đây sẽ là tiêu đề loại của đoạn văn giống như
mục (định nghĩa, nhận xét, v.v.). Ngoài địa chỉ này, giá
trị hiện tại của bộ đếm <tên tiêu đề> cũng được hiển thị.
<đếm theo khung> Một bộ đếm đã được xác định, thường là bộ
đếm của một trong các mức (chapter, section, v.v.). Khi
điều này được thay đổi, bộ đếm có tên theo khung như
chapter, section,... sẽ được đặt lại. Bộ đếm và <đếm theo
khung> xuất hiện cùng nhau (ví dụ: mục 2.1).
<đếm chung> Tên của một môi trường giống môi trường<đếm
chung>. Bộ đếm cho môi trường trước và <đếm chung> sẽ
tăng cùng nhau.
Đây là cách sử dụng môi trường giống vật phẩm mà bạn đã
tạo:
\begin{<tên môi trường>}[Địa chỉ duy nhất]
<Văn bản>
\end{<tên môi trường>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


246 Chương 7. Tài liệu có cấu trúc

Nếu "địa chỉ duy nhất" được chỉ định, nó sẽ xuất hiện trong
dấu ngoặc đơn sau "địa chỉ mặt hàng". Tham chiếu có thể được
thực hiện đối với các đoạn văn được chia thành từng mục phù
hợp với mô tả chung. Ví dụ

7 Ví dụ 7.4 8
\newtheorem{dli}{Định lý}
\begin {dli}
Văn bản của định lý.
\end {dli}
\begin {dli}[Cauchy]\label{cauchy}
Văn bản của mục tiếp theo.
\end{dli}
Định lý~\ref{cauchy}.~từ mục \dots
: 2
Định lý 1. Văn bản của định lý.

Định lý 2 (Cauchy). Văn bản của mục tiếp theo.

Định lý 2. từ mục . . .
Dùng số đếm của mục này định nghĩa

7 Ví dụ 7.5 8
\newtheorem {dly}{Định lý}[section]
\newtheorem {dn}[dly]{Định nghĩa}
\begin{dly}
Văn bản của định lý.
\end{dly}
\begin{dn}
Văn bản của định nghĩa.
\end {dn}
: 2
Định lý 7.6.1. Văn bản của định lý.

Định nghĩa 7.6.2. Văn bản của định nghĩa.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.6. Môi trường định lý 247

7.6.2 Môi trường định lý trong amsthm.sty

Từ các ví dụ cho đến nay, bạn có thể thấy rằng trong các
đoạn văn giống như mục, tiêu đề được in đậm và văn bản được
in nghiêng. Bạn có thể tự đặt kiểu cho các đoạn văn giống như
mục bằng gói theorem hoặc amsthm. Chúng ta chỉ giải quyết gói
amsthm bây giờ. Khi sử dụng điều này, hãy đảm bảo rằng nó
được tải sau các gói amsmath hoặc mathtools. Bạn có thể đặt
kiểu bằng lệnh sau:
\theoremstyle{<stylename>} (trong amsthm.sty)

Các giá trị cho <stylename> có thể là:


plain Tiêu đề được in đậm, văn bản được in nghiêng. Đây là
mặc định.
definition Tiêu đề được in đậm, dòng chữ cổ.
remark Tiêu đề được in nghiêng, dòng chữ cổ.
Ngoài các kiểu này, bạn có thể xác định kiểu riêng của mình
bằng lệnh sau:
\newtheoremstyle{<sn>} {<fe>} {<le>} {<sz>} {<be>} {<cf>} {
<cp>} {<ct>} {<cd>} (trong amsthm.sty)

<sn> Tên của phong cách mới.


<fe> Kích thước của khoảng trắng phía trên đoạn văn. Để
trống sẽ trả về giá trị mặc định.
<le> Kích thước của khoảng trắng dưới đoạn văn. Để trống sẽ
trả về giá trị mặc định.
<sz> Loại phông chữ của văn bản.
<be> Kích thước của thụt lề. Nếu bạn muốn có kích thước thụt
lề bình thường, hãy nhập ? vào đây. Để trống, không có
thụt lề.
<cf> Phông chữ của tiêu đề.
<cp> Dấu câu tách tiêu đề khỏi văn bản.
<ct> Kích thước của khoảng trắng ngăn cách tiêu đề với văn
bản. Nếu bạn muốn ngắt dòng sau địa chỉ, hãy nhập new-

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


248 Chương 7. Tài liệu có cấu trúc

line tại đây.


<cd> Cấu trúc của tiêu đề mục. Nếu để trống, cài đặt mặc định
sẽ có hiệu lực. Bạn có thể sử dụng ba lệnh để cấu hình
nó: \thmname, \thmnumber, \thmnote.
Hãy xem ví dụ sau về cách sử dụng chúng:

7 Ví dụ 7.6 8
\newtheoremstyle{myth}{3ex}{3ex}{\slshape}{0pt}{\slshape\
bfseries}{.}
{2ex}{\thmnumber{#2}\thmname{. #1}\thmnote{ (#3)}}
\theoremstyle{myth}
\newtheorem{dinhly}{Định lý}
\begin{dinhly}[Cauchy]
Nội dung định lý
\end{dinhly}
: 2
1. Định lý (Cauchy). Nội dung định lý

Nếu bạn không muốn đánh số cho một môi trường giống
như mục, hãy sử dụng như sau:
\newtheorem*{<tên môi trường>}}{<tên tiêu đề>}}(trong
amsthm.sty)

7 Ví dụ 7.7 8
\newtheorem{din}{Định lý}[section]
\theoremstyle{definition}
\newtheorem{dnghia}[din]{Định nghĩa}
\theoremstyle{remark}
\newtheorem*{binhluan}{Bình luận}
\begin{din}
Văn bản của định lý.
\end{din}
\begin{dnghia}
Văn bản của định nghĩa.
\end{dnghia}
\begin{binhluan}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.6. Môi trường định lý 249

Văn bản của bình luận.


\end{binhluan}
: 2
Định lý 7.6.1. Văn bản của định lý.
Định nghĩa 7.6.2. Văn bản của định nghĩa.
Bình luận. Văn bản của bình luận.

Để chứng minh các định lý toán học, bổ đề, hệ quả có một


môi trường chứng minh trong gói amsthm.sty. Ví dụ

7 Ví dụ 7.8 8
\begin {proof}[Chứng minh]
Văn bản của chứng minh.
\end{proof}
: 2
Chứng minh. Văn bản của chứng minh.

Cái gọi là Q.E.D. dấu hiệu, là bản biểu diễn quod erat trong
tiếng Latinh (đã được chứng minh) viết tắt của thuật ngữ. Một
Q.E.D. một chữ viết tắt thường được thêm vào cuối các dẫn
xuất toán học. Ngày nay nó ít được sử dụng hơn, thay vào đó
được ký hiệu bằng □ hoặc ■, bằng tiếng Anh trong khu vực
ngôn ngữ, nó còn được gọi là bia mộ hoặc bia mộ sau Pál Hal-
mos, người đã giới thiệu việc sử dụng nó với iff (sau đó và chỉ
sau đó) vào những năm 1950. Một Q.E.D. Ví dụ: bạn có thể xác
định lại ký hiệu thành ■ như sau:
\renewcommand{\qedsymbol}{$\blacksquare$}

Nếu bạn không muốn đánh dấu Q.E.D., nhập thông tin sau:
\refreshcommand {\qedsymbol}{}

Nếu chứng minh kết thúc bằng một công thức toán học được
đánh dấu, nó sẽ được đặt ở dòng sau công thức và Q.E.D. dấu
hiệu đó là xấu:

7 Ví dụ 7.9 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
250 Chương 7. Tài liệu có cấu trúc

\begin{proof}

...

\[e^{i\pi}+1\]
\end{proof}
: 2
Chứng minh. ...

e iπ + 1

Trong trường hợp này, hãy sử dụng lệnh \qedhere:


7 Ví dụ 7.10 8: 2
\begin{proof}
Chứng minh. ....
....
e iπ + 1
\[e^{i\pi}+1\qedhere\]
\end{proof}

Tất nhiên, giải pháp này không cho kết quả tốt nếu công
thức được đánh số từ bên phải. Trong trường hợp này, hãy
chắc chắn kết thúc bằng chứng bằng văn bản. Nếu phần tử
cuối cùng của chứng minh là một công thức nhiều dòng, chẳng
hạn như với môi trường align*, hãy nhập \qedhere sau dòng
công thức cuối cùng. Ví dụ
7 Ví dụ 7.11 8: 2
\begin{proof}
Chứng minh. ...
...

\begin{align*} a = 2,
a&=2,\\ b = 3.
b&=3.\qedhere
\end{align*}
\end{proof}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.6. Môi trường định lý 251

Nếu phần tử cuối cùng của chứng minh là môi trường


mảng, hãy sử dụng tùy chọn b và a Đặt lệnh \qedsymbol sau
\end{array}. Ví dụ
7 Ví dụ 7.12 8: 2
\begin{proof}
Chứng minh. ....
....
a b c
\[\begin{array}[b]{|c|c|c|}
\hline d e f
a&b&c\\
\hline
d&e&f\\
\hline
\end{array}\qedhere\]
\end{proof}

Điều quan trọng là bạn phải sử dụng lệnh \qedhere trong


các trường hợp trên và theo cách tương tự, ngay cả khi bạn
sử dụng Q.E.D. đặt dấu để trống. Nếu không, một dòng trống
được tạo sau công thức cuối cùng của chứng minh, mà ký hiệu
Q.E.D., điều này sẽ dẫn đến khoảng cách dọc quá lớn sau
chứng minh.
Môi trường chứng minh cũng có thể được sử dụng với tùy
chọn. Ví dụ

7 Ví dụ 7.13 8
\begin{dli} \label {xy}
Văn bản của định lý.
\end {dli}

\begin{proof}[Chứng minh định lý \ref {xy}. ~ ]


Văn bản của chứng minh.
\end{proof}
: 2
Định lý 3. Văn bản của định lý.

Chứng minh định lý 3. Văn bản của chứng minh.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


252 Chương 7. Tài liệu có cấu trúc

Ví dụ: nếu bạn muốn "Giải pháp" thay vì "Chứng minh",


hãy sử dụng
\refreshcommand {\proofname}{Giải pháp}

lệnh trong phần thân tài liệu.


Nếu bạn muốn thay đổi sang định dạng loại khác, hãy sử
dụng mã sau thay chữ nghiêng thành chữ đậm:

7 Ví dụ 7.14 8
\makeatletter
\renewenvironment{proof}[1][\proofname]{\par
\pushQED{\qed}%
\normalfont \topsep6\p@\@plus6\p@\relax
\trivlist
\item[\hskip\labelsep
\bfseries % kiểu in đậm được đặt ở đây
#1\@addpunct{.}]\ignorespaces}
{\popQED\endtrivlist\@endpefalse}
\makeatother
\begin {proof}[Chứng minh]
Văn bản của chứng minh.
\end{proof}
: 2
Chứng minh. Văn bản của chứng minh.

Bạn không thể xác định lại các môi trường giống như mục
đã được xác định bằng lệnh \newtheorem trừ khi bạn thực hiện
trước các lệnh sau:
\let\<tên môi trương định lý>\relax
\let\end<tên môi trương định lý>\relax

Việc đóng một môi trường giống như một mục sẽ mở ra một
đoạn mới, bất kể bạn có chèn một dòng trống vào sau nó hay
không. Bạn có thể ghi đè hiệu ứng này bằng đoạn mã sau:
\makeatletter

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.6. Môi trường định lý 253

\AfterEndEnvironment{<tên môi trương định lý>}{\@doendpe} (


trong etoolbox.sty)
\makeatother

Để một dòng trống sau \end{<tên môi trương định lý>} sẽ


bắt đầu một đoạn văn mới, ngược lại thì không. Nếu bạn không
muốn có một đoạn mới sau \end{<tên môi trương định lý>},
nếu bạn đặt một dòng trống sau nó, nếu không, hãy sử dụng
mã sau:
\makeatletter
\AfterEndEnvironment{<tên môi trương định lý>}
{\everypar{\setbox\z@\lastbox\everypar{}}} (trong etoolbox.
sty)
\makeatother

Nếu bạn muốn đóng một môi trường giống với một ký hiệu
cụ thể, như trong trường hợp chứng minh, ký hiệu Q.E.D., bạn
có thể làm điều này bằng cách sử dụng ví dụ sau. Tải gói amsthm
.sty và viết như sau trong phần mở đầu:
\newtheorem{mde}{Mệnh đề}
\let\oldmde\mde
\let\endoldmde\endmde
\renewenvironment{mde}[1][]{%
\begin{oldmde}[#1]\pushQED{\qed}}
{\def\qedsymbol{$\bigcirc$}\popQED\end{oldmde}}

Điều này xác định một môi trường mde luôn kết thúc bằng
⃝ ($\bigcirc$). Điều này không xác định lại Q.E.D. ở cuối môi
trường chứng minh. Vì vậy, sau đó

7 Ví dụ 7.15 8
\begin{mde}
Văn bản của mệnh đề.
\end{mde}
\begin{proof}
Văn bản của chứng minh.
\end{proof}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
254 Chương 7. Tài liệu có cấu trúc

Mệnh đề 1. Văn bản của mệnh đề. ⃝

Chứng minh. Văn bản của chứng minh.

7.7 Tài liệu tham khảo

Tiêu đề của "Tài liệu tham khảo" trong lớp article, được
lưu trữ bằng lệnh \refname. "Tài liệu tham khảo" trong lớp
report và book, được lưu trữ bằng lệnh \bibname. Ví dụ: định
nghĩa lại chúng thành "Văn học":
\refreshcommand{\refname}{Tài liệu chính}
\refreshcommand{\bibname}{Tài liệu chính}

Việc xác định lại phải được thực hiện trong phần thân tài
liệu, nếu không nó sẽ bị magyar.ldf ghi đè.

7.7.1 Tạo thư mục với môi trường

Bạn có thể tạo thư mục với thebibliography và bạn có thể


chỉ định các phần tử thư mục bằng lệnh \bibitem.
\begin {thebibliography}{<vidụ định dạng>}
\bibitem[<label>]{<key>} mô tả tài liệu
...
\end {thebibliography}

<vidụ định dạng> Là thẻ rộng nhất trong số các thẻ phần tử
thư mục.
<label> Chỉ định văn bản để xác định phần tử thư mục.
Nếu bạn bỏ nó, nhãn sẽ là một số sê-ri tự động.
<key> Đối với phần tử thư mục
\cite[<text>]{<key>}
có thể được tham chiếu trong tài liệu. Trong trường hợp
này, nhãn của mặt hàng sẽ xuất hiện tại điểm giữa các dấu

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 255

[ ]. Bạn có thể nhập nhiều khóa cùng một lúc, được phân tách
bằng dấu phẩy. Ví dụ: trong <text>, bạn có thể chỉ định trang
nào bạn đang đề cập đến.
Trong một tài liệu tiếng Việt, nó cũng có thể đặt một tính
từ tự động trước các liên kết
\cite[<text>]{<key>}
\cite[<text>]{<key>}

hoặc tương đương


\az{\cite[<text>]{<key>}}
\Az{\cite[<text>]{<key>}}

với các lệnh. Ví dụ


7 Ví dụ 7.16 8
Xem \cite{tuandien} và \cite[trang 134.~oldal]{dien}\dots
Xem \cite{tuandien,dien}\dots
Xem \cite{tuandien, dien} trong sách
\begin{thebibliography}{99}
\bibitem{tuandien} Nguyễn Hữu Điển và Nguyễn Minh Tuấn,
\textit{LaTeX và Soạn thảo}, 2000, NXB ĐHQG Hà Nội.
\bibitem{dien} Nguyễn Hữu Điển,
\textit{LaTeX với gói lệnh và phần mềm công cụ}, 2004, NXB
ĐHQG Hà Nội.
\end{thebibliography}
: 2
Xem [1] và [2, trang 134. oldal] . . . Xem [1, 2] . . . Xem [1, 2]
trong sách
TÀI LIỆU THAM KHẢO
[1] Nguyễn Hữu Điển và Nguyễn Minh Tuấn, LaTeX và Soạn
thảo, 2000, NXB ĐHQG Hà Nội.
[2] Nguyễn Hữu Điển, LaTeX với gói lệnh và phần mềm công
cụ, 2004, NXB ĐHQG Hà Nội.

7 Ví dụ 7.17 8
Xem \cite{tuandien} và \cite[trang 134.~oldal]{dien}\dots
Xem \cite{tuandien,dien}\dots
Xem \cite{tuandien, dien} trong sách

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


256 Chương 7. Tài liệu có cấu trúc

\begin{thebibliography}{tuandien 2000}
\bibitem[tuandien 2000]{tuandien} Nguyễn Hữu Điển và Nguyễn
Minh Tuấn,
\textit{LaTeX và Soạn thảo}, 2000, NXB ĐHQG Hà Nội.
\bibitem[dien 2004]{dien} Nguyễn Hữu Điển,
\textit{LaTeX với gói lệnh và phần mềm công cụ}, 2004, NXB
ĐHQG Hà Nội.
\end{thebibliography}
: 2
Xem [tuandien 2000] và [dien 2004, trang 134. oldal]
. . . Xem [tuandien 2000, dien 2004] . . . Xem [tuandien 2000,
dien 2004] trong sách
TÀI LIỆU THAM KHẢO
[tuandien 2000] Nguyễn Hữu Điển và Nguyễn Minh Tuấn,
LaTeX và Soạn thảo, 2000, NXB ĐHQG Hà
Nội.
[dien 2004] Nguyễn Hữu Điển, LaTeX với gói lệnh và
phần mềm
công cụ, 2004, NXB ĐHQG Hà Nội.
Với gói natbib, bạn cũng có thể tạo một thư mục không có
nhãn. Nếu bạn sử dụng gói này, lệnh \cite không hoạt động
đúng với một tính từ tự động. Thay vì mô tả chung về gói,
chúng ta chỉ đưa ra một ví dụ về việc sử dụng nó. Viết những
điều sau trong phần mở đầu:
\usepackage{natbib}
\setcitestyle{aysep={},citesep={,},open={},close={}}
\setlength{\bibsep}{0pt}

Sau đó, nhập nội dung sau vào nội dung tài liệu:
7 Ví dụ 7.18 8
Xem \cite{tuandien} và \cite[trang 134.~oldal]{dien}\dots
Xem \cite{tuandien,dien}\dots
Xem \cite{tuandien, dien} trong sách
\begin{thebibliography}{}
\bibitem[tuandien 2000]{tuandien} Nguyễn Hữu Điển và Nguyễn
Minh Tuấn, \textit{LaTeX và Soạn thảo}, 2000, NXB ĐHQG
Hà Nội.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 257

\bibitem[dien 2004]{dien} Nguyễn Hữu Điển, \textit{LaTeX vớ


i gói lệnh và phần mềm công cụ}, 2004, NXB ĐHQG Hà Nội.
\end{thebibliography}
: 2
Xem Nguyễn Hữu Điển và Nguyễn Minh Tuấn 2000 và
Nguyễn Hữu Điển 2004, trang 134. oldal . . . Xem Nguyễn
Hữu Điển và Nguyễn Minh Tuấn 2000, Nguyễn Hữu Điển
2004 . . . Xem Nguyễn Hữu Điển và Nguyễn Minh Tuấn 2000,
Nguyễn Hữu Điển 2004 trong sách
TÀI LIỆU THAM KHẢO
Nguyễn Hữu Điển và Nguyễn Minh Tuấn, LaTeX và Soạn
thảo, 2000, NXB ĐHQG Hà Nội.
Nguyễn Hữu Điển, LaTeX với gói lệnh và phần mềm công cụ,
2004, NXB ĐHQG Hà Nội.

7.7.2 Gói lệnh biblatex.sty

Cũng có thể tạo thư mục từ cơ sở dữ liệu, có một số ưu điểm:


- Có thể sử dụng cùng một cơ sở dữ liệu cho nhiều tài liệu
vì chỉ những tác phẩm thực sự được tham chiếu với lệnh \cite
mới xuất hiện trong thư mục. Nhưng nó cũng có thể hiển thị
tất cả các phần tử của cơ sở dữ liệu, bất kể chúng ta có tham
chiếu đến nó hay không.
- Việc lập danh sách và thiết lập nhãn dài nhất được thực
hiện tự động.
- Phong cách có thể được thay đổi mà không cần thay đổi cơ
sở dữ liệu.
Bạn có thể sử dụng gói biblatex.sty cho mục đích này. Các
phần tử của cơ sở dữ liệu phải được ghi vào tệp có phần mở rộng
yếm ở mã hóa UTF-8. Gói lệnh biblatex.sty sử dụng chương
trình biber theo mặc định để liệt kê các mục cơ sở dữ liệu và
thực hiện các công việc nền khác.
Mục đích của tiểu mục này không phải là để thảo luận toàn
bộ về biblatex. Để có tài liệu đầy đủ, hãy tìm kiếm biblatex,
biblatex-ext và biber trong menu Mô tả gói trợ giúp của TeXs-

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


258 Chương 7. Tài liệu có cấu trúc

tudio.
Cấu trúc của tệp bib. Nội dung của tệp cái yếm bao gồm
các loại phần tử và tên trường. Một loại mục xác định xem mục
đó là một bài báo hay sách hay một cái gì đó khác. Tên trường
chỉ định dữ liệu (tác giả, tiêu đề, v.v.) của mục. Cấu trúc của
nó như sau:
@ <kiểu tài liệu>{<key>,
<tên trường> = {<text>},
<tên trường> = {<text>},
<tên trường> = {<text>},
...
}

Ví dụ, mục được mô tả trước đó trong tài liệu


\cite[<text>]{<key>}

có thể được tham chiếu với lệnh. Có các tùy chọn khác cho điều
này trong gói biblatex, mà chúng ta sẽ đề cập sau. Có rất nhiều
<kiểu tài liệu> và <tên trường>, đây chỉ là một số:

<kiểu tài liệu> <tên trường>


article author, title, journaltitle, date, volume,
number, pages, issn, doi, url, urldate, sort-
name, options, langid
book author, title, date, editor, publisher, loca-
tion, isbn, doi, url, urldate, sortname, op-
tions, langid
inproceedings author, title, booktitle, date, editor, event-
date, volume, number, organization, pub-
lisher, location, isbn, pages, doi, url, urldate,
sortname, options, langid
online author, title, date, url, version, doi, urldate,
sortname, options, langid

Các loại tài liệu. Mô tả các loại mục trong bảng trước:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 259

article Để nhập thông tin bài viết.


book Để nhập thông tin sách.
inproceedings Để nhập dữ liệu bài báo trong một tập tin hội
nghị.
online Để nhập dữ liệu cho một nguồn trực tuyến.
Tên trường. Mô tả và phương pháp nhập tên trường trong
bảng trước:
author Nhập tên của tác giả. Tên phải được đặt theo quy tắc
tiếng Anh, tức là theo thứ tự chữ thập và sau đó đến họ:
author = {<firstname> <lastname> and <Firstname> <
familyname> and
... <firstname> <lastname> and others},

Và chỉ cần liệt kê nhiều tên và những tên khác chỉ khi
không liệt kê tất cả các tên. Ví dụ
author = {Nguyễn Hữu Điển và Nguyễn Minh Tuấn},
Chúng ta sẽ thấy ở phần sau rằng có một tùy chọn để
viết tắt tên đầu tiên. Đó là, ví dụ, “Nguyễn Hữu Điển và
Nguyễn Minh Tuấn” được thay thế bằng “N. H. Điển” nên
là đầu ra. Đây có thể là một vấn đề đối với tên Việt nam,
vì đây là trường hợp, chẳng hạn
author = {Nguyễn Hữu Điển và Nguyễn Minh Tuấn},
đầu ra “N. H. Điển và N. M. Tuấn”. Sau đó, sử dụng đầu
vào tiếp theo định dạng:
given={<firstname>},
given-i={< short of firstname>},
family={<family name>}

Ví dụ
author = {given = {Nguyễn}, given-i = {N.H.}, family =
{Điển} và Nguyễn Minh Tuấn},

đầu ra “N.H. Điển và N.M. Tuấn”sẽ là cách đặt tên viết


tắt.
booktitle Tiêu đề của tập sách hội nghị có bài báo được trích
dẫn. Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


260 Chương 7. Tài liệu có cấu trúc

booktitle = {LaTeX và Soạn thảo},


date Ngày xuất bản tác phẩm. Ví dụ
date={1998},
doi Số DOI (Số nhận dạng đối tượng kỹ thuật số) của tác
phẩm. Ví dụ
doi = {10.1080 / 17442508.2017.1366490},
editor Tên biên tập viên. Phải được chỉ định chính xác như
cho tác giả.
eventdate Trong trường hợp khối lượng hội nghị, ngày diễn ra
hội nghị. Xác định đường:
eventdate = {Year-Month-Day-Day/Year-Month-Day},

Ngày đầu tiên là bắt đầu của hội nghị và ngày thứ hai là
kết thúc. Ví dụ
eventdate = {2018-09-30 / 2018-10-04},
isbn ISBN của sách hoặc tập sách hội nghị. Ví dụ
isbn = {978-615-5621-72-7},
issn số ISSN của tập san hoặc hội nghị. Ví dụ
issn = {1787-5021},
journaltitle Tên của tạp chí có bài báo được trích dẫn. Ví dụ
journaltitle = {Annales Mathematicae et Informaticae},
langid Để có thư mục đa ngôn ngữ với tùy chọn autolang =
gạch nối trong gói biblatex luôn sử dụng cách tách từ
theo quy tắc của ngôn ngữ đã định. Nếu, ví dụ gói babel
được tải với tùy chọn Hungary và một trong các phần tử
trong tệp bib là tiếng Anh nhập ngôn ngữ sau:
langid = {Vietnamese},
location Nơi xuất bản cuốn sách. Ví dụ
location = {Hanoi},
number Số của tạp chí.
options Bạn cũng có thể thêm tùy chọn cho từng mục với tên
trường này. Chúng ta sẽ xem về điều đó sau, sau đó là
một ví dụ.
organization Đối với một khối lượng hội nghị, tên của người

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 261

tổ chức hội nghị.


organization = {Đại học KHTN Hà Nội},
pages Số trang đầu tiên và trang cuối cùng của một bài báo
trong tạp chí. Nó phải được cung cấp ở dạng sau:
pages = {số trang đầu tiên-số trang cuối cùng},

Ví dụ
pages = {135-150},
publishe Tên nhà xuất bản của cuốn sách. Ví dụ
publishe = {Springer},
sortname biber không chỉ là người Anh, mà còn là danh sách
của Việt Nam. Ví dụ
author = {Nguyễn Hữu Điển},
sortname = {N.H.Điển},
title Tên tác phẩm. Ví dụ
title={Baum--Katz Type Theorems with Exact Threshold},
Trong một số trường hợp, biblatex có thể viết hoa chữ cái
đầu tiên trong tiêu đề và phần còn lại viết thường. Trong
trường hợp này, ví dụ: chuyển đổi tiêu đề “Định lý loại
Baum - Katz với Ngưỡng chính xác” thành “Định lý loại
Baum - katz với ngưỡng chính xác”. Ví dụ: nếu bạn muốn
ngăn chặn điều này đối với tên, hãy đặt từ bạn muốn bảo
vệ khỏi việc thay đổi các chữ cái trong dấu ngoặc đơn.
Đặt không chỉ chữ cái đã cho, mà cả từ trong ngoặc đơn,
nếu không khoảng cách xung quanh các chữ cái sẽ không
chính xác. Ví dụ
title = {{Baum--Katz} Type Theorems with Exact
Threshold},
hay
title = {{$p$-adic} Logarithmic Forms and Group
Varieties {II}},
Tương tự, đặt các lệnh trong tiêu đề trong dấu ngoặc đơn:
title = {{\TeX book}},
url Địa chỉ web của tác phẩm. Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


262 Chương 7. Tài liệu có cấu trúc

url = {http://tug.org/texinfohtml/latex2e.html},
urldate Ngày của địa chỉ web tại thời điểm liên kết được xác
định như sau:
urldate = {year-month-day-day},

Ví dụ
urldate = {2009-01-31},
version bản Phiên bản của nguồn trực tuyến.
volume Số tập của tác phẩm.
Các loại tên trường. Các tên trường cũng được chia thành
ba nhóm:
gõ tên trường
Loại Tên trường
Danh sách tên author, editor
Danh sách tổ chức organization, publisher
Trường booktitle, date, doi, eventdate, isbn,
issn, journaltitle, location, number,
pages, title, url, urldate, version, vol-
ume,
Ví dụ về tệp bib.
Viết nội dung sau vào tệp reference.bib được mã hóa UTF-
8. Mục menu TeXstudio Bibliography được hỗ trợ rất nhiều.
@book{Knuth2001,
author={Donald Ervin Knuth},
title={Deformation modelling tracking animation and
applications},
date={2001},
publisher={Springer},
location={Berlin, Heidelberg},
}
@article{BalkaTomacs2018,
author={Richárd Balka and Tibor Tómács},
title={{Baum--Katz} type theorems with exact threshold},
journaltitle={Stochastics},

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 263

volume={90},
number={4},
date={2018},
pages={473-503},
publisher={Taylor \& Francis},
doi={10.1080/17442508.2017.1366490},
}

Hiển thị thư mục. Tệp tex. Chứa thư mục. Sau khi tải gói
biblatex, hãy viết
\addbibresource{<bib filename>}

và sau đó trong phần nội dung của tài liệu đến vị trí mà thư
mục xuất hiện
\printbibliography[<options>]

Một số tùy chọn khả thi:


title = <library title> Nếu bạn muốn thay đổi giá trị mặc
định của tiêu đề thư mục, hãy sử dụng tùy chọn này. Ví
dụ
title = Bibliography
heading = <style> Nếu <style> là bibintoc, thì danh mục sẽ
được thêm vào mục lục. Nếu <style> được đánh số thứ
tự, tiêu đề của thư mục sẽ là một chương hoặc phần được
đánh số và sẽ được đưa vào mục lục.
Theo mặc định, chỉ những tác phẩm được chỉ định trong tệp
bib xuất hiện bằng lệnh \cite mới xuất hiện trong danh mục.
Nếu bạn muốn hiển thị các mục từ cơ sở dữ liệu không được
tham chiếu trong tài liệu, hãy nhập khóa cho các mục tương
ứng, được phân tách bằng dấu phẩy, trong lệnh \nocite:
\nocite{<key1>,<key2>, ...}

Để chèn tất cả các mục từ cơ sở dữ liệu, hãy sử dụng lệnh \


nocite{*}.
Ví dụ về tệp tex. Ví dụ, hãy viết như sau vào tệp hoctap.
tex:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


264 Chương 7. Tài liệu có cấu trúc

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{biblatex}
\addbibresource{references.bib}
\begin{document}
See \cite[p.~56]{Knuth2001} \dots see \cite{BalkaTomacs2018
}
\printbibliography
\end{document}

Đặt tệp này và tệp reference.bib trước đó vào cùng một thư
mục.
Tạo kết quả cuối cùng. Trong ví dụ trước, bạn có thể tạo
phát hành các lệnh sau tại dấu nhắc lệnh:
pdflatex hoctap.tex
biber hoctap
pdflatex hoctap.tex
pdflatex hoctap.tex

Trong TeXstudio, đáng để tạo ra kết quả cuối cùng bằng


chương trình latexmk (xem phần Giới thiệu), vì nó tự động
chạy các chương trình biber và pdflatex theo đúng số lượng và
thứ tự. Tại dấu nhắc lệnh:
latexmk -pdf hoctap

Tin nhắn từ gói biblatex. Nếu bạn biên dịch tệp hoctap
.tex đã tạo trước đó, bạn sẽ được cảnh báo rằng nếu bạn sử
dụng gói babel và biblatex cùng nhau, bạn cũng sẽ cần tải gói
csquotes. Điều này là do các tiêu đề sẽ xuất hiện trong dấu
ngoặc kép, mà bạn điều chỉnh cho phù hợp với ngôn ngữ cụ thể
với gói csquotes. Dấu ngoặc kép tiếng Việt Nam này đã được
biết đến từ tháng 5 năm 2019 (v5.2e), vì vậy nếu bạn đang sử
dụng phiên bản cũ hơn, sau khi tải gói csquotes, hãy nhập nội
dung sau vào phần mở đầu:
\DeclareQuoteStyle{english}{,,}{’’}{>>}{<<}

Đối với tài liệu bằng tiếng Việt, chúng ta sẽ nhận được một

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 265

thông báo khác: Đã tải mô-đun bản địa hóa tiếng Việt cho
biblatex. Nếu bạn muốn tắt tính năng này, hãy phát hành
\BiblatexVietnamWarningOff

Tùy chọn gói biblatex.sty. Nếu không muốn nói đầy đủ,
chúng ta liệt kê gói biblatex một số tùy chọn:
style = <stylename> Điều này cho phép bạn chỉ định kiểu của
thư mục và trích dẫn. Có rất nhiều tên biểu tượng <
stylename>, đây chỉ là một số:
numeric Đây là kiểu cơ bản. Các phần tử thư mục và tài
liệu tham khảo được đánh số.
alphabetic Nhãn cho các yếu tố thư mục là chữ viết tắt
dựa trên tác giả và năm.
authoryear Thư mục không được gắn thẻ. Tài liệu tham
khảo dựa trên tác giả và năm.
Mỗi kiểu chuẩn cũng có một phiên bản mở rộng, có
thể được truy cập bằng tiền tố ext ở phía trước tên:
ext-numeric , ext-alphabetic , ext-authoryear, v.v.
maxnames = <number> Nếu phần tử thư mục có nhiều hơn <
number>, chỉ liệt kê số lượng tác giả được chỉ định bởi tùy
chọn minnames, sau đó in “và những người khác” hoặc viết
tắt “và tsai”. Giá trị mặc định cho number> là 3.
minnames = <number> Xem tên max. Giá trị mặc định cho <
number> là 1.
giveninits Tên của các tác giả được viết tắt. Ví dụ, D. E.
Knuth thay thế Donald Ervin Knuth.
abbreviate= false Các nội dung tự động được đưa vào thư mục
sẽ không được viết tắt (“và những người khác” thay vì “và
sai”, “Thư mục” thay vì “Văn học”, v.v.).
autolang = hyphen Đối với thư mục đa ngôn ngữ, tùy chọn này
luôn sử dụng tính năng tách từ theo quy tắc của ngôn
ngữ được chỉ định. Nếu gói babel được tải bằng tùy chọn
vietnam và một trong các mục trong tệp bib bằng tiếng
Anh, hãy nhập như sau:
langid = {english}, Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


266 Chương 7. Tài liệu có cấu trúc

@book{Knuth2001,
langid={english},
author={Donald Ervin Knuth},
title={Deformation modelling tracking animation and
applications},
date={2001},
publisher={Springer},
address={Berlin, Heidelberg},
}

Các lệnh trong gói biblatex.sty


Gói biblatex.sty có một số lệnh mà bạn có thể sử dụng để
thiết lập kết quả đầu ra đến từng chi tiết nhỏ nhất. Nếu không
có phong cách có sẵn nào phù hợp, giải pháp may mắn nhất là
tạo phong cách của riêng bạn. Chúng ta không cam kết mô tả
điều này, chúng ta chỉ mô tả một số lệnh bạn có thể sử dụng
để tinh chỉnh một phong cách hiện có theo ý thích của mình.
\biblabelsep

Điều này xác định khoảng cách giữa thẻ và phần tử thư mục.
Giá trị mặc định là \labelsep hai lần. Để thay đổi nó thành
\labelsep, hãy sử dụng lệnh sau:
\setlength {\biblabelsep} {\labelsep}
\bibfont

Điều này chỉ định loại phông chữ của thư mục. Ví dụ: bạn có
thể thay đổi kích thước thành \small như sau:
\refreshcommand {\bibfont} {\normalfont \small}
\mkbibnamefamily

Điều này chỉ định loại phông chữ của họ. Ví dụ: bạn có thể
chuyển sang vốn chủ sở hữu nhỏ như sau:
\refreshcommand {\mkbibnamefamily} {\scshape}
\mkbibnamegiven

Điều này chỉ định loại phông chữ của tên. Ví dụ: bạn có thể
chuyển sang vốn chủ sở hữu nhỏ như sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 267

\refreshcommand {\mkbibnamegiven} {\scshape}


\DeclareNameAlias{<author>} {<family-given>}

Trong trường hợp này, nó nằm trong tệp yếm


autho = {Donald Ervin Knuth},
đầu ra của nó sẽ là “Knuth, Donald Ervin”. Đó là, trong
đầu ra, đầu tiên là họ và sau đó là tên đầu tiên được hiển thị.
Giữa hai chữ có một dấu phẩy như phong tục Anglo-Saxon.
\revsdnamepunct

Đối với lệnh trước đó, dấu được lưu trữ bởi lệnh này được chèn
vào giữa họ và tên. Mặc định là dấu phẩy. Nếu tác giả của tài
liệu và các yếu tố thư mục là người Hungary, bạn nên chuyển
mục này thành trống bằng cách sử dụng lệnh trước:
\DeclareNameAlias{author}{family-given}
\renecommand{\revsdnamepunct}{}

Ví dụ, trong tệp cái yếm


author = {Nguyễn Hữu Điển},
đầu ra của nó sẽ là "Nguyễn Hữu Điển".
\DeclareEntryOption[<option>] {<optionname>} [<default>] {<
definition>}

Thay vì mô tả chung chung, chúng ta minh họa hoạt động của


nó bằng một ví dụ cụ thể:
\DeclareEntryOption[boolean]{hunname} [true] {%
\DeclareNameAlias{author}{family-given}%
\renecommand{\revsdnamepunct}{}}

Điều này tạo ra một tùy chọn được gọi là hunname của một
kiểu logic với giá trị mặc định là true. Kết quả của tùy chọn
này, tên của các tác giả được đặt trong trường nhất định được
hiển thị theo thứ tự của họ mà không có bất kỳ dấu hiệu nào
giữa chúng. Tùy chọn có thể được chỉ định trong tệp yếm như
sau:
options = {hunname},

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


268 Chương 7. Tài liệu có cấu trúc

Nếu nhiều tùy chọn được sử dụng, chúng phải được phân
tách bằng dấu phẩy. Ví dụ trước nên được sử dụng khi tài liệu
là tiếng Việt Nam, nhưng thư mục chứa tiếng Việt Nam và ví
dụ: cũng là một tác giả người Nga. Trong trường hợp này, bằng
cách nhập tùy chọn trước cho tác phẩm của tác giả Việt Nam,
họ sẽ xuất hiện theo thứ tự tốt. Ví dụ
@book{KolmogorovFomin1981,
author = {Andrei Nikolayevich Kolmogorov và
Sergei Vasilyevich Fomin},
title = {Các yếu tố của Lý thuyết Hàm và Phân tích Chức nă
ng},
publisher= {Nhà xuất bản kỹ thuật},
location = {Hà Nội},
date = {1981},
}
@book {nhdien2015,
options = {hunname},
author = {Nguyễn Hữu Điển},
title = {Thực hành tinha toán trong Maple},
publisher = {ĐHQG Hà Nội},
location= {Hà Nội},
date = {2015},
}

\DeclareFieldFormat [<option>] {<tên trường loại trường>} {


<format>}

Chỉ định định dạng của tên trường <field>. Trong định dạng,
hãy tham khảo nội dung của <tên trường trường> theo cách #1.
<option> chứa các loại mục trong đó <tên trường loại trường>
được chỉ định <được định dạng>. Nếu không có tùy chọn, nó sẽ
áp dụng cho tất cả các loại mục trong đó tên trường <field
> chưa được định dạng. Không được có khoảng trắng trong
<format>. Ví dụ
\DeclareFieldFormat{title}{\textit{#1}}
Trong trường hợp này, tiêu đề sẽ xuất hiện ở dạng nghiêng
cho tất cả các loại mục chưa được định dạng. Ví dụ, loại mục
sách sẽ được in nghiêng, nhưng bài báo thì không.
\DeclareFieldFormat[article,book]{title}{\textit{#1}}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 269

trong trường hợp của loại phần tử bài báo và sách, tiêu đề
sẽ được in nghiêng, tất cả các phần tử khác sẽ giữ nguyên định
dạng ban đầu.

\DeclareFieldFormat*{<Tên trường loại trường>} {<format>}

Nó hoạt động giống như lệnh trước đó, nhưng nó ảnh hưởng
đến tất cả các loại mục. Ví dụ
\DeclareFieldFormat*{title}{\textit{#1}}
Đối với mỗi loại mục, tiêu đề sẽ xuất hiện ở dạng in nghiêng.
\DeclareFieldFormat{titlecase}{\MakeSentenceCase{#1}}
Đối với title , journaltitle và booktitle, chữ cái đầu tiên là
chữ hoa và phần còn lại là chữ thường. Ví dụ, nếu điều này
có ảnh hưởng không mong muốn đối với tên, nó nên được đặt
trong dấu ngoặc đơn. Đặt không chỉ chữ cái mà toàn bộ từ
trong ngoặc đơn để các khoảng trống xung quanh các chữ cái
vẫn chính xác. Ví dụ
title={{Baum--Katz} Type Theorems with Exact Threshold},
sẽ ra Baum–Katz type theorems with exact threshold.
booktitle={{$p$-adic} Logarithmic Forms and Group
Varieties},
sẽ ra q-adic logarithmic forms and group varieties.

\add<jel>

Chèn dấu cách hoặc dấu chấm câu khi định dạng các phần tử
thư mục. <jel> có thể được thay thế bằng:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


270 Chương 7. Tài liệu có cấu trúc

space không gian


nbspace không gian không thể phá vỡ
thinspace không gian có thể phá vỡ
nbthinspace nửa không gian không thể phá vỡ
dot dấu điểm
comma dấu phẩy
semicolon dấu chấm phẩy
colon dấu hai chấm
\newunitpunct

Az egységek közötti elválasztójel. Alapértéke pont és utána


egy törhető szóköz. Átállítása például vesszőre és utána egy
törhető szóközre:
\renewcommand{\newunitpunct}{\addcomma\addspace}
\multinamedelim

Dấu hiệu giữa tên tác giả hoặc người biên tập, ngoại trừ
dấu hiệu trước họ. Ví dụ: để chuyển sang dấu gạch ngang:
\renewcommand{\multinamedelim}{\addnbthinspace--\
addnbthinspace}
\finalnamedelim

Trong trường hợp tên của các tác giả hoặc người biên tập thì
ký hiệu trước họ. Ví dụ: để chuyển sang dấu phẩy rồi chuyển
sang dấu cách có thể ngắt:
\renewcommand{\finalnamedelim}{\addcomma\addspace}
\labelnamepunct

Dấu hiệu sau danh sách tên tác giả hoặc biên tập viên. Ví
dụ: để chuyển sang dấu hai chấm rồi chuyển sang dấu cách có
thể ngắt:
\renewcommand{\labelnamepunct}{\addcolon\addspace}
\DeclareBibliographyDriver{<Itement>} {<formatting>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 271

Định dạng đầu ra của loại Itement. Các lệnh sau đây trợ giúp
trong <formatting>:
\printnames{<Tên trường loại danh sách>} Hiển thị nội dung
của danh sách tên trường.
\printlist{<Tên trường loại danh sách trang>} Hiển thị nội
dung của danh sách tên trường.
\printfield{<Tên trường loại trường>} Hiển thị nội dung của
tên trường.
\ifnameundef{<Tên trường loại trường>}{true}{false}
Nếu tên trường típusúname danh sách được chỉ định
trong <Tên trường loại trường>, thì nó là <true>, nếu
không thì <false>.
\iflistundef{<Tên trường loại trường>} {true} {false}
Nếu tên trường của loại danh sách được chỉ định trong
<Tên trường loại trường>, thì nó là true, nếu không thì là
false.
\begin{lstlisting}[style=latexdef]
\iffieldundef{<Tên trường loại trường>} {true} {false}

Nếu tên trường típusúfield được đưa ra trong <Tên trườ


ng loại trường>, thì kết quả là true>, ngược lại là false.
\newunit
In tín hiệu được chỉ định trong \newunitpunct.
\setunit*{<jel>}
In <jel> nếu đứng trước \printnames, \printlist hoặc \
printfield Tên trường được chỉ định trong lệnh được chỉ
định trong <loại tăng tốc>.
\usebibmacro{finentry}
Lệnh đóng <loại tăng tốc>.

\DeclareBibliographyDriver{book}{%
\printnames{author}%
\labelnamepunct%
\printfield{title}%
\newunit
\printlist{publisher}%

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


272 Chương 7. Tài liệu có cấu trúc

\newunit
\printlist{location}%
\newunit
\printfield{date}
\usebibmacro{finentry}}

Tham chiếu đến phần tử thư mục


Đối với một mục thư mục nhất định, như sau có thể được
tham chiếu theo một số cách:
\cite [<văn bản>]{<key>}
\cite [số trang]{<key>}
\cite [<trang bắt đầu-trang cuối cùng>]{<key>}

trong đó <key> là mã định danh của phần tử thư mục được chỉ
định trong tệp bib. Ví dụ
7
\cite[Định
Ví dụ 7.19
lý~5]{Kolmogorov},
8
\cite[122]{Kolmogorov},
\cite[32-45]{Kolmogorov}
: 2
[1, Định lý 5].[1, trang 122],[1, trang 32-45]
Đối với việc sử dụng \cite, kết quả của các ví dụ trước là cho
một kiểu được đánh số. Nếu bạn chọn một phong cách khác, kết
quả có thể khác. Đây không phải là chi tiết ở đây, hãy xem tài
liệu biblatex cho điều này. Thậm chí còn có nhiều cách để liên
kết. Chúng ta đề cập đến ba trong số họ:
\citeauthor{key}
\citetitle{key}
\citeyear{key}

Lựa chọn nhất ghi tên tác giả của tác phẩm, Lựa chọn hai
ghi tên tác phẩm và Lựa chọn ba xuất bản tác phẩm.
Một ví dụ về việc sử dụng biblatex
Sao chép văn bản vào tệp hoctapbib.tex.
7 Ví dụ 7.20 8
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{vietnam}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.7. Tài liệu tham khảo 273

\usepackage[autolang=hyphen,giveninits,abbreviate=false]{
biblatex}
\setlength{\biblabelsep}{\labelsep}
\renewcommand{\mkbibnamefamily}{\scshape}
\renewcommand{\mkbibnamegiven}{\scshape}
\DeclareFieldFormat*{title}{\textit{#1}}
\DeclareFieldFormat[article]{journaltitle}{#1}
\DeclareFieldFormat[article]{pages}{#1}
\renewcommand{\finalnamedelim}{\addcomma\addspace}
\renewcommand{\labelnamepunct}{\addcolon\addspace}
\renewcommand{\newunitpunct}{\addcomma\addspace}
\DeclareEntryOption[boolean]{hunname}[true]{%
\DeclareNameAlias{author}{family-given}%
\renewcommand{\revsdnamepunct}{}}
\DefineBibliographyExtras{magyar}{\DeclareFieldFormat{
postnote}{#1}}
\addbibresource{references.bib}
\begin{document}
\cite{KolmogorovFomin1981} --
\cite[Định lý 5.]{KolmogorovFomin1981} --
\citeauthor{nhdien2015} \citeyear{nhdien2015} --
\cite{KolmogorovFomin1981,nhdien2015}
\printbibliography
\end{document}
Tệp thư mục: references.bib
@book{KolmogorovFomin1981,
author = {Andrei Nikolayevich Kolmogorov và
Sergei Vasilyevich Fomin},
title = {Các yếu tố của Lý thuyết Hàm và Phân tích Chức nă
ng},
publisher= {Nhà xuất bản kỹ thuật},
location = {Hà Nội},
date = {1981},
}
@book {nhdien2015,
options = {hunname},
author = {Nguyễn Hữu Điển},
title = {Thực hành tính toán trong Maple},
publisher = {ĐHQG Hà Nội},
location= {Hà Nội},

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


274 Chương 7. Tài liệu có cấu trúc

date = {2015},
: 2
[1] – [1, Định lý 5]– Nguyễn Hữu Điển 2015 – [1, 2]
TÀI LIỆU THAM KHẢO
[1] Andrei Nikolayevich Kolmogorov và Sergei Vasilyevich
Fomin, Các yếu tố của Lý thuyết Hàm và Phân tích Chức
năng, 1981, NXB ĐHQG Hà Nội.
[2] Nguyễn Hữu Điển, Thực hành tính toán trong Maple,
2015, NXB ĐHQG Hà Nội.

7.8 Chỉ mục

Chỉ mục là danh sách các khái niệm quan trọng nhất xuất
hiện trong tác phẩm, trong đó bên cạnh mỗi chủ đề là số trang
nơi nó xuất hiện. Có một số công cụ cho việc này. Chúng ta là
gói imakeidx và chương trình thời thượng việc sử dụng nó được
mô tả mà không tuyên bố là đầy đủ.

7.8.1 Gói lệnh imakeidx

Nhập nội dung sau vào phần mở đầu:


\usepackage [xindy, quiet]{imakeidx}
\makeindex [<options>]

Các <options> có thể xảy ra:


program = texindy Điều này sẽ khiến chương trình texindy sắp
xếp danh sách.
options = -C utf8 -L <ngôn ngữ> Chỉ định các tùy chọn hợp
thời trang nếu tùy chọn trước đó đã được tải. Trong
trường hợp là <ngôn ngữ> là Việt Nam hoặc tiếng Anh.
Bạn cũng có thể chỉ định phong cách riêng của mình
trong tệp user.xdy. Ví dụ: nếu đây là user.xdy, bạn cũng
phải sử dụng chuyển đổi -M user để tải nó. Ví dụ: tùy chọn
= -C utf8 -L người dùng tiếng Việt -M.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.8. Chỉ mục 275

name = <filename> Tên của tệp không có phần mở rộng để lưu


các từ khóa với số trang tương ứng. (Không chứa các chữ
cái có dấu và dấu cách trong <filename>.) Mặc định là \
jobname, là tên của tệp tex hiện tại. Khi lưu, phần mở
rộng tệp sẽ là idx, nghĩa là, nếu name = nevmutato, các từ
chủ đề với số trang sẽ được thêm vào tệp nevmutato.idx
. Điều này rất quan trọng nếu ngoài chỉ mục, bạn cũng
muốn tạo chỉ mục tên. Chúng ta sẽ xem một ví dụ về điều
này sau.
title = <Tiêu đề> Tiêu đề của chỉ mục. Giá trị mặc định là
\indexname, kết quả là "Chỉ mục" cho tài liệu tiếng Việt
Nam và "Index" cho tài liệu tiếng Anh.
columns= <Số cột> Chỉ mục nên được lấy ra từ bao nhiêu cột.
Giá trị mặc định 2.
columnsep = <Khoảng cách cột> Khoảng cách giữa các cột. Giá
trị mặc định là 35pt.
columnseprule các cột phải được phân tách bằng một đường
kẻ.
intoc Nhập tiêu đề của chỉ mục trong mục lục.
Ví dụ
\usepackage[xindy,quiet]{imakeidx}
\makeindex[program=texindy,options=-C utf8 -L vietnam,name=
chimuc,title=Chỉ mục,columns=1]
\makeindex[program=texindy,options=-C utf8 -L vietnam]

hai tệp idx được tạo. Một là chimuc.idx và một là document


.idx chẳng hạn như example.tex. Từ khóa và số trang trong
chimuc.idx sẽ xuất hiện dưới tiêu đề "Chỉ mục" trong một cột,
trong khi tài liệu và trang trong document.idx sẽ xuất hiện
trong "Chỉ mục" trong kết quả cuối cùng trong hai cột, miễn
là \indexname Được xác định như một chỉ mục.

7.8.2 Nhập từ khóa

Chỉ số là

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


276 Chương 7. Tài liệu có cấu trúc

\index[<filename>] {<từ khóa>}

Bạn có thể thêm nó bằng lệnh trong nội dung tài liệu, trong
đó giá trị mặc định của <filename> là \jobname, tức là tên của
tệp tex không có phần mở rộng. Từ chủ đề được đặt trong tệp <
filename>.idx, với điều kiện là tùy chọn name=\param{filename}
đã được chỉ định trong một trong các lệnh \makeindex.
Ví dụ

...
\makeindex[program=texindy,options=-C utf8 -L vietnamese,
name=nevmutato,
title=Chimuc,columns=1]
\makeindex[program=texindy,options=-C utf8 -L vietnamese]
...
\begin{document}
...
Kolmogorov\index[nevmutato]{Andrej Nyikolajevics Kolmogorov
(1903--1987)}
Năm 1933, ông đã phát biểu các tiên đề sau:
...
Độ lệch chuẩn \index{độ lệch chuẩn} được hiểu như sau:
...

Trong trường hợp của chimuc.idx, từ chủ đề "Andrei Niko-


layevich Kolmogorov (1903–1987)" với số trang tương ứng và
"độ lệch chuẩn" được thêm vào document.idx, miễn là tệp tex
được đặt tên là document.tex.
Có bốn ký tự đặc biệt trong lệnh \index không xuất hiện
trong đầu ra: @! | ". Nếu bạn muốn hiển thị chúng, bạn cần
đặt một dấu" "trước chúng.
Bằng cách tải gói showidx sau imakeidx, LATEX liệt kê từng
chủ đề ở lề trái của văn bản, cung cấp một kiểm tra hữu ích.
Tất nhiên, một khi quá trình chỉnh sửa hoàn tất, điều này sẽ
trở nên thừa trong phiên bản cuối cùng.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.8. Chỉ mục 277

7.8.3 Hiển thị chỉ mục

Nơi bạn muốn đặt chỉ mục, hãy nhập


\printindex[<filename>]

lệnh, trong đó <filename> mặc định là \jobname, là tên của


tệp tex không có phần mở rộng. Do đó, các từ khóa trong tệp
<filename>.idx xuất hiện được liệt kê dưới tiêu đề đó.
Nếu bạn muốn văn bản giới thiệu ở đầu chỉ mục, hãy sử
dụng lệnh sau trước \printindex:
\indexprologue{<text>}

Trước đây người ta đã nói rằng nếu từ chủ đề bắt đầu bằng
một số, nó sẽ được gán cho nhóm đầu tiên, đứng trước nhóm A.
Để chỉ định một địa chỉ cho nhóm này, hãy sử dụng một lệnh
trước \printindex
\newcommand {\lettergroupDefault} [1] {<địa chỉ nhóm>}

Ví dụ
\newcommand {\lettergroupDefault} [1] {\par \textbf {
Notations} \par}
Nếu bạn muốn định dạng các điểm đánh dấu của các nhóm
khác, hãy sử dụng dấu trước \printindex
Ví dụ: nếu bạn muốn đóng khung các điểm đánh dấu nhóm,
\newcommand {\lettergroup} [1] {\par \fbox {\textbf {# 1
}} \par \nopagebreak}
Trong trường hợp của một tài liệu tiếng Việt, các nguyên
âm dài được phân loại là các nguyên âm ngắn. Ví dụ, chủ đề
"Án bạ" sẽ được gán cho nhóm A. Điều này biện minh cho nhóm
A được ký hiệu là “A, Á”, nhóm E được ký hiệu bằng “E, É”, v.v.
Đây không phải là trường hợp theo mặc định, nhưng có thể
được giải quyết bằng cách sử dụng mã sau trước \printindex:
newcommand{\lettergroup}[1]{%
\def\letter{#1}%
\def\Letter{A}\ifx\letter\Letter\def\letter{A, Â, Ă, À, Á,
Ả, Ã, Ạ}\fi

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


278 Chương 7. Tài liệu có cấu trúc

\def\Letter{E}\ifx\letter\Letter\def\letter{E, Ê, È, É, Ẻ,
Ẽ, Ẹ}\fi
\def\Letter{I}\ifx\letter\Letter\def\letter{I, Ì, Í, Ỉ, Ĩ,
Ị}\fi
\def\Letter{O}\ifx\letter\Letter\def\letter{O, Ô, Ó}\fi
\def\Letter{U}\ifx\letter\Letter\def\letter{U, Ú}\fi
\par\textbf{\letter}\par\nopagebreak

Trong các tùy chọn \makeindex, chúng ta đã đề cập rằng bạn


có thể viết tệp kiểu của riêng mình với phần mở rộng là xdy.
Chúng ta sẽ không đi vào chi tiết của điều này ở đây, chúng ta
sẽ chỉ đề cập đến một điều thú vị. Trong đầu ra, một dấu phẩy
sẽ được đặt giữa từ chủ đề và số trang. Theo mặc định, không
thể xác định lại điều này bằng một lệnh vì nó được nhập trực
tiếp vào tệp kiểu. Để thay đổi điều này, hãy nhập mã sau vào
phần mở đầu:
\begin{filecontents*}{user.xdy}
(markup-locclass-list :open "Separator" :sep ", ")
\end{filecontents*}

Trong cài đặt gốc, dấu phẩy được thay thế bằng dấu phẩy.
Nếu bạn muốn số trang xuất hiện tương tự như mục lục, nghĩa
là, để mở rộng nó bằng một loạt dấu chấm đến cạnh cột, hãy
nhập \dotfill thay vì <separator>. Nếu bạn chỉ muốn một
khoảng trắng rộng hơn bình thường, hãy nhập \quad thay vì
<separator>. Mã hoạt động bằng cách tạo tệp user.xdy khi biên
dịch
(markup-locclass-list: open "<separator>": sep ",")
Nội dung. Để tải texindy với tệp này, hãy sử dụng tùy chọn
-M user trong chương trình texindy (xem tùy chọn \makeindex).

7.8.4 Một ví dụ về tạo chỉ mục bằng tiếng Việt

Ví dụ: sao chép mã sau vào tệp có tên viduindex.tex:


\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{vietnam}
\usepackage[xindy,quiet]{imakeidx}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.8. Chỉ mục 279

\makeindex[program=texindy,options=-C utf8 -L vietnamese -M


user,
name=nevmutato,title=Chỉ mục,columns=1,intoc]
\makeindex[program=texindy,options=-C utf8 -L vietnamese -M
user,intoc]
\begin{filecontents*}{user.xdy}
(markup-locclass-list :open "\dotfill " :sep ", ")
\end{filecontents*}
\newcommand{\lettergroupDefault}[1]{\par\textbf{Đánh dấu}\
par}
\newcommand{\lettergroup}[1]{%
\def\letter{#1}%
\def\Letter{A}\ifx\letter\Letter\def\letter{A, Á, Â, Ă}\fi
\def\Letter{E}\ifx\letter\Letter\def\letter{E, Ê}\fi
\def\Letter{I}\ifx\letter\Letter\def\letter{I, Í}\fi
\def\Letter{O}\ifx\letter\Letter\def\letter{O, Ô}\fi
\def\Letter{U}\ifx\letter\Letter\def\letter{U, Ú}\fi
\par\textbf{\letter}\par\nopagebreak}
\begin{document}
\title{Ví dụ imakeidx}
\author{Nguyễn Hữu Điển}
\date{}
\maketitle
\tableofcontents
\section{Gõ vào}
Kolmogorov\index[nevmutato]{Andrej Nyikolajevics Kolmogorov
(1903--1987)}
Năm 1933, ông đã phát biểu các tiên đề sau: \dots \\
Độ lệch chuẩn \index{độ lệch chuẩn} như sau
diễn giải: \dots \\
Dấu hiệu của độ lệch chuẩn là $D^2\xi $ \index{0 d hình vuô
ng là @$D^2 \xi$}. \\
Phân phối theo cấp số nhân \index{phân phối!Cấp số nhân} \
dots \\
Phân phối bình thường \index{phân phối!Bình thường} \dots
\\
Phân phối $ \Gamma $ phân phối \index{phân phối!Gamma@$\
Gamma $}
phân phối- \index{gamma-Distribution@$\Gamma$ -distribution
!AAA}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


280 Chương 7. Tài liệu có cấu trúc

hoặc hàm mật độ%


\index{hàm mật độ của phân phối gamma@$\Gamma$ phân phối!
BBB} \dots.
\index{Anh em}
\index{ASnh dương@Ánh dương}
\index{AAn tình@Ân tình}
\indexprologue{Được đề cập trong chương này của cuốn sách
chúng ta đã thu thập tên của các nhà toán học theo thứ tự b
ảng chữ cái.}
\section{In ra kết quả}
\printindex[nevmutato]
\printindex
\end{document}

7.8.5 Dịch tệp nguồn sang pdf

Đầu tiên, tài liệu phải được dịch ở dạng thông thường. Thao
tác này sẽ tạo một tệp có một hoặc nhiều phần mở rộng idx sẽ
chứa các từ khóa với số trang thích hợp. Sau đó, với texindy,
dữ liệu được sắp xếp thành một tệp có phần mở rộng là ind.
Cuối cùng, nó phải được dịch lại ở dạng thông thường ít nhất
hai lần. Chúng được thực thi một lần nếu bạn sử dụng tùy
chọn \texindy của chương trình trên lệnh \makeindex và công
tắc -shell-escape trong chương trình pdflatex. Ví dụ: nếu tệp
nguồn là viduindex.tex, hãy nhập tệp đó tại dấu nhắc lệnh

pdflatex -shell-escape viduindex.tex

rồi [Enter]. Nếu bạn cũng sử dụng tham chiếu chéo hoặc
biblatex, tốt hơn nên sử dụng chương trình latexmk với tùy
chọn -shell-escape:

latexmk -pdf -shell-escape viduindex

rồi [Enter].

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


7.9. Phụ lục 281

7.9 Phụ lục

Nhập \appendix ở đầu phụ lục. Do đó, bộ đếm phần và


chương được đặt lại về 0 và số của chúng được thay đổi thành
bảng chữ cái (A, B, C, ...). Tùy chọn defaults = vi-min của tệp
vietnam.ldf sau các số thứ tự bảng chữ cái này không tạo điểm
nhấn trong các lớp báo cáo và sách (Phụ lục A, Phụ lục B, ...).
Bạn có thể ghi đè kiểu chữ này bằng tùy chọn appnexdot = yes
(Phụ lục A, Phụ lục B, ...).
\appendix không liệt kê "Phụ lục" trong mục lục và chú thích
này không có trong phần nội dung trong article. Nếu bạn vẫn
muốn làm điều này, hãy sao chép mã sau:
\makeatletter
\let\old@appendix\appendix
\def\appendix{\old@appendix
\@ifundefined{chapter}
{\section*{Phụ lục}\addcontentsline{toc}{section}{Phụ lục}}
{\addtocontents{toc}{\bigskip\noindent\textbf{Phụ lục}\par}
}}
\makeatother

7.10 Tổ chức các tác phẩm dài hơn

Bạn không cần phải viết một tác phẩm dài trong một tệp
duy nhất. Bạn có thể sử dụng tệp chính để tải các tệp con
chứa mỗi chương hoặc phần. Ví dụ: bạn có thể đọc một tệp con
gioithieu.tex vào tệp chính như sau:
\input{gioithieu}

hoặc
\include{gioithieu}

Trong cả hai trường hợp, phần mở rộng .tex có thể bị bỏ qua.


Nếu phần mở rộng của tệp con khác, nó phải được viết ra.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


282 Chương 7. Tài liệu có cấu trúc

Ví dụ: nếu bạn đặt tệp chapter01.tex trong thư mục hiện tại
trong một thư mục con có tên là chapters, nó sẽ được đưa vào
như sau:
\input{chaper/chapter01}

hoặc
\include{chaper/chapter01}

\include không chỉ đọc tệp dưới dạng \input, mà còn bắt đầu
nội dung của nó trên một trang mới, đóng trang cuối cùng bằng
lệnh \clearpage, để văn bản sau đó bắt đầu trên một trang mới
và đóng bất kỳ bước nào đang chờ xử lý.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


Chương 8. TRÌNH CHIẾU BEAMER
TRONG LATEX

8.1. Giao diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285


8.1.1. Giao diện đầy đủ . . . . . . . . . . . . . . . . . . . . . . . . . 285
8.1.2. Giao diện bên trong . . . . . . . . . . . . . . . . . . . . . . 287
8.1.3. Giao diện bên ngoài . . . . . . . . . . . . . . . . . . . . . . 288
8.1.4. Giao diện màu sắc . . . . . . . . . . . . . . . . . . . . . . . . 289
8.1.5. Giao diện phông chữ. . . . . . . . . . . . . . . . . . . . . . 290
8.2. Khung giao diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
8.3. Nhiều trang trình bày trong một khung . . . . . . . . . . 292
8.3.1. Thông số kỹ thuật lớp phủ (overlay) . . . . . . 292
8.3.2. Độ trong suốt của trình chiếu . . . . . . . . . . . . 295
8.3.3. Các lệnh có đặc tả lớp phủ . . . . . . . . . . . . . . . . 295
8.4. Trình chiếu với hiệu ứng hình ảnh . . . . . . . . . . . . . . . . 298
8.5. Lập dàn ý cho bài thuyết trình . . . . . . . . . . . . . . . . . . . 299
8.5.1. Trang tiêu đề . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
8.5.2. Cấu trúc của văn bản chính . . . . . . . . . . . . . . 300
8.5.3. Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
284 Chương 8. Trình chiếu trong LATEX

8.5.4. Tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303


8.6. Các yếu tố nội dung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
8.6.1. Danh sách . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
8.6.2. Khu vực nhiều cột . . . . . . . . . . . . . . . . . . . . . . . . 305
8.6.3. Khối, môi trường giống một định lý . . . . . . 306
8.6.4. Hộp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
8.6.5. Tô màu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
8.6.6. Đưa ảnh vào . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
8.6.7. Hoạt hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
8.6.8. Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
8.6.9. Phóng to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
8.6.10. Tham chiếu chéo . . . . . . . . . . . . . . . . . . . . . . . . 314
8.6.11. Nút ấn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
8.6.12. Lặp lại khung . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

LATEX, loại tài liệu beamer phù hợp nhất để trình bày điện tử.
Ưu điểm của bài thuyết trình dựa trên pdf là kết quả cuối cùng
có thể được chiếu trên tất cả các nền tảng và sẽ hoạt động theo
cùng một cách. Bằng cách này, bạn không phải lo lắng về việc
máy nước ngoài không khởi động được hoặc xuất hiện khác với
máy của chính bạn. Các tính năng của lớp beamer:
- Kích thước cạnh: 128mm x 96mm (tỉ lệ 4: 3). Đối với
aspectratio = 169, 160mm x 90mm (tỷ lệ khung hình 16: 9).
- Kích thước phông chữ cơ bản: 11pt. Các kích thước bổ sung
sau có thể được chỉ định trong tùy chọn: 8pt 9pt 10pt 12pt 14
pt 17pt 20pt.
- Phông chữ cơ bản: chân dung, bình thường, kỳ cục.
- Ngắt dòng văn bản chính: được đóng về bên trái nên không
có các ngăn cách từ.
- Không thụt đầu dòng ở đầu đoạn văn mới.
- Vị trí dọc của nội dung trong khung (xem sau): trung tâm.
Có hai tùy chọn khác: t (trên), b (dưới).
- Các gói sau được tự động tải với lớp này: graphicx, amsthm,
xcolor, enumerate, hyperref.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.1. Giao diện 285

8.1 Giao diện

Khi biên tập các ấn phẩm in và điện tử, một phần quan
trọng của công việc đánh máy được giao cho LATEX. Điều này
cũng có thể được giải quyết ở đây, bởi vì beamer có rất nhiều cái
gọi là chứa các giao diện, mỗi giao diện có nghĩa là một thiết
lập và phong cách kiểu chữ. Các giao diện được tải trong phần
mở đầu bằng các lệnh sau:
\useinnertheme[<tùy chọn]{<tên giao diện>}
Phần tử cấu trúc bên trong nào (trang tiêu đề, danh sách,
mảng, môi trường giống mục, hình ảnh, bảng, chú thích cuối
trang, thư mục) xuất hiện và với dạng hình học nào.
\useoutertheme[<tùy chọn]{<tên giao diện>}
Những gì sẽ xuất hiện từ các yếu tố cấu trúc bên ngoài (đầu
trang và chân trang, thanh bên, biểu trưng, tiêu đề khung) và
với hình dạng nào.
\usecolortheme[<tùy chọn]{<tên giao diện>}
Phối màu của các yếu tố cấu trúc bên trong và bên ngoài.
\usefonttheme[<tùy chọn]{<tên giao diện>}
Phông chữ cho các yếu tố cấu trúc bên trong và bên ngoài.
\usetheme[<tùy chọn]{<tên giao diện>}
Đặt giao diện. Căn chỉnh các chủ đề cấu trúc, màu sắc và
phông chữ.
Nên chọn một giao diện hoàn chỉnh trước. Nếu bạn không
thích bất kỳ chi tiết nào trong này, bạn thậm chí có thể áp
dụng một số chủ đề cấu trúc, màu sắc hoặc phông chữ bên
trong hoặc bên ngoài.

8.1.1 Giao diện đầy đủ

Không có thanh bên

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


286 Chương 8. Trình chiếu trong LATEX

<Tên giao diện> <tùy chọn>


Bergen -
Boadilla secheader (kích hoạt tiêu đề)
Madrid secheader (kích hoạt đánh đầu)
AnnArbor -
CambridgeUS -
Pittsburgh -
Rochester height=<chiều cao> (chiều cao khung)
Điều hướng cây
<Tên giao diện> <tùy chọn>
Antibes -
JuanLesPins -
Montpellier -
Với thanh bên
<Tên giao diện> <tùy chọn>
Berkeley hideallsubsections (không có phụ đề
trong thanh bên)
hideothersubsections (thanh bên chỉ
chứa tiêu đề của phần phụ hiện tại)
left (thanh bên bên trái)
right (thanh bên ở bên phải)
width = <chiều rộng> (độ rộng thanh bên)
PaloAlto như Berkeley
Goettingen như Berkeley
Marburg như Berkeley
Hannover nhìn như Berkeley, không có trái, phải

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.1. Giao diện 287

Khung nhỏ trong tiêu đề


<Tên giao diện> <tùy chọn>
Berlin compress (khung nhỏ một dòng)
Ilmenau xem Berlin
Dresden xem Berlin
Darmstadt -
Frankfurt -
Singapore -
Szeged -
Tiêu đề của phần hiện tại và tiểu mục trên khung
<Tên giao diện> <tùy chọn>
Copenhagen -
Luebeck -
Malmoe -
Warsaw -

8.1.2 Giao diện bên trong

<Tên giao diện> <tùy chọn>


circles -
rectangles -
rounded shadow (bóng tròn)
inmargin -

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


288 Chương 8. Trình chiếu trong LATEX

8.1.3 Giao diện bên ngoài

<Tên giao diện> <tùy chọn>


infolines -
miniframes footline = authorinstitute (ở chân trang: tác
giả, viện)
footline = authortitle (trong footer: tác giả,
tiêu đề)
footline = institutetitle (trong footer: viện,
tiêu đề)
footline = authorinstitutetitle (ở chân trang:
tác giả, viện, tiêu đề)
subsection = true (hiển thị tiêu đề tiểu mục)
subsection = false (không hiển thị tiêu đề
tiểu mục)
smoothbars subsection = true (hiển thị tiêu đề tiểu mục)
subsection = false (không hiển thị tiêu đề
tiểu mục)
sidebar hideallsubsections (không có tiêu đề tiểu
mục trong nội dung)
hideothersubsections (chỉ tiêu đề phần phụ
hiện tại trong nội dung)
left (thanh bên bên trái)
right (thanh bên ở bên phải)
width = <width> (chiều rộng thanh bên)
height = <height> (chiều cao của tiêu đề
khung)
split -

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.1. Giao diện 289

shadow -
tree hooks
Smoothtree -

8.1.4 Giao diện màu sắc

<Tên giao diện> <tùy chọn>


structure named=<colorname> (màu nền trước của
các phần tử cấu trúc)
sidebartab -
Giao diện đầy đủ màu sắc
<Tên giao diện> <tùy chọn>
albatross overlystylish
beetle -
crane -
dove -
fly -
seagull -
wolverine -
beaver -
Giao diện màu sắc cho các yếu tố nội
<Tên giao diện> <tùy chọn>
lily -
orchid -
rose -
Giao diện màu sắc cho các yếu tố bên ngoài

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


290 Chương 8. Trình chiếu trong LATEX

<Tên giao diện> <tùy chọn>


whale -
seahorse -
dolphin -

8.1.5 Giao diện phông chữ

<Tên phông> <tùy chọn>


serif stillsansserifmath, stillsansserifs-
mall
stillsansseriflarge, stillsansserif-
text
onlymath
structurebold onlysmall, onlylarge
structureitalicserif xem structurebold
structuresmallcapsserif xem structurebold

8.2 Khung giao diện

Trong bộ trình chiếu, bản trình bày bao gồm một loạt các
khung và các khung bao gồm một loạt các trang chiếu. Bạn
cũng có thể đặt tiêu đề và phụ đề cho khung. Nếu một khung
chứa một loạt các trang chiếu có chứa một số trang chiếu, thì
các thành viên của tập trang chiếu sẽ lần lượt xuất hiện trong
khung đó. Nếu nội dung của một khung không vừa trên một
trang chiếu, nó có thể bị chia thành nhiều khung. Tiêu đề và
phụ đề của khung gốc xuất hiện trên mỗi khung "bị hỏng". Các
khung bị hỏng như vậy chỉ có thể chứa một trang chiếu tại một
thời điểm.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.2. Khung giao diện 291

Tất cả các frame phải được đặt trong một môi trường khung:
\begin {frame} [<option>] {<frame title>} {<frame subtitle>
}
<Nội dung khung>
\end {frame}

Hay
\begin {frame} [<option>]
\frametitle {<frame title>}
\framesubtitle{<frame subtitle>}
<Nội dung khung>
\end {frame}

Tùy chọn môi trường khung


t, b, c Nội dung của khung được căn chỉnh theo chiều dọc ở
trên cùng, dưới cùng, chính giữa. (Tùy chọn cơ bản)
plain trơn Đầu trang, chân trang và thanh bên không xuất
hiện trong khung.
shrink=<giảm> Kích hoạt tùy chọn t và giảm nội dung của
khung xuống <giảm>%. Giá trị mặc định cho "giảm" là 0.
fragile Theo mặc định, văn bản hoặc mã nguyên văn không
thể được viết trong khung. Hạn chế này được khắc phục
bằng tùy chọn này.
squeeze Các danh sách được hiển thị mà không có khoảng
trống thừa theo chiều dọc.
allowframebreaks = <fill> Đổ đầy là một số từ 0 đến 1, với
giá trị mặc định là 1. Nó chia khung thành nhiều khung
sau khi bão hòa tỷ lệ lấp đầy. Với tùy chọn này, khung
cũng có thể bị phá trực tiếp bằng lệnh \framebreak. Tùy
chọn này không hỗ trợ sử dụng nhiều slide trong khung.
Nếu bạn bật tùy chọn allowframebreaks, nó sẽ mặc định
là tiêu đề khung số thứ tự của khung gãy được hiển thị
bằng chữ số La mã lớn. Ví dụ, nếu khung tiêu đề là "Ví
dụ", sau đó là tiêu đề xuất hiện trong các khung liên tiếp:
Ví dụ I → Ví dụ II → Ví dụ III → ...
Hãy xem một số ví dụ để thay đổi điều này.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


292 Chương 8. Trình chiếu trong LATEX

\setbeamertemplate{frametitle continuation}[from
second]
[\insertcontinuationcountroman.]
Ví dụ → Ví dụ II. → Ví dụ III. → ...
\setbeamertemplate{frametitle continuation}[from
second]
[\insertcontinuationcount.]
Ví dụ → Ví dụ 2. → Ví dụ 3. → ...
\setbeamertemplate{frametitle continuation}[from
second][(tiếp)]
Ví dụ → Ví dụ (tiếp) → Ví dụ (tiếp) → ...

8.3 Nhiều trang trình bày trong một khung

Lưu ý rằng môi trường khung với tùy chọn allowframe-


breaks không hỗ trợ việc sử dụng nhiều trang trình bày trong
một khung. Cách dễ nhất để hiển thị nội dung của một khung
trên nhiều trang chiếu là sử dụng lệnh \pause. Thận trọng,
lệnh này không thể được sử dụng trong các môi trường được
xác định bởi các gói amsmath hoặc mathtools, chẳng hạn như
căn chỉnh. Ví dụ
\begin{frame}{Ví dụ}{}
Điều này được hiển thị trên trang chiếu 1 của khung. \par \
pause
Điều này được hiển thị trên trang trình bày 2 của khung. \
par \pause
Điều này được hiển thị trên slide 3 của khung.
\end {frame}

8.3.1 Thông số kỹ thuật lớp phủ (overlay)

Các trình chiếu phức tạp hơn có thể được tạo bằng cách sử
dụng cái gọi là thông số kỹ thuật lớp phủ. Beamer bổ sung cho

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.3. Nhiều trang trình bày trong một khung 293

nhiều lệnh tiêu chuẩn với một đặc điểm kỹ thuật lớp phủ. Ví
dụ, đối với danh sách, hãy sử dụng lệnh \item. Việc sử dụng và
hoạt động của nó có thể được hiểu trong ví dụ sau:
\begin {frame}{Ví dụ}{}
\begin {itemize}
\item <1-2> Danh sách mục 1
\item <2> Danh sách mục 2
\item <3> Danh sách mục 3
\item <3-4> Danh sách mục 4
\end {itemize}
\end {frame}

Vì vậy, chúng ta đặt đặc tả lớp phủ giữa các dấu < và >. Bạn
có thể nhập nhiều thông số lớp phủ cùng một lúc, được phân
tách bằng dấu phẩy. Ví dụ:
Bước Thực hiện
<0> Không có trang trình bày nào được hiển thị.
<1> Được hiển thị trên trang trình bày 1.
<1-3> 1-3. hiển thị trên các trang trình bày.
<1-3.5-6> 1-3. và 5-6. hiển thị trên các trang trình bày.
<1.5> Được hiển thị trên các trang chiếu 1 và 5.
<3-> Hiển thị từ trang trình bày 3 đến trang cuối
cùng.
<-3> 1-3. hiển thị trên các trang trình bày.
<-2,4-6,8-> Được hiển thị trên tất cả các trang chiếu trừ
trang chiếu 3 và 7.
Vì thế. thông số kỹ thuật lớp phủ bước cũng có thể được
viết thay cho các con số. Họ sử dụng một bộ đếm được gọi là
beamerpauses với giá trị ban đầu ở đầu khung là 1.
Một đặc tả lớp phủ bước là +(<number>), trong đó <number>
có thể là bất kỳ giá trị nguyên nào, thậm chí là số âm. Hiệu
quả là:
- Thay +(<number>) bằng beamerpauses +<number>. Thay vì

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


294 Chương 8. Trình chiếu trong LATEX

+(0), bạn có thể chỉ cần viết dấu +.


- Tăng giá trị của beamerpauses lên 1 sau khi dấu > kết thúc
thông số lớp phủ. (Giá trị chỉ tăng 1 ngay cả khi có nhiều dấu
+ hơn trong thông số lớp phủ.)
Trong mỗi ví dụ sau, giả sử rằng giá trị của các ô chùm là
2 trước khi giải thích đặc điểm kỹ thuật lớp phủ.
<+ (1)> = <3>
<+ (- 1)> = <1>
<+ (- 2)> = <0>
<+ (- 4)> = <-2> = <- +>
<+ (0)> = <+> = <2>
<+ - + (2)> = <2-4>

Sau mỗi ví dụ này, giá trị của beamerpauses tăng lên 3.


Một đặc điểm kỹ thuật bước khác như vậy là điểm. Khi sử
dụng điều này, hãy đảm bảo rằng giá trị của beamerpauses đã ít
nhất là 2. Hiệu quả là:
- Thay thế dấu chấm bằng 1 chấm nhỏ hơn beamerpauses.
- Giá trị của beamerpauses không thay đổi sau khi dấu > kết
thúc thông số lớp phủ. Ví dụ: hai mã sau là tương đương:
\begin{frame}{Ví dụ}{}
\begin{itemize}
\item <+ -> Liệt kê mục 1
\item <.-> Danh sách mục 2
\item <+ -> Danh sách mục 3
\item <.-> Liệt kê mục 4
\end{itemize}
\end{frame}


\begin{frame}{Ví dụ}{}
\begin{itemize}
\item <1-> Danh sách mục 1
\item <1-> Danh sách mục 2
\item <2-> Danh sách mục 3
\item <2-> Danh sách mục 4
\end{itemize}
\end{frame}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.3. Nhiều trang trình bày trong một khung 295

Các lệnh với một đặc tả lớp phủ cũng có thể có một đặc tả cơ
bản. Ví dụ: \item là đặc tả cơ bản <1->, nghĩa là, \item tương
đương với \item <1->. Các thông số kỹ thuật cơ bản của các
lệnh khác được đưa ra khi thảo luận về lệnh đó.

8.3.2 Độ trong suốt của trình chiếu

Cũng có thể cho các trang chiếu trong khung làm mờ nội
dung được phép của tất cả các trang chiếu khác trong khung.
Đây là cách thiết lập nó:
\setbeamercovered {transparent = <number>}
Sau đó, khung hiển thị nội dung của các trang chiếu khác
trên trang chiếu với cường độ sáng <number>

8.3.3 Các lệnh có đặc tả lớp phủ

\uncover<[spec]>{<text>}
hay
\begin{openverenv} <[spec]> <text> \end{openverenv}
Chỉ trang chiếu được chỉ định mới hiển thị văn bản, các
trang chiếu khác sẽ chỉ chiếm dung lượng, tương ứng, chúng
ta nhìn thấy theo giá trị của minh bạch. (Giá trị mặc định cho
<[spec]> là <1->.)
\visible<[spec]> {<text>}
hay
\begin{visibleenv}<[spec]> <text> \end{visibleenv}
Tương tự như explore, chỉ đặt trong suốt thành tích cực
không ảnh hưởng đến lệnh này. (Giá trị mặc định cho <[spec]
> là <1->.) Lệnh \invisible và môi trường invisibleenv có thể
được sử dụng theo cách tương tự, nhưng có tác dụng ngược
lại. Điều này cũng không bị ảnh hưởng bởi giá trị trong suốt
dương.
\only <[spec]> {<text>}
hay

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


296 Chương 8. Trình chiếu trong LATEX

\begin{onlyenv} <[spec]> <text> \end{onlyenv}


Giống như hiển thị, nhưng không chiếm dung lượng trên
các trang trình bày bên ngoài <[spec]>.
\alt<[spec]> {<text1>} {<text2>}
<text1> sẽ xuất hiện trên trang chiếu được chỉ định và <
text2> sẽ xuất hiện trên các trang khác. Đặt trong suốt thành
tích cực không ảnh hưởng đến lệnh này. (Giá trị mặc định cho
<[spec]> là <1->.)
\begin {altenv} <[spec]> {<start1>} {<egend1>}} {<start2>}
{<end2>}
<chữ>
\end {altenv}

Trang trình bày được chỉ định sẽ hiển thị: <start1> <text>
<egend1>. Đối với phần còn lại, nó sẽ xuất hiện: <start2><text
><end2>. Đặt trong suốt thành tích cực không ảnh hưởng đến
lệnh này. (Giá trị mặc định cho <[spec]> là <1->.)
\temporal<[spec]>{trước <text>}{<text>}{sau <text>}
trước <text> sẽ xuất hiện trước trang chiếu được chỉ định,
văn bản sẽ xuất hiện trên trang chiếu được chỉ định và sau
<text> sẽ xuất hiện sau trang chiếu được chỉ định. (<[spec]>
không có mặc định ở đây, nó là bắt buộc.) Ví dụ
\begin {frame} {Ví dụ} {}
\temporal <3-4> {slide 1, 2} {3, 4 slide} {5, 6, \dot slide
} \\
\temporal <3,5> {slide 1, 2, 4} {3, 5 slide} {6, 7, \dot
slide} \\
\thời gian <2> {1. slide} {2. slide} {3, 4, \dot slide}
\end {frame}

\begin{overlayarea}{<width>}{<height>}
\only<[spec1]> {<text1>}
\only <[spec2]> {<text2>}
...
\end {overlayarea}

Mỗi trang chiếu trên khung chiếm một hộp <width> và <
height> trong đó <[spec1]>, <[spec2]>, v.v. <text1>, <text2>, v.v.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.3. Nhiều trang trình bày trong một khung 297

được nhập theo thông số kỹ thuật của lớp phủ.

\begin {overprint} [<width>]


\onslide <[spec1]> <text1>
\onslide <[spec2]> <text2>
...
\end {overprint}

Nó chiếm một ô rộng "width" trên mỗi trang chiếu trong


khung, giá trị mặc định là chiều rộng của văn bản. Chiều cao
của hộp là <text1>, <text2>, v.v. lớn nhất trong số các chiều cao
tự nhiên của các hộp được chỉ định bởi. <[spec1]>, <[spec2]>,
v.v. không được có sự chồng chéo giữa các thông số kỹ thuật của
lớp phủ. Trong hộp, <[spec1]>, <[spec2]>, v.v. <text1>, <text2>,
v.v. được nhập theo thông số kỹ thuật lớp phủ.
Các lệnh sau cũng có đặc điểm kỹ thuật lớp phủ: \textbf,
\textit, \textl, \textrm, \textsf, \textcolor, \color. Đặc điểm
kỹ thuật cơ bản là <1->. Ví dụ

\begin {frame} {1. Thí dụ}{}


\textbf <1> {Phần này được in đậm trên trang trình bày 1,
phần còn lại là bình thường.} \\
\textcolor <2> {red} {Màu đỏ trên trang trình bày 2 và màu
đen ở phần còn lại.} \\
\textcolor <3> [RGB] {43,52,223} {Đây là màu xanh lam trên
trang trình bày 3 và màu đen trên các trang trình bày
khác.}
\end {frame}

\begin {frame} {2. Thí dụ}{}


\begin {itemize}
\item \textcolor <+> {red} {1. danh sách mục}
\item \textcolor <+> {red} {2. danh sách mục}
\item \textcolor <+> {red} {3. danh sách mục}
\end {itemize}
\end {frame}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


298 Chương 8. Trình chiếu trong LATEX

8.4 Trình chiếu với hiệu ứng hình ảnh

Khi chúng ta chuyển sang trang chiếu tiếp theo trong một
khung hoặc sang trang chiếu đầu tiên trong khung tiếp theo,
tất cả những gì đã xảy ra cho đến nay là hình ảnh trong trang
chiếu trước đó chỉ đơn giản là chuyển sang lại. Bạn cũng có thể
làm cho những thay đổi này ngoạn mục hơn với các hiệu ứng
khác nhau. Thật không may, không phải tất cả các trình xem
pdf đều hỗ trợ các hiệu ứng này, vì vậy nó có thể không hoạt
động trên máy nước ngoài. Ví dụ: chúng hoạt động với Adobe
Reader, nhưng chỉ khi bạn chuyển sang chế độ toàn màn hình,
như thường thấy khi trình bày bản trình bày. Bạn có thể đạt
được những hiệu ứng này bằng cách viết các lệnh sau vào môi
trường khung:
\transblindshorizontal<[spec]> [<option>]
\transblindsvertical<[spec]> [<option>]
\transboxin<[spec]> [<option>]
\transboxout<[spec]> [<option>]
\transcover<[spec]> [<option>]
\transdissolve<[spec]> [<option>]
\transfade<[spec]> [<option>]
\transglitter<[spec]> [<option>]
\transreplace<[spec]> [<option>]
\transsplitverticalin<[spec]> [<option>]
\transsplitverticalout<[spec]> [<option>]
\transsplithorizontalin<[spec]> [<option>]
\transsplithorizontalout<[spec]> [<option>]
\transwipe<[spec]> [<option>]

Trong các lệnh này, giá trị mặc định cho đặc tả lớp phủ là
<1->. Các tùy chọn có thể có:
duration = <time> Đây là thời gian hiệu ứng kéo dài bao
nhiêu giây.
direction = <angle> Hiệu ứng được thực hiện ở góc này. Các
giá trị <angle> có thể có cho góc 0 là 0, 90, 180, 270 hoặc thậm
chí là 315 cho \transglitter.
Cho đến nay, chuyển đổi slide luôn được thực hiện chỉ bằng

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.5. Lập dàn ý cho bài thuyết trình 299

một nút bấm. Điều này có thể được tự động hóa bằng cách nhập
một thời gian nhất định, nhưng điều này cũng chỉ có thể thực
hiện được ở chế độ toàn màn hình với lệnh sau:
\transduration <[spec2]> {<time>}
Giá trị mặc định cho đặc tả lớp phủ là <1->. Thay thế <time>
bằng số giây bạn muốn xem các slide được chỉ định trong thông
số kỹ thuật mà không cần nhấn nút.

8.5 Lập dàn ý cho bài thuyết trình

8.5.1 Trang tiêu đề

Trang đầu tiên của bản trình bày là trang tiêu đề, nơi chứa
các dữ liệu cần thiết với các lệnh sau trong phần mở đầu.
\title[<Tiêu đề ngắn>]{<Tiêu đề>}
\subtitle[<Tiêu đề ngắn>]{<Tiêu đề con con>}
\author[<Tên viết tắt>]{<Tên>}
\institute[<Tên viết tắt của viện>]{<Tên viện>}
\date[<Ngày ngắn>]{<Ngày>}
\logo{\includegraphics[<Tùy chọn>]{<tệp ảnh>}}
\titlegraphic{\includegraphics[<Tùy chọn>]{<Tệp ảnh>}}

Sau đó, trang tiêu đề có thể được tạo trong nội dung tài liệu
như sau:
\begin {frame}[plain]
\titlepage
\end {frame}

hay
\maketitle
tương đương với:
\begin {frame}
\titlepage
\end {frame}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


300 Chương 8. Trình chiếu trong LATEX

8.5.2 Cấu trúc của văn bản chính

Trong beamer, cấu trúc của văn bản tương tự như lớp bài
viết, nhưng không có đoạn văn và đoạn văn phụ.
Nếu bạn đang thực hiện một bài thuyết trình rất dài, bạn
có thể cần chia nhỏ nó thành nhiều phần. Phần mới của
\part[<Tiêu đề ngắn>]{<Tiêu đề>}
lệnh có thể được bắt đầu ngoài khung. Địa chỉ được chỉ
định trong tùy chọn được mặc định là tương ứng với tiêu đề
của phần. Bằng cách này, nó không xuất hiện ở bất kỳ đâu
ngoài trình xem pdf. (địa chỉ ngắn) nếu nó được kích hoạt hoặc
trong thanh điều hướng (thường là địa chỉ ngắn), nếu được
đặt. Nếu bạn muốn lệnh trước đó đưa ra một tạo một khung
riêng với tiêu đề, bạn có thể sử dụng \AtBeginPart, \insertpart,
lệnh \insertpartnumber và \insertromanpartnumber. Ví dụ: nhập
thông tin sau trong phần mở đầu:
\AtBeginPart{
\begin{frame}[plain]
\begin{center}
{\Large\insertromanpartnumber. Tiêu đề\\[10mm]}
{\large\insertpart\\}
\end{center}
\end{frame}}
Sau đó
\part{<Tiêu đề của phần>}
phát lệnh tạo một khung với số bộ phận và tiêu đề. Phần
mới của
\section[<Tiêu đề ngắn>]{<tiêu đề>}
lệnh có thể được bắt đầu ngoài khung. Địa chỉ được chỉ
định trong tùy chọn mặc định là tiêu đề phần. Bằng cách này,
nó không xuất hiện ở bất cứ đâu, chỉ giữa các dấu trang trong
trình xem pdf (tiêu đề ngắn) nếu nó được kích hoạt và trong
thanh điều hướng (thường là tiêu đề ngắn) nếu nó được đặt
theo cách đó. Nếu bạn muốn tạo một khung riêng biệt với địa
chỉ khi bạn sử dụng lệnh trước đó, bạn có thể sử dụng các lệnh
\AtBeginSection, \inserttsection và \inserttsectionnumber. Ví

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.5. Lập dàn ý cho bài thuyết trình 301

dụ: nhập nội dung sau vào phần mở đầu:


\AtBeginSection{
\begin{frame}[plain]
\begin{center}
{\Large\insertsectionnumber. \insertsection\\ }
\end{center}
\end{frame}}

Sau đó
\section{<Tiêu đề>}
phát lệnh tạo một khung với số phần và tiêu đề. Nó có ý
nghĩa có thể tiến hành theo cách tương tự đối với tiểu mục và
tiểu mục con.

8.5.3 Mục lục

Bạn cũng có thể hiển thị sự phân chia nội dung của phần,
mục, tiểu mục, tiểu mục dưới dạng các liên kết trong một
khung riêng. Ví dụ: nếu bạn không sử dụng lệnh \part, bạn
có thể nhập mã sau vào sau trang tiêu đề:
\begin{frame}[plain]{Mục lục}
\tableofcontents
\end{frame}

Nếu bạn đã sử dụng lệnh \part, mã trước đó chỉ có hiệu lực


nếu nó nằm sau khi lệnh \part được phát hành. Sau đó, hiệu
ứng không phải trên toàn bộ mục lục, mà chỉ trên phần đó. Ví
dụ: nếu bạn muốn nội dung của mỗi phần xuất hiện trước lệnh
\part ngay sau trang tiêu đề, bạn có thể làm như sau:
\begin {frame} [plain] {I. mục lục}
\tableofcontents[part = 1]
\end {frame}
\begin {frame}[plain]{II. mục lục}
\tableofcontents[part = 2]
\end {frame}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


302 Chương 8. Trình chiếu trong LATEX

Nếu bạn muốn có hiệu lực của lệnh \pause trước tiêu đề
của mỗi phần ngoại trừ phần đầu tiên trong mục lục, hãy sử
dụng tùy chọn tạm dừng của lệnh \tableofcontents. Nếu bạn
sử dụng tùy chọn tạm dừng, bạn có thể viết lệnh \pause trước
tất cả các tiểu mục và tiêu đề tiểu mục ngoại trừ tiểu mục đầu
tiên trong mục lục.
Ví dụ: nếu bạn không muốn tiêu đề của phần phụ trong
mục lục hoặc nếu bạn không muốn tiêu đề hiện tại bị mờ đi,
bạn có thể sử dụng các tùy chọn \tableofcontents sau:
sectiontyle = <style>
subsectiontyle = <style>
subsubsectiontyle = <style>
trong đó <style> có thể là: show (hiển thị), hide (ẩn), shaded
(bóng mờ). Ví dụ
\tableofcontents [subsubsectiontyle = hide]
tiểu mục tiêu đề không có trong mục lục. Nếu một từ nhất
định Nếu bạn tạo mục lục phụ cho máy cắt cỏ, bạn cũng có thể
kết hợp các kiểu.
sectiontyle = <style1> / <style2>
<style1> Kiểu của tiêu đề phần hiện tại.
<style2> Kiểu tiêu đề của các phần khác.
subsectiontyle = <style1> / <style2>
<style1> Kiểu của tiêu đề tiểu mục hiện tại.
<style2> Kiểu tiêu đề của các phần phụ khác.
subsectiontyle = <style1> / <style2> / <style3>
<style1> Kiểu của tiêu đề tiểu mục hiện tại.
<style2> Kiểu tiêu đề của các phần phụ khác của phần
hiện tại.
<style3> Kiểu tiêu đề của các tiểu mục khác (trong trường
hợp ẩn, không chỉ tiểu mục này tiêu đề, cũng không phải
tiêu đề của tiểu mục của chúng, xuất hiện trong mục lục).
subsubsectiontyle = <style1> / <style2>
<style1> Kiểu của tiêu đề phần phụ hiện tại.
<style2> Kiểu tiêu đề của các phần phụ khác.
subsubsectiontyle = <style1> / <style2> / <style3>
<style1> Kiểu của tiêu đề phần phụ hiện tại.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.5. Lập dàn ý cho bài thuyết trình 303

<style2> Kiểu tiêu đề của các tiểu mục khác của tiểu mục
hiện tại.
<style3> Kiểu tiêu đề của các phần phụ khác.
subsubsectiontyle = <style1> / <style2> / <style3> / <style4>
<style1> Kiểu của tiêu đề phần phụ hiện tại.
<style2> Kiểu tiêu đề của các tiểu mục khác của tiểu mục
hiện tại.
<style3> Kiểu tiêu đề của các phần phụ khác của phần
hiện tại.
<style4> Kiểu tiêu đề của các phần phụ khác.
Ví dụ: bằng cách sử dụng mã sau, chúng ta nhận được một
mục lục phụ cho phần đó:

\section{...}
...
\section{...}
\begin{frame}[plain]{}{}
\tableofcontents[sectionstyle=show/hide,subsectionstyle=
show/show/hide]
\end{frame}

8.5.4 Tài liệu

Bạn có thể tạo một danh mục trong chính xác một khung
như cách bạn làm đối với các tài liệu in. Sự khác biệt duy nhất
là lệnh \bibitem có thể được cung cấp một đặc tả lớp phủ ở đây
(mặc định <1->). Ví dụ

\begin{frame}[plain]{Tài liệu}
\begin{thebibliography}{12}
\bibitem <+ -> {Salomaa1973} A. ~ Salomaa, ...
\bibitem <+ -> {Dijkstra1982} E. ~ Dijkstra, ...
...
\end{thebibliography}
\end{frame}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


304 Chương 8. Trình chiếu trong LATEX

8.6 Các yếu tố nội dung

8.6.1 Danh sách

Beamer tải gói liệt kê. Nó không tương thích với gói
paralist.sty, vì vậy đừng tải nó. Do đó, bạn cũng không thể sử
dụng môi trường danh sách compactenum và compactitem. Nếu
bạn muốn danh sách không có khoảng trắng thừa theo chiều
dọc, thì khung nạp môi trường với tùy chọn squeeze. Các môi
trường tiêu chuẩn có thể được sử dụng: itemize , enumerate ,
description. Những môi trường này không tồn tại, nhưng lệnh
\item có đặc tả lớp phủ với giá trị mặc định là <1->. Ví dụ
\begin{frame}{}{}
\begin{itemize}
\item<+-> 1. Danh sách
\item<+-> 2. Danh sách
\item<+-> 3. Danh sách
\end{itemize}
\end{frame}

Ví dụ: nếu bạn muốn thay đổi đặc tả lớp phủ cơ bản thành <+
-> trong một danh sách cụ thể, bạn có thể thực hiện như sau.
(Điều này tương đương với mã trước đó.)
\begin{frame}{}{}
\begin{itemize}[<+->]
\item 1. Danh sách
\item 2. Danh sách
\item 3. Danh sách
\end{itemize}
\end{frame}

Ví dụ: nếu bạn muốn thay đổi đặc điểm kỹ thuật lớp phủ cơ
bản cho tất cả các danh sách trong một khung nhất định thành
<+ ->, bạn có thể thực hiện như sau.
\begin{frame}[<+->]{}{}
\begin{itemize}
\item 1. Danh sách

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 305

\item 2. Danh sách


\end{itemize}
\begin{enumerate}
\item 1. Danh sách
\item 2. Danh sách
\end{enumerate}
\end{frame}

Ví dụ: nếu khung cần tùy chọn t, hãy sửa đổi dòng 1 trong mã
trước đó như sau:
\begin{frame}[<+->][t]{}{}
Nếu bạn sử dụng đồng thời một đặc tả lớp phủ và một tùy
chọn trên lệnh \item, hãy làm như vậy theo thứ tự đó. Ví dụ
\item<+->[--]
Nếu bạn muốn thay đổi cách đánh số của một cấp cụ thể
trong danh sách được đánh số cụ thể, bạn có thể sử dụng
\begin{enumerate}[style]
mở ra môi trường, giống như trong lớp bài viết. Đối với môi
trường liệt kê, nếu bạn muốn đặt đặc tả lớp phủ cơ bản thành
<+ ->, ngoài tùy chọn, bạn có thể thực hiện như sau:
\begin{enumerate} [<+ ->][style]

8.6.2 Khu vực nhiều cột

\begin {columns} [<tùy chọn>]


\begin {column} {<1. chiều rộng cột>}
<1. nội dung cột>
\end {column}
\begin {column} {<2. chiều rộng cột>}
<2. nội dung cột>
\end{column}
...
\end {columns}

Các <tùy chọn> là:


totalwidth= <width> Tổng chiều rộng của vùng nhiều cột.
b Căn chỉnh đường cơ sở của các hàng dưới cùng của cột.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


306 Chương 8. Trình chiếu trong LATEX

c Căn chỉnh tâm dọc của các cột.


t Căn chỉnh đường cơ sở của các hàng trên cùng của cột.
T Căn chỉnh các đỉnh của các hàng trên cùng của cột.

8.6.3 Khối, môi trường giống một định lý

Khối là các phần của khung có tiêu đề và tiêu đề riêng. Để


tạo chúng:
\begin{block}<[spec]>{<tiêu đề mảng>}
<chữ>
\end{block}

Đặc tả lớp phủ cơ bản là <1->. Nếu bạn muốn thay đổi
điều này cho các mảng trong một khung nhất định, bạn phải
tiến hành chính xác như đối với danh sách. Ngoài ra còn có
hai mảng đặc biệt khác nhau cơ bản về màu sắc: môi trường
alertblock và exampleblock, cách sử dụng tương tự như trước
đó.
Trong beamer, môi trường giống khối hoạt động như một
định lý, trong đó địa chỉ là địa chỉ của môi trường giống khối.
Bởi vì gói amsthm được tải theo mặc định, môi trường thử
nghiệm cũng có thể được sử dụng. Môi trường giống khối nên
được xác định và sử dụng chính xác như đã thảo luận trong
trường hợp thông thường và trong xem xét gói amsthm, với hai
điểm khác biệt.
Một điểm khác biệt là các môi trường giống như mục đã xác
định cũng có thể được sử dụng với đặc tả lớp phủ (mặc định <1
->). Nếu bạn muốn thay đổi điều này cho các môi trường giống
như mục trong một khung nhất định, bạn phải tiến hành chính
xác như đối với danh sách. Sự khác biệt khác là việc đánh số
mục không được hiển thị theo mặc định. Điều này có thể được
thay đổi thành
\setbeamertemplate{theorems}[numbered]
trong phần mở đầu, nhưng trong trường hợp của Việt nam,
chúng ta không đạt được kết quả tốt, vì kiểu chữ tiếng Anh cho
điều này không được vietnam.ldf thay đổi. Nếu bạn vẫn muốn

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 307

đánh số mục bằng tiếng Việt, bạn có thể sử dụng giải pháp
sau:
\setbeamertemplate{theorems}[default]
\newtheorem{tetel}{\inserttheoremnumber. tétel}

8.6.4 Hộp

Các hộp có thể được sử dụng trong beamer như bình thường,
nhưng hai hộp đoạn được thêm vào ở đây. Trước khi mô tả
những điều này, hãy giới thiệu đôi nét về quản lý màu. Trình
chiếu xác định trước các sơ đồ màu tự đặt tên và chúng ta có
thể tạo một sơ đồ màu. Ví dụ
\setbeamercolor{my color}{fg = blue, bg = yellow}
xác định một bảng màu được gọi là my color của riêng,
trong đó nền là màu vàng và nền trước, tức là nội dung, có
màu xanh lam. Một trong những hộp đoạn beamer là:
\begin{beamercolorbox}[<tùy ch>]{<color scheme>}
<Hộp nội dung>
\end{beamercolorbox}

Các <tùy chọn> là:


wd = <width> Chiều rộng hộp (mặc định textwidth).
dp = <depth> Chiều sâu của hộp.
ht = <height> Chiều cao của hộp.
left nội dung hộp bên trái bị đóng lại.
right Nội dung của hộp được đóng ở bên phải.
center Nội dung của hộp được căn giữa.
sep = <distance> Lượng không gian thừa xung quanh nội
dung của hộp.
shadow Hộp được tô bóng.
shadow = false Hộp không được tô bóng.
rounded Các góc của hộp được làm tròn.
rounded = false Các góc hộp không được làm tròn.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


308 Chương 8. Trình chiếu trong LATEX

Ví dụ
\setbeamercolor{sajat szin}{fg=blue,bg=yellow}
\begin{frame}{}{}
\begin{beamercolorbox}[wd=6cm,shadow,rounded,center]{sajat
szin}
Nội dung
\end{beamercolorbox}
\end{frame}

Hộp đoạn văn được xác định bởi môi trường khác có các góc
tròn và bạn có thể đặt tiêu đề cho nó trong một tiêu đề:
\begin{beamerboxesrounded}[<tùy chọn>]{address}
<Hộp nội dung>
\end{beamerboxesrounded}

Các <tùy chọn> là:


width = <width> Chiều rộng hộp (mặc định \textwidth).
shadow = true Hộp được tô bóng.
shadow = false Hộp không được tô bóng.
lower = <color Scheme> Màu của nội dung trong hộp.
upper = <color Scheme> Phối màu của đầu hộp.
Ví dụ
\setbeamercolor{sajat szin1}{fg=white,bg=blue}
\setbeamercolor{sajat szin2}{fg=black,bg=yellow}
\begin{frame}{}{}
\begin{beamerboxesrounded}[upper=sajat szin1,lower=sajat
szin2]{Cím}
<Nội dung hộp>
\end{beamerboxesrounded}
\end{frame}

8.6.5 Tô màu

Màu nền có thể được đặt bằng mã sau:


\setbeamercolor{background canvas}{bg = <colorname>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 309

Cũng có thể tạo nền nhiều màu:


\setbeamertemplate {background canvas}
[vertical shading][top=<colorname>,middle=<colorname>,
bottom=<colorname>]

Ngoài các tùy chọn trên top , middle và bottom, bạn cũng có thể
sử dụng tùy chọn middle, cho phép bạn chỉ định vị trí thẳng
đứng của mức giữa của màu được chỉ định ở giữa. Đây là tỷ lệ
giữa 0 và 1, trong đó 0 là mức thấp nhất và 1 là mức cao nhất.
Ví dụ
\setbeamertemplate{background canvas}
[vertical shading][midpoint=0.3,middle=yellow]

Nếu bạn muốn có một hình nền cho học sinh, hãy viết những
điều sau trong phần mở đầu:
\setbeamertemplate{background canvas}
{\includegraphics[width = \paperwidth]{<image>}}

Hình ảnh <image> xuất hiện trong nền của mỗi trang chiếu.
Nếu bạn muốn điều tương tự cho các trang trình bày trong
một khung hình để đạt được, bạn cần làm điều này:
{\setbeamertemplate{background canvas}
{\includegraphics[width=\paperwidth]{<image>}}
\begin{frame}
...
\end{frame}}

8.6.6 Đưa ảnh vào

Hình ảnh có thể được dán, như trong trường hợp bình
thường, bằng lệnh \includegraphics, nhưng đây là đặc tả lớp
phủ với giá trị mặc định là <1->.
\includegraphics<[spec]>[<tùy chọn>]{figure}
Hình ảnh không chiếm dung lượng trên trang chiếu không
được đánh dấu. Điều này là để làm cho việc tạo hoạt ảnh cho
một loạt hình ảnh trở nên dễ dàng hơn. Ví dụ

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


310 Chương 8. Trình chiếu trong LATEX

\includegraphics<+>[width=5cm]{figure0}
\includegraphics<+>[width=5cm]{figure1}
\includegraphics<+>[width=5cm]{figure2}
\includegraphics<+>[width=5cm]{figure3}

8.6.7 Hoạt hình

Đoạn mã trước đây đã có thể được coi là một hình ảnh động,
nhưng nếu nó bao gồm nhiều hình ảnh, thì đoạn mã cũng bao
gồm nhiều dòng, điều này thật bất tiện. Vấn đề này có thể được
giải quyết với gói xmpmulti.sty. Giả sử hoạt ảnh bao gồm các
hình ảnh fig-0.png, fig-1.png, fig-2.png, ..., fig-20.png. Sau đó,
một
\multiinclude[<+>][format = jpg, graphics = {width = 5cm}]{
fig}
(trong xmpmulti.sty)

mã tương đương với:


\includegraphics<+>[width=5cm]{fig-0}
\includegraphics<+>[width=5cm]{fig-1}
\includegraphics<+>[width=5cm]{fig-2}
...
\includegraphics<+>[width=5cm]{fig-20}

Giải pháp này đã rất tiện lợi về mặt mã hóa, nhưng việc
sử dụng bản trình bày thì chưa, vì bạn phải cuộn qua máy
tính cho mỗi lần thay đổi hình ảnh. Vấn đề này có thể được
giải quyết, ví dụ, với lệnh \transduration được mô tả trước đó,
nhưng nó cung cấp một giải pháp tốt hơn nhiều cho
\animategraphics[<option>] {<speed>} {<basicname>} {<first>
} {<last>}
(trong animate.sty, https://ctan.org/pkg/animate )

Mã này sẽ phát một loạt hình ảnh dưới dạng video, miễn là
tính năng này được hỗ trợ trong trình xem pdf. Adobe Reader
là như vậy, nhưng trình xem pdf tích hợp của SumatraPDF hoặc
TeXstudio thì không. Chỉ sử dụng lệnh này trong khung có một
trang chiếu.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 311

<speed> Số nguyên dương, phát ở tốc độ khung hình này.


<basicname> Ví dụ: nếu tệp hình ảnh là fig0.png, fig1.png,
..., fig20.png, quả sung.
<first> Trong ví dụ trước, số 0 được thêm vào đây.
<last> Trong ví dụ trước, 20 được thêm vào đây.
Các <tùy chọn> có thể có:
autoplay Phát lại tự động bắt đầu khi trang được mở.
loop Tự động khởi động lại khi kết thúc quá trình phát lại.
width = <width> Chiều rộng của hình ảnh.
height = <height> Chiều cao của hình ảnh.
controls Các nút hiển thị xuất hiện.
buttonize = <button size> Kích thước của các nút trình phát.
buttonbg = <color> Màu nền của các nút trình phát.
buttonfg = <color> Màu của đường các nút trình phát. Chỉ
định màu với thang màu xám hoặc bảng màu rgb.
Ví dụ buttonbg = 0.8 hoặc buttonbg = 0.36: 0.08: 0.88
(Nếu bạn sử dụng vietnam.ldf,thì kích hoạt dấu hai chấm
phải được tắt, nếu không thì buttonbg và Không thể sử
dụng tùy chọn buttonfg, chỉ với thang màu xám.)
Tất nhiên, lệnh \animategraphics có thể được sử dụng không
chỉ trong lớp tài liệu beamer, mà sau đó ngoài animate, hãy tải
gói graphicx.
gif động không thể được xây dựng trực tiếp thành pdf.
Trong trường hợp này, tệp gif phải được chuyển đổi thành một
loạt các hình ảnh png, có thể được hiển thị dưới dạng pdf như
trước đây. Ví dụ, bạn có thể sử dụng ImageMagick để chuyển
đổi. Sau khi cài đặt, bạn có thể thực hiện chuyển đổi bằng dòng
lệnh sau:

convert -coalesce <filename>.gif <filename>.png

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


312 Chương 8. Trình chiếu trong LATEX

8.6.8 Video

Bạn cũng có thể phát video trong khung của bản trình bày
bằng lệnh sau:
\movie[<option>] {<poster>} {<video tệp>}
(trong multimedia.sty)

Lưu ý rằng tính năng phát lại video trên máy nước ngoài có
thể không hoạt động. Ví dụ: nếu codec bạn cần phát trên máy
của mình không được cài đặt, bạn sẽ nhận được lỗi.
Chỉ phát lại diễn ra trong tệp pdf, tệp video không được
tích hợp trong pdf. Vì vậy, khi trình chiếu, tập tin video phải
được sao chép bên cạnh tập tin pdf.
Một vấn đề khác có thể được quan tâm là chương trình xem
pdf có thể coi việc phát video là một rủi ro bảo mật. Điều này
phải được đặt riêng trước khi chiếu.
Cho đến khi video bắt đầu, “áp phích” sẽ xuất hiện trong
khu vực được chỉ định cho video, trừ khi bạn đã chỉ định
tùy chọn áp phích (xem sau). Nhấp để bắt đầu phát lại. "Áp
phích" có thể là văn bản hoặc hình ảnh được tải bằng lệnh
\includegraphics.
Các tùy chọn có thể có:
width = <width> Chiều rộng của video.
height = <height> Chiều cao của video.
poster Cho đến khi video bắt đầu, bạn sẽ không nhìn thấy
“áp phích” mà là khung đầu tiên của video. Nhấp để bắt
đầu phát lại.
showcontrols Hiển thị thanh điều hướng bên dưới video.
start = <time> Chỉ định điểm bắt đầu phát lại video. Ví dụ:
start = 5s có nghĩa là rằng điểm bắt đầu phát lại là 5
giây.
duration = <time> Thời lượng để phát một phần của video. Ví
dụ: thời lượng = 25 giây nó nghĩa là bạn đang chơi một
phần trong 25 giây. Ví dụ
\movie[width=8cm, height = 6cm, showcontrols, poster]{

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 313

}{video.avi}
Cũng có thể sử dụng tùy chọn \label và lệnh \
hyperlinkmovie (trong multimedia.sty) đa phương tiện
cùng nhau sử dụng để phát các khoảng thời gian khác
nhau của video trên một liên kết duy nhất bằng một cú
nhấp chuột. Các liên kết này phải nằm trên cùng một
trang trình bày với vị trí của video. Ví dụ
\begin{frame}{}{}
\movie[label=cimke,width=8cm,height=6cm,showcontrols,poster
]{}{video.avi}
\par\medskip
\hyperlinkmovie[start=5s,duration=10s]{cimke}{5--15\,sec}
\par
\hyperlinkmovie[start=20s,duration=25s]{cimke}{20--45\,sec}
\end{frame}

Nếu video không ở trong tệp pdf mà chỉ bằng cách nhấp vào
liên kết có ứng dụng bên ngoài bạn muốn chơi, bạn không cần
gói multimedia.sty:
\href{run: <video file>} {<link text>}
Tất nhiên, lệnh này chỉ hoạt động nếu bạn có ứng dụng bên
ngoài cho avi trên máy của mình được gán.

8.6.9 Phóng to

Có thể phóng to một vùng cụ thể của trang chiếu bằng lệnh
framezoom. Ví dụ
\framezoom<1> <2>[border=3](1 cm, 2 cm)(4 cm, 3 cm)
lệnh ở đầu khung, điều sau sẽ xảy ra. Trang trình bày 3 sẽ
xuất hiện trên trang trình bày 1 Khung dày pixel xung quanh
một hình chữ nhật 4cm × 3cm với góc trên cùng bên trái là
1cm cách mặt trái của gương văn bản và cách mặt trên của
gương văn bản 2cm. Phần được chọn khu vực hoạt động như
một liên kết, nhấp vào nó sẽ đưa bạn đến trang trình bày thứ
2 với phần đã chọn trước đây bạn có thể thấy nó được phóng
to bằng kích thước của toàn bộ trang chiếu. Toàn bộ khu vực

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


314 Chương 8. Trình chiếu trong LATEX

của trang trình bày 2 cũng hoạt động như một liên kết, nhấp
để quay lại trang trình bày 1. (Các liên kết sẽ hoạt động chính
xác nếu hoàn chỉnh chế độ màn hình là trình xem pdf.) Ví dụ
\begin{frame}{}{}
\frameome <2> <3> [border = 3] (1 cm, 0,5 cm) (5 cm, 3,75
cm)
\frameome <2> <4> [border = 3] (6,2cm, 0,2cm) (4,5cm, 3,375
cm)
\frameome <2> <5> [border = 3] (2cm, 5cm) (4cm, 3cm)
\includegraphics[width = \textwidth] {pic}
\end {frame}

tạo một khung gồm 5 trang chiếu. Trang trình bày 1 tải hình
ảnh pic.jpg và sau đó sao chép dikon chọn các phần để phóng
to. Nhấp vào chúng để xem độ phóng đại.

8.6.10 Tham chiếu chéo

Hãy thử mã sau:


\begin{frame}{Ví dụ}{}
\begin {itemize}
\item <+ -> Liệt kê mục 1
\item <+ -> Liệt kê mục 2
\begin{equation}\label{method}
a ^ 2 + b ^ 2 = c ^ 2
\end{equation}
\end{itemize}
\end {frame}

\begin {frame}
\eqref {method}
\end {frame}

Bạn sẽ thấy rằng việc nhấp vào liên kết được tạo bởi \eqref
{method} sẽ không bản trình bày chuyển đến phương trình, tức
là không phải trượt 2 của khung "Ví dụ", nhưng để trượt 1. Để
giải quyết vấn đề này, lệnh \label cũng là lớp phủ đặc điểm kỹ
thuật với giá trị mặc định là <1> (vì vậy liên kết nhảy đến slide

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 315

1 trong trường hợp trước).


Vì vậy, mã trước đó là chính xác:
\begin {frame} {Ví dụ} {}
\begin {itemize}
\item <+ -> Liệt kê mục 1
\item <+ -> Liệt kê mục 2
\begin {method} \label <2> {method}
a ^ 2 + b ^ 2 = c ^ 2
\end {phương trình}
\end {itemize}
\end {frame}
\begin {frame}
\eqref {method}
\end {frame}

Nếu bạn muốn tham chiếu một trang trình bày cụ thể trong
một khung, hãy sử dụng nhãn môi trường khung Lựa chọn:
\begin{frame}[label = label]{Ví dụ}{}
\begin{itemize}
\item <+ -> Liệt kê mục 1
\item <+ -> Liệt kê mục 2
\end {itemize}
\end {frame}
\begin {frame}
\ref {tag <2>}
\end {frame}

Sau đó, \ref {tag <2>} sẽ tạo một liên kết có số khung để nhấp
vào nhảy đến trang trình bày 2 của khung. Nếu bạn sử dụng
lệnh \hyperlink thay vì \ref, bạn có thể nhập văn bản của liên
kết. Ví dụ
\begin{frame}[label = label]{Ví dụ}{}
\begin {itemize}
\item <+ -> Liệt kê mục 1
\item <+ -> Liệt kê mục 2
\end {itemize}
\end {frame}
\begin {frame}
\hyperlink{tag <2>} {Chuyển đến trang trình bày 2 của khung
trước đó.}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


316 Chương 8. Trình chiếu trong LATEX

\end {frame}

8.6.11 Nút ấn

Không chỉ văn bản mà còn có thể gán các nút cho một liên
kết:
\beamerbutton{<chữ nút>}
\beamergotobutton{<chữ nút>}
\beamerskipbutton{<chữ nút>}
\beamerreturnbutton{<chữ nút>}

Ví dụ: sửa khung thứ hai của mã trước đó thành:


\begin {frame}
\hyperlink{tag <2>} {\beamerreturnbutton {Trang trình bày 2
của khung trước}}
\end {frame}

Các biểu tượng cho các nút bấm được hiển thị trong
\insertgotosymbol
\inserttskipsymbol
\insertreturnsymbol

bạn có thể thay đổi nó bằng cách xác định lại các lệnh. Màu
nút và phông chữ văn bản bạn cũng có thể thay đổi nó. Ví dụ
\renewcommand{\insertgotosymbol}{$\ggg$}
\setbeamercolor{button}{fg=black,bg=yellow}
\setbeamercolor{button border}{fg=red}
\setbeamerfont{button}{family=\rmfamily,shape=\itshape,
series=\bfseries}

8.6.12 Lặp lại khung

Nếu bạn đã tải một khung có tùy chọn nhãn, bạn có tùy
chọn để \againframe để hiển thị nội dung của khung tại một
điểm khác, có thể bằng một lớp phủ khác đặc điểm kỹ thuật,
với một tùy chọn khác. Ví dụ

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


8.6. Các yếu tố nội dung 317

\begin {frame} [<+>][label = <nhãn>]{Ví dụ}{}


\begin {itemize}
\item Danh sách mục 1
\item Danh sách mục 2
\item Danh sách mục 3
\end {itemize}
\end {frame}
\againframe<2->[<+ ->][t]{<nhãn>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 9. LẬP TRÌNH TRONG LATEX

9.1. Mã hóa ASCII và mã danh mục . . . . . . . . . . . . . . . . . 319


9.1.1. Kiểm soát từ, mã thông báo, macro . . . . . . 325
9.1.2. Lệnh nội bộ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
9.1.3. Lệnh độ dài . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
9.2. Bộ đếm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.3. Kiểm soát định hướng . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
9.3.1. Định hướng có điều kiện . . . . . . . . . . . . . . . . . 332
9.3.2. Chu kỳ lặp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
9.4. Định nghĩa macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
9.5. Định định môi trường . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.5.1. Lệnh \newenvironment . . . . . . . . . . . . . . . . . . 364
9.5.2. Lệnh \NewEnviron . . . . . . . . . . . . . . . . . . . . . . . 367
9.5.3. Lệnh \NewDocumentEnvironment . . . . . . 368
9.5.4. Môi trường nguyên văn mới . . . . . . . . . . . . . . 370
9.5.5. Môi trường loại commen mới . . . . . . . . . . . . . 371
9.5.6. overlay với đặc tả lớp phủ mới . . . . . . . . . . . . 371
9.5.7. Môi trường danh sách mới . . . . . . . . . . . . . . . . 372
9.6. Mỏ neo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
9.6.1. Neo môi trường . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
9.1. Mã hóa ASCII và mã danh mục 319

9.1 Mã hóa ASCII và mã danh mục

Khi biên dịch nguồn, LATEX đầu tiên kiểm tra từng ký tự.
Nếu nó được bao gồm trong hai bảng sau - tức là cái gọi là Ký
tự ASCII - giữ lại nó, nhưng nếu không, hãy nhập một lệnh
thích hợp vào vị trí của nó, lệnh này bây giờ chỉ chứa các ký
tự ASCII. Ví dụ: thay thế Ő bằng ký tự \H{O}. Nếu tệp nguồn
được mã hóa UTF-8, điều này sẽ được thực hiện theo mặc định
từ năm 2018 trở đi. Nếu nguồn được mã hóa khác, bắt buộc
phải sử dụng gói inputenc với tùy chọn tương ứng với mã hóa.
Mã hóa ASCII là 8-bit, nhưng mã đầu tiên trong số này là
0 và chỉ thay đổi vào các 7 số khác. Như vậy, có 27 = 128 ký tự
được mã hóa ASCII.

Mã ASCII thập phân cho các ký tự có thể in được

Ký tự mã Ký tự mã Ký tự mã Ký tự mã
trắng 32 8 56 P 80 h 104
! 33 9 57 Q 81 i 105
" 34 : 58 R 82 j 106
# 35 ; 59 S 83 k 107
$ 36 < 60 T 84 l 108
% 37 = 61 U 85 m 109
& 38 > 62 V 86 n 110
’ 39 ? 63 W 87 o 111
( 40 @ 64 X 88 p 112
) 41 A 65 Y 89 q 113
* 42 B 66 Z 90 r 114
+ 43 C 67 [ 91 s 115

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


320 Chương 9. Lập trình trong LATEX

, 44 D 68 \ 92 t 116
- 45 E 69 ] 93 u 117
. 46 F 70 ^ 94 v 118
/ 47 G 71 _ 95 w 119
0 48 H 72 ‘ 96 x 120
1 49 I 73 a 97 y 121
2 50 J 74 b 98 z 122
3 51 K 75 c 99 { 123
4 52 L 76 d 100 | 124
5 53 M 77 e 101 } 125
6 54 N 78 f 102 ~ 126
7 55 O 79 g 103

Mã ASCII thập phân cho các ký tự điều khiển

mô tả tham chiếu mã
đóng số 0 ^^@ 0
đầu tiêu đề ^^A 1
bắt đầu văn bản ^^B 2
cuối văn bản ^^C 3
kết thúc quá trình truyền dữ liệu ^^D 4
kiểm tra ^^E 5
xác nhận ^^F 6
đổ chuông ^^G 7
trở lại ^^H 8

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.1. Mã hóa ASCII và mã danh mục 321

tab ngang ^^I 9


dòng mới ^^J 10
tab dọc ^^K 11
quăng ^^L 12
xe về ^^M 13
thay đổi bộ ký tự ^^N 14
đặt lại bộ ký tự ^^O 15
dữ liệu thô theo sau ^^P 16
điều khiển thiết bị 1 ^^Q 17
điều khiển thiết bị 2 ^^R 18
điều khiển thiết bị 3 ^^S 19
điều khiển thiết bị 4 ^^T 20
xác nhận phủ định ^^U 21
nhàn rỗi đồng bộ ^^V 22
cuối khối dữ liệu ^^W 23
chưa ^^X 24
end of media ^^Y 25
ký tự đại diện ^^Z 26
ký phát hành ^^[ 27
dấu tách tệp ^^\ 28
tách nhóm ^^] 29
dấu phân cách bản ghi ^^^ 30
dấu tách đơn vị ^^_ 31
xóa ^^? 127

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


322 Chương 9. Lập trình trong LATEX

Không chỉ ký tự điều khiển có thể được tham chiếu với một
số ký tự sau ^^. Nói chung, nếu mã ASCII thập phân của ký tự
là x và mã ASCII thập phân của ký tự sau ^^ liên quan đến ký
tự là y, thì
(
y + 64 nếu y = 0, 1, . . . , 63,
x=
y − 64 nếu y = 64, 65, . . . , 127,

hoặc là (
x + 64 nếu x = 0, 1, . . . , 63,
y=
x − 64 nếu x = 64, 65, . . . , 127.

Ví dụ, mã ASCII thập phân của khoảng trắng là x = 32, do


đó y = 32 + 64 = 96, là mã ASCII của ký tự ‘. Vì vậy, chúng ta
có thể tham chiếu đến không gian với chuỗi ^^‘. Trong ^^I, mã
ASCII thập phân của I là y = 73, do đó x = 73 − 64 = 9, là mã
ASCII thập phân của tab ngang. Vì vậy, ^^I ta đề cập đến tab
ngang.
Mã ASCII thập phân của một ký tự được mã hóa ASCII
được lưu trữ trong mã sau:
‘<ký tự>.
trong đó <ký tự> cũng có thể là một tham chiếu. Nếu bạn
muốn viết điều này trong tài liệu của mình, bạn cần đặt lệnh
\number trước nó. Nếu ký tự ‘ đang hoạt động, giống như khi
sử dụng magyar.ldf, hãy đặt lệnh \string trước dấu này. Ví dụ,
mã ASCII của chữ A.
7 8: 2
\number\string‘A 65

Mã ASCII cho "tab ngang"


7 8: 2
\number\string‘\^^I 9

Mỗi ký tự được mã hóa ASCII cũng có một cái gọi là mã


danh mục trong LATEX, phân loại các ký tự này thành 16 lớp
khác nhau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.1. Mã hóa ASCII và mã danh mục 323

0 Ký tự nhập lệnh (mặc định là dấu \).


1 Ký tự mở khối (ký tự { theo mặc định).
2 Chặn ký tự đóng (} theo mặc định).
3 Ký tự chuyển đổi chế độ toán học liên dòng (mặc định là dấu
$).
4 Ký tự Tab (theo mặc định là dấu &).
5 Ký tự cuối dòng (ký tự điều khiển ASCII 13 "xuống dòng"
mặc định).
6 Ký tự tham số macro (mặc định là dấu #).
7 Ký tự siêu ký tự (mặc định là ^).
8 Ký tự chỉ số (mặc định là _).
9 Ký tự bị bỏ qua (thuần TEX là ký tự điều khiển "đóng số
không", LATEX thì không).
10 Ký tự khoảng trắng (ký tự ASCII mặc định 9 và 32, nghĩa
là ký tự điều khiển “tab ngang” và khoảng trắng).
11 Ký tự cho một chữ cái (mặc định là ký tự từ a đến z hoặc
từ A đến Z).
12 Ký tự khác (mặc định là 10, 33, 34, 39, 40-64, 91,93, 96,
124 ký tự ASCII).
13 Ký tự hoạt động là một lệnh tự nó không có ký tự giới thiệu
lệnh (theo mặc định, các ký tự ASCII từ 1 đến 8, 11, 12,
14 đến 31, 126, nghĩa là tất cả ngoại trừ ba ký tự điều
khiển và dấu ~).
14 Ký tự chú thích (mặc định là dấu %).
15 Ký tự không hợp lệ dẫn đến lỗi dịch (mặc định là 0 và 127)
Ký tự ASCII).
Mặc dù mã ASCII là 8 bit, theo mặc định, bit đầu tiên luôn là 0
và chỉ có 7 bit tiếp theo là thay đổi, do đó có tổng cộng 27 = 128
ký tự với mã thập phân từ 0 đến 127 được xuất hiện. Mã hóa
ASCII mở rộng cũng sử dụng bit đầu tiên, vì vậy nó đã chứa
28 = 256 ký tự với mã thập phân từ 0 đến 255. A LATEX gán 13
mã danh mục cho các ký tự ASCII từ 128 đến 255.
Mã danh mục cho một ký tự được lưu trữ trong mã sau:
\catcode<mã ký tự ASCII>

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


324 Chương 9. Lập trình trong LATEX

trong đó <mã kỹ tự ASCII> của ký tự có thể được chỉ định ở


dạng thập phân, bát phân và thập lục phân. Nếu bạn sử dụng
định dạng bát phân, hãy nhập ’, trong khi nếu bạn sử dụng hệ
thập lục phân, hãy nhập ". Nếu bạn muốn viết mã danh mục
trong tài liệu của mình, thì lệnh \number phải được viết trước
\catcode. Ví dụ: mã danh mục (15) cho ký tự điều khiển "xóa"
được in bởi bất kỳ dòng nào sau đây:
\number\catcode127
\number\catcode\string’\^^?
\number\catcode’177
\number\catcode"7F

Để thay đổi mã danh mục của một ký tự, hãy sử dụng


\catcode<script ASCII code> = <ategcategory code>
lệnh, trong đó “mã ASCII” của ký tự có thể được chỉ định ở
dạng thập phân, bát phân và thập lục phân, như được mô tả ở
trên. Ví dụ: ký tự điều khiển "tab ngang" sẽ được mã hóa bằng
bất kỳ dòng nào trong số 10 dòng sau:
\catcode9=10
\catcode\string’\^^I=10
\catcode’11=10
\catcode"9=10

Trong các ví dụ trước, lệnh \string được sử dụng để tạm


thời vô hiệu hóa vai trò của ký tự hoạt động trong TEX. Trên
thực tế, ký tự sau chuỗi \ có 12 mã danh mục cho một trường
hợp này. Nếu \string được theo sau bởi một lệnh, thì cả ký tự
giới thiệu lệnh và mỗi ký tự trong từ lệnh đều được cung cấp
12 mã thể loại cho một trường hợp này. Ví dụ
\string\TeX\TeX
Trong trường hợp, dấu \ đầu tiên và các chữ cái TeX tiếp
theo sẽ xuất hiện cùng với 12 mã danh mục trong quá trình
dịch, nhưng dấu \ thứ hai lại là 0 mã danh mục, vì vậy các ký
tự sau được coi là lệnh. Vì vậy, kết quả của mã trước đó

7 Ví dụ 9.1 8: 2
\string\TeX\TeX \TeXTEX

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.1. Mã hóa ASCII và mã danh mục 325

9.1.1 Kiểm soát từ, mã thông báo, macro

Chuỗi điều khiển là một chuỗi được coi là một đơn vị duy
nhất bởi TEX. Ví dụ như lệnh, bộ đếm, tham số. TEX là bước
đầu tiên trong quá trình xử lý tệp văn bản được quét. chia nhỏ
nó thành các mã thông báo. Sau đó, TEX coi mỗi từ điều khiển
là một mã thông báo duy nhất và truyền tất cả các ký tự khác
như một mã thông báo duy nhất. Các khoảng trắng hoặc nhận
xét không cần thiết sẽ không được xử lý thêm. Nó phân loại các
ký tự được quét và gán mã danh mục của nó cho từng ký tự.
Macro là một mã chương trình được đặt tên. Khi tên này
được gọi, TEX thực thi mã chương trình đã cho. Tên của macro
có thể chứa bất kỳ ký tự nào, thậm chí là khoảng trắng, ngoài
\ hiện tại (chính xác hơn là 0 ký tự được mã hóa bên trong).
Nếu tên macro chỉ bao gồm các chữ cái trong bảng chữ cái
tiếng Anh và ký tự @ không có dấu cách, nó được gọi là tên
lệnh. Một macro có tên lệnh có thể được chạy bằng cách đặt ký
tự \ trước tên lệnh (chính xác hơn là 0 ký tự được mã hóa bên
trong). Chuỗi kết quả được gọi là một lệnh. Ví dụ: bfseries là
tên lệnh có thể được thực thi bằng cách gõ \bfseries. Các lệnh
có tên chứa ký tự @ được gọi là lệnh nội bộ.
Bạn có thể chạy bất kỳ macro nào bằng cách nhập tên
macro giữa các lệnh \csname và \endcsname.

9.1.2 Lệnh nội bộ

Phần 9.1.1 các lệnh nội bộ được đề cập trong phần nay
không thể được sử dụng trong tệp nguồn LATEX đơn giản, chỉ
trong tệp lớp (.cls) và gói (.sty). Nếu bạn vẫn muốn sử dụng
lệnh nội bộ trong tệp nguồn LATEX đơn giản (.tex), hãy đặt nó
giữa lệnh \makeatletter và \makeatother. Các lệnh này không
thể được đưa vào macro mô tả một lệnh mới. Ví dụ, không
chính xác:
\def\asterisk#1#2{\makeatletter\@ifstar{#1}{#2}\makeatother
}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


326 Chương 9. Lập trình trong LATEX

Mã sau là đúng:
\makeatletter
\def\hacsillag#1#2{\@ifstar{#1}{#2}}
\makeatother

Lưu ý rằng các lệnh \makeatletter và \makeatother không


thể được đưa vào các tệp lớp và gói.

9.1.3 Lệnh độ dài

Có các lệnh mang kích thước chiều dài. Những cái gọi là
các lệnh về độ dài. Ví dụ là \textwidth (chiều rộng khuôn văn
bản), \textheight hoặc \pagegoal (chiều cao khuôn văn bản) và
\pagetotal (khoảng cách giữa đường cơ sở của vị trí hiện tại và
đường cơ sở của dòng đầu tiên). Các lệnh sau có thể được sử
dụng để xử lý các lệnh độ dài:
\newlength{<lệnh độ dài mới>}

Xác định một lệnh độ dài mới. Giá trị mặc định của nó là
0pt. Ví dụ
\newlength {\mylength}.
\setlength{<lệnh độ dài>}{<độ dài>}

Giá trị của <lệnh độ dài> sẽ là <độ dài>. Ví dụ


\setlength{\boxheight}{2cm} Trong trường hợp này, giá trị
của chiều dài được xác định trước đó sẽ là 2 cm.
\setlength{<lệnh độ dài>}{<độ dài> plus <độ dài1> minus <độ
dài2>}

Đặt <lệnh độ dài> thành một kích thước linh hoạt. Ví dụ


\setlength {\boxheight} {15pt plus 7pt minus 3pt}
\setlength {<lệnh độ dài>}{<lệnh độ dài khác>}

Lệnh <lệnh độ dài> tiếp nhận giá trị của <lệnh độ dài khác>.
Ví dụ
\setlength {\mylength} {\textwidth}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.1. Mã hóa ASCII và mã danh mục 327

\setlength{<lệnh độ dài>} {<số nhân><lệnh độ dài khác>}

<lệnh độ dài>=<số nhân>.<lệnh độ dài khác>. Nếu nhân với


chiều dài đàn hồi, nó trở nên không co giãn. Ví dụ
\setlength{\mylength}{0,3\textwidth}
\settowidth {<lệnh độ rộng>} {<văn bản>}

Lệnh <lệnh độ rộng> chiếm chiều rộng của <văn bản>.


\settoheight{<lệnh độ cao>}{<văn bản>}

Lệnh <lệnh độ cao> chọn chiều cao của <văn bản> (chiều cao
của phần trên đường cơ sở).
\settodepth{<lệnh độ sâu>}{<văn bản>}

Lệnh <lệnh độ sâu> lấy độ sâu của <văn bản> (độ cao bên dưới
đường cơ sở).
\addtolength{<độ dài>}{<số đơn vị thêm>}

Tăng giá trị của lệnh <độ dài> bằng <độ dài cũ>+<số đơn vị th
êm>. "Chiều dài" cũng có thể âm, dẫn đến giảm. (Độ dài linh
hoạt cũng có thể được thêm vào.)
\the<lệnh độ dài>

cho giá trị hiện tại của <lệnh độ dài> được đo bằng pt. Ví dụ
\the\textwidth
\uselengthunit{<đơn vị>}\printlength{<lệnh độ đài>} (
printlen.sty).

Chỉ định giá trị hiện tại của <lệnh độ đài> được đo bằng
<đơn vị>. Ví dụ
\uselengthunit{cm}\printlength{\paperwidth}

7 Ví dụ 9.2 8
\newlength{\hossz}
\newlength{\melyseg}
\settoheight{\hossz}{vizsga}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


328 Chương 9. Lập trình trong LATEX

\settodepth{\melyseg}{vizsga}
Chiều cao của từ kiểm tra \the\hossz, chiều sâu \the\
melyseg,
và tổng của chúng là \addtolength{\hossz}{\melyseg}\the\
hossz.
: 2
Chiều cao của từ kiểm tra 8.538pt, chiều sâu 2.502pt, và
tổng của chúng là 11.04pt.

9.2 Bộ đếm

Bộ đếm LATEX lưu trữ các số nguyên. Các bộ đếm tích hợp
là:

part số phần
chapter số chương
section số đoạn
subsection số tiểu đoạn
subsubsection số tiểu đoạn nhỏ
paragraph tiểu mục
subparagraph tiểu mục nhỏ
tocdepth độ sâu của mục lục
secnumdepth số độ sau của tiểu đoạn
page số trang
equation số phương trình
figure số hình
table số bảng
enumi số danh sách cấp 1

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.2. Bộ đếm 329

enumii số danh sách cấp 2


enumiii số danh sách cấp 3
enumiv số danh sách cấp 4
footnote số chú thích
mpfootnote số chú thích trong môi trường minipage

Một môi trường giống như định lý được tạo bằng lệnh \
newtheorem cũng tạo ra một bộ đếm. Ví dụ: nếu một môi trường
giống như mục lemma được xác định, một bộ đếm lemma cũng
được tạo để đánh số nó.
Các lệnh được sử dụng để quản lý bộ đếm:
\newcounter{<số đếm mới>}

Xác định một bộ đếm mới. Giá trị mặc định là 0.


\newcounter{<số đếm mới>}[<số đếm>]

Xác định một bộ đếm mới. Giá trị mặc định là 0. Nếu giá trị
của <bộ đếm> thay đổi, giá trị của <bộ đếm> mới được đặt lại về
0.
\setcounter{<số đếm>}{<một số>}

Giá trị của <số đếm> sẽ là <một số>.


\addtocounter{<số đếm>}{<một số>}

Tăng giá trị của <số đếm> bằng giá trị của <một số>, có thể là số
âm.
\stepcounter{<số đếm>}

Tăng giá trị của <số đếm> lên 1.


\refstepcounter{<số đếm>}

Tăng giá trị của <số đếm> lên 1 và nếu sau đó chúng ta đặt một
nhãn bằng lệnh \label, thì tham chiếu đến nó bằng lệnh \ref
sẽ in ra giá trị của <số đếm> tại đây.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


330 Chương 9. Lập trình trong LATEX

\value{<số đếm>}

Nó có thể được sử dụng để chuyển giá trị của <số đếm>. Ví dụ


\setcounter{secnumdepth} {\value {tocdepth}} khiến
secnumdepth nhận giá trị hiện tại của tocdepth.
\multiply\value{<số đếm>} với <một số>

Nhân giá trị của <số đếm> với <một số>.


\divide\value{<số đếm>}<một số>

Chia giá trị của <số đếm> cho <một số> và lấy toàn bộ.
\arabic{<số đếm>}

Hiển thị giá trị của <số đếm> bằng chữ số Ả Rập.
\Roman{<số đếm>}

Hiển thị giá trị của <số đếm> bằng chữ số La Mã lớn.
\roman{<số đếm>}

Hiển thị giá trị của <số đếm> bằng các chữ số La Mã nhỏ.
\Alph{<số đếm>}

Hiển thị giá trị của <số đếm> với đánh số chữ và số lớn.
\alph{<số đếm>}

Hiển thị giá trị của <số đếm> bằng cách đánh số chữ và số nhỏ.
\fnsymbol{<số đếm>}

Để hiển thị giá trị của <số đếm> với các ký hiệu: *, †, ‡, S,
¶, ∥, **, ††, ‡‡.
\the<số đếm>

Lệnh này được xác định khi tạo <số đếm>, nó dịch giá trị của
<số đếm> sang tiếng Ả Rập. đánh số. Ví dụ, nó có thể được định
nghĩa lại như sau:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.2. Bộ đếm 331

\renecommand{\thepage}{\roman{page}}

hoặc
\refreshcommand{\thesubsection}{\thesection.\arabic{
subsection}}
\@addtoreset {<số đếm 1>}{<số đếm 2>}
\counterwithin*{<số đếm 1>}{<số đếm 2>}

Đối với cả hai lệnh, nếu giá trị của <số đếm 2> thay đổi, giá
trị của <số đếm 1> đặt lại về 0.
\counterwithin{<số đếm 1>}{<số đếm 2>}
\numberwithin{<số đếm 1>}{<số đếm 2>} (trong amsmath.sty)

Đối với cả hai lệnh, nếu giá trị của <số đếm 2> thay đổi, giá
trị của <số đếm 1> được đặt lại và hiệu ứng của \the<số đếm 1>
là \the<số đếm 2>. \arabic{<số đếm 1>}.
\counterwithout{<số đếm 1>}{<số đếm 2>}

Sau đó, giá trị của <số đếm 1> không được đặt lại nếu <số đếm
2> thay đổi và Hiệu ứng của \the<số đếm 1> sẽ là \arabic{<số
đếm 1>}.

\counterwithout*{<số đếm 1>}{<số đếm 2>}

Nó có tác dụng tương tự như phiên bản không có *, nhưng


trong trường hợp này, \the<số đếm 1>.
Một số ví dụ:
7 Ví dụ 9.3 8: 2
\newcounter{szamAA} 1.2; 2.0
\newcounter{szamBB}
\numberwithin{szamBB}{szamAA}
\stepcounter{szamAA}
\setcounter{szamBB}{2}
\theszamBB;
\stepcounter{szamAA}
\theszamBB

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


332 Chương 9. Lập trình trong LATEX
7 Ví dụ 9.4 8: 2
\newcounter{egyik} V và II phép nhân
\newcounter{masik} X.
\newcounter{szorzat}
\setcounter{egyik}{5}
\setcounter{masik}{2}
\setcounter{szorzat}{\value{egyik}}
\Roman{egyik} và \Roman{masik} phép
nhân
\multiply\value{szorzat}by\value{
masik}
\Roman{szorzat}.

7 Ví dụ 9.5 8: ¤2
\newcounter{szamA} 44
£
886 = 2015 · 100
\newcounter{szamB}
\newcounter{szamC}
\setcounter{szamA}{2015}
\setcounter{szamB}{44}
\setcounter{szamC}{\value{szamA}}
\multiply\value{szamC} by \value{
szamB}
\divide\value{szamC} by 100
$\theszamC=\left[\theszamA\cdot
\frac{\theszamB}{100}\right]$

9.3 Kiểm soát định hướng

9.3.1 Định hướng có điều kiện

Các lệnh điều khiển \if ... \else ... \fi


\if<biểu thức lôgic> <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy thuộc vào việc hai ký
tự đầu tiên trong kết quả <biểu thức lôgic> có giống nhau hay
không.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.3. Kiểm soát định hướng 333

7 Ví dụ 9.6 8: 2
\if11(a)\else(b)\fi (a)
(b)
\if12(a)\else(b)\fi
7 Ví dụ 9.7 8: 2
\def\parancs{11} (a)
\if\parancs(a)\else(b)\fi (b)

\def\parancs{12}
\if\parancs(a)\else(b)\fi

Trong ví dụ trước, \def định nghĩa một lệnh \parancs kết


quả đầu tiên là 11 rồi đến 12.
Trong các câu lệnh kiểu \if ... \else ... \fi, phần \else
... có thể bị bỏ qua nếu bạn không kiểm tra trường hợp điều
kiện không được đáp ứng.
7 Ví dụ 9.8 8: 2
\if11(a)\fi (a)
(c)
\if12(b)\fi(c)

\ifx<mã 1><mã 2> <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy theo kết quả của <mã 1> và
<mã 2> có giống nhau hay không.
7 Ví dụ 9.9 8: 2
\def\parancsA{aaa} (a)(d)
\def\parancsB{aaa}
\def\parancsC{ccc}
\ifx\parancsA\parancsB(a)\else(b)\fi
\ifx\parancsA\parancsC(c)\else(d)\fi

\ifx\@onlypreamble\@notprerr <true> \else <false> \fi

Kết quả là <true> hoặc <false> cho dù mã này nằm trong nội
dung tài liệu hay là ở phần mở đầu.
\ifnum<điều kiện số> <true> \else <false> \fi

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


334 Chương 9. Lập trình trong LATEX

Kết quả sẽ là <true> hoặc <false> tùy thuộc vào việc "điều kiện
số" có được đáp ứng hay không.
7 Ví dụ 9.10 8: 2
\ifnum\value{page}>10(a)\else(b)\fi (a)

\ifodd<số nguyên> <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy theo giá trị của <số nguyên>
là lẻ hay chẵn.
7 Ví dụ 9.11 8: 2
\ifodd\value{page}(a)\else(b)\fi (b)

\ifdim<điều kiện độ dài> <true> \else <false> \fi

Kết quả sẽ là <true> hoặc <false> tùy thuộc vào việc đáp ứng
<điều kiện độ dài> hãy xem:
7 Ví dụ 9.12 8: 2
\ifdim 1in<2cm(a)\else(b)\fi (b)
(a)
\ifdim\textwidth<\textheight(a)\else(
b)\fi

\ifmmode <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy thuộc vào việc chúng ta có
đang ở chế độ toán học hay không.
7 Ví dụ 9.13 8: 2
$2\ifmmode^4\else\textsuperscript5\fi 24 25
$
2\ifmmode^4\else\textsuperscript5\fi

\ifpdf<true> \else <false> \fi (trong iftex.sty)

Kết quả là <true> hoặc <false> khi pdflatex có phải là trình


biên dịch hay không.
\ifdefined<lệnh> <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy thuộc vào việc <lệnh> có
được xác định hay không.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.3. Kiểm soát định hướng 335

7 Ví dụ 9.14 8: 2
(\ifdefined\section a\else b\fi) (a)

\ifdefined\date<ngôn ngữ> <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy thuộc vào việc gói babel.sty
hoặc polyglossia.sty có tải “vào” hay không.
\if@twoside <true> \else <false> \fi

Kết quả là <true> hoặc <false> tùy thuộc vào việc bạn có tải
lớp tài liệu với tùy chọn hai mặt hay không.
\ifcase<số nguyên> <0>\or<1>\or<2>\or...\or<n>\else <n +> \
fi

Ví dụ, nếu giá trị của <số nguyên> là 2, thì kết quả là <2>, trong
khi nếu nó lớn hơn <n>, thì <n +>.
7 Ví dụ 9.15 8: 2
\ifcase\value{page} zero \or một nhiều
\or hai \else nhiề
u \fi
7 Ví dụ 9.16 8: 2
\begingroup chủ nhật
\newcounter{szam}\setcounter{szam}{7}
\ifcase\value{szam}\or
thứ hai \or thứ ba \or thứ tư \or thứ
năm
\or thứ sáu \or thứ bảy \or chủ nh
ật \fi
\endgroup

Định nghĩa một lệnh mới kiểu \if ... \else ... \fi
\newif\if<tên lệnh>

giá trị mặc định của nó là false, nghĩa là sau đó


\if<tên lệnh><true> \else <false> \fi

kết quả là <false>. Đây là cách đặt nó thành <true>:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


336 Chương 9. Lập trình trong LATEX

\<tên lệnh>true

(Điều này có hiệu ứng cục bộ, có nghĩa là được đưa ra trong
một khối, hiệu ứng này không có hiệu lực bên ngoài khối. Bên
ngoài một khối, nó sẽ có ảnh hưởng, tức là nó sẽ trở thành toàn
cục, nếu bạn đặt lệnh \global trước nó.) thì
\if<tên lệnh> <true> \else <false> \fi

Kết quả là <true>. Đặt lại thành sai:


\<tên lệnh>false

(Điều này có tác dụng cục bộ. Để sử dụng toàn cầu, hãy đặt
trước lệnh \global.)
7 Ví dụ 9.17 8: 2
\newif\ifproba (b)(c)(f)
\ifproba(a)\else(b)\fi
\probatrue\ifproba(c)\else(d)\fi
\probafalse\ifproba(e)\else(f)\fi

Các loại câu lệnh điều kiện khác


\@ifnextchar<ký tự> {<true>} {<false>}

Kết quả là <true> hoặc <false> tùy thuộc vào việc ký tự đầu
tiên tiếp theo có phải là <ký tự> hay không.
7 Ví dụ 9.18 8: 2
\makeatletter (ac)
(\@ifnextchar c {a}{b}c)
\makeatother

\@ifstar{<true>}{<false>}

Kết quả là <true> hoặc <false> tùy thuộc vào ký tự đầu tiên
tiếp theo có phải là * hay không. Nếu *, nó hấp thụ nó.
7 Ví dụ 9.19 8: 2
\makeatletter (a) (bx)
(\@ifstar{a}{b}*) (\@ifstar{a}{b}x)
\makeatother

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.3. Kiểm soát định hướng 337

\@ifundefined{<tên lệnh chung>} {<true>} {<false>}

Kết quả là <true> hoặc <false> tùy theo việc <tên lệnh chung>
là không xác định hoặc được xác định.
7 Ví dụ 9.20 8: 2
\makeatletter (b)
(\@ifundefined{section}{a}{b})
\makeatother

vì phần \section được xác định.


\@ifclassloaded{<class>} {<true>} {<false>}

Kết quả là <true> hoặc <false> tùy thuộc vào việc bạn có tải
lớp tài liệu <class> hay không. Chỉ có thể được sử dụng trong
phần mở đầu!
\@ifpackageloaded{<gói lệnh>} {<true>} {<false>}

Kết quả là <true> hoặc <false> cho dù <gói lệnh> đã được tải
trước đó hay chưa. Chỉ có thể được sử dụng trong phần mở đầu!
\IfLanguageName{<ngôn ngữ>} {<true>} {<false>} (trong
iflang.sty)

Kết quả là <true> hoặc <false> tùy thuộc vào việc <ngôn ngữ> có
hoạt động hay không.
\IfFileExists {<tệp>} {<true>} {<false>}

Kết quả là <true> hoặc <false> tùy thuộc vào việc <tệp> có tồn
tại hay không.
\InputIfFileExists{<file>} {<true>} {<false>}

Nếu <file> tồn tại, kết quả là <true> và sau đó đọc <false>, nếu
không kết quả là <false>
Sử dụng gói ifthen.sty
\ifthenelse{<điều kiện>} {<true>} {<false>} (trong ifthen
.sty)

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


338 Chương 9. Lập trình trong LATEX

Kết quả là <true> hoặc <false> tùy theo <điều kiện> là đúng
hay sai.
\isodd{<một số>} (trong ifthen.sty)

Giá trị của nó đúng hay sai tùy theo giá trị của <một số> là lẻ
hay chẵn.
\lengthtest{<điều kiện độ dài>} (trong ifthen.sty)

Giá trị của nó là đúng hay sai tùy theo <điều kiện độ dài> là
đúng hay sai.
\equal{<text1>}{<text2>} (trong ifthen.sty)

Giá trị của nó sẽ đúng hoặc sai tùy thuộc vào việc <text1> và
<text2> giống nhau hay sem.
\not <điều kiện> (trong ifthen.sty)

Giá trị của nó là đúng hay sai tùy theo <điều kiện> là sai hay
đúng.
<điều kiện 1> \and <điều kiện 2> (trong ifthen.sty)

Giá trị của nó chỉ đúng nếu cả <điều kiện 1> và <điều kiện 2>
đều đúng.
<điều kiện 1> \or <điều kiện 2> (trong ifthen.sty)

Giá trị của nó chỉ đúng nếu một trong <điều kiện 1> hoặc <điề
u kiện 2> là true.
\(<điều kiện>\) (trong ifthen.sty)

Dấu ngoặc đơn điều khoản.


\newboolean {<biến lôgic mới>} (trong ifthen.sty)

Xác định một công tắc logic mới. Mặc định này sai.
\setboolean{<biến lôgic>}{<giá trị lôgic>} (trong ifthen
.sty)

Đặt giá trị của <biến lôgic>. Giá trị lôgic có thể sai hoặc đúng
(thật).

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.3. Kiểm soát định hướng 339

\boolean{<biến lôgic>} (trong ifthen.sty)

Chỉ định giá trị của <biến lôgic>.


Hãy xem một số ví dụ về việc sử dụng các lệnh trước:
7 Ví dụ 9.21 8: 2
\newcounter{szamm} (b) (d)
\setcounter{szamm}{2}
\ifthenelse{\value{szamm}<2}{(a)}{(b)
}
\ifthenelse{\isodd{szamm}}{(c)}{(d)}

7 Ví dụ 9.22 8: 2
\ifthenelse{\lengthtest{ (a)
\textwidth<\textheight}}{(a)}{(b)}

7 Ví dụ 9.23 8: 2
\ifthenelse{\equal{haj}{háj}}{(a)}{(b (b)
)}

7 Ví dụ 9.24 8: 2
\newboolean{kapcsolo} (b) (c) (f)
\ifthenelse{\boolean{kapcsolo}}{(a)}{
(b)}
\setboolean{kapcsolo}{true}
\ifthenelse{\boolean{kapcsolo}}{(c)}{
(d)}
\setboolean{kapcsolo}{false}
\ifthenelse{\boolean{kapcsolo}}{(e)}{
(f)}

9.3.2 Chu kỳ lặp

Các lệnh sau là câu lệnh lặp nội bộ:


\@whilenum<điều kiện số> \do {<mã lệnh>}

Thực thi <mã lệnh> miễn là tồn tại <điều kiện số>.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


340 Chương 9. Lập trình trong LATEX

7 Ví dụ 9.25 8: 2
\begingroup 1 2 3 4 5 6 7 8 9 10
\makeatletter
\newcounter{szamc}
\@whilenum\theszamc<10
\do{\stepcounter{szamc}\theszamc\ }
\makeatother
\endgroup

\@for\parancs: = {<list1>, <list2>, ...} \do {<mã lệnh>}

Thực thi <mã lệnh> trên các mục danh sách. Ví dụ


7 Ví dụ 9.26 8: 2
\makeatletter Mặt trời đứng dậy,
\@for\mitcsinal:={đứng dậy, lặn xuống lặn xuống .
}
\do{Mặt trời \mitcsinal.}
\makeatother

Sử dụng lệnh \@for trong nội dung tài liệu xung đột với tùy
chọn defaults = english trong tệp english.ldf. (Không có vấn
đề gì với phần mở đầu.) Một giải pháp khả thi là xác định lại
lệnh \@for trong nội dung tài liệu:
\makeatletter
\long\def\@for#1:=#2\do#3{%
\expandafter\def\expandafter\@fortmp\expandafter{#2}%
\ifx\@fortmp\@empty \else
\expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}
\makeatother

Bạn cũng có thể sử dụng lệnh sau thay vì lệnh \@for:


\renewcommand{\do}[1]{<m lệnh>}
\docsvlist{<list1>, <list2>, ...}! (trong etoolbox.sty)

trong đó <mã lệnh> được thay thế bằng các mục danh list #1.
7 Ví dụ 9.27 8: 2
\renewcommand{\do}[1]{Ngày #1.} Ngày đứng
\docsvlist{đứng dậy, ổn định} dậy.Ngày ổn định.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 341

Các hướng dẫn chu trình sau có thể được sử dụng mà không
có bất kỳ hạn chế nào:
\loop<code1> \ifnum<điều kiện số> <code2> \repeat

Nó giải mã mã <code1> và sau đó kiểm tra xem <điều kiện số>


có được đáp ứng hay không. Nếu vậy, nó giải thích mã <code2>
và sau đó bắt đầu lại tất cả. Nếu <điều kiện số> không được
thỏa mãn, chu kỳ sẽ bị chấm dứt.

7 Ví dụ 9.28 8
\newcounter{szamw}
\loop\theszamw \ifnum\value{szamw}<9\stepcounter{szamw}\
repeat
: 2
0123456789

\whiledo{<điều kiện số>} {<code>} (trong ifthen.sty)

Thực thi <code> miễn là tồn tại <điều kiện âm số>.

7 Ví dụ 9.29 8
\newcounter{szamz}\setcounter{szamz}{2}
\whiledo{\value{szamz}<5}{\theszamz\stepcounter{szamz}}
: 2
234

9.4 Định nghĩa macro


Lệnh \newcommand Ngoài các lệnh hiện có trong LATEX, bạn
cũng có thể định nghĩa lệnh của riêng mình bằng lệnh \
newcommand.
\newcommand {<lệnh mới>} {<mã lệnh>}

Khi đó hiệu ứng của <lệnh mới> sẽ là <mã lệnh>.

7 Ví dụ 9.30 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
342 Chương 9. Lập trình trong LATEX

\newcommand {\dhkhtn}{Đại học Khoa học Tự nhiên}


\dhkhtn
: 2
Đại học Khoa học Tự nhiên
Các lệnh tham số cũng có thể được định nghĩa:
\newcommand{<lệnh mới>}[<lệnh mới>]{<mã lệnh>}

<số tham số> có thể lên đến 9. Ví dụ: trong <mã lệnh>, bạn có
thể xem tham số 2 là #2.

7 Ví dụ 9.31 8
\newcommand{\ora}[2]{#1\textsuperscript{\underline{#2}}}
\ora{12}{45}
: 2
1245
Một lệnh tùy chọn cũng có thể được định nghĩa:
\newcommand{<lệnh mới>}[<lệnh mới>][<mặc định>]{<mã lệnh>}

Khi đó, tham số đầu tiên được coi là một tùy chọn với giá trị
mặc định là <mặc định>.

7 Ví dụ 9.32 8
\newcommand{\ora}[2][12]{#1\textsuperscript{\underline{#2}}
}
\ora{45}, \ora[13]{45}
: 2
1245 , 1345
Nếu bạn muốn xác định lại một lệnh hiện có bằng \
newcommand, trình biên dịch sẽ chỉ ra điều này và dừng lại. Điều
này rất hữu ích vì nó tránh được việc xác định lại một cách
ngẫu nhiên.
Nếu bạn muốn xác định lại nó một cách có chủ ý, hãy làm
như vậy với \refreshcommand, nó sẽ được sử dụng chính xác như
\newcommand.
Nếu bạn chỉ muốn xác định một lệnh nếu nó chưa tồn tại,
nhưng không có ý định xác định lại nó nếu nó tồn tại, hãy sử

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 343

dụng lệnh \providecommand, lệnh này sẽ được sử dụng giống hệt


như \newcommand.
Các lệnh này cũng có phiên bản dấu hoa thị: \newcommand*,
\refreshcommand* \providecommand*. Sử dụng chúng nếu đối số
lệnh không thể bao gồm nhiều hơn một đoạn văn. Cách chúng
được sử dụng giống như đối với các lệnh không có dấu sao.
Ví dụ: Ví dụ sau định nghĩa lệnh \greekalph{<số đếm>}, tương
tự như lệnh \alph{<số đếm>}

7 Ví dụ 9.33 8
\newcommand{\greekalph}[1]{\ensuremath{%
\ifcase\value{#1}\or\alpha\or\beta\or\gamma\or\delta%
\or\varepsilon\or\zeta\or\eta\or\vartheta\or\iota\or\kappa%
\or\lambda\or\mu\or\nu\or\xi\or\varphi\or\varpi\or\varrho%
\or\varsigma\or\tau\or\upsilon\or\chi\or\psi\or\omega\fi}}
\newcounter{szamd}
\setcounter{szamd}{4}
\greekalph{szamd}
: 2
δ

Chúng ta đã đề cập trước đó rằng chỉ có thể có tối đa 9 tham


số. Nếu cần một thứ gì đó, bạn có thể làm như mô tả trong ví
dụ sau:

7 Ví dụ 9.34 8
\newcommand{\vektor}[9]{%
\newcommand{\koordA}{#1}\newcommand{\koordB}{#2}%
\newcommand{\koordC}{#3}\newcommand{\koordD}{#4}%
\newcommand{\koordE}{#5}\newcommand{\koordF}{#6}%
\newcommand{\koordG}{#7}\newcommand{\koordH}{#8}%
\newcommand{\koordI}{#9}\vektorfolyt}

\newcommand{\vektorfolyt}[2]{%
\newcommand{\koordJ}{#1}\newcommand{\koordK}{#2}%
$(\koordA,\koordB,\koordC,\koordD,\koordE,\koordF,
\koordG,\koordH,\koordI,\koordJ,\koordK)$}

\vektor{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}
tọa độ thứ hai \koordB.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


344 Chương 9. Lập trình trong LATEX

: 2
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) tọa độ thứ hai 2.

Khi đó lệnh \vector sẽ có 9 + 2 = 11 tham số.


Tham chiếu đến đối số định nghĩa nội bộ
Bạn có thể định nghĩa một lệnh khác trong định nghĩa của
một lệnh. Để không nhầm lẫn các tham chiếu đến các đối số
của định nghĩa bên ngoài và bên trong, định nghĩa sau phải là
##1, ##2, v.v. được đánh dấu theo cách này.

7 Ví dụ 9.35 8
\newcommand{\irogep}[1]{\renewcommand{\emph}[1]{\underline{
##1}}%
\texttt{#1}}
\irogep{Hòn đá \emph{nâng lên}.}
: 2
Hòn đá nâng lên.

Lệnh \NewDocumentCommand: Cung cấp một tùy chọn định nghĩa


lệnh linh hoạt hơn nhiều so với \newcommand.
\NewDocumentCommand{<lệnh mới>}{<đối số chỉ ra>}{<mã lệnh>}
(trong xparse.sty)

Nó phải được chỉ định trong <đối số chỉ ra> cho các đối số của
<lệnh mới> số lượng, loại, thứ tự. Các tham số được ghi vào đối
số - tương tự như cho đến nay - #1, #2, ..., #9 có thể được
tham chiếu trong <mã lệnh>. Các đối số Các thông số kỹ thuật

•m R
chỉ ra loại có thể như sau:
Đối số bắt buộc là một mã thông báo duy nhất hoặc
nhiều mã thông báo giữa { và }.

7 Ví dụ 9.36 8
\NewDocumentCommand{\ora}{mm}{#1\textsuperscript{\underline
{#2}}}
\ora{13}{45}
: 2

R
1345
• r<token1><token2> Tương tự như m, nhưng sau đó các

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 345

dấu phân cách sẽ là <token1> và <token2> thay vì { và }.

7 Ví dụ 9.37 8
\NewDocumentCommand{\ora}{mr()}{#1\textsuperscript{\
underline{#2}}}
\ora{13}(45)
: 2

R
1345
• O{<mặc định>}Đối số tùy chọn được chỉ định giữa [và].
Nếu bạn không nhập nó, <mặc định> sẽ có hiệu lực.

7 Ví dụ 9.38 8
\NewDocumentCommand{\ora}{mO{00}}{#1\textsuperscript{\
underline{#2}}}
\ora{13} \ora{13}[45]
: 2

R
1300 1345
•v Nguyên văn đối số. Điều này cho phép bạn xác định
các lệnh tương tự như \lstinline, nhưng ở đây {và} cũng có thể
chứa các dấu phân cách.

7 Ví dụ 9.39 8
\NewDocumentCommand{\myverb}{v}{\color{red}\texttt{#1}}
\myverb{\color{red}\texttt{#1}}
\myverb+\lstinline|\par|+
: 2
\color{red}\texttt{#1} \lstinline|\par|
Tương tự như lệnh \newcommand*, các đặc tả này có thể được
sử dụng để xác định các đối số đoạn đơn. Nếu bạn viết dấu +
trước bất kỳ dấu nào trong số chúng, đối số có thể bao gồm một
số đoạn (+m, +r(), +O{1}, +v, v.v.). Ví dụ

7 Ví dụ 9.40 8
\NewDocumentCommand{\foo}{+m}{\color{red} #1}
\foo{văn bản \par văn bản}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
346 Chương 9. Lập trình trong LATEX
văn bản
văn bản
Ngoài ra còn có một thông số kỹ thuật đặc biệt giúp bạn dễ
dàng xác định phiên bản sao của lệnh. Đối với điều này, đặc
điểm kỹ thuật đầu tiên phải là s. Sau đó, nó được đặt trong
<mã>
\IfBooleanTF{#1}{<true>} {<false>}
trong trường hợp là một lệnh, phiên bản dấu hoa thị của
lệnh định nghĩa trên được biểu thị là "true" và ngược lại là
"false".

7 Ví dụ 9.41 8
\NewDocumentCommand{\ora}{smm}{%
\IfBooleanTF{#1}{#2\textsuperscript{\underline{#3}}}{#2:#3}
}
\ora{13}{45}
\ora*{13}{45}
: 2
13:45 1345
Nếu bạn muốn xác định lại một lệnh hiện có với \
NewDocumentCommand, thì quá trình biên dịch sẽ dừng lại do lỗi.
Nếu bạn muốn xác định lại một lệnh có chủ đích, hãy làm như
vậy với \RenewDocumentCommand. Nếu bạn chỉ muốn xác định một
lệnh nếu nó chưa tồn tại, nhưng nếu bạn không muốn xác
định lại nó, hãy sử dụng lệnh \ProvideDocumentCommand. Nếu
bạn muốn xác định một lệnh trong mọi trường hợp, cho dù nó
đã tồn tại hay chưa, hãy sử dụng lệnh \DeclareDocumentCommand.
Chúng phải được sử dụng giống như lệnh \NewDocumentCommand.
Lệnh \def và \edef : Bạn cũng có thể tạo các lệnh mới bằng
lệnh \def, lệnh này cũng có thể được sử dụng trong Plain TEX,
nhưng điều này không cho biết bạn có đang định nghĩa lại một
lệnh hiện có hay không.

7 Ví dụ 9.42 8
\def\ora#1#2{#1\textsuperscript{\underline{#2}}}
\ora{12}{45}
: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
9.4. Định nghĩa macro 347

1245

7 Ví dụ 9.43 8
\def\ora(#1.#2){#1\textsuperscript{\underline{#2}}}
\ora(12.45)
: 2
1245

7 Ví dụ 9.44 8
\def\FirstUppercase#1{\MakeUppercase#1}
\FirstUppercase{Nguyễn} \FirstUppercase{{á}nh}
: 2
Nguyễn Ánh
Đối số của lệnh được định nghĩa bởi \def chỉ có thể chứa một
đoạn, như trong trường hợp của \newcommand*. Để giải quyết
hạn chế này, hãy nhập \long vào trước \def. Trong các định
nghĩa nội bộ ở đây cũng có ##1, ##2, v.v. chúng ta sử dụng các
liên kết. Nếu bạn muốn macro trong định nghĩa lệnh hoạt động
theo các giá trị tại thời điểm định nghĩa, hãy sử dụng \edef.

7 Ví dụ 9.45 8
\newcounter{szamx}
\def\szamkiir{\theszamx}
\edef\kiirszam{\theszamx}
\setcounter{szamx}{1}
\szamkiir\kiirszam
: 2
10
Nếu bạn không muốn macro hiển thị với các giá trị ở định
nghĩa khi bạn sử dụng \edef, hãy nhập \noexpand.

7 Ví dụ 9.46 8
\newcounter{szamv}
\edef\kiirszam{\noexpand\theszamv\theszamv}
\setcounter{szamv}{1}
\kiirszam
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
348 Chương 9. Lập trình trong LATEX

10
Các ví dụ thêm.
1. Tham số thứ hai của lệnh \ora được định nghĩa trong ví
dụ sau là tùy chọn, với giá trị mặc định là 00:

7 Ví dụ 9.47 8
\makeatletter
\def\@ora#1[#2]{#1\textsuperscript{#2}\ }
\def\ora#1{\@ifnextchar[{\@ora#1}{\@ora#1[00]}}
\makeatother
\ora{11}
\ora{11}[15]
: 2
1100 1115
2. Tham số đầu tiên của lệnh \ result được định nghĩa trong
ví dụ sau là tùy chọn, giá trị mặc định là tham số thứ hai:

7 Ví dụ 9.48 8
\makeatletter
\def\@eredmeny[#1]#2{\textbf{#1}\,:\,\textbf{#2}}
\def\@@eredmeny#1{\@eredmeny[#1]{#1}}
\def\eredmeny{\@ifnextchar[{\@eredmeny}{\@@eredmeny}}
\makeatother
\eredmeny{1}\\
\eredmeny[5]{0}
: 2
1:1
5:0
3. Chúng ta không cần tính toán số tiền bằng các macro
sau:

7 Ví dụ 9.49 8
\newcounter{szumma}
\def\szummatag#1{\addtocounter{szumma}{#1}#1}
\def\szumma{\theszumma\setcounter{szumma}{0}}

Tổng của \szummatag{1234} và \szummatag{367} là \theszumma.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 349

: 2
Tổng của 1234 và 367 là 1601.
Trình bầy đẹp hơn
7 Ví dụ 9.50 8: 2
\def\szummatag#1{\addtocounter{szumma
}{#1}#1}
12345
\def\szumma{\theszumma\setcounter{ 1234
szumma}{0}}
\begin{tabular}{@{}r@{}r@{}} + 123
&\szummatag{12345}\\
15303
&\szummatag{1234}\\
+&\szummatag{123}\\
\hline
&\szumma
\end{tabular}

4. Trong ví dụ sau, chúng ta xác định lệnh


\ifdivible {<number1>} {<number2>} {<true>} {<false>}, kết
quả của nó là <true> hoặc <false> tùy thuộc vào việc <number1>
là chia hết cho <number2>.

7 Ví dụ 9.51 8
\newcounter{checknum}
\def\ifdivisible#1#2#3#4{%
\setcounter{checknum}{#1}%
\divide\value{checknum}by#2\relax%
\multiply\value{checknum}by#2\relax%
\ifnum\value{checknum}=#1\relax#3\else#4\fi}

\ifdivisible{20449}{143}{Chia hết!}{Không chia hết!}


: 2
Chia hết!
5. Trong phần sau, chúng ta định nghĩa lệnh \lentounit{<
length>}, kết quả là <length> tính bằng cm.

7 Ví dụ 9.52 8
\makeatletter
\newlength{\unit}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


350 Chương 9. Lập trình trong LATEX

\setlength{\unit}{1cm}
\def\lentounit#1{\strip@pt\dimexpr#1*\p@/\unit}
\makeatother

1\,inch = \lentounit{1in}\,cm
: 2
1 inch = 2.54 cm
6. Ví dụ sau đây là của Donald Ervin Knuth (xem [4]):
Định nghĩa lệnh \primes{<số>}, in ra <số> nguyên tố đầu
tiên, trong đó <số> ít nhất là 2. Ví dụ: 50 số nguyên tố đầu tiên
có thể được liệt kê như sau:

7 Ví dụ 9.53 8
\newif\ifprime \newif\ifunknown
\newcount\n \newcount\p \newcount\d \newcount\a
\def\primes#1{2,~3\n=#1 \advance\n by-2 \p=5
\loop\ifnum\n>0 \printifprime\advance\p by2 \repeat}
\def\printp{, \number\p \advance\n by -1 }
\def\printifprime{\testprimality \ifprime\printp\fi}
\def\testprimality{{\d=3 \global\primetrue
\loop\trialdivision \ifunknown\advance\d by2 \repeat}}
\def\trialdivision{\a=\p \divide\a by\d
\ifnum\a>\d \unknowntrue\else\unknownfalse\fi
\multiply\a by\d
\ifnum\a=\p \global\primefalse\unknownfalse\fi}

\primes{50}
: 2
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191,
193, 197, 199, 211, 223, 227, 229
Lệnh mở rộng \expandafter
1. Khi xác định một lệnh với \edef, chúng ta thấy rằng việc
thực thi ngay lập tức một macro có thể bị ngăn chặn bằng lệnh
\noexpand. Một lệnh khác để kiểm soát macro được gọi là
\expandafter

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 351

Nó bỏ qua mã thông báo tiếp theo, lấy mã thông báo tiếp


theo (nếu đó là macro đối số, nó cũng nhận các đối số) và sau
đó mở rộng nó theo chiều sâu. Sau đó, nó quay trở lại mã thông
báo đã bỏ qua và đặt nó trước phần được giải thích. Ví dụ

7 Ví dụ 9.54 8
\def\a{\b}
\def\b{c}
\a
\string\a
\expandafter\string\a
: 2
c\a\b
Sau đó, giải thích của \a (đầy đủ cả bên trong) c. Đối với
\string\a, tác dụng \string lên \ sẽ xuất hiện trong pdf theo
sau là một chữ cái. \expandafter\string\a Trong trường hợp
này, \expandafter bỏ qua lệnh \string theo sau nó sau \a mở
rộng lệnh đến bên trong \b. Sau đó đặt chuỗi \string đã bỏ qua
trước nó. Vì vậy, bây giờ \string\b sẽ được trích xuất, đó là \b.
Vì vậy, kết quả của mã trước đó là c\a\b như trên.
2. Ví dụ sau dành cho lệnh \newgeometry trong gói hình học
geometry.sty, đó là mong đợi cài đặt hình học trang tính như
được giải thích. Ví dụ
\newgeometry{top=3cm}
Nếu top = 3cm được lưu trữ trong một lệnh, lệnh này không
thể được nhập trực tiếp vào \newgeometry vì nó không được giải
thích bởi \newgeometry trước khi phân tích cú pháp. Đó là, đoạn
mã sau sẽ chỉ ra lỗi:
\def\foo{top=3cm}
\newgeometry{\foo}

Giải pháp như sau:


\def\foo{top=3cm}
\expandafter\newgeometry\expandafter{\foo}

Trong giải pháp này, cần phải có \expandafter đầu tiên vì nếu
không \newgeometry sẽ coi \expandafter-t tiếp theo là một đối
số, điều này sẽ dẫn đến lỗi. Hoạt động của đoạn mã trước

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


352 Chương 9. Lập trình trong LATEX

đó như sau: Đoạn mã đầu tiên \expandafter sau bỏ qua \


newgeometry -ttiếp theo và sau đó mở rộng lệnh thứ hai \
expandafter sau nó đến độ sâu bên trong. Thao tác này sẽ bỏ
qua { sau nó và mở rộng lệnh \foo tiếp theo sâu thêm một cấp,
là top = 3cm. Sau đó \expandafter thứ hai đặt mã thông báo
{ phía trước nó. Với điều này, \expandafter sau đó được phát
triển đến độ sâu mức, dẫn đến {top = 3cm. Bây giờ nó quay trở
lại đầu tiên \expandafter, vì nó chỉ có thể đặt \newgeometry đã
bỏ qua trước kết quả trước đó. Vì vậy, \newgeometry {top = 3cm
là kết quả. Nó vẫn còn mã thông báo }, vì vậy đặt nó ở cuối.
Sau đó
\newgeometry{top=3cm}
mã chính xác được phát triển.
3. Trong ví dụ sau, giả sử bạn có một lệnh \foo đã xác định
mà bạn muốn mở rộng với một số mã mới tại một thời điểm
nào đó. Thoạt nhìn, đây có vẻ là một giải pháp tốt:
\def\foo{a}
\def\foo{\foo b}
\foo

Nhưng trong trường hợp này, một vòng lặp vô hạn được tạo ra
khi \foo được phân tích cú pháp, vì vậy quá trình biên dịch sẽ
dừng lại với lỗi. Mã có thể được sửa chữa như sau
\def\foo{a}
\expandafter\def\expandafter\foo\expandafter{\foo b}
\foo

Ban đầu, biểu thức cho \foo là chữ a, nhưng sau dòng thứ
hai, nó được mở rộng bằng chữ b, tức là ab là kết quả. Hãy xem
tại sao. Khi bạn lần đầu tiên hiển thị \expandafter, bạn bỏ qua
lệnh \def và sau đó hiển thị lệnh \expandafter tiếp theo. Thao
tác này sẽ bỏ qua lệnh \foo sau nó và sau đó mở rộng lệnh sau
\expandafter. Thao tác này sẽ bỏ qua { token sau nó và sau đó
mở rộng lệnh \foo sau nó, bây giờ là chữ cái "a". Sau đó, lệnh
mở rộng thứ ba đặt mã thông báo { đã bỏ qua ở phía trước nó.
Lệnh \expandafter thứ hai đặt lệnh đã bỏ qua \foo trước nó,
và sau đó \expandafter đầu tiên đặt lệnh đã bỏ qua \def ở phía
trước nó. Vì vậy, đây là bản dịch:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 353

\def\foo{a
Mã b} sau đó được đặt sau nó, vì vậy nó sẽ được dịch trong
vòng thứ hai:
\def\foo{ab}
Kết quả là, biểu thức cho \foo sẽ là ab.
Trong ví dụ sau, giả sử các lệnh \aa, \bb và \cc đã được xác
định trước đó. Tại
\def\b{\bb}
\def\c{\cc}

sau
\expandafter\expandafter\expandafter\aa\expandafter\b\c
tương đương với
\aa\bb\cc
Hãy xem tại sao. Khi phần \expandafter đầu tiên được giải
thích, nó sẽ bỏ qua phần mở rộng sau nó, và sau đó mở rộng
\expandafter sau nó. Thao tác này sẽ bỏ qua lệnh \aa sau nó và
sau đó mở rộng lệnh \expandafter sau nó. Thao tác này sẽ bỏ
qua lệnh \b sau và sau đó mở rộng lệnh \c tiếp theo, \cc, ở mức
bên trong. Sau đó \expandafter thứ tư đặt lệnh \b đã bỏ qua
trước nó, \expandafter thứ ba đặt lệnh \a bị bỏ qua trước nó, và
\expandafter đầu tiên đặt lệnh thứ hai đã bỏ qua \expandafter
ở trước nó. Vì vậy, đây là bản dịch:
\expandafter\aa\b\cc
Trong lần chạy tiếp theo, khi mở rộng \expandafter, nó sẽ
bỏ qua lệnh \aa sau nó và sau đó mở rộng \b sau nó ở một mức,
là \bb. Sau đó, nó đặt \aa đã bỏ qua ở phía trước nó
\aa\bb
Sau đó, nó đặt \cc sau nó. Vì vậy, trong vòng thứ ba, bạn sẽ
giải thích điều này:
\aa\bb\cc
Chúng ta giao việc phân tích ví dụ cuối cùng cho Người đọc.
Giả sử các lệnh \aa, \bb, \cc và \dd đã được xác định trước đó.
Tại
\def\b{\bb}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


354 Chương 9. Lập trình trong LATEX

\def\c{\cc}
\def\d{\dd}

Sau

\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\aa
\expandafter\expandafter\expandafter\b
\expandafter\c\d

tương đương với


\aa\bb\cc\dd
Lệnh \let
Nếu bạn muốn đổi tên một lệnh đã xác định, hãy sử dụng
lệnh \let. Ví dụ: nếu bạn muốn lệnh \szakasz có tác dụng giống
như lệnh \section, bạn sẽ nhập:
\let\szakasz\section
Điều này hữu ích nhất nếu bạn muốn xác định lại một
lệnh đã xác định bằng cách sử dụng giải thích ban đầu của
nó. Trong trường hợp này, lệnh gốc phải được lưu với tên mới
và được sử dụng để định nghĩa lại. Ví dụ: đoạn mã sau định
nghĩa lại lệnh \section để viết hoa tiêu đề nhưng không thay
đổi trong mục lục:

\makeatletter
\let\old@section\section
\def\@szakasz[#1]#2{\old@section[#1]{\MakeUppercase{#2}}}
\def\@@szakasz#1{\old@section*{\MakeUppercase{#1}}}
\def\@@@szakasz#1{\@szakasz[#1]{#1}}
\def\section{\@ifnextchar[{\@szakasz}{\@ifstar{\@@szakasz}{
\@@@szakasz}}}
\makeatother

Tác động cục bộ và toàn cục


Hiệu ứng của \newcommand, \refreshcommand, \providecommand
, \def, \edef và \let là cục bộ. Điều này có nghĩa là một lệnh
được xác định với chúng trong một khối sẽ không có hiệu lực
bên ngoài khối. Ví dụ

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 355

7 Ví dụ 9.55 8: 2
\def\foo{A} BA
{\def\foo{B}\foo}
\foo

Nếu bạn viết \global\def thay vì \def, hoặc một phiên bản
ngắn của nó, \gdef, thì hiệu ứng sẽ là toàn cục, nghĩa là phạm
vi của nó sẽ vẫn nằm ngoài khối.
7 Ví dụ 9.56 8: 2
\def\foo{A} BB
{\gdef\foo{B}\foo}
\foo

Tương đương toàn cục của \edef là \global\edef và \xdef.


Tương đương toàn cầu của \let là \global\let.
Định nghĩa tên macro
Nếu tên của macro cần được xác định đã cần được tạo bằng
macro hoặc chứa các ký tự không thể bao gồm trong tên của
lệnh, thì mã \def<macroname> không phù hợp với định nghĩa.
Sử dụng thay thế
\@namedef{<macroname>}

hoặc tương đương mã


\expandafter\def\csname <macroname> \endcsname

Trong trường hợp thứ hai, \expandafter là ở đó vì nếu không


\def sẽ muốn xác định lại lệnh \csname hiện có. \csname và \
endcsname xác định ranh giới của tên macro. Nếu đối số có thể
chứa nhiều hơn một đoạn, các mã trước đó phải được đặt trước
bằng lệnh \long. Nếu bạn muốn có hiệu ứng toàn cục, bạn phải
đặt lệnh \global trước chúng. Do đó, macro được định nghĩa là
một
\@nameuse{<macroname>}

hoặc tương đương


\csname <macroname> \endcsname

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


356 Chương 9. Lập trình trong LATEX

cách có thể được gọi. Nếu "tên macro" không được xác định,
bạn sẽ không nhận được cảnh báo hoặc thông báo lỗi.
7 Ví dụ 9.57 8: 2
\makeatletter Chữ đậm
\@namedef{bold}#1{\textbf{#
1}}
\@nameuse{bold}{Chữ đậm}
\makeatother
7 Ví dụ 9.58 8: 2
\makeatletter Chữ đậm Chữ nghiêng
\newcounter{foo}
\stepcounter{foo}
\@namedef{foo\thefoo}#1{\
textbf{#1}}
\stepcounter{foo}
\@namedef{foo\thefoo}#1{\
textit{#1}}
\@nameuse{foo1}{Chữ đậm}
\@nameuse{foo2}{Chữ nghiêng
}
\makeatother

Di chuyển đối số, lệnh yếu và mạnh


Có những lệnh mà đối số có thể xuất hiện trong các phần
khác của tài liệu khi L A T E X đang chạy. Một ví dụ là lệnh
\section, đối số của nó có thể được ghi vào cả mục lục và tiêu
đề. Lập luận như vậy được gọi là đối số chuyển động. Trong
quá trình di chuyển, một lệnh được viết cho một đối số như vậy
có thể được thực hiện sớm hoặc không chính xác. Các lệnh như
vậy được gọi là các lệnh dễ vỡ. Nếu một lệnh không gây ra sự cố
trong bất kỳ đối số chuyển động nào, nó được gọi là lệnh mạnh
mẽ. Nếu bạn cần nhập một lệnh yếu trong một đối số chuyển
động, hãy đặt lệnh \protect trước nó.
Các thủ tục định nghĩa lệnh được mô tả cho đến nay đều có
các lệnh yếu được xác định. Để xác định một lệnh mạnh, hãy
sử dụng
\DeclareRobustCommand{<command>}[<số tham số>][<default>]{<mã l
ệnh>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 357

lệnh này sẽ được sử dụng chính xác như \newcommand, nhưng


thay vì lỗi, nó chỉ gửi một thông báo cảnh báo nếu bạn định
nghĩa lại một lệnh hiện có. Cũng có một phiên bản sao của
lệnh này có thể được sử dụng nếu <mã lệnh> chắc chắn chỉ tạo
ra một đoạn văn. Để xác định một lệnh mạnh với lệnh \def,
bạn phải đặt trước lệnh \protected.
Gói etoolbox.sty cung cấp một cách tuyệt vời để xác định
các lệnh mạnh. Đây chỉ là một số tùy chọn.
\DeclareRobustCommand{<command>}[<số tham số>][<default>]{<mã l
ệnh>}

lệnh này sẽ được sử dụng chính xác như \newcommand, nhưng


thay vì lỗi, nó chỉ gửi một thông báo cảnh báo nếu bạn xác định
lại một lệnh hiện có. Cũng có một phiên bản sao của lệnh này
có thể được sử dụng nếu <mã lệnh> chắc chắn chỉ tạo ra một
đoạn văn. Để xác định một lệnh mạnh với lệnh \def, bạn phải
đặt trước lệnh \protected.
Gói etoolbox.sty cung cấp một cách tuyệt vời để định định
các lệnh mạnh. Đây chỉ là một số tùy chọn.
\newrobustcmd{<command>}[<số tham số>][<default>]{<mã lệnh>
}
(trong etoolbox.sty)

Điều này có thể được sử dụng chính xác như \


DeclareRobustCommand, nhưng nó bị lỗi khi xác định lại một lệnh
hiện có. Nó cũng có một phiên bản dấu hoa thị với mục đích
giống như \newcommand*. \<command> được xác định sẽ mạnh,
nhưng cơ chế bảo vệ của nó không được cung cấp bởi nhân
LATEX, như trong trường hợp của \DeclareRobustCommand, mà
bởi ϵ-TEX ở mức sâu hơn.
\renewrobustcmd{\<command>}[<số tham số>][<default>]{<mã lệ
nh>}
(trong etoolbox.sty)

\<command> hiện có có thể được định nghĩa lại với điều này. Lệnh
được xác định lại sẽ mạnh. Nó cũng có một phiên bản sao.
\providerobustcmd{<command>}[<số tham số>][<default>]{<mã l
ệnh>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


358 Chương 9. Lập trình trong LATEX

(trong etoolbox.sty)

Đối với \<command> không xác định, nó thực hiện tương tự như
\newrobustcmd. Nếu \<command> đã tồn tại, nó không có tác dụng
gì. Nó cũng có một phiên bản sao.
\robustify {<command>} (trong etoolbox.sty)

Chuyển đổi \<command> thành một lệnh mạnh với cơ chế bảo vệ
ϵ-TeX. Nếu \<command> có một đối số, nó sẽ không được chỉ định
trong đó.
\protecting{<mã lệnh>} (trong etoolbox.sty)

Mỗi lệnh yếu trong <mã lệnh> đều có tiền tố là \protect.


\csdef{<macronname>} (trong etoolbox.sty)

Nó giống như \@nameef{<macronname>}, nhưng đó là một lệnh


mạnh.
\csgdef {<macronname>} (trong etoolbox.sty)

Giống như \csdef, nhưng có ảnh hưởng toàn cầu.


\csedef{<macronname>} (trong etoolbox.sty)

Nó sẽ được sử dụng thay cho tên \edef\<macro> nếu tên 〈macro


tương tự như cho \@namedef. Đây là một lệnh mạnh.
\csxdef{<macronname>} (trong etoolbox.sty)

Tương tự như \csedef, nhưng có ảnh hưởng toàn cầu.


\cslet{<macroname>}{<command>} (trong etoolbox.sty)

Nó có chức năng tương tự như lệnh \let, nhưng ở đây điều


tương tự cũng áp dụng cho <macroname> cũng như cho \@namedef
. Đây là một lệnh mạnh. Để có hiệu ứng toàn cục, bạn phải đặt
trước lệnh \global.
\letcs{<command>}{<macronname>} (trong etoolbox.sty)

Tương tự như \cslet, nhưng trong đối số thứ hai này là <
macroname>.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 359

\csletcs{<macronname1>}{<macronname2>} (trong etoolbox.sty)

Tương tự như \cslet, nhưng trong cả hai đối số này đều là một
tên macro.
\undef<command> (trong etoolbox.sty)

Làm cho <command> không được xác định. Đây là một lệnh
mạnh.
\gundef<command> (trong etoolbox.sty)

Tương tự như \undef, nhưng có hiệu lực toàn cầu.


\csundef {<macronname>} (trong etoolbox.sty)

<macroname> trở thành không xác định. Đây là một lệnh mạnh.
\csgundef{<macronname>} (trong etoolbox.sty)

Giống như \csundef, nhưng có ảnh hưởng toàn cục.


Mở rộng lệnh hiện có
Một lệnh hiện có có thể được bổ sung bằng lệnh toàn cục
\g@addto@macro.
7 Ví dụ 9.59 8: 2
\def\EKE{Một loài hoa} Một loài hoa
\EKE\\ Một loài hoa đẹp
\makeatletter
\g@addto@macro\EKE{ đẹp}
\makeatother
\EKE

Nó phù hợp cho một lệnh tương tự


\apptocmd{<command>}{<mã lệnh>} {<nếu nối thành công>}} {<
không thành>}
(trong etoolbox.sty)

lệnh nối <mã lệnh> vào cuối định nghĩa <command>. Nếu điều này
thành công, nó thậm chí sẽ giải thích mã <thành công>, nếu
không thì mã nối <không thành>.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


360 Chương 9. Lập trình trong LATEX

7 Ví dụ 9.60 8: 2
\def\EKE{Một loài hoa} Một loài hoa
\EKE\\ Một loài hoa đẹp
\apptocmd{\EKE}{ đẹp}{}{}
\EKE

Bạn cũng có thể nối mã vào đầu định nghĩa lệnh hiện có
\pretocmd{<command>}{<mã lệnh>}{<nếu nối thành công>}}{<khô
ng thành>}
(trong etoolbox.sty)

7 Ví dụ 9.61 8: 2
\def\EKE{ đẹp} đẹp
\EKE\\ Một loài hoa đẹp
\pretocmd{\EKE}{Một loài
hoa}{}{}
\EKE

Thay thế một phần của lệnh hiện có


Lệnh sau cho phép điều này:
\patchcmd{<command>}{<cái gi>}{<bằng cái gì>}
{<mã thành công>} {<không thành>}
(trong etoolbox.sty)

Điều này thay thế mã "cái gì" đầu tiên trong định nghĩa "lệnh"
bằng mã "cái gì". Nếu điều này thành công, nó thậm chí sẽ giải
thích <mã thành công>, nếu không thì mã <không thành>. Ví dụ
7 Ví dụ 9.62 8: 2
\def\EKE{Một loài hoa} Một loài hoa
\EKE\\ Một loài cây
\patchcmd{\EKE}{hoa}{cây}{}
{}
\EKE

Lệnh nguyên văn mới


Chúng ta đã thấy trước đây rằng có thể định nghĩa một
lệnh kiểu nguyên văn, ví dụ, lệnh \NewDocumentCommand trong
gói xparse.sty. Một tùy chọn khác là sử dụng gói fancyvrb. Ví
dụ

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 361

\newcommand{\kod}{
\SaveVerb[
aftersave={mã:
\UseVerb[showspaces,
formatcom={\color{red}\rmfamily\bfseries},
]{kod}
}
]{kod}
}

Sau đó, lệnh \kod có thể được sử dụng giống hệt như \
lstinline, chỉ là không có phiên bản dấu sao. Ví dụ
7 Ví dụ 9.63 8: 2
\kod+$ $ \+ mã: $$\

Lệnh với đặc tả lớp phủ mới


Nếu bạn sử dụng lớp beamer.cls để tạo bản trình bày, bạn
cũng có thể xác định các lệnh với đặc tả lớp phủ của riêng bạn.
Bạn có thể sử dụng lệnh \newcommand<> hoặc \refreshcommand<>
để thực hiện việc này. Các phiên bản này hoạt động chính xác
giống như các phiên bản <> không được đánh dấu, chỉ khi có
n tham số trong định nghĩa ( n = 0, 1, ..., 9), sau đó nó được mở
rộng bởi một n + 1, trong đó đặc tả lớp phủ có thể được cung cấp
cho ta. . Ví dụ
\newcommand<>{\textblue}[1]{\textcolor #2 {blue}{#1}}
ám ảnh
\newcommand<>{\blue}{\color#1{blue}}
Giá trị mặc định cho các đặc tả lớp phủ của lệnh \textblue
và \blue được định nghĩa theo cách này là <1->. Công dụng của
chúng:
\textblue<spec>Văn bản}
\blue<spec><Văn bản>

Lệnh với một khóa mới = tùy chọn loại giá trị
Một ví dụ về lệnh như vậy là tiếp theo:
\includegraphics[width=5cm]{imagefile}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


362 Chương 9. Lập trình trong LATEX

Trong trường hợp này, trong tùy chọn width = 5cm, thông
thường gọi chiều rộng là khóa và 5cm là giá trị của khóa. Bạn
cũng có thể xác định loại lệnh này bằng một trong các gói sau:
keyval2e, expkv, expkv-def, expkv-cs, simplekv. Chúng ta sẽ
chỉ đối phó với cái sau bây giờ. Để sử dụng nó, bạn cần biết các
lệnh sau:
\setKVdefault[<setname>]{<key1>=<value1>,<key2> = <value2>,
...}
(trong simplekv.sty)

Nó khai báo <key2>, <value2>, v.v. trên <option name>. các


phím, <value1>, <value2>, v.v., tương ứng. với các giá trị mặc
định. <setname>, <key1>, <key2>, v.v. chỉ có thể chứa các chữ
cái tiếng Anh, nhưng các phím cũng có thể chứa khoảng trắng.
Nếu <value1>, <value2>, v.v. nếu một trong hai đúng hoặc sai,
khóa đó hoạt động như một khóa logic. = true có thể được bỏ
qua. Sau lệnh đầu tiên
\useKV[<option name khai báo>] {<key1>} (trong simplekv.
sty)
\useKV[<option name>] {<key2>}

kết quả là <value1>, <value2>, v.v. Ví dụ: nếu <key1> là một


khóa logic, thì
\ifboolKV[<setname>] {<key1>}{true}}{fake}} (trong simplekv
.sty)

kết quả là <true> hoặc false, với <value1> true hoặc false. Các
mặc định chính có thể được đặt lại
\setKV[<setname khai báo>] {<key1> = <value1>, <key2> = <
value2>, ...}
(trong simplekv.sty)

bằng lệnh. Nếu một khóa không có trong các tùy chọn, nó vẫn
giữ nguyên giá trị hiện tại. Để trở về các giá trị mặc định, vấn
đề
\restoreKV[<resetname>] (trong simplekv.sty)

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.4. Định nghĩa macro 363

chỉ huy.

7 Ví dụ 9.64 8
\setKVdefault[pelda]{font type=\bfseries,text={Hoa hồng},
frame}

1. \useKV[pelda]{text},
{\useKV[pelda]{font type}\useKV[pelda]{text}},
\ifboolKV[pelda]{frame}{\fbox{\useKV[pelda]{text}}}{\useKV[
pelda]{text}}

\setKV[pelda]{frame=false}
2. \ifboolKV[pelda]{frame}{\fbox{\useKV[pelda]{text}}}
{\useKV[pelda]{text}}

\setKV[pelda]{font type=\itshape,text=HOA HỒNG}


3. {\useKV[pelda]{font type}\useKV[pelda]{text}}

\restoreKV[pelda]

4. \useKV[pelda]{text},
{\useKV[pelda]{font type}\useKV[pelda]{text}},
\ifboolKV[pelda]{frame}{\fbox{\useKV[pelda]{text}}}{\useKV[
pelda]{text}}
: 2
1. Hoa hồng, Hoa hồng, Hoa hồng
2. Hoa hồng
3. HOA HỒNG
4. Hoa hồng, Hoa hồng, Hoa hồng

Biết tất cả những điều này, bây giờ thật dễ dàng để tạo
một lệnh với tùy chọn loại khóa = giá trị mới. Định nghĩa lệnh
\frametxt, lệnh này có các tác dụng sau:

7 Ví dụ 9.65 8
\setKVdefault[frame]{sep=3pt,line width=0.5pt,style=\
bfseries,inline}
\newcommand\frametxt[2][]{%
\restoreKV[frame]%

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


364 Chương 9. Lập trình trong LATEX

\setKV[frame]{#1}%
\setlength{\fboxsep}{\useKV[frame]{sep}}%
\setlength{\fboxrule}{\useKV[frame]{line width}}%
\ifboolKV[frame]{inline}{}{\begin{center}}%
\fbox{\useKV[frame]{style}#2}%
\ifboolKV[frame]{inline}{}{\end{center}}%
}

\frametxt{Hoa Hồng-1}
\frametxt[sep=5pt,style=\itshape]{Hoa Hồng-2}
\frametxt[style=\huge,inline=false]{Hoa Hồng-3}
\frametxt[line width=2pt]{Hoa Hồng-4}
: 2
Hoa Hồng-1 Hoa Hồng-2

Hoa Hồng-3
Hoa Hồng-4

9.5 Định định môi trường

9.5.1 Lệnh \newenvironment

Ngoài các môi trường hiện có của bạn trong LATEX, bạn
cũng có thể xác định môi trường của riêng mình bằng lệnh
\newenvironment:
\newenvironment{<tên>}[<Số đối số>][<mặc định>]{<mở mã>}{<đ
óng mã>}

<tên> Tên của môi trường.


<Số đối số> Số đối số. Đối số <n>-th được tham chiếu bởi
#<n>, trong đó n = 1, 2, ..., 9.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.5. Định định môi trường 365

<mặc định> Giá trị mặc định của đối số đầu tiên. Nếu điều
này được đưa ra, đối số đầu tiên sẽ là một tùy chọn.
<mở mã> Thực thi khi môi trường được mở.
<đóng mã> Thực thi khi môi trường đóng. Nó không được
chứa các tham chiếu #<n>, tức là, các đối số cho môi trường.
Bạn không thể xác định môi trường <tên> nếu môi trường
đó đã tồn tại hoặc lệnh \<tên> tồn tại. Tuy nhiên, nó có thể
được xác định nếu một bộ đếm <tên> đã tồn tại. Nếu bạn muốn
xác định lại một môi trường hiện có, bạn có thể làm như vậy
bằng lệnh \renewenvironment. Sử dụng điều này cũng giống
như sử dụng \renewenvironment.
Ví dụ: khi bạn sử dụng lệnh \newenvironment để xác định
một môi trường <tên>, bạn thực sự đang xác định hai lệnh:

\<tên> =\begin{<tên>}
\end<tên>=\end{<tên>}

Điều này giải thích tại sao không thể có tham chiếu #<n> trong
<mã đóng>.
Hãy xem một số ví dụ.

\newenvironment{rend}[1][Chương trình]
{\noindent\textbf{#1}\\[2mm]\begin{tabular}{|r|p{6cm}|}\
hline}
{\\\hline\end{tabular}\par}

Khi đó

7 Ví dụ 9.66 8
\begin{rend}
6:30 & Sau bữa sáng tập thể dục, giặt là và ăn uống. \\
7:30 & Bắt đầu làm việc. \\
\dots & \dots
\end{rend}

: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
366 Chương 9. Lập trình trong LATEX
Chương trình

6:30 Sau bữa sáng tập thể dục, giặt


là và ăn uống.
7:30 Bắt đầu làm việc.
... ...

7 Ví dụ 9.67 8
\begin {rend} [Thời gian biểu]
8:00 & Báo cáo hàng tuần, nhập nhật ký. \\
8:02 & Kiểm tra, đánh giá bài tập về nhà. \\
\dots & \dots
\end{rend}
: 2
Thời gian biểu

8:00 Báo cáo hàng tuần, nhập nhật


ký.
8:02 Kiểm tra, đánh giá bài tập về
nhà.
... ...

Nếu không có tùy chọn


\newenvironment{rend}[1]
{\noindent\textbf{#1}\\[2mm]\begin{tabular}{|r|p{6cm}|}\
hline}
{\\\hline\end{tabular}\par}

Khi đó

7 Ví dụ 9.68 8
\begin {rend}{Thời gian biểu}
8:00 & Báo cáo hàng tuần, nhập nhật ký. \\
8:02 & Kiểm tra, đánh giá bài tập về nhà. \\
\dots & \dots
\end{rend}
: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
9.5. Định định môi trường 367

Thời gian biểu

8:00 Báo cáo hàng tuần, nhập nhật


ký.
8:02 Kiểm tra, đánh giá bài tập về
nhà.
... ...

9.5.2 Lệnh \NewEnviron

Lợi thế của việc sử dụng các môi trường là nội dung của
chúng không được coi là một đối số, do đó sẽ có ít hạn chế
hơn đối với chúng. Tuy nhiên, đôi khi có thể cần sử dụng
bên trong của môi trường trong định nghĩa về môi trường.
\newenvironment không thích hợp để xác định một môi trường
như vậy. Trong trường hợp này, bạn có thể sử dụng:
\NewEnviron{<tên>}[<số đối số][<mặc định>]{<mã lệnh}[<mã kế
t thúc>]
(trong environ.sty)

Đối số được sử dụng chính xác như trong trường hợp


\newenvironment, nhưng ở đây trong <mã lệnh>, bạn có thể sử
dụng lệnh \BODY để tham chiếu đến bên trong (phần thân) của
môi trường đã xác định và <mã kết thúc> là tùy chọn. Ví dụ

7 Ví dụ 9.69 8
\NewEnviron{teszt}[2][\today]{%
\fbox{\parbox{5.5cm}{\textbf{#2}\par\BODY\par(#1)}}}

\begin {teszt} {Tiêu đề}


Văn bản \par Văn bản
\end {teszt}
\begin {teszt} [hôm qua] {Tiêu đề}
Văn bản \par Văn bản
\end {teszt}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
368 Chương 9. Lập trình trong LATEX

Tiêu đề
Tiêu đề
Văn bản
Văn bản
Văn bản
Văn bản
(Ngày 28 tháng 10 năm
(hôm qua)
2022)

9.5.3 Lệnh \NewDocumentEnvironment

Có lẽ giải pháp linh hoạt nhất để xác định môi trường là


gói xparse.sty.

\NewDocumentEnvironment{<tên>}{<đặc tả đối số>}{<mã mở>}{<m


ã đóng>}

Trong <đặc tả đối số>, bạn có thể chỉ định các đối số chính
xác như cách bạn làm với lệnh \NewDocumentCommand. Các đối
số, không giống như lệnh \newenvironment, có thể được tham
chiếu không chỉ trong <mã mở> mà còn trong mã <mã đóng>.
Các đối số phải được chỉ định sau \begin{<tên>}. Bạn cũng có
thể viết * ở cuối <tên>, vì vậy bạn có thể xác định phiên bản sao
của một môi trường. Nếu bạn cũng muốn coi phần bên trong
(phần thân) của môi trường như một đối số, hãy nhập đặc tả b
(hoặc + b) cuối cùng trong <đặc tả đối số>. Ví dụ

\NewDocumentEnvironment{teszt}{mO{\today}+b}{%
\fbox{\parbox{5cm}{\textbf{#1}\par#3\par(#2)}}}{}

7 Ví dụ 9.70 8
\begin {teszt} {Tiêu đề}
Văn bản \par Văn bản
\end {teszt}
\begin {teszt}{Tiêu đề} [hôm qua]
Văn bản \par Văn bản
\end {teszt}

: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
9.5. Định định môi trường 369

Tiêu đề
Tiêu đề
Văn bản
Văn bản
Văn bản
Văn bản
(Ngày 28 tháng 10 năm
(hôm qua)
2022)

\NewDocumentEnvironment{teszt*}{mO{\today}+b}{%
\fbox{\parbox{5cm}{\underline{#1}\par#3\par(#2)}}}{}

7 Ví dụ 9.71 8
\begin {teszt*} {Tiêu đề}
Văn bản \par Văn bản
\end {teszt*}
\begin {teszt*}{Tiêu đề} [hôm qua]
Văn bản \par Văn bản
\end {teszt*}

: 2
Tiêu đề
Tiêu đề
Văn bản
Văn bản
Văn bản
Văn bản
(Ngày 28 tháng 10 năm
(hôm qua)
2022)

Nếu bạn muốn xác định một môi trường hiện có


với \NewDocumentEnvironmen, quá trình biên dịch sẽ dừng
lại với một lỗi. Nếu bạn muốn xác định lại một môi
trường, hãy làm như vậy với \RenewDocumentEnvironment.
Nếu bạn chỉ muốn xác định môi trường nếu nó chưa
tồn tại, nhưng nếu bạn không muốn xác định lại nó,
hãy sử dụng lệnh \ProvideDocumentEnvironment. Nếu bạn
muốn xác định một môi trường trong mọi trường hợp,
cho dù nó đã tồn tại hay chưa, hãy sử dụng lệnh
\DeclareDocumentEnvironment. Chúng phải được sử dụng
chính xác như lệnh \NewDocumentEnvironment.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


370 Chương 9. Lập trình trong LATEX

9.5.4 Môi trường nguyên văn mới

Bạn không thể xác định môi trường nguyên văn với các
phương thức trước đó vì các lệnh cần thiết cho việc này không
thể được đặt trong đối số của lệnh khác. Ví dụ: phân tích lý do
tại sao mã sau có thể không hoạt động sau khi tải gói fancyvrb
.sty:
\newenvironment{frameverb}{\begin{Verbatim}[frame=single]}
{\end{Verbatim}}

Lệnh \DefineVerbatimEnvironment (trong fancyvrb.sty) giải


quyết những vấn đề này. Dưới đây là một ví dụ về phiên bản
chính xác của mã trước đó để sử dụng:
\DefineVerbatimEnvironment{frameverb}{Verbatim}{frame=
single}

Môi trường Verbatim Không thể nhúng môi trường


Verbatim, nhưng môi trường frameverb đã được xác định trước
đó có thể được nhúng vào môi trường nguyên văn hoặc ngược
lại.
Sử dụng để xác định một môi trường mã chương trình
\lstnewenvironment (trong listings.sty)

với cách sử dụng tương tự như \newenvironment. Ví dụ:


\lstnewenvironment{delphi}[1][]
{\lstset{language=Delphi,numbers=left,numberstyle=\tiny,#1}
}{}

Khi đó ta dùng
\begin{delphi}[<tùy chọn>]
...
\end{delphi}

Hoặc
\begin{lstlisting}[language=Delphi,numbers=left,numberstyle=\tin
chọn>]
...
\end{lstlisting}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.5. Định định môi trường 371

các mã có cùng tác dụng.

9.5.5 Môi trường loại commen mới

Giả sử bạn đã định nghĩa một megjegyzes giống như mục


nhận xét. Nếu bạn muốn tạo một phiên bản của tài liệu bị
thiếu nhận xét, bạn cần giải quyết rằng môi trường megje-
gyzes hoạt động giống như môi trường comment của gói com-
ment.sty, nghĩa là nội dung của môi trường đó bị trình biên
dịch LATEX bỏ qua. Bạn có thể thực hiện việc này bằng lệnh
\excludecomment (trong comment.sty), như sau:
\renewenvironment{megjegyzes}{}{}
\excludecomment{megjegyzes}

Giả sử rằng trong ví dụ trước, môi trường megjegyzes được


đánh số cùng với một môi trường giống như mục hàng loạt.
Trong trường hợp này, số lượng các mục trong phiên bản gốc
của tài liệu và trong phiên bản có mã trước đó sẽ không
giống nhau, vì số lượng nhận xét bị xóa sẽ không tăng lên.
Nếu bạn không muốn điều này, giải pháp là sử dụng lệnh
\processcomment (trong comment):
\renewenvironment{megjegyzes}{}{}
\processcomment{megjegyzes}{\stepcounter{tetel}
\def\ThisComment##1{}}{}{}

Ngoài ra, nếu bạn muốn đánh dấu vị trí của các nhận xét bằng
dấu - chẳng hạn, giải pháp này là:
\renewenvironment{megjegyzes}{}{}
\processcomment{megjegyzes}
{\stepcounter{tetel}\def\ThisComment##1{}}{---}{}

9.5.6 overlay với đặc tả lớp phủ mới

Bạn cũng có thể xác định môi trường của riêng mình với
đặc tả lớp phủ trong lớp tài liệu beamer. Bạn có thể sử dụng

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


372 Chương 9. Lập trình trong LATEX

lệnh \newenvironment<> hoặc \renewenvironment<> để thực


hiện việc này. Các phiên bản này hoạt động chính xác giống
như các phiên bản <> không được đánh dấu, chỉ khi có n tham
số trong định nghĩa (n = 0,1, ..., 9), sau đó nó được mở rộng bởi
một n + 1, trong đó có thể cho ta. . Ví dụ
\newenvironment<>{boldornormal}
{\begin{altenv}#1{\begin{bfseries}}{\end{bfseries}}{}{}}{\
end{altenv}}

Giá trị mặc định của đặc tả lớp phủ môi trường chuẩn mực
được xác định như vậy là <1->. Sử dụng:
\begin{boldornormal}<đối số>
<văn bản>
\end{boldornormal}

9.5.7 Môi trường danh sách mới

Bạn cũng có thể xác định môi trường danh sách của riêng
mình bằng lệnh sau:
\newlist{<tên danh sách>} {<loại danh sách>} {<số cấp tối đ
a>}}
(trong enumitem.sty)

<loại danh sách> có thể là enumerate, itemize hoặc


descriptio, tùy thuộc vào việc bạn muốn xác định danh
sách được đánh số, không được đánh số hay mô tả. <Số cấp
tối đa> chỉ định số cấp mà danh sách đã xác định có thể
được lồng vào nhau. Lệnh này cũng tạo bộ đếm mức tối
đa cho <tên danh sách>,<tanlistnames>i, <tanlistnames>ii,
<listnames>iii, <listnames>iv, <listnames>, v.v. đó sẽ là bộ
đếm cho các cấp độ khác nhau. Ví dụ
\newlist{steps}{enumerate}{2}

xác định một môi trường danh sách được đánh số gọi là steps
có thể được lồng vào nhau sâu đến hai cấp. Sau đó, điều này
có thể được đặt bằng lệnh \setlist chính xác như đối với các
môi trường danh sách khác (xem phần 7.4). Ví dụ

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


9.6. Mỏ neo 373

\\setlist[steps,1]{label=\textbf{\arabic*. bước.},align=
left}
\setlist[steps,2]{label=(\alph*)}

Bộ đếm của mức đầu tiên sẽ là stepsi và bộ đếm của mức


thứ hai sẽ là stepii.

9.6 Mỏ neo

Bạn có thể tìm hiểu thêm về cách xử lý neo từ những gì


được mô tả ở đây bằng cách làm theo dòng lệnh từ các tệp pdf
được mở bằng:
>texdoc lthooks ltshipout ltfilehook

9.6.1 Neo môi trường

\BeforeBeginEnvironment{environment}{code}
\AtBeginEnvironment{environment}{code}
\AtEndEnvironment{environment}{code}
\AfterEndEnvironment{environment} {code}

Đối với hệ thống T E X được cài đặt trước tháng 10 năm 2020,
các lệnh này là có sẵn bằng cách tải etoolbox. Đối với hệ thống
T E X được cài đặt sau tháng 10 năm 2020, hệ thống trước đó
các lệnh tương đương như sau:
\AddToHook{env/<environment>/before}{<mã lệnh>}
\AddToHook{env/<environment>/begin}{<mã lệnh>}
\AddToHook{env//<environment>/end}{<mã lệnh>}
\AddToHook{env//<environment>/after}{<mã lệnh>}

Tham số đầu tiên của lệnh \AddToHook là cái gọi là tên mỏ


neo. Hoạt động của chúng trở nên dễ hiểu nếu bạn nhìn vào ví
dụ sau:
\BeforeBeginEnvironment{center}{<mã lệnh1>}
\AtBeginEnvironment{center}{<mã lệnh2>}
\AtEndEnvironment{center}{<mã lệnh3>}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


374 Chương 9. Lập trình trong LATEX

\AfterEndEnvironment{center}{<mã lệnh4>}
...
\begin{center}
<mã lệnh5>
\end{center}
...
\begin{center}
<mã lệnh6>
\end{center}

Kết quả sẽ giống như khi bạn đã sử dụng những thứ sau:
...
<mã lệnh1>{<mã lệnh2>\begin{center}
<mã lệnh5><mã lệnh3>
\end{center}}<mã lệnh4>
...
<mã lệnh1>{<mã lệnh2>\begin{center}
<mã lệnh6><mã lệnh3>
\end{center}}<mã lệnh4>

Các lệnh được mô tả ở trên thêm mã được chỉ định vào neo đã
cho, không thay thế. Ví dụ
szamb

7 Ví dụ 9.72 8
\AtBeginEnvironment{center}{\bfseries}
\begin{center}
Đầu tiên
\end{center}
\AtBeginEnvironment{center}{\itshape}
\begin{center}
Thứ hai
\end{center}
: 2
Đầu tiên

Thứ hai

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


Chương 10. VIẾT GÓI LỆNH

10.1. Phân loại gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375


10.2. Tạo một gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
10.3. Tạo một lớp tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379

10.1 Phân loại gói lệnh

Bạn cũng có thể tạo các lớp và gói tài liệu của riêng mình.
Tạo một gói nếu nó hoạt động với nhiều lớp tài liệu. Nếu không,
hãy viết một lớp tài liệu. Cũng có thể biến các tệp này thành
một phần của bản phân phối TEX chính thức. Để biết thông tin
về điều này, bấm vào đây.
https://mirror-hk.koddos.net/CTAN/info/dtxtut/dtxtut.pdf
Có thể quản lý ở đây: bấm vào đây.
https://www.ctan.org/upload https://www.ctan.org/help/upload-
pkg
376 Chương 10. Viết gói lệnh

10.2 Tạo một gói lệnh

Khi viết một gói, hãy xem xét những điều sau:
- Tập tin nguồn của gói phải có phần mở rộng là sty và được
đặt trong thư mục của tập tin chính có phần mở rộng tex.
- Tệp nguồn gói lệnh chỉ nên chứa các ký tự ascii, vì vậy hãy
nhập các ký tự có dấu với dấu bay. Điều này là bắt buộc để tải
vào bất kỳ tệp chính được mã hóa nào bằng lệnh \usepackage.
- Tất cả các lệnh trong phần mở đầu của tệp chính có
thể được ghi vào tệp nguồn của gói, chỉ cần sử dụng \
RequirePackage thay vì \usepackage. \RequirePackage khác với
\usepackage ở chỗ nó có thể được tải trước khi lớp tài liệu được
tải.
- Các lệnh nội bộ trong một gói hoạt động mà không cần các
lệnh \makeatletter và \makeatother.
Cấu trúc của tệp có phần mở rộng là sty như sau:
\NeedsTeXFormat {LaTeX2e} [<date1>]
\ProvidesPackage{<package name>}[<date2><version><mô tả>]
<Nội dung>
\endinput

<Date1> được yêu cầu để sử dụng gói LATEX ngày phiên bản
ở định dạng yyyy/mm/dd, ví dụ: 12/1/1999. <package name> trùng
tên của tệp với phần mở rộng sty. Nếu có thể, chỉ sử dụng các
chữ cái và số trong bảng chữ cái tiếng Anh. Vì vậy, nếu v.d. nếu
tên tệp là my.sty, tên <package name> sẽ được thay thế bằng tên
của riêng ta. <date2> là ngày gói được xuất bản ở định dạng
giống như trước đây. <version> là số phiên bản của gói, ví dụ:
v1.0. <mô tả> là một vài từ về mục đích của gói mà không sử
dụng lệnh, với các ký tự ascii.
Bạn cũng có thể cung cấp các tùy chọn cho một gói. Ví dụ:
hãy để my.sty chứa:
\NeedsTeXFormat{LaTeX2e} [12/1/1999]
\ProvidesPackage{my}[20/06/2021 v1.0 Gói này chỉ là một ví
dụ]
\DeclareOption{<tùy chọn1>} {<mã lệnh 1>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


10.2. Tạo một gói lệnh 377

\DeclareOption{<tùy chọn2>} {<mã lệnh 2>}


\ExecuteOptions{<tùy chọn1>}
\ProcessOptions\relax
\endinput

Gói riêng sau đó sẽ có hai tùy chọn: <tùy chọn1> (tùy chọn
cơ bản) và <tùy chọn2>. Nếu bạn sử dụng tùy chọn <tùy chọn2>,
mã <mã lệnh 2> sẽ có hiệu lực. Tuy nhiên, cho dù bạn có phát
hành tùy chọn <tùy chọn1> hay không thì <mã lệnh 1> vẫn có
giá trị. Nếu bạn chỉ định nhiều tùy chọn làm tùy chọn mặc
định trong lệnh \ExecuteOptions, chúng phải được phân tách
bằng dấu phẩy:
\ExecuteOptions{<tùy chọn1>,<tùy chọn1>,...}
Bạn cũng có thể chỉ định một giá trị cho các tùy chọn
của mình (bộ đếm, độ dài, chuỗi, boolean). Ví dụ geometry và
hyperref các gói cũng có các tùy chọn như vậy:
\usepackage[width=150mm]{geometry}
\usepackage[linktocpage=false,linkcolor=blue]{hyperref}

Nếu bạn muốn có các tùy chọn như vậy trong


gói của riêng mình, hãy sử dụng gói kvoptions.
https://www.ctan.org/pkg/kvoptions Ví dụ: hãy để my.sty
chứa:
\NeedsTeXFormat{LaTeX2e} [12/1/1999]
\ProvidesPackage{my}[20/06/2021 v1.0 Gói này chỉ là một ví
dụ]
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=my,prefix=my@}
\DeclareVoidOption{<tùy chọn1>}{<mã lệnh 1>}
\DeclareBoolOption[true]{<tùy chọn2>}
\DeclareComplementaryOption{<tùy chọn3>}{<tùy chọn2>}
\DeclareStringOption[<mã lệnh 4>]{<tùy chọn4>}
\ProcessKeyvalOptions{my}
\ifmy@<tùy chọn2> <mã lệnh 2> true \else<mã lệnh 2> false \
fi
\endinput

Mã này hoạt động như sau:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


378 Chương 10. Viết gói lệnh

hiệu ứng tùy chọn


<tùy chọn1> <mã lệnh1>
<tùy chọn2>, <tùy chọn2> = <mã lệnh 2 true>
true, <tùy chọn3> = false (mặc
định)
<tùy chọn3>, <tùy chọn3> = <mã lệnh2 false>
true, <tùy chọn2> = false
<tùy chọn4> = <mã lệnh5> (tùy \def \my@<tùy chọn4>{
chọn cơ bản <tùy chọn4> = <mã lệnh1>}
<mã lệnh4>)

Sau đó, nếu bạn tải gói my.sty với các tùy chọn cơ bản trong
tài liệu
\usepackage{my}
thì các mã được cung cấp bởi các tùy chọn cơ bản sẽ áp
dụng:
- <mã lệnh2> là true
- \my@<mã lệnh4> cho kết quả là <mã lệnh4>.
Ví dụ: nếu bạn tải theo cách này
\usepackage [<tùy chọn1>,<tùy chọn2> = false, <tùy chọn4> =
<mã lệnh5>] {my}

thì các mã sau sẽ được áp dụng:


- <mã lệnh1>
- <mã lệnh2 false>
- \my @<mã lệnh4> kết quả <mã lệnh5>
Bất kỳ tùy chọn nào trong gói riêng đều có thể được kích
hoạt trong các lệnh. Ví dụ
\setkeys{my}{<tùy chọn2> = false, <tùy chọn1>}
Tùy chọn của một gói cũng có thể được kế thừa vào gói của
riêng chúng ta bằng lệnh
\PassOptionsToPackage{<tùy chọn>}{<gói lệnh>}
Ví dụ: hãy để my.sty chứa:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


10.3. Tạo một lớp tài liệu 379

\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{my}[20/06/2021 v1.0 Gói này chỉ là một ví
dụ]
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=my,prefix=my@}
\DeclareVoidOption{unicode}{\PassOptionsToPackage{unicode}{
hyperref}}
\DeclareBoolOption{colorlinks}
\DeclareStringOption{urlcolor}
\ProcessKeyvalOptions{my}
\ifmy@colorlinks\PassOptionsToPackage{colorlinks}{hyperref}
\fi
\PassOptionsToPackage{urlcolor=\my@urlcolor}{hyperref}
\RequirePackage[bookmarksopen]{hyperref}
\endinput

Các tùy chọn unicode, liên kết màu và urlcolor của gói
hyperref sau đó có thể được sử dụng như một tùy chọn cho
gói riêng.
Có thể gửi cho người dùng một cảnh báo khi dịch:
\PackageWarning{<tên gói lệnh>}{<nội dung thông báo>}
Bạn cũng có thể dừng bản dịch khi có thông báo lỗi:
\PackageError{<tên gói lệnh>}{<thông báo lỗi>}{<trợ giúp
>}
Bạn có thể sử dụng lệnh \MessageBreak để ngắt một dòng
trong văn bản tin nhắn.
\AtEndOfPackage{<mã lệnh>}
Bất kỳ nơi nào bạn đưa ra lệnh này trong tệp gói, <mã lệnh>
sẽ được thực thi ở cuối tệp. Việc phát hành lệnh này nhiều lần
sẽ hiển thị lần lượt các mã được chỉ định.

10.3 Tạo một lớp tài liệu

Đối với một lớp tài liệu, quy trình tương tự như đối với gói,
ngoại trừ phần mở rộng tệp nguồn của lớp tài liệu cls và \
ProvidesPackage sử dụng lệnh \ProvidesClass để thay thế. Bạn

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


380 Chương 10. Viết gói lệnh

nên tải một lớp tài liệu hiện có làm cơ sở bằng lệnh \LoadClass.
Hãy xem ví dụ sau. Hãy để my.cls chứa:
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{my}[20/06/2021 v1.0 Gói này chỉ là một ví
dụ]
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=my,prefix=my@}
\DeclareBoolOption[true]{<tùy chọn>}
\ProcessKeyvalOptions{my}
\ifmy@<tùy chọn><mã lệnh true>\else<mã lệnh false>\fi

\LoadClass[12pt,a4paper]{article}
\RequirePackage[T1]{fontenc}
\PassOptionsToPackage{defaults=vi-min}{vietnam.ldf}
\RequirePackage[magyar]{babel}
\endinput

Sau đó, nếu, ví dụ, bạn tải tệp lớp my.cls trong tài liệu như
sau
\documentclass[<tùy chọn> = false]{my}
sau đó bạn sẽ nhận được kích thước phông chữ cơ bản 12pt,
kích thước trang A4, tài liệu kiểu chữ Vietnam theo loại bài
báo, trong đó "mã là giả mạo" sẽ được giải thích.
Tùy chọn của một lớp tài liệu cũng có thể được kế thừa cho
lớp tài liệu của riêng chúng ta. Điều này có thể được thực hiện
theo cách tương tự như đối với các gói, chỉ khi đó bạn cần sử
dụng lệnh \PassOptionsToClass thay vì \PassOptionsToPackage.
Ví dụ: hãy để my.cls chứa:
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{my}[20/06/2021 v1.0 Gói này chỉ là một ví
dụ]
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=my,prefix=my@}
\DeclareVoidOption{11pt}{\PassOptionsToClass{11pt}{article}
}
\DeclareVoidOption{12pt}{\PassOptionsToClass{12pt}{article}
}
\ProcessKeyvalOptions{my}
\LoadClass[a4paper]{article}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


10.3. Tạo một lớp tài liệu 381

\endinput

Các tùy chọn 11pt và 12pt trong lớp tài liệu bài viết sau
đó có thể được sử dụng như một tùy chọn cho lớp tài liệu của
riêng bạn.
Có thể gửi cho người dùng một cảnh báo khi dịch:
\ClassWarning{<tên lớp>}{<thông báo>}
Bạn cũng có thể dừng bản dịch khi có thông báo lỗi:
\ClassError{<tên lớp>}{<thông báo lỗi>} {<trợ giúp>}
Bạn có thể sử dụng lệnh \MessageBreak để ngắt một dòng
trong văn bản tin nhắn.
\AtEndOfClass{<mã lệnh>}
Bất kỳ nơi nào bạn đưa ra lệnh này trong tệp lớp, <mã lệnh>
sẽ được thực thi ở cuối tệp. Việc phát hành lệnh này nhiều lần
sẽ hiển thị lần lượt các mã được chỉ định.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 11. CHỌN PHÔNG CHỮ

11.1. Danh mục phông chữ LATEX . . . . . . . . . . . . . . . . . . . . 383


11.2. Bảng mã phông chữ nguồn và nội bộ của LATEX . . 383
11.3. Thiết lập toàn cục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
11.3.1. Họ phông . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
11.3.2. Khai báo họ phông . . . . . . . . . . . . . . . . . . . . . . 389
11.3.3. Hình dạng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
11.3.4. Thiết lập địa phương . . . . . . . . . . . . . . . . . . . . 394
11.3.5. Sự kết hợp của các họ phông . . . . . . . . . . . . 395
11.4. Khai báo mã họ phông . . . . . . . . . . . . . . . . . . . . . . . . . 396
11.4.1. Hợp nhất nhiều mã họ phông với một mã mới
396
11.4.2. Khai báo mã họ phông mới . . . . . . . . . . . . . . 397
11.5. Gói lệnh với thay đổi phông chữ . . . . . . . . . . . . . . . . 398
11.6. Thông tin và kiểm tra phông chữ . . . . . . . . . . . . . . . 399

Để biết phân loại các biến thể chữ cái, xem 4.4.1. tiểu mục.
Bây giờ chúng ta hãy nhìn vào Cách chọn phông chữ khác với
cài đặt mặc định. Để giúp đỡ với điều này cũng có thể là Cả
trang web https://tug.org/FontCatalogue/ Danh mục Phông
11.1. Danh mục phông chữ LATEX 383

chữ TEX và tệp fntguide.pdf:


https://mirror-hk.koddos.net/CTAN/macros/latex/base/
fntguide.pdf.
Cơ chế tải phông chữ LATEX đã thay đổi kể từ ngày 2 tháng
2 năm 2020, vì vậy phần lớn những gì được mô tả ở đây chỉ
hoạt động cho các hệ thống được cài đặt hoặc nâng cấp sau đó
(xem ltnews31.pdf:
https://www.latex-project.org/news/latex2e-news/ltnews31.
pdf).

11.1 Danh mục phông chữ LATEX

Phần này tóm tắt các họ phông chữ Latinh được cài đặt
trên hệ thống TEX và các mã cần thiết để sử dụng chúng. Để
hiểu các mã này, bạn cũng sẽ cần nghiên cứu các phần sau của
chương này. Các bộ phông chữ có sẵn liên tục mở rộng, vì vậy
danh sách dưới đây cũng có thể không đầy đủ.
1. Chữ có chân
2. Chữ không chân
3. Chữ máy đánh chữ
4. Chữ kiểu khác

11.2 Bảng mã phông chữ nguồn và nội bộ


của LATEX
Các ký tự ASCII trong tệp nguồn (xem Phần 21.1) có cùng
số mã cho mỗi bảng mã phông chữ. Ví dụ: mã ASCII và UTF-8
của ký tự O là 79. Một phần lớn các ký tự không phải ASCII
được gói inputenc chuyển đổi sang dạng lệnh (với tùy chọn
tương ứng với mã hóa của tệp nguồn) hoặc, trong trường hợp
mã hóa UTF-8, vào năm 2018 không có LATEX. Ví dụ: thay
thế bằng ký tự Ő. Nếu một ký tự không phải ASCII không
có lệnh tương đương, quá trình dịch sẽ dừng lại do lỗi. Theo

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


384 Chương 11. Chọn phông chữ

mặc định, LATEX hiển thị phông chữ cổ, có độ dày bình thường,
đứng, có kích thước 10pt trong pdf, sử dụng bộ phông chữ có
tên là cmr10 (mặc định).
Trong các bộ phông chữ, mỗi ký tự có một số mã. Nếu bạn
cần chèn một ký tự ASCII vào pdf, bạn chọn ký tự có mã tương
ứng với mã ASCII từ bộ phông chữ. Vì vậy, ví dụ, chữ O, có
mã ASCII là 79, được thay thế bằng chữ O của mã 79 trong bộ
phông chữ cmr10. Tuy nhiên, mã hóa của bộ phông chữ cmr10
không phải lúc nào cũng tuân theo ASCII. Ví dụ: mã ASCII
của ký tự < là 60, trong khi ký tự 60 ký tự của bộ phông chữ
cmr10 là ¡, dẫn đến một kết quả đáng ngạc nhiên:
7 Ví dụ 11.1 8: 2
\documentclass{article}
\begin{document}
¡O
<O
\end{document}

Cái gọi là bộ mã nội bộ của LATEX sẽ xác định số ký tự mã


nào trong bộ phông chữ pdf tương ứng với lệnh không tương
ứng với ký tự ASCII. Theo mặc định, LATEX sử dụng bộ mã nội
bộ OT1, được phát minh cho bộ phông chữ không chứa các ký
tự có dấu. cmr10 là như vậy. Do đó, trong trường hợp các chữ
cái viết tay Ö, không phải một phần tử bộ phông chữ sẽ được
chỉ định, mà là hai phần tử: chữ cái cơ bản và dấu trọng âm
riêng biệt. Ví dụ: lệnh \H{O} được chèn vào vị trí của chữ cái Ö,
theo bộ mã nội bộ OT1, sẽ có nghĩa là đặt một ký tự ‚ được mã
hóa bằng 125 số thập phân trong bộ phông chữ cmr10 thành ký
tự O được mã hóa bằng 79 số thập phân. Kết quả: Ő.
7 Ví dụ 11.2 8: 2
\documentclass{article}
\begin{document} Ő
\H{O}
\end{document}

Việc biên dịch các ký tự có dấu từ hai ký tự trong một pdf


gây ra một số vấn đề:

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.2. Bảng mã phông chữ nguồn và nội bộ của LATEX 385

- Sau các âm tiết có chứa các chữ cái có dấu, bạn không thể
tách ở cuối dòng.
- Không thể tìm kiếm các từ chứa chữ cái có dấu trong bản
pdf hoàn chỉnh.
- Nếu bạn sao chép văn bản có chứa các chữ cái có dấu từ
tệp pdf, các chữ cái có dấu sẽ hiển thị không chính xác.
Một vấn đề khác là không phải tất cả các họ phông chữ mặc
định đều chứa các ký tự dấu riêng biệt, vì vậy trường hợp sau
tạo ra kết quả không chính xác:

7 Ví dụ 11.3 8: 2
\documentclass{article}
\begin{document} }O
\ttfamily Ő
\end{document}

Điều này là do bộ phông chữ cmtt10 được sử dụng ở đây


không có dấu trọng âm trong khoảng trống 125 chữ số, vì vậy
nó làm như vậy cho ký tự O.

´0 ´1 ´2 ´3 ´4 ´5 ´6 ´7
´00x Γ0 ∆1 Θ2 Λ3 Ξ4 Π5 Σ6 Υ7
˝0x
´01x Φ8 Ψ9 Ω 10 ff 11 fi 12 fl 13 ffi 14 ffl 15
´02x ı 16 ȷ 17 ` 18 ´ 19 ˇ 20 ˘ 21 ¯ 22 ˚ 23
˝1x
´03x ¸ 24 ß 25 æ 26 œ 27 ø 28 Æ 29 Œ 30 Ø 31
´04x 32 ! 33 ” 34 # 35 $ 36 % 37 & 38 ’ 39
˝2x
´05x ( 40 ) 41 * 42 + 43 , 44 - 45 . 46 / 47
´06x 0 48 1 49 2 50 3 51 4 52 5 53 6 54 7 55
˝3x
´07x 8 56 9 57 : 58 ; 59 ¡ 60 = 61 ¿ 62 ? 63
´10x @ 64 A 65 B 66 C 67 D 68 E 69 F 70 G 71
˝4x
´11x H 72 I 73 J 74 K 75 L 76 M 77 N 78 O 79
´12x P 80 Q 81 R 82 S 83 T 84 U 85 V 86 W 87
˝5x
´13x X 88 Y 89 Z 90 [ 91 “ 92 ] 93 ˆ 94 ˙ 95
´14x ‘ 96 a 97 b 98 c 99 d 100 e 101 f 102 g 103
˝6x
´15x h 104 i 105 j 106 k 107 l 108 m 109 n 110 o 111

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


386 Chương 11. Chọn phông chữ

´16x p 112 q 113 r 114 s 115 t 116 u 117 v 118 w 119


˝7x
´17x x 120 y 121 z 122 – 123 — 124 ˝ 125 ˜ 126 ¨ 127
˝8 ˝9 ˝A ˝B ˝C ˝D ˝E ˝F

Giải pháp là sử dụng một trong những bộ phông chữ được


cài đặt trong LATEX có chứa các ký tự có dấu. Một ví dụ là ecrm
1000. Nó chứa ký tự của Ö với 142 mã. Ngoài ra, các số mã
trong bộ phông chữ này phù hợp với bảng mã ASCII, vì vậy ký
tự < chẳng hạn, sẽ không hiển thị chính xác. Vẫn chưa được
giải quyết rằng lệnh \H{O} được tạo từ ký tự của Ö không tuân
theo phương pháp như với bộ mã nội bộ OT1, mà chỉ định ký
tự 142. Điều này được thực hiện bởi bộ mã nội bộ T1. Bạn có
thể chuyển sang điều này với tùy chọn T1 trong gói fontenc.
LATEX được cấu hình để sử dụng phông chữ ecrm1000 được đặt
theo mặc định khi chuyển sang bộ mã nội bộ T1. Vì vậy, sau
đây là đủ cho giải pháp:
7 Ví dụ 11.4 8: 2
\documentclass{article}
\usepackage[T1]{fontenc} Ő<
\begin{document}
Ő<
\end{document}

Ngoài ra, việc thay đổi họ không gây ra các kết quả sai lệch:
7 Ví dụ 11.5 8: 2
\documentclass{article}
\usepackage[T1]{fontenc} Ő
\begin{document}
\ttfamily Ő
\end{document}

Nói chung, bạn có thể đặt bộ mã nội bộ trong phần mở đầu


bằng mã sau:
\usepackage [<Mã hóa>]{fontenc}
Giá trị mặc định cho <Mã hóa> là OT1. Bạn có thể nhập
nhiều mã hóa cùng một lúc. Trong trường hợp này, những phải
được phân tách bằng dấu phẩy và dấu cuối cùng sẽ là mặc định.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.2. Bảng mã phông chữ nguồn và nội bộ của LATEX 387

Các ký tự trong bảng mã T1 phông ecrm1000:

´0 ´1 ´2 ´3 ´4 ´5 ´6 ´7
´00x `0 ´1 ˆ2 ˜3 ¨4 ˝5 ˚6 ˇ7
˝0x
´01x ˘8 ¯9 ˙ 10 ¸ 11 ˛ 12 ‚ 13 ‹ 14 › 15
´02x “ 16 ” 17 „ 18 « 19 » 20 – 21 — 22 ‌ 23
˝1x
´03x  24 ı 25 ȷ 26 ff 27 fi 28 fl 29 ffi 30 ffl 31
´04x ␣ 32 ! 33 " 34 # 35 $ 36 % 37 & 38 ’ 39
˝2x
´05x ( 40 ) 41 * 42 + 43 , 44 - 45 . 46 / 47
´06x 0 48 1 49 2 50 3 51 4 52 5 53 6 54 7 55
˝3x
´07x 8 56 9 57 : 58 ; 59 < 60 = 61 > 62 ? 63
´10x @ 64 A 65 B 66 C 67 D 68 E 69 F 70 G 71
˝4x
´11x H 72 I 73 J 74 K 75 L 76 M 77 N 78 O 79
´12x P 80 Q 81 R 82 S 83 T 84 U 85 V 86 W 87
˝5x
´13x X 88 Y 89 Z 90 [ 91 \ 92 ] 93 ^ 94 _ 95
´14x ‘ 96 a 97 b 98 c 99 d 100 e 101 f 102 g 103
˝6x
´15x h 104 i 105 j 106 k 107 l 108 m 109 n 110 o 111
´16x p 112 q 113 r 114 s 115 t 116 u 117 v 118 w 119
˝7x
´17x x 120 y 121 z 122 { 123 | 124 } 125 ~ 126 - 127
´20x Ă 128 Ą 129 Ć 130 Č 131 Ď 132 Ě 133 Ę 134 Ğ 135
˝8x
´21x Ĺ 136 Ľ 137 Ł 138 Ń 139 Ň 140 Ŋ 141 Ő 142 Ŕ 143
´22x Ř 144 Ś 145 Š 146 Ş 147 Ť 148 Ţ 149 Ű 150 Ů 151
˝9x
´23x Ÿ 152 Ź 153 Ž 154 Ż 155 IJ 156 İ 157 đ 158 § 159
´24x ă 160 ą 161 ć 162 č 163 ď 164 ě 165 ę 166 ğ 167
˝Ax
´25x ĺ 168 ľ 169 ł 170 ń 171 ň 172 ŋ 173 ő 174 ŕ 175
´26x ř 176 ś 177 š 178 ş 179 ť 180 ţ 181 ű 182 ů 183
˝Bx
´27x ÿ 184 ź 185 ž 186 ż 187 ij 188 ¡ 189 ¿ 190 £ 191
´30x À 192 Á 193 Â 194 Ã 195 Ä 196 Å 197 Æ 198 Ç 199
˝Cx
´31x È 200 É 201 Ê 202 Ë 203 Ì 204 Í 205 Î 206 Ï 207
´32x Ð 208 Ñ 209 Ò 210 Ó 211 Ô 212 Õ 213 Ö 214 Œ 215
˝Dx
´33x Ø 216 Ù 217 Ú 218 Û 219 Ü 220 Ý 221 Þ 222 SS 223
´34x à 224 á 225 â 226 ã 227 ä 228 å 229 æ 230 ç 231
˝Ex
´35x è 232 é 233 ê 234 ë 235 ì 236 í 237 î 238 ï 239

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


388 Chương 11. Chọn phông chữ

´36x ð 240 ñ 241 ò 242 ó 243 ô 244 õ 245 ö 246 œ 247


˝Fx
´37x ø 248 ù 249 ú 250 û 251 ü 252 ý 253 þ 254 ß 255
˝8 ˝9 ˝A ˝B ˝C ˝D ˝E ˝F

11.3 Thiết lập toàn cục

Có năm phần thông tin cần thiết để chọn bộ phông chữ được
sử dụng trong pdf:
- Mã nội bộ (mặc định: OT1).
- Mã họ phông (mặc định: cmr).
- Mã thân (mặc định: m).
- Mã hình dạng (mặc định: n).
- Kích thước phông chữ (mặc định: 10pt).
Bạn có thể tìm thấy các giá trị có thể có cho mã family, body
và shape trong 23.1. phần. CÁC Để đặt kích thước phông chữ,
hãy xem phần 4.5. phần.
Trừ khi có hướng dẫn khác trong mã nguồn, trình biên dịch
A
L TEX và tải tệp có phần mở rộng fd (định nghĩa phông chữ) dựa
trên mã họ phông. Theo mặc định OT1 là mã hóa nội bộ và cmr
là mã họ phông, vì vậy nó tải tệp ot1cmr.fd. Sau đó nó sẽ là mã
cơ thể và hình dạng và kích thước phông chữ, theo mặc định
là m, n và 10pt. Bạn sẽ tìm thấy hướng dẫn về những điều này
trong tệp ot1cmr.fd Người dịch TEX, để sử dụng bộ phông chữ
có tên cmr10.
Nếu chúng ta chuyển sang mã hóa nội bộ T1, nó sẽ tải
t1cmr.fd thay vì ot1cmr.fd trong, trong đó m, n và 10pt được
liên kết với bộ phông chữ ecrm1000.

11.3.1 Họ phông

\refreshcommand{\rmdefault} {<family>}
Giá trị mặc định cho mã họ phông có chân là <family>: \
rmfamily và \textrm kích hoạt điều này. Giá trị mặc định cho

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.3. Thiết lập toàn cục 389

<family> là cmr (Computer Modern Roman).


\refreshcommand {\sfdefault} {<family>}
Giá trị mặc định cho mã họ phông không chân là <family>.
\sffamily và \textsf kích hoạt điều này. Giá trị mặc định cho
<family> là cmss (Computer Modern Sans Serif).
\refreshcommand{\ttdefault}{<family>}
Mã họ phông mặc định cho máy đánh chữ là <family>. \
ttfamily và \texttt kích hoạt điều này. Giá trị mặc định cho
<family> là cmtt (Máy đánh chữ hiện đại của Máy tính).
\refreshcommand{\familydefault}{<family>}
Mã họ phông mặc định phải là <family>. \normalfont và
\textnormal kích hoạt mã họ phông này. Giá trị mặc định
cho <family> là \rmdefault. Nó cũng có thể là \sfdefault và \
ttdefault

11.3.2 Khai báo họ phông

\DeclareFontSeriesDefault[<loại họ phông>] {md} {<family


>}
Lệnh này chỉ có thể được đưa ra trong phần mở đầu. Điều
này cho phép bạn đặt <family> làm giá trị mặc định cho mã
ngữ thể bình thường, tức là \mdseries và \textmd kích hoạt mã
thể xác này nếu họ hiện tại là loại <loại hộ phông>. Các giá
trị có thể có cho kiểu <loại họ phông> là rm, sf hoặc tt, tùy
thuộc vào lệnh nào trong số các lệnh \rmfamily (\textrm), \
sffamily (\textsf), \ttfamily (\texttt) được khai báo. Trong
cả ba trường hợp, giá trị mặc định của <family> là m (bình
thường). Ví dụ
\DeclareFontSeriesDefault[rm]{md}{lc}
trong trường hợp này
\rmfamily \mdseries
kích hoạt mã họ phông lc. Lưu ý rằng một
\DeclareFontSeriesDefault[<loại họ phông>]{md}{<family>}
mã tương đương với một định nghĩa

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


390 Chương 11. Chọn phông chữ

\def\mdseries@<loại họ phông>{<family>}
với mã.
\DeclareFontSeriesDefault{md}{<family>}
Lệnh này chỉ có thể được đưa ra trong phần mở đầu. Điều
này cho phép bạn đặt <family> làm giá trị mặc định cho mã
thân thể bình thường, tức là \mdseries và \textmd kích hoạt mã
này nếu họ hiện tại được khai báo bằng lệnh \fontfamily hoặc
\usefont được thảo luận sau. Giá trị mặc định cho <family> là
m (bình thường). Mã này tương đương với
\def \mddefault{<family>}
với mã.
\DeclareFontSeriesDefault [<loại họ phông>] {bf} {<
family>}
Lệnh này chỉ có thể được đưa ra trong phần mở đầu. Điều
này cho phép bạn đặt <family> làm giá trị mặc định cho mã
nội dung in đậm, tức là \bfseries và \textbf kích hoạt mã nội
dung này nếu họ hiện tại là <loại họ phông>. Các giá trị có thể
có cho kiểu <loại họ phông> là rm, sf hoặc tt, tùy thuộc vào lệnh
nào trong số các lệnh \rmfamily (\textrm), \sffamily (\textsf
), \ttfamily (\texttt) được khai báo. Trong cả ba trường hợp,
giá trị mặc định của <family> là bx (in đậm mở rộng). Ví dụ
\DeclareFontSeriesDefault[rm]{bf}{eb}
trong trường hợp này
\rmfamily \bfseries
kích hoạt mã cơ thể eb. Lưu ý rằng một
\DeclareFontSeriesDefault[<loại họ phông>]{bf}{<family>}
mã tương đương với một
\def\bfseries@<loại họ phông>{<family>}
với mã.
\DeclareFontSeriesDefault{bf} {<family>}
Lệnh này chỉ có thể được đưa ra trong phần mở đầu. Điều
này cho phép <family> là giá trị mặc định cho mã nội dung
in đậm, nghĩa là \bfseries và \textbf kích hoạt mã nội dung
này nếu họ hiện tại được khai báo bằng lệnh \fontfamily hoặc

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.3. Thiết lập toàn cục 391

\usefont được thảo luận sau. Giá trị mặc định cho <family> là
b (in đậm). Mã này tương đương với \def\bfdefault{<family>}.
\refreshcommand{\seriesdefault}{<family>}
Mã nội dung mặc định phải là "body". \normalfont và \
textnormal làm điều này kích hoạt mã <family>. Giá trị mặc
định cho <family> là \mddefault

11.3.3 Hình dạng

\refreshcommand {\updefault}{<hình dạng>}


Mã hình dạng mặc định phải là <hình dạng>. \upshape và
\textup kích hoạt mã hình dạng này. Giá trị mặc định cho <hì
nh dạng> là lên (thẳng đứng).
\refreshcommand {\ulcdefault}{<hình dạng>}
Mã trường hợp mặc định phải là <hình dạng>. \ulcshape và
\textulc kích hoạt mã hình dạng này. Giá trị mặc định cho
<hình dạng> là ulc (phân biệt chữ hoa chữ thường).
\refreshcommand {\sldefault} {<hình dạng>}
Giá trị mặc định cho mã hình dạng nghiêng phải là <hình
dạng>. \slshape và \textsl kích hoạt mã hình dạng này. Giá trị
mặc định của <hình dạng> là sl (nghiêng).
\refreshcommand{\itdefault} {<hình dạng>}
Giá trị mặc định cho mã hình dạng nghiêng phải là <hình d
ạng>. \itshape và \textit kích hoạt mã hình dạng này. Giá trị
mặc định của <hình dạng> là nó (in nghiêng).
\refreshcommand{\scdefault}{<hình dạng>}
Giá trị mặc định của mã dạng viết hoa nhỏ phải là <hình
dạng>. \scshape và \textc kích hoạt mã hình dạng này. Giá trị
mặc định của <hình dạng> là sc (viết hoa nhỏ).
\refreshcommand {\shapedefault} {<hình dạng>}
Mã hình dạng mặc định phải là <hình dạng>. \normalfont
và \textnormal kích hoạt định dạng này. Giá trị mặc định cho
<hình dạng> là n (bình thường, văn phòng phẩm/chữ hoa). Nó
cũng có thể là \sldefault, \itdefault và \scdefault. Mặc định

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


392 Chương 11. Chọn phông chữ

là n chứ không phải \updefault, vì lệnh \uphape và \textup chỉ


cần khôi phục định dạng dọc cho chữ nghiêng hoặc chữ thường
nghiêng, không phải trường hợp, trong khi \normalfont và \
textnormal trở về định dạng mặc định.
\DeclareFontShapeChangeRule{<hd1>} {<hd2>} {<hd3>} {<hd4
>}
Lệnh này chỉ có thể được đưa ra trong phần mở đầu
(<hdi>=<hình dạng i>). Nếu mã hình dạng hiện tại là <hình
dạng 1> và bạn muốn kết hợp mã này với mã hình dạng <hình
dạng 2>, thì <hình dạng 3> sẽ hoạt động nếu nó được bộ phông
chữ hiện tại hỗ trợ, nếu không thì <hình dạng 4>. Nếu <hình dạ
ng 4> cũng không được hỗ trợ, <hình dạng 2> sẽ hoạt động. Nếu
không có đầu ra <hình dạng 3> hoặc <hình dạng 4> nào được xác
định cho một cặp <hình dạng 1><hình dạng 2> bằng lệnh
\DeclareFontShapeChangeRule, <hình dạng 2> sẽ hoạt động.
Có một số quy tắc xác định trước:

<hd1> <hd2> <hd3> <hd4>

n it it sl
n sl sl it
n ulc n
n up n
it sl sl it
it sc scit scsl
it ulc it
it up n
sl it it sl
sl sc scsl scit
sl ulc sl
sl up n

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.3. Thiết lập toàn cục 393

sc it scit scsl
sc sl scsl scit
sc sw scsw sw
sc ulc n
sc up n
scit it scit
scit sl scsl scit

<hd1> <hd2> <hd3> <hd4>

scit sw scsw sc
scit sc scit
scit ulc it
scit up sc
scsl it scit scsl
scsl sl scsl
scsl sw scsw sc
scsl sc scsl
scsl ulc sl
scsl up sc
scsw it scit scsw
scsw sl scsl
scsw sw scsw
scsw sc scsw

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


394 Chương 11. Chọn phông chữ

scsw ulc sw
scsw up sc
sw sc scsw
sw ulc sw
sw up n

Ví dụ 1: theo mặc định, \normalfont có hiệu lực khi một


tài liệu được khởi động, điều này sẽ kích hoạt giá trị của \
shapedefault, tức là mã hình dạng n. Tức là <hd1> = n. Sau đó,
nếu bạn đưa ra lệnh \uphape, nó sẽ kích hoạt giá trị \updefault
, giá trị này được tăng theo mặc định. Tức là <hd2> = up. Nó
có thể được đọc từ bảng trước đó sau đó <hd3> = n, vì vậy mã
hình dạng này trở nên hoạt động. Trong trường hợp này, <hd4>
không được xác định vì n mã hình dạng được tìm thấy trong
tất cả các bộ phông chữ.
Ví dụ 2: hãy phân tích điều gì sẽ xảy ra nếu chúng ta sử
dụng lệnh \scshape ở đầu tài liệu trống theo mặc định. Chúng
ta đã thấy rằng <hd1> = n. \scshape kích hoạt giá trị \scdefault
, theo mặc định là sc, tức là <hd2> = sc. Không có biến thể
nào như vậy trong bảng, vì vậy <hd2> = sc sẽ hoạt động. Nếu
sau đó chúng ta đưa ra một lệnh biến dạng khác, chẳng hạn
như \itshape, nó sẽ được hiểu là <hd1> = sc và <hd2> = it (vì
\itshape kích hoạt giá trị của \itdefault, theo mặc định). Do
đó, dựa trên bảng, trước tiên nó cố gắng kích hoạt mã hình
dạng <hd3> = scit, nếu nó được xác định trong bộ phông chữ
nhất định. Nếu không, <hd4> scsl có hiệu lực. Nếu điều này
cũng không được hỗ trợ, <hd2> = it nó sẽ được kích hoạt.

11.3.4 Thiết lập địa phương

Bạn cũng có thể sử dụng các lệnh sau để tạm thời chuyển
sang phông chữ khác với cài đặt mặc định ở một vị trí cụ thể.
\fontencoding {<encoding>}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.3. Thiết lập toàn cục 395

\fontfamily {<family>}
\fontseries {<bodily>}
\fonthape {<hd>}
\selectfont

Sau đó, mã hóa, họ, nội dung và hình dạng được tải với
các tham số đã cho. Mã hóa cũng phải được tải trong tùy chọn
fontenc, trừ khi mã là OT1, T1 hoặc U. Năm lệnh trước trên có
thể được nhập cùng một lúc:
\usefont{<encoding>}{<family>}{<bodily>}{<hd>}
7 Ví dụ 11.6 8: 2
\documentclass{article}
\usepackage[T5]{fontenc} „Tồn tại hay không: đó là câu hỏi ở
\PassOptionsToPackage{ đây. . . ” (William
defaults=hu-min}{vietnam.ldf} Shakespeare)
\usepackage[vietnam]{babel}
\begin{document}
{\usefont{T5}{qzc}{m}{it},,Tồ
n tại hay không: đó là câu hỏ
i ở đây’’}
(William Shakespeare)
\end{document}

11.3.5 Sự kết hợp của các họ phông

Trước đây chúng ta đã thấy rằng các hình dạng khác nhau
có thể được kết hợp nếu nó được hỗ trợ bởi bộ phông chữ hiện
tại. Điều này cũng đúng với định nghĩa. Ví dụ
7 Ví dụ 11.7 8: 2
{\usefont{T5}{antt}{c}{n} văn bản1 văn bản1 văn bản 2
\bfseries văn bản 2}

Ở đây, mã nội dung của “văn bản 1” là c, mặt khác, vì họ


được khai báo bằng lệnh \usefont, \bfseries sẽ kích hoạt biểu
mẫu nội dung b. Mã nội dung của “văn bản 2” bằng cách kết
hợp chúng sẽ là bc. Các quy tắc kết hợp là một

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


396 Chương 11. Chọn phông chữ

\DeclareFontSeriesChangeRule{<family1>} {<family2>}
{<family3>} {<family4>}

lệnh, chỉ có thể được đưa ra trong phần mở đầu. Nếu mã


nội dung hiện tại là <family1> và bạn muốn kết hợp nó với mã
nội dung <family2>, thì <family3> sẽ hoạt động nếu nó được
bộ phông chữ hiện tại hỗ trợ, nếu không thì <family4>. Nếu
<family4> cũng không được hỗ trợ, <family2> sẽ hoạt động.
Nếu không có đầu ra <family3> hoặc <family4> nào được xác
định cho biến thể <family1> <family2> bằng lệnh
\DeclareFontSeriesChangeRule, <family2> sẽ hoạt động.
Có rất nhiều quy tắc kết hợp các cơ quan. Đây không phải
là chi tiết ở đây vì lý do dài.

11.4 Khai báo mã họ phông

11.4.1 Hợp nhất nhiều mã họ phông với một mã mới

Bạn thậm chí có thể hợp nhất nhiều mã mã họ phông dưới


một mã mới. Mã họ phông mới cho giai đoạn tiếp theo có thể
được khai báo bởi:
\DeclareFontFamily {<mã nội bộ>}{<mã họ phông m>}{}
Sau đó, dưới "mã họ phông mới" cho một cơ thể và hình
dạng cụ thể như sau bạn có thể đặt hàng họ, mã nội dung và
hình dạng đã xác định trước đó:
\DeclareFontShape{<mã nội bộ>}{<họ mã phông mới>}{<mã thân
mới>}
{<mã hình dạng mới>}{<-> ssub*<family>/<bodily>/<hình dạng>
}{}

Điều quan trọng là <mã nội bộ> phải giống với mã nội bộ
được đặt cho <family>.
Ví dụ
\DeclareFontFamily{T1}{myrm}{}
\DeclareFontShape{T1} {myrm}{m}{n}{<-> ssub*clm/m/n}{}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.4. Khai báo mã họ phông 397

\DeclareFontShape {T1} {myrm} {b}{sc}{<->ssub*fnc/b/sc}{}

Sau đó dùng

7 Ví dụ 11.8 8: 2
{\usefont{T1}{myrm}{m}{n} khong dau} khong dau
\\ MA KHONG DAU
{\usefont{T1}{myrm}{b}{sc} ma khong
dau}

11.4.2 Khai báo mã họ phông mới

Phần phụ trước đã chỉ ra cách tạo một mã họ phông mới


bằng cách sử dụng những mã đã xác định trước đó. Nhưng
những mã họ phông này được định nghĩa như thế nào? Để
minh họa điều này, chúng ta hãy xem cách mã họ lmr được xác
định với bộ mã nội bộ T1 cho m mã nội dung và mã hình dạng
n (xem t1lmr.fd):

\DeclareFontFamily{T1}{lmr}{}
\DeclareFontShape{T1}{lmr}{m}{n}{%
<-5.5> ec-lmr5 <5.5-6.5> ec-lmr6
<6.5-7.5> ec-lmr7 <7.5-8.5> ec-lmr8
<8.5-9.5> ec-lmr9 <9.5-11> ec-lmr10
<11-15> ec-lmr12 <15-> ec-lmr17}{}

Theo điều này, nếu họ lmr đang hoạt động với m mã cơ thể và
mã hình dạng n, thì bộ phông chữ được cài đặt là ec-lmr17 có
kích thước trên phông chữ là ec-lmr5, 5,5pt đến 6,5pt dưới
kích thước phông chữ 5,5pt sẽ. tải trọng. Họ tải các bộ phông
chữ khác nhau trong các phạm vi kích thước khác nhau vì
phông chữ ở kích thước 5pt có thể trông đẹp, nhưng phóng to
đến kích thước 20pt có thể không còn là lý tưởng nhất. Để minh
họa điều này, hãy xem trích xuất “văn bản” với các bộ phông
chữ và kích thước khác nhau:

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


398 Chương 11. Chọn phông chữ

Cỡ phông độ đo pt
ec-lmr5 20 morning
ec-lmr17 20 morning
ec-lmr5 5 morning

ec-lmr17 5 morning

11.5 Gói lệnh với thay đổi phông chữ

Cột đầu tiên của bảng sau đây hiển thị các gói thay đổi theo
bảng Anh. Các cột bổ sung cho bạn biết họ phông chữ mã nào
mà gói cụ thể tải thay cho họ phông chữ có chân, không chân
và máy đánh chữ, và có nên chuyển đổi cả phông chữ toán học
hay không. Bạn cũng có thể muốn đọc mô tả gói, vì một số có
tùy chọn.

Gói lệnh có chân không chân đánh máy toán


p
lmodern lmr lmss lmtt
p
mlmodern mlmr mlmss mlmtt
times ptm phv pcr -
p
txfonts txr txss txtt
p
pxfonts pxr pxss pxtt
p
kpfonts jkp jkpss jkptt
bera fve fvs fvm -
p
lxfonts - llcmss llcmtt
p
newtxtext ntxtlf qhv ntxtt
newtxmath
p
newpxtext zpllf qhv npxtt

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.6. Thông tin và kiểm tra phông chữ 399

newpxmath
cyklop cyklop - - -
tgbonum qbk - - -
tgadventor - qag - -
tgchorus qzc - - -
tgcursor - - qcr -
tgheros - qhv - -
tgpagella qpl - - -
tgschola qcs - - -
tgtermes qtm - - -
p
anttor antt - -
p
arev fav fav fvm
p
cmbright - cmbr cmtl

11.6 Thông tin và kiểm tra phông chữ

Nếu bạn đang tự hỏi bộ phông chữ nào mà một nhóm cụ thể
tải cho một nội dung, hình dạng và kích thước nhất định, hãy
sử dụng mã sau:
{\fontize{<cỡ phông>} {\the\baselineskip}
\usefont {<mã nội bộ>} {<họ phông>} {<mã thân>} {<hình dạng
>}
\xdef\thisfont{\fontname\font}}
\thisfont

7 Ví dụ 11.9 8: 2
{\fontsize{16}{\the\baselineskip} ec-lmr17 at 16.0pt
\usefont{T1}{lmr}{m}{n}
\xdef\thisfont{\fontname\font}}
\thisfont

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


400 Chương 11. Chọn phông chữ

Sử dụng đoạn mã sau vào dữ liệu phông chữ thực tế cho


văn bản hiện tại của trang này:
\makeatletter
\xdef\thisfont{%
\f@encoding/\f@family/\f@series/\f@shape/\f@size/\fontname\
font}
\makeatother

7 Ví dụ 11.10 8
\makeatletter
\xdef\thisfont{%
\f@encoding/\f@family/\f@series/\f@shape/\f@size/\fontname\
font}
\makeatother
{\usefont{OT1}{cmr}{m}{n}\thisfont}
: 2
T5/fnc/m/n/12/uncr8v at 12.0pt
Cũng có thể xem tất cả các ký tự được thiết kế bằng phông
chữ được tải trong một họ cho một thân, hình dạng và kích
thước nhất định trong một bảng. Để thực hiện việc này, hãy sử
dụng tệp có chứa mã sau:
\documentclass{article}
\usepackage[<mã nội bộ>]{fontenc}
\begin{document}
\input{fntproof}
\fontsize{<cỡ phông>}{\the\baselineskip}
\usefont{<mã nội bộ>}{<họ phông>}{<mã thân>}{<hình dạng>}
\initcurrentfont
\fonttable
\end{document}

\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
\input{fntproof}
\fontsize{12}{\the\baselineskip}
\usefont{T1}{lmr}{m}{n}
\initcurrentfont

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.6. Thông tin và kiểm tra phông chữ 401

\fonttable
\end{document}

sau khi dịch, bạn có thể thấy tất cả các ký tự được thiết kế
bằng phông chữ có tên ec-lmr12 trong bảng kết quả. (Cụ thể,
nó điền vào phông chữ này cho bộ mã nội bộ T1, họ lmr, nội
dung m, hình dạng n và kích thước 12pt.)
Mỗi ký tự cũng có một số mã, có thể được tìm thấy trong các
hàng và cột đầu tiên và cuối cùng của bảng. Số mã có thể được
chỉ định ở dạng thập phân, bát phân và thập lục phân. Bảng
chỉ chứa các mã bát phân và thập lục phân. Ví dụ, ký tự bát
phân có mã bát phân là 113 và mã thập lục phân là 4B. Trong
số này, mã thập phân là 1 · 82 + 1 · 81 + 3 · 80 = 75.
Một ký tự có thể được gọi bằng số mã của nó là
\symbol{<thập phân>}
\symbol{’<bát phân>}
\symbol{"<thập lục phân>}

Hoặc
\char<thập phân>
\char’<bát phân>}
\char"<thập lục phân>

7 Ví dụ 11.11 8: 2
\usefont{T1}{lmr}{m}{n} KKK
\symbol{75}
\symbol{’113}
\symbol{"4B}

Sử dụng mã sau để in mã thập phân của các ký tự:


\documentclass{article}
\usepackage[<mã nội bộ>]{fontenc}
\def\FONT{\fontsize{<cỡ phông>}{\the\baselineskip}%
\usefont{<mã nội bộ>}{<họ phông>}{<mã thân>}{<hình dạng>}}
\usepackage[a4paper,margin={1cm,1cm},landscape]{geometry}
\usepackage[T1]{fontenc}
\usepackage{multicol,amsmath,xcolor}
\setlength{\columnseprule}{.4pt}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


402 Chương 11. Chọn phông chữ

\pagestyle{empty}
\newcounter{currchar}
\renewcommand{\ttdefault}{lmtt}
\renewcommand{\familydefault}{\ttdefault}
\newlength{\fontht}
\newlength{\fonthtd}
\newlength{\fonthtnext}
\newlength{\fonthtnextd}
\settoheight{\fontht}{\FONT\char0}
\settodepth{\fonthtd}{\FONT\char0}
\addtolength{\fontht}{\fonthtd}
\loop
\ifnum\value{currchar}<255
\stepcounter{currchar}
\settoheight{\fonthtnext}{\FONT\char\arabic{currchar}}
\settodepth{\fonthtnextd}{\FONT\char\arabic{currchar}}
\addtolength{\fonthtnext}{\fonthtnextd}
\ifdim\fonthtnext>\fontht\setlength{\fontht}{\fonthtnext}\
fi
\repeat
\addtolength{\fontht}{5pt}
\setcounter{currchar}{0}
\begin{document}
\noindent{\FONT\xdef\thisfont{\fontname\font}}%
\kern1em\framebox{\thisfont}
\begin{multicols}{10}
\noindent
\loop
\ifnum\value{currchar}<256
\phantom{\rule{0pt}{\fontht}}%
\kern1em\smash{\FONT\char\arabic{currchar}}\hfill
{\footnotesize\color{blue}\arabic{currchar}}\kern1em\\
\stepcounter{currchar}
\repeat
\end{multicols}
\end{document}

ới thông số cụ thể

\usepackage[T1]{fontenc}
\def\FONT{\fontsize{12}{\the\baselineskip}%

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


11.6. Thông tin và kiểm tra phông chữ 403

\usefont{T1}{lmr}{m}{n}}

Cho kết quả trang sau


ec-lmr12

` 0 ␣ 32 @ 64 ‘ 96 Ă 128 ă 160 À 192 à 224


´ 1 ! 33 A 65 a 97 Ą 129 ą 161 Á 193 á 225
ˆ 2 " 34 B 66 b 98 Ć 130 ć 162 Â 194 â 226

˜ 3 # 35 C 67 c 99 Č 131 č 163 Ã 195 ã 227


¨ 4 $ 36 D 68 d 100 Ď 132 ď 164 Ä 196 ä 228
˝ 5 % 37 E 69 e 101 Ě 133 ě 165 Å 197 å 229
˚ 6 & 38 F 70 f 102 Ę 134 ę 166 Æ 198 æ 230

ˇ 7 ’ 39 G 71 g 103 Ğ 135 ğ 167 Ç 199 ç 231


˘ 8 ( 40 H 72 h 104 Ĺ 136 ĺ 168 È 200 è 232
¯ 9 ) 41 I 73 i 105 Ľ 137 ľ 169 É 201 é 233
˙ 10 * 42 J 74 j 106 Ł 138 ł 170 Ê 202 ê 234
¸ 11 + 43 K 75 k 107 Ń 139 ń 171 Ë 203 ë 235

˛ 12 , 44 L 76 l 108 Ň 140 ň 172 Ì 204 ì 236


‚ 13 - 45 M 77 m 109 Ŋ 141 ŋ 173 Í 205 í 237
‹ 14 . 46 N 78 n 110 Ő 142 ő 174 Î 206 î 238
› 15 / 47 O 79 o 111 Ŕ 143 ŕ 175 Ï 207 ï 239
“ 16 0 48 P 80 p 112 Ř 144 ř 176 Ð 208 ð 240

” 17 1 49 Q 81 q 113 Ś 145 ś 177 Ñ 209 ñ 241


„ 18 2 50 R 82 r 114 Š 146 š 178 Ò 210 ò 242
« 19 3 51 S 83 s 115 Ş 147 ş 179 Ó 211 ó 243
» 20 4 52 T 84 t 116 Ť 148 ť 180 Ô 212 ô 244

– 21 5 53 U 85 u 117 Ţ 149 ţ 181 Õ 213 õ 245


— 22 6 54 V 86 v 118 Ű 150 ű 182 Ö 214 ö 246
 23 7 55 W 87 w 119 Ů 151 ů 183 Œ 215 œ 247
 24 8 56 X 88 x 120 Ÿ 152 ÿ 184 Ø 216 ø 248
ı 25 9 57 Y 89 y 121 Ź 153 ź 185 Ù 217 ù 249

 26 : 58 Z 90 z 122 Ž 154 ž 186 Ú 218 ú 250


ff 27 ; 59 [ 91 { 123 Ż 155 ż 187 Û 219 û 251
fi 28 < 60 \ 92 | 124 IJ 156 ij 188 Ü 220 ü 252
fl 29 = 61 ] 93 } 125 İ 157 ¡ 189 Ý 221 ý 253

ffi 30 > 62 ^ 94 ~ 126 đ 158 ¿ 190 Þ 222 þ 254


ffl 31 ? 63 _ 95 - 127 § 159 £ 191 ß 223 ß 255

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


Chương 12. SỬ DỤNG PHÔNG CHỮ

12.1. Chữ Hy Lạp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405


12.2. Chữ cái Kirin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
12.3. Văn bản Gothic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
12.4. Viết chữ cái hoa đầu tiên . . . . . . . . . . . . . . . . . . . . . . 409
12.4.1. Chữ Latinh đầu tiên . . . . . . . . . . . . . . . . . . . . 409
12.4.2. Phông chữ Latinh có trang trí . . . . . . . . . . 410
12.5. Có thể dùng phông đặc biệt thay cho ký tự đầu . 411
12.6. Các chữ cái có đường viền và tô bóng . . . . . . . . . . 412
12.7. Gạch chân và gạch ngang cùng một lúc . . . . . . . . . 413
12.8. TEX lôgô liên quan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
12.9. Trang có dòng kẻ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
12.10. Trang lưới ô vuông . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
12.11. Nối hai điểm bằng một đường mũi tên . . . . . . . . . 416
12.12. Văn bản đường cơ sở không nằm ngang . . . . . . . . 418
12.13. Thời gian tạo pdf tính bằng giờ và phút. . . . . . . . 421
12.14. Mã QR code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
12.15. Mã vạch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
12.16. Yếu tố trang trí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
12.17. Đoạn văn hình đặc biệt . . . . . . . . . . . . . . . . . . . . . . . 426
12.18. Đánh dấu tài liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
12.19. Thư viện chứa mẫu câu . . . . . . . . . . . . . . . . . . . . . . . 430
12.20. Dấu cắt cho chế bản . . . . . . . . . . . . . . . . . . . . . . . . . . 431
12.1. Chữ Hy Lạp 405

12.21. Trang trí số đếm danh sách với TikZ . . . . . . . . . . . 432


12.21.1. Gói lệnh enumitem và TikZ . . . . . . . . . . . . 432
12.21.2. Gói lệnh enumerate và TikZ . . . . . . . . . . . 434
12.21.3. Gói lệnh tasks và TikZ . . . . . . . . . . . . . . . . . 435

12.1 Chữ Hy Lạp

Các chữ cái Hy Lạp thường cần thiết nhất khi viết công
thức. Trường hợp này được mô tả trong Phần 14.4. sẽ được
thảo luận trong phần. Nếu bạn muốn viết các chữ cái Hy Lạp
trong môi trường phông chữ Latinh, nhưng không phải trong
công thức, hãy tải LGR trước bộ mã nội bộ T1:
\usepackage[LGR,T1]{fontenc}

Sau đó sử dụng mã sau:


{\fontencoding{LGR} \selectfont <Gạch chữ cái>}

7 Ví dụ 12.1 8
{\fontencoding{LGR}\selectfont abcdefghijklmnopqrstuxyz}
: 2
αβςδεφγηιθκλμνοπχρστυξψζ
Bạn cũng có thể sử dụng các phông chữ khác với mã sau:
{\fontencoding {LGR} \fontfamily {<font>} \selectfont <
Greek letter>}

trong đó các giá trị của <font> có thể là, ví dụ: artemisia ,
gfsbaskerville , bodoni, complutum, udidot, neohellenic, porson,
solomos, txr, mak, llcmss.

7 Ví dụ 12.2 8
{\fontencoding{LGR}\fontfamily{gfsbodoni}\selectfont
abcdefghijklmnopqrstuxyz}\\
{\fontencoding{LGR}\fontfamily{gfssolomos}\selectfont
abcdefghijklmnopqrstuxyz}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


406 Chương 12. Sử dụng thêm phông chữ

: 2
αβςδεφγηιθκλμνοπχρστυξψζ
αβςδεφγηιθκλμνοπχρστυξψζ
Với gói textgreek.sty, bạn cũng có thể in một chữ cái Hy
Lạp dựa trên tên của nó:

α \textalpha κ \textkappa σ \textsigma


β \textbeta λ \textlambda τ \texttau
γ \textgamma µ \textmu υ \textupsilon
δ \textdelta μ \textmugreek φ \textphi
ε \textepsilon ν \textnu χ \textchi
ζ \textzeta ξ \textxi ψ \textpsi
η \texteta ο \textomikron ω \textomega
θ \texttheta π \textpi
ι \textiota ρ \textrho

Α \textAlpha Λ \textLambda Φ \textPhi


Β \textBeta Μ \textMu Χ \textChi
Γ \textGamma Ν \textNu Ψ \textPsi
Δ \textDelta Ξ \textXi Ω \textOmega
Ε \textEpsilon Ο \textOmikron ς \textvarsigma
Ζ \textZeta Π \textPi ϕ \straightphi
Η \textEta Ρ \textRho θ \scripttheta
Θ \textTheta Σ \textSigma θ \straighttheta
Ι \textIota Τ \textTau ϵ \straightepsilon
Κ \textKappa Υ \textUpsilon

12.2 Chữ cái Kirin

Đôi khi, chữ cái Kirin có thể được yêu cầu trong văn bản
Latinh. Để làm điều này, bộ mã nội bộ T1 cũng tải T2C trước:
\usepackage[T2C,T1]{fontenc}
Sau đó, T1 sẽ là mặc định. Các chữ cái kirin của T2C:
Chữ hoa Kirin

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.2. Chữ cái Kirin 407

А \CYRA Л \CYRL Ч \CYRCH


Б \CYRB М \CYRM Ш \CYRSH
В \CYRV Н \CYRN Щ \CYRSHCH
Г \CYRG О \CYRO Ъ \CYRHRDSN
Д \CYRD П \CYRP Ы \CYRERY
Е \CYRE Р \CYRR Ь \CYRSFTSN
Ё \CYRYO С \CYRS Э \CYREREV
Ж \CYRZH Т \CYRT Ю \CYRYU
З \CYRZ У \CYRU Я \CYRYA
И \CYRI Ф \CYRF
Й \CYRISHRT Х \CYRH
К \CYRK Ц \CYRC

Chữ thường Kirin

а \cyra л \cyrl ч \cyrch


б \cyrb м \cyrm ш \cyrsh
в \cyrv н \cyrn щ \cyrshch
г \cyrg о \cyro ъ \cyrhrdsn
д \cyrd п \cyrp ы \cyrery
е \cyre р \cyrr ь \cyrsftsn
ё \cyryo с \cyrs э \cyrerev
ж \cyrzh т \cyrt ю \cyryu
з \cyrz у \cyru я \cyrya
и \cyri ф \cyrf
й \cyrishrt х \cyrh
к \cyrk ц \cyrc

Chữ cổ Kirin

Ҽ \CYRABHCH Ҧ \CYRPHK Ҵ \CYRTETSE


Ҿ \CYRABHCHDSC Ҏ \CYRRTICK Ҷ \CYRCHRDSC
Ӡ \CYRABHDZE Ҭ \CYRTDSC Ҍ \CYRSEMISFTSN
Ҟ \CYRKHCRS Һ \CYRSHHA Ә \CYRSCHWA
Қ \CYRKDSC Ҕ \CYRGHK I \CYRII
ˆ \CYRMDSC Ҳ \CYRHDSC J \CYRJE
Ң \CYRNDSC Џ \CYRDZHE Ӏ \CYRpalochka
Ө \CYROTLD S \CYRDZE ҽ \cyrabhch

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


408 Chương 12. Sử dụng thêm phông chữ

ҿ \cyrabhchdsc ҏ \cyrrtick ҷ \cyrchrdsc


ӡ \cyrabhdze ҭ \cyrtdsc ҍ \cyrsemisftsn
ҟ \cyrkhcrs һ \cyrshha ә \cyrschwa
қ \cyrkdsc ҕ \cyrghk i \cyrii
¨ \cyrmdsc ҳ \cyrhdsc j \cyrje
ң \cyrndsc џ \cyrdzhe ҩ \cyrabhha
ө \cyrotld s \cyrdze
ҧ \cyrphk ҵ \cyrtetse

7 Ví dụ 12.3 8
{\fontencoding{T2C}\selectfont
\CYRH\cyra\cyrr\cyro\cyrsh\cyro }
: 2
Харошо
Bạn có thể hiển thị các chữ cái Kirin của T2C bằng lệnh
sau:
{\fontencoding{T2C}\selectfont <các chữ cái Kirin>}

7 Ví dụ 12.4 8
{\fontencoding{T2C}\selectfont Компьютер в
математическом исследовании }
: 2
Компьютер в математическом исследовании

12.3 Văn bản Gothic

Ngoài các chữ cái Latinh và Kirin, có rất nhiều loại chữ cái
khác nhau. Ví dụ: tgothic.sty là Gothic có thể được viết bằng
một gói:
7 Ví dụ 12.5 8
\documentclass[varwidth, preview]{standalone}
\usepackage[T1,T50,as]{vntext}
\usepackage{tgothic}
\begin{document}
\normalfont\tgothfamily

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.4. Viết chữ cái hoa đầu tiên 409

Chim xa cành còn thương nhớ cội\\


Người xa người tội lắm người ơi!\\
Chẳng thà không gặp thì thôi\\
Gặp rồi mỗi đứa một nơi sao đành
\end{document}
: ,, ,
2
Chim xa cành còn thuong nhó coi .̂
,, ,, ,, ,
.̂ ´
Nguòi xa nguòi toi lăm nguòi oi!
,
Chăng thà không gap .̆ thì thôi
- , ,
`
.̆ rôi mô˜i dúa mot
Gap .̂ noi sao d-ành
Còn rất nhiều phông nữa trong cuốn ebook của ta:
Phông trong LaTeX và sử dụng phông chữ Việt tại địa chỉ
https://vietex.blog.fc2.com/blog-entry-158.html

12.4 Viết chữ cái hoa đầu tiên

12.4.1 Chữ Latinh đầu tiên

Khai báo đầu tệp


\usepackage{anyfontsize,lettrine}
\setcounter{DefaultLines}{3}

7 Ví dụ 12.6 8
\lettrine[lines=3, slope=0.5em, lhang=0.0, nindent=3pt]{D}{
ù} rất chua chát nhưng sự thật là, nhà ở có sửa to, rộ
ng hơn thế nào đi nữa cũng chỉ là nơi ở tạm thời. Cái
quách sành mới là nhà ở vĩnh hằng của tất cả chúng ta.
Thế nên, nhà rộng chẳng bằng tâm rộng, tấm lòng rộng mở
, bề ngoài an yên không bằng cõi lòng an yên.
: 2
rất chua chát nhưng sự thật là, nhà ở có sửa to,

D
Ù
rộng hơn thế nào đi nữa cũng chỉ là nơi ở tạm thời.
Cái quách sành mới là nhà ở vĩnh hằng của tất
cả chúng ta. Thế nên, nhà rộng chẳng bằng tâm rộng, tấm
lòng rộng mở, bề ngoài an yên không bằng cõi lòng an yên.

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


410 Chương 12. Sử dụng thêm phông chữ

12.4.2 Phông chữ Latinh có trang trí

Khai báo đầu tệp


\input Zallman.fd
\usepackage{anyfontsize,lettrine}
\setcounter{DefaultLines}{3}
\renewcommand{\LettrineFontHook}{\usefont{U}{Zallman}{xl}{n
}}

7 Ví dụ 12.7 8
\lettrine[lines=3, slope=0.5em, lhang=0.0, nindent=3pt]{T}{
iền}
bạc khó mua được sức khỏe nhưng sức khỏe sẽ được tăng cườ
ng hơn nhờ tiền bạc; tiền bạc khó mua được hạnh phúc nh
ưng muốn có hạnh phúc, buộc phải có sức khỏe.

\lettrine[lines=3, slope=0.5em, lhang=0.0, nindent=3pt]{H}{


ạnh}
phúc của đời người không nằm ở danh lợi mà xuất phát từ sứ
c khỏe, cơ thể khỏe mạnh không quyết định bởi tiền bạc
mà quyết định bởi sự vận động của mỗi con người!
: 2
bạc khó mua được sức khỏe nhưng sức khỏe

T
IỀN
sẽ được tăng cường hơn nhờ tiền bạc; tiền bạc khó
mua được hạnh phúc nhưng muốn có hạnh phúc,
buộc phải có sức khỏe.
ẠNH phúc của đời người không nằm ở danh lợi mà

H xuất phát từ sức khỏe, cơ thể khỏe mạnh không


quyết định bởi tiền bạc mà quyết định bởi sự vận
động của mỗi con người!
Nếu bạn sử dụng một chữ cái có dấu làm chữ cái đầu, hãy
nhập chữ cái đó làm dấu trọng âm. Ví dụ
\lettrine{\’{A}}{nh} sáng của tương lai...
Các mẫu sau có thể được thay thế cho mẫu Zallman:
Acorn, AnnSton, ArtNouv, ArtNouvc, Carrickc, Eichenla,
Eileen, EileenBl, Elzevier, GotIn, GoudyIn,Kinigcap,

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.5. Có thể dùng phông đặc biệt thay cho ký tự đầu 411

Konanur, Kramer, MorrisIn, Nouveaud, Romantik, Rothdn,


RoyalIn, Sanremo, Starburst, Typocaps.

12.5 Có thể dùng phông đặc biệt thay cho


ký tự đầu

Kiểu chữ Gothic cũng làm được


7
\documentclass[varwidth,
Ví dụ 12.8
preview]{standalone}
8
\usepackage{tgothic}
\usepackage{anyfontsize,lettrine}
\setcounter{DefaultLines}{2}
\renewcommand{\LettrineTextFont}{}
\usepackage[T1,T50,as]{vntext}
\usepackage{xcolor}
\begin{document}
{ \fontfamily{yfrak}\selectfont\large
\renewcommand{\LettrineTextFont}{\relax}
\renewcommand{\LettrineFontHook}{\color{blue}}
\parbox{12cm}{
\normalfont\tgothfamily \lettrine[lhang=0.1, loversize=.25,
findent=0.1em]{V}{ui} vẻ là phương thuốc kỳ diệu giúp
con người trường \\
thọ, nỗ lực chăm chỉ là linh đan giúp sức khỏe bền \\
bỉ dẻo dai. Vận động là sự đầu tư cho sức khỏe, \\
trường thọ là sự báo đáp sau những ngày tháng\\
chúng ta bỏ ra để rèn luyện thân thể..
} }
\end{document}
: ,
2
V
,, ,, ,,
ui ve là phuong thuô´c kỳ dieu .̂ giúp con nguòi truòng
, , ,
.
tho, ˜ lu. c chăm chi là linh dan
nô - giúp sú,c khoe bê`n
, , , - , , ,
bi deo dai. Van .̂ d-ong
.̂ là su. dâ`u tu cho súc khoe,
,, , ,
truòng tho. ,là su. b, áo d-áp sau nhũng ng ,
ày tháng

chúng ta bo ra d -ê rèn luyen .̂ thân thê..

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


412 Chương 12. Sử dụng thêm phông chữ

12.6 Các chữ cái có đường viền và tô bóng

Bạn có thể sử dụng contour.sty để tạo đường viền cho các


chữ cái với tùy chọn đường viền. Nó cũng tự động tải gói màu
xcolor.sty. Nếu bạn muốn tận dụng thêm xcolor.sty, hãy tải
nó.
\contourlength{<size>} %trong gói contour.sty

Sử dụng lệnh để đặt độ dày của đường viền, trong đó giá trị
mặc định cho <size> là 0,03em. Lệnh làm viền:
\contour{<tên màu>}{<văn bản>} %trong gói contour.sty

7 Ví dụ 12.9 8
\contourlength{0.5pt}
\contour{pink}{\LARGE\bfseries\color{blue} NGUYỄN HỮU ĐIỂN}
: 2
NGUYỄN
NGUYỄNHỮU
HỮUĐIỂN
ĐIỂN
Để tô bóng văn bản, hãy sử dụng shadowtext.sty
\shadowtext {<văn bản>} %trong gói shadowtext.sty

7 Ví dụ 12.10 8
\shadowtext{VĂN BẢN ĐƯỢC TÔ BÓNG}
: 2
VĂN BẢN ĐƯỢC TÔ BÓNG
Bạn cũng có thể điều chỉnh màu bóng bằng gói xcolor được
mô tả trước đó:
\shadowcolor{<tên màu} %trong gói shadowtext.sty

7 Ví dụ 12.11 8
\shadowcolor{red!40!white}
\shadowtext{VĂN BẢN ĐƯỢC TÔ BÓNG}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.7. Gạch chân và gạch ngang cùng một lúc 413

: 2
VĂN BẢN ĐƯỢC TÔ BÓNG
Khoảng cách bóng có thể được điều chỉnh bằng các lệnh
sau:
\shadowoffset{<độ dài>} %trong gói shadowtext.sty
\shadowoffsetx{<độ dài>} %trong gói shadowtext.sty
\shadowoffsety{<độ dài>} %trong gói shadowtext.sty

7 Ví dụ 12.12 8
\shadowoffset{2pt}
\shadowcolor{red!40!white}
\shadowtext{VĂN BẢN ĐƯỢC TÔ BÓNG}
: 2
VĂN
VĂN BẢN
BẢN ĐƯỢC
ĐƯỢC TÔ
TÔ BÓNG
BÓNG

7 Ví dụ 12.13 8
\shadowoffsetx{4pt}
\shadowoffsety{-2pt}
\shadowcolor{red!40!white}
\shadowtext{VĂN BẢN ĐƯỢC TÔ BÓNG}
: 2
VĂNBẢN
VĂN BẢNĐƯỢC
ĐƯỢCTÔ
TÔBÓNG
BÓNG

12.7 Gạch chân và gạch ngang cùng một lúc


Lệnh \overunderline không được định nghĩa theo mặc định.
Để sử dụng nó, hãy viết như sau trong phần mở đầu:
\usepackage{calc}
\usepackage[outline]{contour}
\newlength{\ruleht}
\newlength{\rulesep}
\newcommand{\overunderline}[1]{%
\leavevmode
\begingroup

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


414 Chương 12. Sử dụng thêm phông chữ

\setbox1=\hbox{#1}%
\setbox2=\hbox{m}%
\contourlength{1pt}%
\setlength{\ruleht}{0.4pt}%
\setlength{\rulesep}{1.2pt}%khoảng cách giữa các dòngvàchữ
cái"m"
\rlap{\rlap{\rule[-\rulesep-\ruleht]{\wd1}{\ruleht}}%
\rule[\ht2+\rulesep]{\wd1}{\ruleht}}%
\contour{white}{\copy1}%
\endgroup
}

7 Ví dụ 12.14 8
\overunderline{Không có gì đẹp hơn thế}
: 2
Không có gì đẹp hơn thế

12.8 TEX lôgô liên quan

7 Ví dụ 12.15 8
\TeX, \LaTeX, \LaTeXe\\
\AmS\\ %trong gói amsmath.sty
\MF, \MP\\ %trong gói mflogo.sty
\XeTeX, \XeLaTeX, \LuaTeX, \LuaLaTeX\\ %trong gói metalogo
.sty
: 2
TEX, LATEX, LATEX 2ε
AMS
METAFONT, METAPOST
XETEX, XELATEX, LuaTEX, LuaLATEX

Nếu không có metalogo.sty, XELATEX có thể được xác định


như sau nằm trong gói graphicx.sty.
\DeclareRobustCommand{\XeLaTeX}
{X\kern-.11em\lower.5ex\hbox{\scalebox{-1}[1]{E}}\kern-.11
em\LaTeX}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.9. Trang có dòng kẻ 415

12.9 Trang có dòng kẻ

Nếu bạn muốn sản xuất một tờ giấy lót, hãy viết những điều
sau trong phần mở đầu:
\usepackage{picture,xcolor,atbegshi}
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
{\color{blue}%
\put(\dimexpr 1in+\oddsidemargin,
-\dimexpr 1in+\topmargin+\headheight+\headsep+\
topskip)%
{%
\vtop to\dimexpr\vsize+\baselineskip{
\hrule
\leaders\vbox to\baselineskip{\hrule width\hsize\
vfill}
\vfill
}%
}%
}}%
}

Các dòng trẻ ngang trên các trang sẽ tạo ra, có tệp ví dụ
riêng.

12.10 Trang lưới ô vuông

Nếu bạn muốn tạo ra một tấm lưới hình vuông, hãy viết
những điều sau trong phần mở đầu:
\usepackage{tikz,eso-pic}
\AddToShipoutPicture{%
\begin{tikzpicture}[remember picture,overlay]
\tikzset{normal lines/.style={black!20,very thin}}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


416 Chương 12. Sử dụng thêm phông chữ

\node at ([yshift=2mm] current page.south west){


\begin{tikzpicture}[remember picture,overlay]
\draw[style=normal lines,step=5mm](0,0)grid(\paperwidth,\
paperheight);
\end{tikzpicture}};
\end{tikzpicture}}

Các trang văn bản có kẻ ô vuông như trang ví dụ này.

12.11 Nối hai điểm bằng một đường mũi tên

Để làm điều này, hãy thêm phần sau vào phần mở đầu:
\usepackage{tikz}
\newcommand{\Node}[2]{\tikz[remember picture,inner sep=0pt,
outer sep=0pt,
baseline=(#1.base)]\node(#1){#2};}
\newcommand{\Draw}[4][]{\tikz[remember picture,overlay]
\draw[#1](#3)#2(#4);\ignorespaces}

7 Ví dụ 12.16 8
Đầu tiên, \Node{A}{từ đây} vẽ một mũi tên màu đỏ đến dấu bằ
ng của phương trình tiếp theo.
\[5x^2+2x\Node{B}{${}={}$}5.\]
Bây giờ \Node{C}{\fbox{từ đây}} vẽ một mũi tên màu xanh lam
tới từ trước đó "từ đây". Cuối cùng, \Node{D}{\textit{
từ chỗ này}}, chúng ta vẽ một mũi tên màu hồng cho dấu
bằng và một mũi tên màu xanh lục cho cột thứ hai của hà
ng đầu tiên của bảng sau.
\begin{center}
\begin{tabular}{|c|c|}
\hline
1 & \Node{E}{ide} \\
\hline
2 & 3 \\
\hline
\end{tabular}
\end{center}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.11. Nối hai điểm bằng một đường mũi tên 417

\Draw[->,color=red]{to[out=-30,in=130]}{A}{B}
\Draw[>->.>,>=stealth,color=blue]{to[bend left]}{C}{A}
\Draw[<.-.>,color=green,>=latex,line width=4pt,opacity=.5]{
to}{D}{E}
\Draw[->,color=pink,line width=2pt]{--+(0mm,3mm)-|}{D}{B}
: 2
Đầu tiên, từ đây vẽ một mũi tên màu đỏ đến dấu bằng của
phương trình tiếp theo.

5 x 2 + 2 x = 5.

Bây giờ từ đây vẽ một mũi tên màu xanh lam tới từ trước đó
"từ đây". Cuối cùng, từ chỗ này, chúng ta vẽ một mũi tên màu
hồng cho dấu bằng và một mũi tên màu xanh lục cho cột thứ
hai của hàng đầu tiên của bảng sau.

1 ide
2 3

Vì vậy, bạn có thể sử dụng hai lệnh sau:


\Node{<name>} {<văn bản>}
\Draw[<Loại mũi tên>] {<hình nét vẽ>} {<name1>} {<name2>}

\Node chọn các điểm và \Draw kết nối chúng. “Hình dạng của
đường thẳng” cho biết hình dạng của đường kết nối:
to Đường thẳng.
to[bend left] Đường cong bắt đầu rẽ trái.
to[bend right] Đường cong bắt đầu rẽ phải.
to[out=<angle1>,in=<angle2>] thành Đường cong bắt đầu ở
góc <angle1> độ và <angle2> độ đến một góc.
- -+ (<koord1>mm, <koord2>mm) - | Đường đứt đoạn có điểm
bắt đầu được nối với nhau bằng thêm một điểm có tọa
độ tương đối (<koord1>mm, <koord2>mm), nằm ngang, tiếp
theo là một đường thẳng đứng.
Tùy chọn <loại mũi tên> (không có mũi tên theo mặc định, chỉ
có dòng):

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


418 Chương 12. Sử dụng thêm phông chữ

-> Mũi tên trỏ đến <name2>.


<- Mũi tên trỏ đến <name1>.
<-> Mũi tên cũng trỏ đến <name1> và <name2>.
color = <tên màu> Màu của đường kẻ.
> = <đầu mũi tên> Hình dạng của đầu mũi tên. (Ví dụ: > =
latex,> = stealth, v.v. Xem gói tikz.sty để biết chi tiết
trong mô tả.)
line width = <thickness> Chiều dày của đường. Giá trị mặc
định là 0,4pt.
opacity = <Giá trị số> Độ trong suốt. <Giá trị số> là một giá
trị từ 0 đến 1. Nó càng nhỏ giá trị, nét càng mảnh. Giá
trị mặc định 1.

12.12 Văn bản đường cơ sở không nằm ngang

Viết phần mở đầu như sau:


\usepackage{tikz}
\usetikzlibrary{decorations.text}

Sau đó, viết những điều sau vào nội dung tài liệu:

7 Ví dụ 12.17 8
% VĂN BẢN XANH LÁ CÂY
\begin{tikzpicture}[baseline=-3pt]
\path[decorate,
decoration={text effects along path, text={{Đ}{Ồ} S{Ơ}N},
text effects/.cd,scale text to path, text effects={text=
green},
character widths={inner xsep=1pt}}](0,0) -- (3,2);
\end{tikzpicture}
% VĂN BẢN XANH
\begin{tikzpicture}[baseline]
\path [decorate,
decoration={text effects along path,text={{Đ}{Ồ} S{Ơ}N},
text effects/.cd,text along path,scale text to path},
text effects={text=blue,

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.12. Văn bản đường cơ sở không nằm ngang 419

character widths={inner xsep=0pt}}](0,0) -- (3,2);


\end{tikzpicture}
% VĂN BẢN VÀNG
\begin{tikzpicture}[baseline]
\path [decorate,
decoration={text effects along path,text={{Đ}{Ồ} S{Ơ}N},
text effects/.cd,text along path,scale text to path,
characters={font=\color{pink},xslant=0.6666}},
text effects={character widths={inner xsep=0pt}}](0,0) -- (
3,2);
\end{tikzpicture}
: 2

N
Ơ N ƠN
SƠ S S
ĐỒ ĐỒ ĐỒ
Đối với ví dụ sau, hãy nhập nội dung sau vào phần mở đầu:
\usepackage{tikz}
\usetikzlibrary{decorations.text}
\usepackage[outline]{contour}

Sau đó, viết những điều sau vào nội dung tài liệu:

7 Ví dụ 12.18 8
\begin{tikzpicture}[baseline]
\def\mycontour#1{\contour{red}{#1}}
\path[decorate,
decoration={text effects along path,text={H{Ả}I PH{Ò}NG},
text effects/.cd,text along path,scale text to path,
characters={font=\color{white},character command=\mycontour
,
xslant=0.6666}},
text effects={character widths={inner xsep=0pt}}](0,0) -- (
3,2);
\end{tikzpicture}
: 2
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
420 Chương 12. Sử dụng thêm phông chữ

N G
P HÒ
Ả I
H
Đối với ví dụ sau, hãy nhập nội dung sau vào phần mở đầu:
\usepackage{tikz}
\usetikzlibrary{decorations.text}

Sau đó, viết những điều sau vào nội dung tài liệu:

7 Ví dụ 12.19 8
\begin{tikzpicture}[baseline]
\path [decorate,
decoration={text effects along path,
text={NGUY{Ễ}N H{Ữ}U {Đ}I{Ể}N},
text effects/.cd,text along path,scale text to path},
text effects={text=magenta,
character widths={inner xsep=0pt}}](0,0)..controls (3,3)
and (6,-3)..(10,0);
\end{tikzpicture}
: 2

GUYỄN
N HỮ
U ĐIỂN

Lưu ý rằng trong các ví dụ trước, các chữ cái có dấu phải
được đặt trong dấu ngoặc đơn làm. Ví dụ: {Đ}{Ồ} S{Ơ}N.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.13. Thời gian tạo pdf tính bằng giờ và phút 421

12.13 Thời gian tạo pdf tính bằng giờ và phút

Để hiển thị điều này, trước tiên hãy viết như sau trong phần
mở đầu:
\newcount\hour \newcount\minute
\hour=\time \divide \hour by 60
\minute=\time
\loop \ifnum \minute > 59 \advance \minute by -60 \repeat
\makeatletter
\def\hourminute{\number\hour:\two@digits{\minute}}
\makeatother

Giả sử thời gian để dịch một tài liệu là 693 phút, tức là 11
giờ 33 phút.

\number\time: 543
\number\hour: 9
\number\minute: 3
\hourminute: 9:03

Có thể sử dụng lệnh sau thay cho lệnh \hourminute đã xác định
trước đó:
\currenttime % trong gói datetime.sty

12.14 Mã QR code

Mã QR code có thể được tạo dễ dàng với gói qrcode.sty:


\qrcode[height=<height>]{<địa chỉ URL>} %trong gói qrcode
.sty

7 Ví dụ 12.20 8
Nguyễn Hữu Điển https://vietex.blog.fc2.com/
422 Chương 12. Sử dụng thêm phông chữ

\qrcode [height = 2.5cm]{https://vietex.blog.fc2.com/}


\qquad\qrset{height=4cm}%
\qrcode[hyperlink]{https://www.facebook.com/nguyenhuu.dien.
52}
: 2

7 Ví dụ 12.21 8
\fbox{\qrcode[height=2cm]{https://nhdien.wordpress.com/}}
\hspace*{1cm}
\fbox{\qrcode[height=2cm,hyperlink]{http://www.hus.vnu.edu.
vn/vi}}
: 2

12.15 Mã vạch

Bạn có thể sử dụng gói GS1 để tạo mã vạch. Cho đến nay,
đây chỉ là EAN-8 và mã vạch tiêu chuẩn EAN-13 có thể được
tạo, nhưng chúng dự kiến sẽ được tạo sau gia hạn. Sử dụng
như sau:
\EANBarcode [module_height=<height>]{<number>}

Mã vạch của cuốn sách "Thực hành tính toán trong Maple"

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.16. Yếu tố trang trí 423

xuất bản năm 2015:

7 Ví dụ 12.22 8
\EANBarcode[module_height=2cm]{ISBN 978-604-62-1901-9}
: 2

9 786046 219019

12.16 Yếu tố trang trí

Gói pgfornament.sty chứa một số lượng lớn các yếu tố trang


trí mà có thể được sử dụng để trang trí hoặc văn bản các đoạn
trích.
\pgfornament[<Tùy chọn>]{<số từ 1 đến 196>}

<Tùy chọn> với tên và dấu =.

<Tùy chọn> Mặc định Tác dụng


scale 1 phóng to/nhỏ đồng bộ chiều rộng, chiều c
width {} Đặt độ rộng, tỉ lệ không đổi
height {} Đặt độ cao, tỉ lệ không đổi
color black Mầu kí hiệu trang trí
opacity 1 nhỏ nhất là 1, độ nét của đồ trang trí
ydelta 0 pt Giá trị điều chỉnh đứng của kí hiệu
symmetry=v none Đối xứng theo chiều dọc
symmetry=h none Đối xứng theo chiều ngang
symmetry=c none Đối xứng theo tâm
symmetry=none none Không đối xứng

Bảng 12.16.1: Các tùy chọn

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


424 Chương 12. Sử dụng thêm phông chữ

Đây chỉ là một ví dụ, Bạn có thể tìm thấy mô tả rất chi tiết
và nhiều ví dụ khác trong hướng dẫn gói

7 Ví dụ 12.23 8
\pgfornament[color=blue,width=2cm,ydelta=-10pt]{25}%
\pgfornament[color=green,width=2cm]{9}%
\pgfornament[color=red,width=2cm,ydelta=+10pt]{10}%
: 2

7 Ví dụ 12.24 8
\pgfornament[height=8mm,ydelta=-5pt,color=cyan]{11}%
{\Large\bfseries NẾU ANH KHÔNG GẶP EM}%
\pgfornament[height=8mm,ydelta=-5pt,color=cyan]{14}\\
\pgfornament[anchor=south,height=1cm]{84}
: 2
NẾU ANH KHÔNG GẶP
EM

7 Ví dụ 12.25 8
\newcommand{\framesize}{8 cm}
\begin{tikzpicture}[color=red,%%Maroon,
transform shape,
every node/.style={inner sep=0pt}]
\node[minimum size=\framesize,fill=yellow!10](vecbox){};
\node[anchor=north west] at (vecbox.north west){%
\pgfornament[width=0.2*\framesize]{63}};
\node[anchor=north east] at (vecbox.north east){%
\pgfornament[width=0.2*\framesize,symmetry=v]{63}};
\node[anchor=south west] at (vecbox.south west){%
\pgfornament[width=0.2*\framesize,symmetry=h]{63}};

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.16. Yếu tố trang trí 425

\node[anchor=south east] at (vecbox.south east){%


\pgfornament[width=0.2*\framesize,symmetry=c]{63}};
\node[anchor=north] at (vecbox.north){%
\pgfornament[width=0.6*\framesize,symmetry=h]{46}};
\node[anchor=south] at (vecbox.south){%
\pgfornament[width=0.6*\framesize]{46}};
\node[anchor=north,rotate=90] at (vecbox.west){%
\pgfornament[width=0.6*\framesize,symmetry=h]{46}};
\node[anchor=north,rotate=-90] at (vecbox.east){%
\pgfornament[width=0.6*\framesize,symmetry=h]{46}};
\node[inner sep=6pt] (text) at (vecbox.center){\Large \
textbf{THIẾP MỪNG}};
\node[anchor=north] at (text.south){%
\pgfornament[width=0.5*\framesize]{75}};
\node[anchor=south] at (text.north){%
\pgfornament[width=0.5*\framesize,symmetry=h]{75}};
\end{tikzpicture}

: 2

THIẾP MỪNG

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


426 Chương 12. Sử dụng thêm phông chữ

12.17 Đoạn văn hình đặc biệt

Các đoạn văn thú vị có thể được tạo bằng gói shapepar.sty.
Một trong những đoạn đặt trong trái tim.

\diamondpar{<văn bản>} %%shapepar.sty


\shapepar\heartshape <văn bản>

7 Ví dụ 12.26 8
\shapepar\heartshape
Con đường gạch ao bèo hoa tím ngắt
Những ô ăn quan, que chuyền bài hát
Những mùa hè chân đất tóc râu ngô
Quá khứ em không chỉ ngày xưa
Mà ngay cả hôm nay thành quá khứ

: 2
Con đường gạch ao
bèo hoa tím ngắt Những ô
ăn quan, que chuyền bài hát
Những mùa hè chân đất
tóc râu ngô Quá khứ em
không chỉ ngày xưa Mà
ngay cả hôm nay
thành quá
khứ

7 Ví dụ 12.27 8
\diamondpar{
Con đường gạch ao bèo hoa tím ngắt
Những ô ăn quan, que chuyền bài hát
Những mùa hè chân đất tóc râu ngô
Quá khứ em không chỉ ngày xưa
Mà ngay cả hôm nay thành quá khứ}

: 2
Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/
12.17. Đoạn văn hình đặc biệt 427


Con
đường
gạch ao bèo
hoa tím ngắt
Những ô ăn quan,
que chuyền bài hát
Những mùa hè chân đất tóc
râu ngô Quá khứ em
không chỉ ngày xưa
Mà ngay cả hôm
nay thành
quá
khứ

Với sự trợ giúp của gói shapepar, bạn có thể tạo các đoạn
văn có các hình dạng khác và thậm chí tự thiết kế những hình
dạng mới.
Các đoạn văn đặc biệt cũng có thể được tạo bằng gói
fancypar.sty.

7 Ví dụ 12.28 8
\NotebookPar{\vnlipsum[1]}
: 2

1. Sai lầm lớn nhất đời người là dùng sức khỏe để đánh đổi
lấy những vật ngoài thân. Bi ai lớn nhất đời người là dùng
sinh mệnh để đổi lấy phiền não và lãng phí lớn nhất đời người
là dùng tính mạng để giải quyết rắc rối do bản thân mình tạo
ra!

7 Ví dụ 12.29 8

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


428 Chương 12. Sử dụng thêm phông chữ

\fancyparsetup{spiral=false,linecolor=green!30!white!90,
interheight=0pt,textcolor=red}
\NotebookPar{\sl\vnlipsum[4]}
: 2

4. Khi tâm linh có xu hướng bình tĩnh lại, tinh thần càng trở
nên vĩnh hằng! Giảm, nén dục vọng xuống thấp một chút,
đẩy lý tính lên cao, tôi, bạn và chúng ta sẽ cảm nhận thấy:
Bình an là phúc, thanh sảng, mới mẻ là lộc và lòng thanh
tịnh không chút dục vọng là thọ!

12.18 Đánh dấu tài liệu

Ta dùng gói lệnh draftmark.sty đưa vào phần đầu và lệnh


đặt lại tùy chọn:
\usepackage[<tùy chọn>]{draftmark}
\draftmarksetup{<tùy chọn>}

Tuyc chọn <tùy chọn> ở hai lệnh giống nhau. Lệnh \


draftmarksetup đặt bất cứ đâu trong tài liệu. Bạn tham khảo
hướng dẫn của gói lệnh ở đây ta chỉ ra một số ví dụ:
draft còn có final
scale= Phóng to thu nhỏ đối tượng ẩn.
xcoord= hoành độ đặt.
ycoord= tung độ đặt.
angle= Góc quay đối tượng
color= Mầu của chữ.
fontfamily= Phông chữ
mark= có thể l chữ và tệp ảnh.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.18. Đánh dấu tài liệu 429

allpages chọn tất cả các trang, còn có firstpage, oddpages,


evenpages, pageno=x, pages=x-y,
Sau đây là ví dụ trong tài liệu này:

\usepackage[draft,scale=0.8, xcoord=-15,ycoord=-10]{
draftmark}
\draftmarksetup{pageno=34,angle=60,color=pink!50,mark=Vie\
TeX}

Có thể thay chữ bằng một ảnh:

\draftmarksetup{pageno=34,angle=60,mark={
\includegraphics[height=8cm,width=12cm]{muahoa}}}

Không muốn dùng gói lệnh, mà các trang đều chạy chữ
dùng ở đầu văn bản

\usepackage{eso-pic,tikz,graphicx}
\AddToShipoutPictureBG{%
\begin{tikzpicture}[overlay]
\node[rotate=60,color=red!50] at (current page.center)
{\resizebox{!}{60pt}{Vie\TeX}};
\end{tikzpicture}}

Hoặc một phương pháp khác

\usepackage{eso-pic,xcolor,graphicx}
\newsavebox{\mybox}
\newlength{\myboxheight}
\newlength{\myboxwidth}
\sbox{\mybox}{\rotatebox{60}{\resizebox{!}{60pt}{%
\color{pink!70} Vie\TeX}}}
\settowidth{\myboxwidth}{\usebox{\mybox}}
\settoheight{\myboxheight}{\usebox{\mybox}}
\AddToShipoutPictureBG{\AtPageCenter{%
\hspace{-.5\myboxwidth}\lower.5\myboxheight\hbox{\usebox{\
mybox}}}}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


430 Chương 12. Sử dụng thêm phông chữ

12.19 Thư viện chứa mẫu câu

Khi làm văn bản LATEX cần một số câu làm ví dụ, để tránh
gõ đi, gõ lại nhiều lần người ta làm gói lệnh lipsum.sty. Khi
lấy ra một ví dụ nào dùng một trong lệnh sau

\lipsum[<số nguyên>] %từ 1 đến 150 trong gói lipsum.sty


\lipsum[<số1>-<số2>] % in ra từ <số1> đến <số1>
\lipsum % in ra từ 1 đến 7

Ngoài ra còn một số gói lệnh tương tự như blindtext.sty


với lệnh gọi các đoạn ra là Blindtext[<số>].
Ta cũng làm gói lệnh tương tự cho tiếng Việt, vnlipsum.sty
cách gọi như 3 lệnh ở trên nhưng thêm chữ vn vào trước.

7 Ví dụ 12.30 8
\vnlipsum[2]

: 2
2. Dù rất chua chát nhưng sự thật là, nhà ở có sửa to, rộng
hơn thế nào đi nữa cũng chỉ là nơi ở tạm thời. Cái quách sành
mới là nhà ở vĩnh hằng của tất cả chúng ta. Thế nên, nhà
rộng chẳng bằng tâm rộng, tấm lòng rộng mở, bề ngoài an yên
không bằng cõi lòng an yên.

7 Ví dụ 12.31 8
\vnlipsum[6-7]

: 2
6. Người kiếm cớ, vin vào những lý do không có thời gian rèn
luyện cơ thể sớm muộn sẽ phải bỏ thời gian ra để đi chữa bệnh!
7. Vui vẻ là phương thuốc kỳ diệu giúp con người trường
thọ, nỗ lực chăm chỉ là linh đan giúp sức khỏe bền bỉ dẻo dai.
Vận động là sự đầu tư cho sức khỏe, trường thọ là sự báo đáp
sau những ngày tháng chúng ta bỏ ra để rèn luyện thân thể.

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.20. Dấu cắt cho chế bản 431

12.20 Dấu cắt cho chế bản

Khi bạn đã tạo xong tệp pdf sẽ được chuyển đến máy in,
bạn nên đặt dấu cắt trên các trang cho máy in để làm cho công
việc của họ dễ dàng hơn. Để thực hiện việc này, hãy tạo một
tệp tex với nội dung sau, đính kèm tệp pdf với các dấu câu, sau
đó dịch tệp tex

\documentclass{minimal}
\usepackage{pdfpages,tikz}
\setlength{\paperwidth}{<chiều rộng pdf>+30mm}
\setlength{\paperheight}{<chiều cao pdf>+30mm}
\begin{document}
\AddToShipoutPictureFG{\begin{tikzpicture}[overlay]
\draw ([yshift= 15mm] current page.south west) -- +(10mm,0)
;
\draw ([xshift= 15mm] current page.south west) -- +(0,10mm)
;
\draw ([yshift= 15mm] current page.south east) -- +(-10mm,0
);
\draw ([xshift=-15mm] current page.south east) -- +(0,10mm)
;
\draw ([yshift=-15mm] current page.north west) -- +(10mm,0)
;
\draw ([xshift= 15mm] current page.north west) -- +(0,-10mm
);
\draw ([yshift=-15mm] current page.north east) -- +(-10mm,0
);
\draw ([xshift=-15mm] current page.north east) -- +(0,-10mm
);
\node at ([yshift=-5mm] current page.north) {Bản in};
\end{tikzpicture}}
\includepdf[noautoscale,pages=1-]{<tệp pdf>}
\end{document}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


432 Chương 12. Sử dụng thêm phông chữ

12.21 Trang trí số đếm danh sách với TikZ

Về gói lệnh tikz, ta chỉ dùng một phần thư viện của nó. Ta
phải khai báo thư viện hình dạng

\usepackage{tikz}
\usetikzlibrary{shapes, shapes.geometric, shapes.symbols,
shapes.arrows, shapes.multipart, shapes.callouts, shapes.
misc}

Có hai gói lệnh đánh số theo chiều dọc enumerate.sty và


emumitem.sty, nhưng không dùng chung được với nhau, ở đây
ta dùng gói thứ hai.

12.21.1 Gói lệnh enumitem và TikZ

Đưa vào đầu văn bản \usepackage{enumitem} và định nghĩa


một lệnh:
1. Định nghĩa \itemi mới hai chiều trên mặt phẳng:

\newcommand*{\itemi}[3]{%
\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[fill={#1},shape=#2,draw,inner sep=0.0pt,
line width=0.2mm](n1){\color{-#1}\textbf{#3*}};}

Lệnh có 3 dối số:\itemi{color}{shape}{number}


1. #1: là mầu của ký hiệu:white, red, blue, green, yellow,
pink,....
2. #2: Hình dạng của ký hiệu danh sách: Theo các thư viện
shape của tikz
3. #3: Số thứ tự thể hiện: arabic, alph, Alph, roma, Roma,...
Sử dụng lệnh

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.21. Trang trí số đếm danh sách với TikZ 433

7 Ví dụ 12.32 8: 2
\begin{enumerate}[label=
\itemi{green!50}{star}{\ 1 Nếu Anh không gặp
arabic}] Em
\item Nếu Anh không gặp Em
\item Làm sao Anh thấy được
2 Làm sao Anh thấy
\item Hai ngôi sao có nước được
\item Ở gần kề ngay bên. 3 Hai ngôi sao có nước
\end{enumerate}
4 Ở gần kề ngay bên.

Đối số thứ 2 hình bao quanh số có:


4 shapes.geometric: diamond, ellipse, trapezium, regular
polygon, semicircle, star,isosceles triangle, kite, dart, cir-
cular sector, cylinder.
4 shapes.symbols: cloud, starburst, signal, tape.
4 shapes.arrows: single arrow, double arrow, arrow box.
4 shapes.multipart: circle split, circle solidus.
4 shapes.callouts: ellipse callout, rectangle callout, cloud
callout
4 shapes.misc: rounded rectangle, chamfered rectangle.
2. Định nghĩa \itemii mới ba chiều nổi trên mặt phẳng:

\newcommand*{\itemii}[3]{%
\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[scale=.4, shade,{#2}, ball color=#1]{\color
{-#1} \LARGE\textbf{#3*}};}

Các đối số của lệnh \itemii hoàn toàn giống như lệnh trên
ta không nhắc lại ở đây. sử dụng lệnh

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


434 Chương 12. Sử dụng thêm phông chữ

7 Ví dụ 12.33 8: 2
\begin{enumerate}[label=
\itemii{violet}{star}{\arabic 1 Nếu Anh không gặp
}] Em
\item Nếu Anh không gặp Em 2 Làm sao Anh thấy
\item Làm sao Anh thấy được được
\item Hai ngôi sao có nước
\item Ở gần kề ngay bên. 3 Hai ngôi sao có nước
\end{enumerate}
4 Ở gần kề ngay bên.

12.21.2 Gói lệnh enumerate và TikZ

Gói lệnh enumerate.sty và emumitem.sty cùng dùng chung


môi trường, do cấu trúc hai gói lệnh khác nhau ta phải định
nghĩa lại, cách dùng hoàn toàn tương tự:
Đưa gói lệnh vào\usepackage{enumerate}. Đặt lại khe hở
danh sách ở đầu tệp
\newcommand\tightlist{\setlength\itemsep{0pt}
\setlength\parsep{0pt}\setlength\topsep{0pt}}

1. Định nghĩa \iteme mới hai chiều trên mặt phẳng:


\newcommand*{\iteme}[3]{%
\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[fill={#1},shape=#2,draw,inner sep=0.0pt,
line width=0.2mm](n1){\strut\color{-#1}{\textbf{#3{enumi}
}}};}

Các đối số #1, #2, #3 hoàn toàn toàn như phần trước, và các
thư viện hình của TikZ cũng như vậy.
7 polygon}{\arabic}] 8
Ví dụ 12.34
\begin{enumerate}[\iteme{cyan}{regular
\tightlist
\item Nếu Anh không gặp Em
\item Làm sao Anh thấy được
\item Hai ngôi sao có nước
\item Ở gần kề ngay bên.
\end{enumerate}

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.21. Trang trí số đếm danh sách với TikZ 435

: 2
1 Nếu Anh không gặp Em
2 Làm sao Anh thấy được
3 Hai ngôi sao có nước
4 Ở gần kề ngay bên.
2. Định nghĩa môi trường mới mới ba chiều nổi trên mặt
phẳng:
\newcommand*{\itemee}[3]{%
\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[ scale=.4, shade, {#2}, ball color=#1] {\
color{-#1}\LARGE\textbf{#3{enumi}}};}

Cách dùng các lệnh này giống như ở trên, khác nhau là không
có \label= và thêm tightlist.

12.21.3 Gói lệnh tasks và TikZ

Gói lệnh tasks.sty làm danh sách cả ngang và dọc theo


tùy chọn. Đưa vào đầu văn bản \usepackage{tasks}.
1. Định nghĩa \itemt mới hai chiều trên mặt phẳng:
\newcommand*{\itemt}[3]{%
\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[fill={#1},shape=#2,draw,inner sep=0.0pt,
line width=0.2mm](n1){\strut\color{-#1}{\textbf{#3{task}}
}};}

Ba đối số giống như các định nghĩa trước. Ta xét một ví dụ:

7 Ví dụ 12.35 8
\begin{tasks}[label=\itemt{yellow}{cloud}{\Alph}](2)
\task* Bài thơ: Nếu ...
\task Nếu Anh không gặp Em
\task Làm sao Anh biết được
\task Có một vầng trăng khác

Nguyễn Hữu Điển https://vietex.blog.fc2.com/


436 Chương 12. Sử dụng thêm phông chữ

\task Lại sáng giữa ban ngày.


\end{tasks}
: 2
A Bài thơ: Nếu ...
B Nếu Anh không gặp Em C Làm sao Anh biết được
D Có một vầng trăng khác E Lại sáng giữa ban ngày.

Chú ý sử dụng môi trường tasks như sau:


1. Tùy chọn (<số>) cho <số> cột của danh sách.
2. Không tùy chọn danh sách chỉ là hàng dọc.
3. Lệnh \item* dành riêng một dòng.
4. Để điều khiển các kẽ hở trong danh sách, ta có thể đặt
lại:
\settasks{
item-indent = 2em ,
label-width = 4ex ,
label-offset = 0pt,
after-item-skip =0pt,
column-sep = 2ex
}

7 Ví dụ 12.36 8
\begin{tasks}[label=\itemt{green}{kite}{\arabic}](2)
\task Nếu Anh không gặp Em
\task Làm sao Anh biết được
\task Có một vầng trăng khác
\task Lại sáng giữa ban ngày.
\end{tasks}
: 2
1 Nếu Anh không gặp Em 2 Làm sao Anh biết được
3 Có một vầng trăng khác 4 Lại sáng giữa ban ngày.

2. Định nghĩa \itemtt mới ba chiều nổi trên mặt phẳng:


\newcommand*{\itemtt}[3]{%

Nguyễn Hữu Điển https://www.facebook.com/groups/vietex/


12.21. Trang trí số đếm danh sách với TikZ 437

\footnotesize\protect\tikz[baseline=-3pt]%
\protect\node[ scale=.4, shade, {#2}, ball color=#1] {\
color{-#1}\LARGE\textbf{#3{task}}};}

Các đối số vẫn như trên.

7 Ví dụ 12.37 8
\begin{tasks}[label=\itemtt{blue}{kite}{\arabic}](2)
\task Nếu Anh không gặp Em
\task Làm sao Anh biết được
\task Có một vầng trăng khác
\task Lại sáng giữa ban ngày.
\end{tasks}
: 2
1 Nếu Anh không gặp Em 2 Làm sao Anh biết được
3 Có một vầng trăng khác 4 Lại sáng giữa ban ngày.

7 Ví dụ 12.38 8: 2
\begin{tasks}[label=\itemtt
{yellow}{cloud}{\Alph}] A Nếu Anh không gặp Em
\task Nếu Anh không gặp Em B Làm sao Anh biết được
\task Làm sao Anh biết được C Có một vầng trăng khác
\task Có một vầng trăng khá
D Lại sáng giữa ban ngày.
c
\task Lại sáng giữa ban ngà
y.
\end{tasks}

Nguyễn Hữu Điển https://vietex.blog.fc2.com/

You might also like