Está en la página 1de 33

lamdethi.

sty định dạng các loại đề thi và


bài tập

Nguyễn Hữu Điển


Khoa Toán - Cơ - Tin học
ĐHKHTN Hà Nội, ĐHQGHN

Mục lục

1. Giới thiệu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Đòi hỏi gói lệnh kèm theo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Tùy chọn của gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4. Định dạng bài thi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.1. Một đề bài và lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.2. Các lệnh định dạng cho các loại câu hỏi . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2.1. Câu hỏi tự luận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2.2. Câu hỏi trắc nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2.3. Câu hỏi trắc nghiệm dạng đặc biệt . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.2.4. Câu hỏi trắc nghiệm trong bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.2.5. Câu hỏi điền chỗ trống . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2.6. Câu hỏi đúng sai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.3. Sử dụng tệp ngoài và lệnh gọi vào . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3.1. Các tệp câu hỏi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3.2. Các lệnh lấy đề bài trực tiếp ở tệp . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3.3. Các lệnh lấy đề bài ở tệp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.4. Nhãn trích dẫn cho các bài tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4.1. Chọn số ngẫu nhiên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.5. Mẫu thiết lập đề cho từng loại câu hỏi . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.5.1. Đề tự luận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.5.2. Đề trắc nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.5.3. Đề điền chỗ và đúng sai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.5.4. Trắc nghiệm theo bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.5.5. Đề có thể thiết kế . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.5.6. Bài tập cho các chương cuốn sách . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1
http://nhdien.wordpress.com - Nguyễn Hữu Điển 2

5. Đưa hình và bảng vào câu hỏi, lời giải . . . . . . . . . . . . . . . . . . . . . . . 22


6. Hướng phát triển gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A. Phụ lục về các gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
A.1. Gói lệnh enumitem.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
A.2. Gói lệnh shortlst.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
A.3. Gói lệnh float.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
A.3.1. Tạo ra một môi trường động mới . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
A.3.2. Những lệnh liên quan đến gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . 29
A.3.3. Sử dụng gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A.4. Gói lệnh nonfloat.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
A.5. Gói lệnh ifthen.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
A.6. Các gói lệnh soạn đề thi hoặc câu hỏi kiểm tra khác . . . . . . . . . . . . . 33
Tài liệu tham khảo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

1. Giới thiệu
1. Trước đây tôi có viết ra gói lệnh dethi.sty cùng với việc sử đổi examdesign.cls
tạo ra đề trắc nghiệm và một số loại đề thi với sự sáo trộn cả câu hỏi lẫn phương
án trả lời. Tôi dùng gói lệnh này nhiều lần và rất tốt, nhưng đây là một lớp văn
bản nên không dùng chung với các định dạng văn bản khác. Nghĩa là khi dùng
lại câu hỏi làm sách, tập hợp thành tuyển tập thì lại phải sửa định dạng và gây
khó khăn cho người dùng.
2. Gói lệnh answer.sty và alterqcm.sty là những gói lệnh kết hợp được với
các văn bản khác. Do đó tôi có thiết kế mẫu làm các đề thi tự luận và các bài
tập trong nhiều chương của một cuốn sách. Tôi đã dùng và chạy khá tốt, khi
đề bài và lời giải trong cùng một khung soạn thảo nhưng lúc đưa ra thì tách
được lời giải ra vị trí tùy ý của văn bản.
3. Một gói lệnh đơn giản probsoln.sty của Nicola L.C. Talbot cũng nhằm
mục đích tạo ra các đề thi theo tùy chọn một số trong các bài đã có. Gói lệnh
có thể lấy từ tệp ngoài vào một số câu hỏi để lập ra đề mới. Gói lệnh có tại địa
chỉ
http://tug.ctan.org/tex-archive/macros/latex/contrib/probsoln/
Bạn có thể xem tài liệu hướng dẫn.
4. Hoàn toàn dựa vào gói lệnh probsoln.sty để chữa lại cho thích hợp với
môi trường của ta và thêm rất nhiều mục đích khác nhau khi sử dụng. Do có
thay đổi khá nhiều khác với bản gốc nên tôi tạm đặt là lamdethi.sty, tôi đã cố
gắng bao lưu các lệnh của gói lệnh probsoln.sty và thêm lệnh cho thích hợp với
yêu cầu mới. Gói lệnh kết hợp với mọi định dạng của LATEX.
Hiện tại gói lệnh mới làm được:
http://nhdien.wordpress.com - Nguyễn Hữu Điển 3

1. Đề thi trắc nghiệm;


2. Đề thi trắc nghiệm dạng đặc biệt;
3. Đề thi tự luận;
4. Đề thi trắc nghiệm theo kiểu bảng;
5. Đề thi điền chỗ trống;
6. Đề thi đúng sai;
7. Kết hợi mọi tổ hợp các loại đề trên;
8. Định dạng giữa đề thi và bài tập trong tài liệu tổng hợp, sách là một.
9. Soạn thảo đề và đáp án, kể cả đề không có đáp án đều được.
10. In ra đề riêng, lời giải riêng hoặc cùng một lúc đề được.
11. Đề trắc nghiệm có thể lập phiếu trắc nghiệm cho các số câu hỏi thích hợp.
12. Làm đề thi có thể chọn ngẫu nhiên một số câu hỏi trong tệp đề đã có
không giới hạn số lượng.
13. Có thể dùng trực tiếp đề và lời giải trong tệp làm đề hoặc đưa các đề thi
và lời giải vào tệp lưu trữ rồi lấy ra dễ dàng theo nhãn của các dề.
Hạn chế gói lệnh: Tráo các phương án trong câu hỏi trắc nghiệm chưa làm
được.
Sau đây là các hướng dẫn sử dụng gói lệnh là chính.

2. Đòi hỏi gói lệnh kèm theo


Để vận hành tốt gói lệnh mới cần thiết có các gói lệnh sau để thực hiện các
lệnh:
• ifthen gói lệnh để lập trình điều khiển.
• substr gói lệnh sử lý dãy ký tự, văn bản.
• amsmath dùng một số cấu trúc toán và lệnh.
• shortlst lập danh sách thứ tự chạy theo hàng.
• enumitem đánh nhãn thông qua tùy chọn.
• float đặt cố định hình và bảng không trong môi trường duy chuyển
nhưng đánh số được.
Trong khi soạn thảo câu hỏi cần các lệnh của gói lệnh ta có thể đưa vào. Gói
lệnh thích hợp với mọi gói lệnh LATEX kể cả gói lệnh về hình.

3. Tùy chọn của gói lệnh


Khi dùng gói lệnh \usepackage[<Tùy chọn>]{lamdethi}, tùy chọn có các khả
năng
1. answers Cho phép hiện ra lời giải khi gọi câu hỏi.
2. noanswers Không hiện ra lời giải (mặc định)
3. draft Hiện ra nhãn bài toán và tên tệp dữ liệu đã gán khi dùng câu hỏi.
http://nhdien.wordpress.com - Nguyễn Hữu Điển 4

Nên dùng chức năng này để biết bài đã đưa ra là bài nào.
4. final Phương án cuối cùng in ra không có các nhãn trên kèm theo.

4. Định dạng bài thi

4.1. Một đề bài và lời giải


Định dạng cơ bản một bài tập

\begin{baitap}{<Nhãn của bài>}


\begin{problems}
<Nội dung đề bài>
\end{problems}
\begin{loigiai}
<Nội dung lời giải>
\end{loigiai}
\end{baitap}

1. <Nhãn của bài> Mỗi bài được gán cho một nhãn, đặc điểm của nhãn là
chi làm hai phần có dấu hai chấm ở giữa. Phần trước dấu chấm ta có
thể cho cùng nhóm ký tự như diffeasy loạt bài đạo hàm loại dễ để sau
này lấy ra hàng loạt cùng loại, phần sau arctan cho khác nhau, duy nhất
trong tệp dữ liệu. Vì vậy ta có thể cho số cũng được như diffeasy:2 bài
số 2 trong tệp của ta.
2. <Nội dung đề bài>, chấp nhận tất cả lệnh của LATEX trừ môi trường ver-
batim. Với tùy chọn kèm theo có thể chỉ hiện ra đề bài hoặc không.
3. <Nội dung lời giải> Tất cả lệnh và môi trường, kể cả hình ảnh đều cho
vào đây được. Với tùy chọn kèm theo có thể chỉ hiện ra lời giải hoặc
không.
Ví dụ

\begin{baitap}{diffeasy:arctan}
\begin{problems}
\(y = \arctan x = \tan^{-1}x\)
\end{problems}
\begin{loigiai}
\[\tan y = x\]
diff w.r.t. $x$:
\begin{eqnarray*}
\sec^2y\frac{dy}{dx} & = & 1\\
\frac{dy}{dx} & = & \frac{1}{\sec^2y}\\
& = & \frac{1}{1+\tan^2y}\\
& = & \frac{1}{1+x^2}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 5

\end{eqnarray*}
\end{loigiai}
\end{baitap}

Với lệnh

\begin{enumerate}
\item \useproblem{diffeasy:arctan}
\end{enumerate}

cho ra kết quả


1. Lấy đạo hàm hàm số sau y = arctan x = tan−1 x
Còn thêm vào lệnh

\showanswers
\begin{enumerate}
\item \useproblem{diffeasy:arctan}
\end{enumerate}

Cho kết quả chỉ lời giải

1. Lời giải.:
tan y = x
diff w.r.t. x:
dy
sec2 y = 1
dx
dy 1
=
dx sec2 y
1
=
1 + tan2 y
1
=
1 + x2

Cho cả lời giải và đề bài

\begin{enumerate}
\hideanswers
\item \useproblem{diffeasy:arctan}
\showanswers
\useproblem{diffeasy:arctan}
\end{enumerate}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 6

1. Lấy đạo hàm hàm số sau y = arctan x = tan−1 x


Lời giải.:
tan y = x
diff w.r.t. x:
dy
sec2 y = 1
dx
dy 1
=
dx sec2 y
1
=
1 + tan2 y
1
=
1 + x2

Như vậy, với lệnh \useproblem{<Nhãn của bài>} và kết hợp với
\hideanswers và \showanswers ta có thể cho ra phần câu hỏi hoặc trả lời.

4.2. Các lệnh định dạng cho các loại câu hỏi
Như vậy ta có thể viết đề bài và lời giải trực tiếp trên một văn bản các câu hỏi
rồi dùng chúng, còn câu nào không dùng sẽ không hiện ra. Nhưng như vậy sẽ
rối trên một văn bản, gói lệnh có khả năng đưa tất cả các câu hỏi vào các tệp
sau đó gọi ra sử dụng. Nghĩa là phần câu hỏi được soạn riêng ra từng tệp tùy
ý khi sử dụng thì gọi vào. Định dạng macro sau đây có thể dùng trức tiếp như
định dạng trên và có thể lưu vào tệp để gọi ra.

4.2.1. Câu hỏi tự luận

Giống hệt như ví dụ trên chỉ có khác là các môi trường được rút gọn lại

\baituluan{<Nhãn của bài>}{%Câu hỏi 1


<Nội dung đề bài>
}{%Trả lời
<Nội dung lời giải>
}%Hết câu hỏi 1

Cách dùng giống ở trên và cách dùng khác nữa ở phần sau.

4.2.2. Câu hỏi trắc nghiệm

Soạn một câu hỏi trắc nghiệm cũng có hai phần

\baitracnghiem{<Nhãn của bài>}{%Câu hỏi 1


http://nhdien.wordpress.com - Nguyễn Hữu Điển 7

<Nội dung câu hỏi>


}{%Trả lời
<Các phương án trả lời>
}%Hết câu hỏi 1
1. <Nhãn của bài> Giống phần trên.
2. <Nội dung câu hỏi> Câu hỏi được tính đến bắt đầu phương án. Các lệnh
và môi trường toán đều dùng được.
3. <Các phương án trả lời> Có hai lệnh dành cho phương án:
\dung[<n>]{<Nội dung đáp án>}
\sai[<n>]{<Nội dung đáp án>}
Bình thường không có tùy chọn [<n>] thì các phương án chỉ chiếm 1/4 theo
chiều ngang. Nếu cả 4 phương án ngắn thì để mặc định không coa tùy chọn
này. Nếu một trong 4 phương án rộng hơn 1/4 thì ta chía 2 phương án 1 cột
vằn cho [2] vào mỗi lệnh đúng sai. Còn các phương án quá dài cho [4] tất cả
xếp hàng dọc luôn. Nếu văn bản chạy 4 phương án ngắn mà vẫn xuống dòng
thì các bạn chỉnh lại 1 chút như
\setlength{\shortitemwidth}{0.1\textwidth}
Số 0.1 có thể tăng hoặc giảm 1 chút như 0.15.
Ví dụ

\baitracnghiem{giaitich:1}{%Câu hỏi 2
Giải phương trình $2^{3\frac{x-1}{x }}\cdot 3^x=\sqrt{9}$ và
chỉ ra nghiệm không nguyên của nó.
}{%Phương án trả lời
\sai {$\frac{3}{2}$;}
\dung {$-3\log_32 $;}
\sai {$\frac{5}{7}$;}
\sai {$\log_23 $;}
}%Hết một bài
x −1 √
Câu 1. Giải phương trình 23 x · 3x = 9 và chỉ ra nghiệm không nguyên của
nó.
A. 32 ; B. −3 log3 2; C. 57 ; D. log2 3;

4.2.3. Câu hỏi trắc nghiệm dạng đặc biệt

A. Một câu hỏi trắc nghiệm thường có phần dẫn giải và phần các phương án,
nhưng thực tế nhiều đề ra phần dẫn giải họ chung vào một cụm sau đó chỉ có
các câu phương án. Định dạng loại này chỉ bằng lệnh

\bangtracnghiem*{<Nhãn của bài>}{%Câu hỏi 1


<Các phương án trả lời>
http://nhdien.wordpress.com - Nguyễn Hữu Điển 8

Như vậy chỉ có phương án trả lời. Ta xét ví dụ

\baitracnghiem*{chontu:1}{%Câu hỏi 1
\dung{\underline{h}our }
\sai{\underline{h}igh }
\sai{\underline{h}ouse }
\sai{\underline{h}ome}
}%Hết một bài
\baitracnghiem*{chontu:2}{%Câu hỏi 2
\sai{ b\underline{a}sic }
\sai{n\underline{a}tion }
\dung{c\underline{a}ncer }
\sai{p\underline{a}tience}
}%Hết một bài
\baitracnghiem*{chontu:3}{%Câu hỏi 3
\sai{ stopp\underline{ed} }
\sai{work\underline{ed} }
\dung{want\underline{ed} }
\sai{lik\underline{ed}}
}%Hết một bài

Với cách dùng trong tệp

\def\dschontu{chontu:1,chontu:2,chontu:3}
\loadselectedproblems[btchontu]{\dschontu}{cauhoitienganh378}
\tieude{Chọn từ (ứng với A hoặc B, C, D) có phần gạch dưới
được phát âm khác với những từ còn lại trong mỗi câu sau.}
\begin{enumerate}[leftmargin=*,align=left,label={\bf Câu \arabic*.}]
\foreachproblem[btchontu]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

Chọn từ (ứng với A hoặc B, C, D) có phần gạch dưới được phát âm khác với
những từ còn lại trong mỗi câu sau.
Câu 1. A. hour B. high C. house D. home
Câu 2. A. basic B. nation C. cancer D. patience
Câu 3. A. stopped B. worked C. wanted D. liked
B. Dạng trắc nghiệm đặc biệt gạch dưới và các phương án ta dùng lệnh

\bangtracnghiemb{<Nhãn của bài>}{%Câu hỏi 1


<Nội dung câu hỏi>
}{%Trả lời
http://nhdien.wordpress.com - Nguyễn Hữu Điển 9

<Các phương án trả lời>


}%Hết câu hỏi 1

Phần nội dung và phương án như sau:


1. <Nhãn của bài> vẫn như ở trên
2. <Nội dung câu hỏi> có gách dưới với các phương án sai hoặc đùng dùng
lệnh:
\dungh<Từ gạch dưới> phương án từ đúng theo hàng;
\saih<Từ gạch dưới> phương án từ sai theo hàng;
3. <Các phương án trả lời> là các phương án đúng và sai
\dung{<Nội dung đáp án>}
\sai{<Nội dung đáp án>}
Ví dụ

\baitracnghiemb{suatu:1}{%Câu hỏi 1
\saih{That} is \saih{the} man \dungh{which}
told me \saih{the} bad news.
}{%Phương án trả lời
\sai{That}
\sai{the}
\dung{which}
\sai{the}
}%Hết một bài
\baitracnghiemb{suatu:2}{%Câu hỏi 2
My \saih{younger} brother \saih{has} worked
in \saih{a} bank \dungh{since} a long time.
}{%Phương án trả lời
\sai{younger}
\sai{has}
\sai{a}
\dung{since}
}%Hết một bài
\baitracnghiemb{suatu:3}{%Câu hỏi 3
\saih{It is} \saih{the English} pronunciation
that \dungh{cause} me \saih{a lot of} difficulties.
}{%Phương án trả lời
\sai{It is}
\sai{the English}
\dung{cause}
\sai{a lot of}
}%Hết một bài

Thực hiện
http://nhdien.wordpress.com - Nguyễn Hữu Điển 10

\def\dssuatu{suatu:1,suatu:2,suatu:3}
\loadselectedproblems[btsuatu]{\dssuatu}{cauhoitienganh378}
\tieude{Chọn phương án (A hoặc B, C, D) ứng với từ/ cụm từ
có gạch dưới cần phải sửa để các câu sau trở thành chính xác.}
\begin{enumerate}[leftmargin=*,align=left, label={\bf Câu \arabic*.}]
\foreachproblem[btsuatu]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

Chọn phương án (A hoặc B, C, D) ứng với từ/ cụm từ có gạch dưới cần phải
sửa để các câu sau trở thành chính xác.
Câu 1. That is the man which told me the bad news.
A B C D
Câu 2. My younger brother has worked in a bank since a long time.
A B C D
Câu 3. It is the English pronunciation that cause me a lot of difficulties.
A B C D

4.2.4. Câu hỏi trắc nghiệm trong bảng

Soạn một câu hỏi trắc nghiệm bảng cũng có hai phần

\bangtracnghiem{<Nhãn của bài>}{%Câu hỏi 1


<Nội dung câu hỏi>
}{%Trả lời
<Các phương án trả lời>
}%Hết câu hỏi 1

1. <Nhãn của bài> Giống phần trên.


2. <Nội dung câu hỏi> Câu hỏi được tính đến bắt đầu phương án. Các lệnh
và môi trường toán đều dùng được.
3. <Các phương án trả lời> Có hai lệnh dành cho phương án:
\chon {<Nội dung đáp án>}
\khong{<Nội dung đáp án>}
Ví dụ

\bangtracnghiem{bangtn:2}{
exp$(\ln x) = x$ pour tout $x$ appartenant à
}{%Phương án trả lời
\chon{$\mathbb{R}$}
\khong{$\big]0~;~+ \infty\big[$}
\khong{$\big[0~;~+\infty\big[$}
}%Hết một bài
http://nhdien.wordpress.com - Nguyễn Hữu Điển 11

Câu hỏi Trả lời


1. exp(ln x ) = x pour tout x appartenant à R
 
0 ; +∞
 
0 ; +∞

4.2.5. Câu hỏi điền chỗ trống

Ta có thể dùng phương án * cho bất cứ môi trường nào cũng được, tôi dùng
lệnh cho cau hỏi tự luận

\baitracnghiem*{<Nhãn của bài>}{


<Nội dung câu hỏi điền>
}

1. <Nhãn của bài> Giống phần trên.


2. <Nội dung câu hỏi điền> Văn bản có khoảng để chống điền vào với
lệnh \blank{<Từ cần điền>}
Ví dụ

\baitracnghiem*{diencho:so1}{%Câu hỏi 1
How much \blank{wood} would a \blank{woodchuck} chuck,
if a \blank{woodchuck}
would \blank{chuck}, wood?
}

1. How much would a chuck, if a


would , wood?

4.2.6. Câu hỏi đúng sai

Ta có thể dùng phương án * cho bất cứ môi trường nào cũng được, tôi dùng
lệnh cho cau hỏi tự luận

\baitracnghiem*{<Nhãn của bài>}{


<Nội dung câu hỏi điền>
}

1. <Nhãn của bài> Giống phần trên.


2. <Nội dung câu hỏi điền> Văn bản có khoảng bằng nhau để điền vào
với lệnh \answers{Đúng} hoặc \answers{Sai}
Ví dụ
http://nhdien.wordpress.com - Nguyễn Hữu Điển 12

\baitracnghiem*{dungsai:1}{%Câu hỏi 1
\answers{Đúng} This sentence is not false.
}
\baitracnghiem*{dungsai:2}{%Câu hỏi 1
\answers{Đúng} ‘Roger \& Trường Me’ chronicles
one man’s attempt to get into
Disneyland so that he can visit Toontown.
}

1. This sentence is not false.


2. ‘Roger & Trường Me’ chronicles one man’s attempt to get
into Disneyland so that he can visit Toontown.

4.3. Sử dụng tệp ngoài và lệnh gọi vào


4.3.1. Các tệp câu hỏi

Mỗi loại câu hỏi tôi đã ghi vào một tệp riêng. Có thể ghi chung vào một tệp
cũng không ảnh hưởng gì, để dễ quản lý và sử chữa ta ghi vào các tệp khác
nhau. Ví dụ kèm theo bao gồm các tệp:
• cauhoituluan.tex Tệp những câu hỏi tự luận.
• cauhoitracnghiem.tex Tệp những câu hỏi trắc nghiệm.
• cauhoibangtn.tex Tệp những câu hỏi trắc nghiệm bảng.
• cauhoidiencho.tex Tệp những câu hỏi điền chỗ trống.
• cauhoidungsai.tex Tệp những câu hỏi đúng sai.
Bạn có thể bố trí các tệp chứa các câu hỏi dễ, các câu hỏi khó, ... khi thiết
lập đề thi chỉ lấy một số câu trong đó thôi.

4.3.2. Các lệnh lấy đề bài trực tiếp ở tệp

A. Lấy một vài câu hỏi trong một tệp được bao quanh môi trường enumerate

\begin{enumerate}
\selectrandomly{<Tên tệp>}{<Số câu hỏi>}
\end{enumerate}

1. <Tên tệp> tên tệp có chứa câu hỏi, nếu không phải thì báo lỗi.
2. <Số câu hỏi> số câu hỏi cần đưa ra trong số các câu hỏi trong tệp.
Ví dụ đưa ra 2 câu hỏi của tệp điền chỗ trống:

\begin{enumerate}
\selectrandomly{cauhoidiencho}{2}
\end{enumerate}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 13

1. Nhất trí How much would a chuck, if a


would , wood?
2. ’s first work was the Tractatus- Philosophicus.
Có thể lấy mỗi tệp vài câu một cách ngẫu nhiên rồi cũng đưa vào môi
trường trên cho ta bộ câu hỏi cần lập.
B. Có thể đưa ra toàn bộ số câu hỏi của tệp:

\begin{enumerate}
\selectallproblems{<Tên tệp>}
\end{enumerate}

<Tên tệp> là các tệp có cấu trúc trên, kể cả tệp chứa định dạng chung nhất ở
phần đầu. Ví dụ

\begin{enumerate}
\selectallproblems{cauhoidungsai}
\end{enumerate}

1. This sentence is not false.


2. ‘Roger & Trường Me’ chronicles one man’s attempt to get into
Disneyland so that he an visit Toontown.
3. Laden swallows fly faster than unladen swallows, unless they
carry coconuts.
4. ‘Monty Python and the Holy Grail’ is a very funny movie.
5. All animals are created equal, but some animals are more
equal than others.

4.3.3. Các lệnh lấy đề bài ở tệp

A. Một lệnh nhập câu hỏi để dùng sau này không nhập vào văn bản, chỉ khi
nào dùng nó bằng lệnh khác mới lấy vào.
\loadrandomproblems[<Tên tệp chứa câu hỏi>]{<Số câu hỏi>}{<Tên tệp>}
1. <Tên tệp chứa câu hỏi> Ta đặt một tên chứa các câu hỏi trong bộ nhớ,
để dùng nó sau này như bttuluan, hoặc bttracnghiem,...
2. <Số câu hỏi> Số nguyên, lớn nhất bằng số câu hỏi có trong <Tên tệp>,
không thì báo lỗi.
3. <Tên tệp> Một trong các tệp chứa câu hỏi ở trên.
Ví dụ lấy 4 câu trong tệp tự luận (ta đã biết tệp có hơn 3 câu hỏi)
\loadrandomproblems[bttuluan]{5}{cauhoituluan}
Có thể lấy hàng loạt tệp vào một lúc như

\loadrandomproblems[bttracnghiem]{12}{cauhoitracnghiem}
\loadrandomproblems[btdiencho]{6}{cauhoidiencho}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 14

\loadrandomproblems[btdungsai]{5}{cauhoidungsai}
\loadrandomproblems[btbangtn]{11}{cauhoibangtn}

Khi đó ta có thể dùng lệnh theo nhãn để lấy ra

\begin{enumerate}[leftmargin=*,align=left,
label={\bf Câu \arabic*.\ }]
\item\useproblem[bttuluan]{logic:4}
\item\useproblem[bttracnghiem]{mc:bay}
\end{enumerate}

Câu 1. a) Phát biểu định nghĩa thế nào là hạng từ và công thức tân từ trong lý
thuyết hệ tân từ.
b) Cho vị từ ba biến P( x, y, z) ≡ ”x.y = z” trên trường số
thực. Xác định giá trị chân lý của mệnh đề: (∀ x )(∀y)(∃z) P ( x, y, z)
và (∃z)(∀ x )(∀y) P( x, y, z). Diễn giải mệnh đề thành câu nói thông
thường.
Câu 2. Giải hệ phương trình
(
x ( x + 3y) = 18,
y(3y + x ) = 6

và chỉ ra đại lượng n( x2 + y2 ), ở đây n là số nghiệm của hệ phương


trình.
A. 10; B. 1; C. 20; D. 6;

Bạn có thể đặt tạm thời draft cho tùy chọn gói lệnh sẽ nhìn thấy nhãn.
B. Khi lấy ra rồi ta có thể gọi các bài ra nhờ tệp dữ liệu như

\begin{enumerate}[leftmargin=*,align=left,
label={\bf Câu \arabic*.\ }]
\foreachproblem[btdungsai]{\item\thisproblem}
\end{enumerate}
Câu 1. This sentence is not false.
Câu 2. ‘Roger & Trường Me’ chronicles one man’s attempt to get
into Disneyland so that he an visit Toontown.
Câu 3. Laden swallows fly faster than unladen swallows, unless
they carry coconuts.
Câu 4. ‘Monty Python and the Holy Grail’ is a very funny movie.
Câu 5. All animals are created equal, but some animals are more
equal than others.
C. Thực ra các đề bài được gọi ở hình thức không có tệp để chứa thì chương
trình dùng tệp [default] để chứa chúng. Có thể dùng cấu trúc gọi liệt kê tất cả
các dữ liệu đã gọi chứa các câu hỏi
http://nhdien.wordpress.com - Nguyễn Hữu Điển 15

\begin{enumerate}[leftmargin=*,align=left, resume,
label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{\item\thisproblem}
}
\end{enumerate}

D. Đặc biệt chẳng cần dùng lệnh trên chỉ cần \input cauhoituluan.tex rồi
dùng lệnh

\begin{enumerate}[leftmargin=*,align=left, resume,
label={\bf Câu \arabic*.\ }]
\item\useproblem{logic:2}
\item\useproblem{logic:1}
\end{enumerate}

Bởi vì tập dữ liệu chứa mặc định chứa các bài gọi vào là [default]. Tất cả các
lệnh phần trước có dùng tệp cơ sở dữ liệu đều dùng thay vào đó [default] là
được như

\begin{enumerate}[leftmargin=*,align=left, resume,
label={\bf Câu \arabic*.\ }]
\foreachproblem[default]{\item\thisproblem}
\end{enumerate}

Chú ý tệp này [default] có tất cả các bài dùng cách gọi không gán vào tệp dữ
liệu cụ thể nào.

4.4. Nhãn trích dẫn cho các bài tập


1. Khi dùng liệt kê ta có thể dùng nhãn cho số bài tập như

\begin{enumerate}[{\bf Câu 1.}]


\item \label{logic:4}\useproblem[bttuluan]{logic:4}
\item \label{logic:1}\useproblem[bttuluan]{logic:1}
\item \label{logic:2}\useproblem[bttuluan]{logic:2}
\item \label{logic:3}\useproblem[bttuluan]{logic:3}
\end{enumerate}

Sau đó dùng \ref{logic:4},\ref{logic:1},...


2. Dùng liệt kê tất cả các bài tập lện \selectalllabels{cauhoituluan} mỗi
bài được gán một nhãn chính là nhãn của bài toán. Ví dụ

\setlist{labelwidth=40pt, itemindent=45pt,topsep=0pt,
http://nhdien.wordpress.com - Nguyễn Hữu Điển 16

partopsep=0pt,parsep=0pt,leftmargin=0pt,align=right}
\begin{enumerate}[label={\bf Câu \arabic*.\ }]
\selectalllabels{cauhoituluan}
\end{enumerate}

Câu 1. a) Cho P1 , P2 và Q là những mệnh đề. Hãy chỉ ra sự tương đương sau
đây
( P1 ∨ P2 ) → Q ≡ ( P1 → Q) ∧ ( P1 → Q).
b) Sử dụng sự tương đương trên chứng minh mệnh đề sau đây: " Nếu n không
chia hết cho 3 thì n2 không chia hết cho 3".

Câu 2. a) Phát biểu định nghĩa 4 phần của lý thuyết tiên đề L.


b) Cho công thức A, B, C tùy ý. Chứng minh rằng

(( A → B) ∧ ( B → C)) ` A → C.

Câu 3. Cho công thức

( A → B) → (( B → C) → (( A ∨ B) → C)).

Hãy thực hiện


a) Đưa công thức về dạng chuẩn tắc hội.
b) Chỉ ra công thức là hằng đúng.

Câu 4. a) Phát biểu định nghĩa thế nào là hạng từ và công thức tân từ trong
lý thuyết hệ tân từ.
b) Cho vị từ ba biến P( x, y, z) ≡ ”x.y = z” trên trường số thực. Xác định giá
trị chân lý của mệnh đề: (∀ x )(∀y)(∃z) P( x, y, z) và (∃z)(∀ x )(∀y) P( x, y, z). Diễn
giải mệnh đề thành câu nói thông thường.

Câu 5. Trong môn học giải tích toán học người ta định nghĩa hàm liên tục
như sau: "Hàm f ( x ) được gọi là hàm liên tục tại x0 ∈ D nếu cho trước một số
e > 0 tùy ý thì ta có được một số δ > 0 tương ứng sao cho với mọi x ∈ D thỏa
mãn | x − x0 | < δ thì | f ( x ) − f ( x0 )| < e".
a) Hãy viết lại định nghĩa theo các ký hiệu của hệ toán tân từ.
b) Hãy lập mệnh đề phủ định cho định nghĩa trên (nghĩa là hàm không liên
tục tại điểm x0 )
Tham khảo các nhãn \ref{all:logic:1} là Câu 1. , \ref{all:logic:3} là Câu
3. , \ref{all:logic:2} là Câu 2.
3. Có thể dùng liệt kê các câu hỏi đã gọi ra rồi dùng

\begin{enumerate}[leftmargin=*,align=left, resume,
label={\bf Câu \arabic*.\ }]
http://nhdien.wordpress.com - Nguyễn Hữu Điển 17

\foreachproblem[bttuluan]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

Từ sau đó ta dùng nhãn

\begin{enumerate}
\foreachproblem[bttuluan]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
\end{enumerate}

4.4.1. Chọn số ngẫu nhiên

Ta có lệnh sinh số giả ngẫu nhiên khi dùng lệnh \loadrandomproblems.


1. \PSNrandseed: \PSNrandseed{<n>} Số <n> là số nguyên khác không.
Để sinh ra các số ngẫu nhiên mối khi biên dich ta có thể đặt ở đầu văn bản
\PSNrandseed{\time} hoặc để sinh ra theo số trong năm sau tiếp theo đặt
\PSNrandseed{\year}
2. \PSNgetrandseed: \PSNgetrandseed{<Biến ghi>} Chứa số vừa truy
nhập vào <Biến ghi>. Ví dụ

\newcount\myseed
\PSNgetrandseed{\myseed}

3. \PSNrandom: \PSNrandom{<Biến ghi>}{<n>} sinh ra một số tự nhiên


từ 1 đến n, rồi ghi vào <Biến ghi>. Ví dụ sinh ra một số trong khoảng 1 đến 10
rồi ghi vào \myreg:

\newcount\myreg
\PSNrandom{\myreg}{10}

4. \random: \random{<Số đếm>}{<cận dưới>}{<cận trên>} Sinh ra số


ngẫu nhiên trong khoạng cận dưới đến cận trên và ghi vào số đếm. Ví dụ

\newcounter{myrand}
\random{myrand}{3}{8}

5. \doforrandN: \doforrandN{<n>}{<cmd>}{<list>}{<Văn bản>} Chọn


ngẫu nhiên n giá trị trong <Văn bản> cách nhau bởi dấu phảy. Mỗi lần thực
hiện lặp thì thực hiện <Văn bản> bằng lệnh <cmd>
Ví dụ gọi đề bài từ hai của danh sách tệp:

\doforrandN{2}{\thisfile}{file1,file2,file3}{%
\loadrandomproblems{1}{\thisfile}}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 18

4.5. Mẫu thiết lập đề cho từng loại câu hỏi


4.5.1. Đề tự luận

Có 3 phương án thể hiện đề. trong tệp dethituluan.tex triển khai ba khả năng
này các bạn có thể biên dịch 1. Chỉ in ra đề thi

\loadrandomproblems[dttuluan]{4}{cauhoituluan}
\hideanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachproblem[dttuluan]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

2. Chỉ in ra lời giải

\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}

3. In đầy đủ cả đề và lời giải

\hideproblems
\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}

4.5.2. Đề trắc nghiệm

1. Chỉ in ra đề

\loadrandomproblems[bttracnghiem]{15}{cauhoitracnghiem}
\hideanswers
\begin{enumerate}[leftmargin=*,align=left,
http://nhdien.wordpress.com - Nguyễn Hữu Điển 19

resume,label={\bf Câu \arabic*.\ }]


\foreachproblem[bttracnghiem]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

2. In ra câu hỏi và đáp án

\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}

3. In ra đáp án ngắn gọn

\hideproblems
\showanswers
\begin{multicols}{3}
\begin{enumerate}[leftmargin=*,align=left]
\item[\sf Phương án] A\quad B\quad C \quad D
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}
\end{multicols}

4. In ra phiếu kiểm tra theo đề

\lamtieude
\begin{center}
{\bf PHIẾU KIỂM TRA TRẮC NGHIỆM}
\end{center}
Họ và tên \dotfill Lớp \dotfill
\hideproblems
\showanswers
\lamphieu
\begin{multicols}{3}
\begin{enumerate}[leftmargin=*,align=left]
\item[\sf Phương án] A\quad B\quad C \quad D
\foreachdataset{\thisdataset}{%
http://nhdien.wordpress.com - Nguyễn Hữu Điển 20

\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}
\end{multicols}

4.5.3. Đề điền chỗ và đúng sai

1. chỉ in ra đề

\loadrandomproblems[btdiencho]{5}{cauhoidiencho}
\loadrandomproblems[btdungsai]{5}{cauhoidungsai}
\hideanswers
\noindent {\bf Điền vào chỗ trống}
\begin{enumerate}[{\bf Câu 1.}]
\foreachproblem[btdiencho]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}
\noindent {\bf Trả lời đúng sai}
\begin{enumerate}[{\bf Câu 1.}]
\foreachproblem[btdungsai]{
\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

2. In ra đề và đáp án

\begin{center}
{\bf ĐỀ BÀI VÀ ĐÁP ÁN }
\end{center}
\showanswers
\noindent {\bf Điền vào chỗ trống}
\begin{enumerate}
\foreachproblem[btdiencho]{
\item[\bf Câu \ref{prob:\thisproblemlabel}.]\thisproblem}
\end{enumerate}
\noindent {\bf Trả lời đúng sai}
\begin{enumerate}
\foreachproblem[btdungsai]{
\item[\bf Câu \ref{prob:\thisproblemlabel}.]\thisproblem}
\end{enumerate}

4.5.4. Trắc nghiệm theo bảng

1. In ra đề bài
http://nhdien.wordpress.com - Nguyễn Hữu Điển 21

\newcounter{problem}
\renewcommand{\PSNitem}{\refstepcounter{problem}%
\theproblem. }
\renewcommand{\endPSNitem}{ }
\loadrandomproblems[btbangtn]{11}{cauhoibangtn}
\setcounter{problem}{0}
\hideanswers
\renewcommand{\arraystretch}{1.5}
\begin{longtable}{| p{0.7\textwidth} |c|}
\hline
\centering \textbf{Câu hỏi} & \textbf{Trả lời}\\
\hline %
\foreachproblem[btbangtn]{
\addtocounter{problem}{1}\theproblem.\thisproblem}
&\\
\hline
\end{longtable}

2. Thay \hideanswers bằng \showanswers cho đề bài và lời giải.

4.5.5. Đề có thể thiết kế

1. Ta có thể thiết kế dạng câu hỏi

\newproblem{tab:1}{%
Kết quả $(3+2)\times5$ là? &
25 \ifshowanswers\selected\else\notselected\fi &
13 \notselected &
10 \notselected &
}{Brackets come first}%

\newproblem{tab:2}{%
Kết quả $-1+2\times3$ là? &
3 \notselected &
-7 \notselected &
5 \ifshowanswers\selected\else\notselected\fi &
}{Multiplication comes first}%

2. Rồi thiết kế câu hỏi trả lời

\begin{longtable}{lrrrl}
\bfseries Câu hỏi & \bfseries A & \bfseries B &
\bfseries C & \ifshowanswers \bfseries Reason\fi\\
\selectrandomly{cauhoithietke}{2}
\end{longtable}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 22

Câu hỏi A B C
1. Kết quả (3 + 2) × 5 là? 25 13 10
2. Kết quả −1 + 2 × 3 là? 3 -7 5

3. Quan sát kỹ ví dụ này cho ta sáng tạo hình thức các câu hỏi khác nữa.

4.5.6. Bài tập cho các chương cuốn sách

Tôi đã làm một tệp baitapcuasach.tex Cách thức làm các bài tập theo chương
của sách, hoặc là in theo từng chương hoặc là cuối cùng ta in theo từng phần
của bài tập trong từng chương. Các bạn tham khảo tệp này và nảy sinh các ý
tưởng mới.

5. Đưa hình và bảng vào câu hỏi, lời giải


Do các câu hỏi được lấy ra gần như cố định toàn bộ nội dung câu hỏi và trả
lời, nên bảng và hình phải luôn tại vị trí được đặt vào, vì vậy gói lệnh không
chấp nhận môi trường di động kiểu như table hay figure mà có tùy chọn vị trí.
Nhưng các môi trường bình thường như tabular, longtable, ... và các lệnh
đưa ảnh vào như \includegraphics[height=2cm,width=3cm]{tex1.eps} đều
được, không thay đổi gì. Vấn đề là ta phải đánh số các hình hoặc bảng bằng
lệnh \caption{...} không được, đây là lệnh cho môi trường động.
Để khắc phục hạn chế trên ta dùng gói lệnh float.sty và dùng theo mẫu sau
để có số và dùng nhãn được:
1. Đối với bảng

\begin{table}[H]
\centering%
\tabcaption{Chú thích bảng}%
\label{tab:Commands}%
\begin{tabular}{c c c}
*&*&*\\
*&*&*\\
\end{tabular}
\end{table}

Ngoài ra để có số bảng có thể dùng gói lệnh longtable.sty với môi trường
longtable nhưng với \caption{...}

\begin{center}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 23

\begin{longtable}{c c c}
*&*&*\\
*&*&*\\
\caption{Chú thích bảng}%
\label{tab:Commands}%
\end{longtable}
\end{center}

2. Đối với hình

\begin{figure}[H]
\centering%
\includegraphics[width=0.8\linewidth,clip=]{input.eps}%
\figcaption{Chú thích hình}%
\label{fig:input}%
\end{figure}

Lấy nhãn bằng \ref{fig:input} và \ref{tab:Commands}.


3. Ví dụ

\baituluan{Viduhinh:1}{%Câu hỏi 4
Hai ngũ giác đều $ABCDE$ và $AEKPL$ trong không gian sao cho
$\widehat{DAK} =60^o$. Chứng minh rằng hai mặt phẳng $ACK$
và $BAL$ vuông góc.
\begin{figure}[H]
\centering%
\includegraphics[width=5cm, height=5cm]{hinh12mat.eps}
\figcaption{Chú thích hình}%
\label{fig:input}%
\end{figure}
}{%Trả lời
Nếu ta quay $AEKPL$ quanh trục $AE$,
bắt đầu ở vị trí trùng nhau với $ABCDE$, thì góc $\widehat{DAK}$
tăng cho đến khi $AEKPL$ lại nằm trên mặt phẳng chứa $ABCDE$. .....
}%Hết câu hỏi

\begin{enumerate}[label={\bf Câu \arabic*.\ }]


\showanswers
\item \useproblem{Viduhinh:1}
\end{enumerate}

Câu 1. Hai ngũ giác đều ABCDE và AEKPL trong không gian sao cho
[ = 60o . Chứng minh rằng hai mặt phẳng ACK và BAL vuông góc.
DAK
http://nhdien.wordpress.com - Nguyễn Hữu Điển 24

K P

T
L
D E
O
C A
B

Hình 1: Chú thích hình

Lời giải. Nếu ta quay AEKPL quanh trục AE, bắt đầu ở vị trí trùng nhau với
[ tăng cho đến khi AEKPL lại nằm trên mặt phẳng chứa
ABCDE, thì góc DAK
ABCDE. .....

6. Hướng phát triển gói lệnh


1. Có thể nói rằng gói lệnh này làm tất cả các loại đề thi của các gói đã có. Ngoài
ra nó còn thích ứng với sự thay đổi của các dạng đề thi khác. Đặc biệt, Tôi sẽ
sưu tầm các dạng đề thi để thử, các bạn có dạng đề thi nào có thể gửi cho tôi
để cùng thiết kế.
2. Tài liệu này gửi kèm các tệp sau đây:

baitapcuasach.tex
cauhoibangtn.tex
cauhoidiencho.tex
cauhoidungsai.tex
cauhoithietke.tex
cauhoitracnghiem.tex
cauhoituluan.tex
dethibangtn.tex
dethidiencho.tex
dethidungtructiep.tex
dethithietke.tex
dethitracnghiem.tex
dethituluan.tex
hinh1.tex
lamdethi.sty
lamdethihelp.pdf
shortlst.sty
titledot.sty
http://nhdien.wordpress.com - Nguyễn Hữu Điển 25

3. Đây là công cụ thu thập và sử dụng các đề thi thành tuyển tập rất nhanh,
chính xác và sử dụng chúng. Nếu có thời gian tôi sẽ thu thập trên mạng một
số đề làm thành sách.
http://nhdien.wordpress.com - Nguyễn Hữu Điển 26

A. Phụ lục về các gói lệnh

A.1. Gói lệnh enumitem.sty


Mục đích gói lệnh này là chủ động điều khiển các nhãn và khoảng cách trong
môi trường enumerate, itemmize, description. Gói lệnh này không cùng với
gói lệnh enumerate.sty, khi dùng chung sẽ báo lỗi, trong nó đã có đầy đủ các
môi trường danh sách chuẩn rồi, tôi dùng gói lệnh làm nhãn và điều khiển các
câu hỏi với khoảng cách thích hợp. Khi đưa gói lệnh \usepackage{enumitem}
vào đầu văn bản, thì có thể thực hiện lệnh và môi trường. Khi dùng môi trường
có tùy chọn

\begin{enumerate}[<Tùy chọn>]
\item <Văn bản>
\end{enumerate}

Mặc định của tùy chọn như là không có gói lệnh, ta có thể gán lại
1. Thông số cho các khoảng cách đứng của danh sách:
topsep, partopsep, parsep, itemsep
2. Khoảng các theo chiều ngang:
leftmargin, rightmargin, listparindent, labelwidth, labelsep, itemindent
3. Có thể đặt lại khi thực hiện môi trường

\begin{enumerate}[ leftmargin=*,itemindent=12pt, ...]


\item <Các danh sách văn bản>
\end{enumerate}

4. Có thể đặt lại chung cho toàn văn bản bằng lệnh
\setlist{topsep=0pt, partopsep=0pt, parsep=0pt, itemsep=0pt, ...}
5. \setlist{noitemsep} bỏ khoảng cách dòng trong danh sách và các dòng
sát nhau hơn.
\setlist{nolistsep} tất cả các khoảng cách trong môi trường danh sách đều
cho bằng 0. Dùng lệnh này để kéo sát các câu hỏi trắc nghiệm sát nhau.
6. Dùng với tùy chọn phong phú như sau

\begin{enumerate}[labelindent=\parindent, leftmargin=*,
label=\Roman*., align=left, resume, start=8, widest=IV]
\item <Danh sách>
\end{enumerate}

(a) labelindent=\parindent Nhãn của danh sách được lùi vào đại lượng
bao nhiêu so với mép trái tài liệu cho ở phía bên phải, có thể cho bằng 0pt,
2trucm, ...
http://nhdien.wordpress.com - Nguyễn Hữu Điển 27

(b) leftmargin=* Hoàn toàn tương tự như trên để nhãn lùi vào cho lề trái
là bao nhiêu. Ngoài các số cụ thể như 2cm, có thể cho bằng * là giá trị mặc
định.
(c) label=Roman*. Đánh số nhãn của danh sách, verb!label=Roman*.! chữ
số la mã I, II, III, ... còn verb!label=arabic*.! cho chữ số thường dùng 1, 2, 3,....
Ta có thể cho nhãn label={\bf Câu \arabic*.\ } thêm từ vào trước số. Ứng
dụng điều này các bạn xem mẫu tôi đã dùng để có các nhãn thích hợp.
(d) align=left Nhãn được dong thẳng hàng theo bên trái, ví dụ 5 và 13
thì số 5 và 1 thẳng hàng. Mặc định là thẳng hàng bên phải.
(e) resume Cho phép đánh số tiếp tục môi trường trước đó, ứng dụng tốt
khi đề thi có nhiều phần.
(f) lstart=8 Bắt đầu đánh số từ 8, mặc định bao giờ cũng đánh số từ 1
nếu không có resume.
(g) widest=IV Độ rộng của nhãn có thể ví dụ có 3 chữ số có thể dùng
widest=000
Ta đã dùng

\setlist{noitemsep}
\setlist{nolistsep}
\setlist{labelwidth=40pt, itemindent=45pt,topsep=0pt,
partopsep=0pt,parsep=0pt,leftmargin=0pt,align=right}

A.2. Gói lệnh shortlst.sty


Gói lệnh nhằm mục đích đánh số danh sách chạy theo chiều ngang, tôi
đã dùng gói lệnh làm các phương án cho câu hỏi trắc nghiệm. Khi đưa
\usepackage{shortlst} ta có 3 môi trường
1. shortitemize Danh sách chấm tròn đen.
2. shortenumerate Danh sách đánh số thứ tự.
3. runenumerate Danh sách đánh số chạy liên liên tục bên trong môi
trường và cả ngoài môi trường nối liên tục.
Một số lệnh thông số điều khiển môi trường này như sau:
1. \runitemsep khoảng cách giữa các danh sách được đặt lại với mặc
định
\setlength{\runitemsep}{1em plus .5em minus .5em}.
2. \labelsep cách chỉ số và chữ.
3. \labelwidth độ rộng của nhãn.
4. \shortitemwidth độ rộng của một cột danh sách danh sách. giá trị
mặc định là lấy độ rộng của văn bản trừ đi các chỗ để nhãn rồi chia cho 4. Có
thể đặt lại cho thích hợp: \setlength{\shortitemwidth}{0.5\textwidth}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 28

A.3. Gói lệnh float.sty


A.3.1. Tạo ra một môi trường động mới

Tạo ra môi trường có thể dùng một số lệnh khác nhau như \newtheorem, ta đã
biết dùng lệnh này tạo ra môi trường Định lý, Mệnh đề, Bổ đề, Định nghĩa, ...Ta
chú ý là trước lệnh này thường có lệnh \theoremstyle{...} để điều khiển nội
dung in nghiêng hoặc không nghiêng trong các môi trường sử dụng sau này.
Hoàn toàn tương tự như vậy gói lệnh float.sty có lệnh làm môi trường động
\newfloat{<Tên môi trương>} và trước đó là lệnh \floatstyle{<Tùy chọn>}
ví dụ

\floatstyle{plaintop}
\newfloat{program}

Rồi dùng môi trường program như môi trường động với tiêu đề chú thích ở
phia trên đoạn chương trình. <Tùy chọn> có các từ khóa:
1. plain Chú thích động không già thay đổi so với LATEX mà ở dưới hình
chỉnh vào giữa.
2. plaintop Chú thích hình ở phía trên và tương tự như tùy chọn trên.
3. boxed Khối môi trường động được đóng khung, nhưng chú thích
ngoài khung và ở phía dưới.
4. ruled Chú thích nằm trong hai đường kẻ ngang và cuối khối cũng có
đường kẻ ngang như.
Ví dụ

\floatstyle{ruled}
\newfloat{Program}{htbp}{lop}[section]

ta có thể dùng Lệnh và thông số đầy đủ như sau: required and one optional

Program A.1 Đây là chương trình dùng phong cách ruled.


#include <stdio.h>
int main(int argc, char **argv)
{
int i;
for (i = 0; i < argc; ++i)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}

argument; it is of the form


\newfloat{<Tên môi trường>}{<Vị trí>}{<tệp chứa mục lục>}[<Trong đoạn>]
http://nhdien.wordpress.com - Nguyễn Hữu Điển 29

1. <Tên môi trường> Đặt tên cho môi trường để dùng.


2. <Vị trí> Là các quy định đơn lẻ chữ cái hoặc kết hợp để đặt khối:
• t tại Đầu trang;
• b tại Cuối trang;
• p tại Trang Di động;
• h tại Đây, nếu có thể;
• H Tại Đây, dứt khoát như vậy.
Chú ý là chỉ có tùy chọn H là mới còn, các tùy chọn khác giống như môi trường
hình và bảng ta thường dùng.
3. <tệp chứa mục lục> Phần mở rộng của
<Tên môi trường>.<tệp chứa mục lục> như là *.toc.
4. <Trong đoạn> Trong chapter, section, part.
Ví dụ ở trên là

\floatstyle{ruled}
\newfloat{Program}{tbp}{lop}[section]
\begin{Program}
\begin{verbatim}
\dots\ program text \dots
\end{verbatim}
\caption{\dots\ caption \dots}
\end{Program}

A.3.2. Những lệnh liên quan đến gói lệnh

Một số lệnh cơ bản ở phần trên đã nhắc tới, còn một số lệnh khác liên quan:
1. \floatname Mạc định tên môi trường là tên chú thích luôn như
Figure 1.1 hoặc Table 1.2 ta cũng có thể đổi tên như ví du trên đặt
\floatname{Program}{Chương trình}

Chương trình A.2 Đây là chương trình dùng phong cách ruled.
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
for (i = 0; i < argc; ++i)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}

2. \floatplacement Mặc định hình được chỉ ra khi có tùy chọn. Nếu
http://nhdien.wordpress.com - Nguyễn Hữu Điển 30

toàn bài đặt chú thích một kiểu thi đặt \floatplacement{figure}{tp} kiểu
đầu trang di động.
3. \restylefloat Lệnh đặt lại phong cách của khối động, như ta đặt lại
cho bảng đóng khung

\floatstyle{boxed}
\restylefloat{table}

\begin{table}[H] \def\B#1{$\displaystyle{n\choose#1}$}
\begin{center} \begin{tabular}{c|cccccccc}
$n$&\B0&\B1&\B2&\B3&\B4&\B5&\B6&\B7\\ \hline
0 & 1\\
1 & 1&1\\
2 & 1&2&1\\
3 & 1&3&3&1\\
4 & 1&4&6&4&1\\
5 & 1&5&10&10&5&1\\
6 & 1&6&15&20&15&6&1\\
7 & 1&7&21&35&35&21&7&1
\end{tabular} \end{center}
\caption{Pascal’s triangle. This is a re-styled \LaTeX\ \texttt{table}.%
\label{table1}}
\end{table}

               
n n n n n n n n
n
0 1 2 3 4 5 6 7
0 1
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1
6 1 6 15 20 15 6 1
7 1 7 21 35 35 21 7 1

Bảng 2: Pascal’s triangle. This is a re-styled LATEX table.

4. \listof \listof{<Tên môi trường>}{<Tiêu đề>} tạo ra danh sách


các môi trường đã sử dụng có cùng tên và thêm tiêu đề ở trên.Giống như
lệnh \listoffigures và \listoftables
http://nhdien.wordpress.com - Nguyễn Hữu Điển 31

A.3.3. Sử dụng gói lệnh

1. Khi dùng gói lệnh này môi trường table và figure giữ nguyên giá trị và tăng
thêm khả năng, ví dụ thêm tùy chọn cố định [H], dùng

\floatstyle{plaintop}
\restylefloat{figure}

đặt lại chú thích hình và bảng.

\begin{figure}[H]
\centering
\includegraphics[height=4cm,width=6cm]{banco1.eps}
\caption{Dùng graphicx}\label{fig:}
\end{figure}

Hình 2: Dùng graphicx

2. Nhiều lớp hoặc môi trường cố định dùng được với tùy chọn [H] mà
không bị báo lỗi.
3. Sáng tạo ra các khối như

\floatstyle{ruled}
\newfloat{vidu}{htbp}{lop}[section]
\floatname{vidu}{Ví dụ}
\begin{vidu}
$$A^2=B^2+C^2$$
\caption{Đây là ví dụ hay}
\end{vidu}

Ví dụ A.1 Đây là ví dụ hay


A2 = B2 + C 2
http://nhdien.wordpress.com - Nguyễn Hữu Điển 32

A.4. Gói lệnh nonfloat.sty


Trong chế độ LaTeX bình thường thì môi trường table và figure luôn để bảng
và hình trong chế độ di động, nghĩa là với thông số

\begin{figure}[!ht]
\centering
\includegraphics[height=2cm,width=3cm]{*.eps}
\caption{}\label{fig:}
\end{figure}

thì hình có thể đặt tại vị trí có lệnh nếu còn chỗ không thì chuyển sang đầu
trang sau hoặc về cuối bài. Nhiều lớp hoặc gói lệnh không dùng chế độ động
này, gói lệnh nonfloat.sty đáp ứng yêu cầu này, nhưng không dùng được môi
trường table và figure nữa, mà phải thay đổi một chút. Đáng lẽ là

\begin{table}[htbp]
\caption{Table Caption}%
\label{tab:supertitle}%
\begin{tabular}{...}
...
\end{tabular}
\end{table}

ta thay bằng

\begin{minipage}{\linewidth}
\centering%
\tabcaption{Commands for Table and Figure Captions}%
\label{tab:Commands}%
\begin{tabular}{c l c }
...
\end{tabular}
\end{minipage}

Hình được thay bằng

\begin{minipage}{\linewidth}
\centering%
\includegraphics[width=0.8\linewidth,clip=]{input.eps}%
\figcaption{Figure Caption}%
\label{fig:input.eps}%
\end{minipage}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 33

A.5. Gói lệnh ifthen.sty


Gói lệnh để lập trình điều khiển đã có nói đầy đủ trong cuốn sách của tôi.

A.6. Các gói lệnh soạn đề thi hoặc câu hỏi kiểm tra khác
1. answers.sty Gói lệnh soạn câu hỏi và trả lời liên tục nhưng thi thực
hiện có thể in câu hỏi riêng và trả lời riêng, tôi đã hướng dẫn làm sách theo các
chương. Trang web của tôi có bài riêng về gói lệnh này. Bạn tham khảo nguyên
bản tại tại địa chỉ
www.ctan.org/tex-archive/macros/latex/contrib/answers/
2. probsoln.sty Gói lệnh tao ra đề thi mà tôi đã sử dụng để làm ra gói
lệnh này. Nguyên bản chỉ có các môi trường đơn giản tự luận, trắc nghiệm thô
sơ. Gói lệnh có tại địa chỉ
http://tug.ctan.org/tex-archive/macros/latex/contrib/probsoln/
3. dethi.sty cùng với việc sử đổi examdesign.cls tạo ra đề trắc nghiệm
và một số loại đề thi với sự sáo trộn cả câu hỏi lẫn phương án trả lời. Chỉ dùng
làm đề độc lập, tuy rất mạnh và đã được sử dụng nhiều. Gói lệnh đã được nói
trong trang web của tôi và kèm vào với Chương trình VieTeX.
http://nhdien.wordpress.com
4. alterqcm.sty làm đề thi theo dạng bảng. Có tại địa chỉ
http://tug.ctan.org/tex-archive/macros/latex/contrib/alterqcm/

Tài liệu
[1] Nguyễn Hữu Điển,Nguyễn Minh Tuấn, LaTeX tra cứu và soạn thảo,
NXBĐHQG, 2001.

[2] Nguyễn Hữu Điển, LaTeX gói lệnh và phần mềm công cụ, NXBĐHQG, 2004.

[3] Các địa chỉ gói lệnh đã được liệt kê ở trên

También podría gustarte