Professional Documents
Culture Documents
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
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
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.
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}
\showanswers
\begin{enumerate}
\item \useproblem{diffeasy:arctan}
\end{enumerate}
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
\begin{enumerate}
\hideanswers
\item \useproblem{diffeasy:arctan}
\showanswers
\useproblem{diffeasy:arctan}
\end{enumerate}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 6
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.
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
Cách dùng giống ở trên và cách dùng khác nữa ở phần sau.
\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;
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
\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
\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
\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
Soạn một câu hỏi trắc nghiệm bảng cũng có hai phần
\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
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*{diencho:so1}{%Câu hỏi 1
How much \blank{wood} would a \blank{woodchuck} chuck,
if a \blank{woodchuck}
would \blank{chuck}, wood?
}
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*{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.
}
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.
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
\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}
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}
\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
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.
\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".
(( A → B) ∧ ( B → C)) ` A → C.
( A → B) → (( B → C) → (( A ∨ B) → C)).
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}
\begin{enumerate}
\foreachproblem[bttuluan]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
\end{enumerate}
\newcount\myseed
\PSNgetrandseed{\myseed}
\newcount\myreg
\PSNrandom{\myreg}{10}
\newcounter{myrand}
\random{myrand}{3}{8}
\doforrandN{2}{\thisfile}{file1,file2,file3}{%
\loadrandomproblems{1}{\thisfile}}
http://nhdien.wordpress.com - Nguyễn Hữu Điển 18
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}
\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}
\hideproblems
\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}
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
\showanswers
\begin{enumerate}[leftmargin=*,align=left,
resume,label={\bf Câu \arabic*.\ }]
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{
\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}
\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}
\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}
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}
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}
\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}%
\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.
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.
\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}
\begin{figure}[H]
\centering%
\includegraphics[width=0.8\linewidth,clip=]{input.eps}%
\figcaption{Chú thích hình}%
\label{fig:input}%
\end{figure}
\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
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
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. .....
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
\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
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}
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
\floatstyle{ruled}
\newfloat{Program}{tbp}{lop}[section]
\begin{Program}
\begin{verbatim}
\dots\ program text \dots
\end{verbatim}
\caption{\dots\ caption \dots}
\end{Program}
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
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}
\begin{figure}[H]
\centering
\includegraphics[height=4cm,width=6cm]{banco1.eps}
\caption{Dùng graphicx}\label{fig:}
\end{figure}
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}
\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}
\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.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.