VietTUG.org - old forum - threads' archive

thread_id = 521, contains 521, 523, 528, 554, 577, 580, 583, 1619
id = 521, parent = 0, thread = 521, catid = 24, locked = 0, moved = 0,
userid = kyanh, ip = 222.252.246.68, time = 2005/12/15 (1134645258) ,
subject = \\def là gì (phần 1, bare), hits = 6319, karma = 0+0-,
* Gọi là phần 1, vì nói về \def thì nó cả ngày vẫn chưa hết!
"bare" để chỉ các macro không có tham số

* \def dùng để định nghĩa một macro mới. Cũng giống như \newcommand. Nhưng \def bỏ qua hoàn toàn lệnh trước đó, còn \newcommand thì sẽ báo lỗi khi lệnh đã có rồi (khi ấy, phải dùng \renewcommand). Người dùng \LaTeX được khuyến cáo dùng \newcommand thay vì \def, nhưng thường thì ta dùng \def cho nhanh. Mỗi cái có ưu và nhược điểm riêng.

\def\dh{Đại học Sư Phạm}


Với mã trên, ta có một macro mới, gọi là \dh. Mỗi lần gọi \dh\ (chú ý có \ theo sau), ta có ngay chuỗi "Đại học Sư Phạm". Việc dùng \ theo sau là rất quan trọng. Nếu dùng \dh XXX thì sẽ có "Đại học Sư PhamXXX", trong khi \dh\ XX mới bảo đảm kết quả "Đại học Sư Pham XX".

Nếu dùng \newcommand:
\providecommand\dh{Đại học Sư Phạm}

Lệnh \providecommand sẽ định nghĩa mới nếu \dh chưa có. Ngược lại, nếu \dh đã có rồi, thì lệnh trên sẽ bị bỏ qua.

Như vậy, dùng \def\dh sẽ chắc chắn bạn thu được kết quả như ý bạn.

* Để khắc phục chuyện phải dùng \ đằng sau mỗi lệnh, ta có thể dùng gói xspace:

\usepackage{xspace}
\def\dh{Đại học Sư Phạm\xspace}


Bây giờ thì \dh XXX thì sẽ có "Đại học Sư Phạm XX". Tại sao? Lệnh \xspace của gói xspace giúp bạn detect phần theo sau lệnh!

* Để kết thúc bài viết, xin nêu ra đây một dạng định nghĩa dùng \let: Giả sử ta đã có macro \abc. Ta cho nó một tên mới như sau:
\let\dh\abc


Khi đó, dùng \dh cũng như dùng \abc. Nói "cho một cái tên mới" thực ra không chính xác, vì: sau lệnh trên, nếu ta định nghĩa lại \abc, thì \dh vẫn có tác dụng của \abc cũ. Áp dụng kỹ thuật này để định nghĩa lại các macro mà vẫn sử dụng một phần của engine cũ. Xem ví dụ trong gói lyk, http://download.viettug.org/mirror1.php?files=lyk-

Các bạn dùng bảng mã TCVN3 đều (phải) biết ví dụ sau để tạo các ký tự hoa:
\let\up\MakeUppercase % hoặc \let\up=\MakeUppercase
\up {ánh nắng} % cho ra ÁNH NẮNG


* Như đã nói, đây chỉ là "bare". Còn cả ngày để mình nói về \def
 
id = 523, parent = 521, thread = 521, catid = 24, locked = 0, moved = 0,
userid = hoangoclan, ip = 220.231.109.195, time = 2005/12/15 (1134647431) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
Cảm ơn bác kyanh rất nhiều, bây giờ thì mọi thứ đã rõ rùi, em sẽ tìm hiểu thêm thông tin trên internet.
 
id = 528, parent = 523, thread = 521, catid = 24, locked = 0, moved = 0,
userid = kyanh, ip = 203.210.245.170, time = 2005/12/15 (1134663431) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
hoangoclan:
Cảm ơn bác kyanh rất nhiều, bây giờ thì mọi thứ đã rõ rùi, em sẽ tìm hiểu thêm thông tin trên internet.
Tìm đâu cho xa?
LINK_HERE
 
id = 554, parent = 528, thread = 521, catid = 24, locked = 0, moved = 0,
userid = tsnsidon, ip = 220.231.78.125, time = 2005/12/18 (1134867624) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
Ai bảo \def chỉ dành cho những ai quan tâm đến lập trình trong TeX not LaTeX.

Nếu bạn muộn biết \def để làm gì thì sẽ tìm thấy ngay câu trả lời: Open and peruse:

\texmf\tex\latex\base\latex.ltx

Bạn sẽ biết được ít ra là vài hay vài chục tác dụng của \def ngay ấy mà. Nhưng thường nhất vẫn là \define.
 
id = 577, parent = 554, thread = 521, catid = 24, locked = 0, moved = 0,
userid = cuong12giaitich, ip = 203.160.1.52, time = 2005/12/21 (1135183268) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
Long Phan:
Ai bảo \def chỉ dành cho những ai quan tâm đến lập trình trong TeX not LaTeX.

Nếu bạn muộn biết \def để làm gì thì sẽ tìm thấy ngay câu trả lời: Open and peruse:

\texmf\tex\latex\base\latex.ltx

Bạn sẽ biết được ít ra là vài hay vài chục tác dụng của \def ngay ấy mà. Nhưng thường nhất vẫn là \define.
Từ trước tới giờ, mình đã dùng \def để định nghĩa các từ muốn gỏ tắt và nói chung là tốt cả, ví dụ \def\tp{topological space} thì trong văn bản chỉ cẫn gõ \tp \ là được. Nhưng giả sử mình dung \def để định nghĩa lại lệnh thì không thành công. Ví dụ như nếu mình định nghĩa lại lệnh phân số như thế này \def\ps{\dfrac} và trong văn bản, mình dùng là $\ps{1}{2}$ hoặc $\ps12$ đều báo lỗi. Các bạn có thể cho mình biết lý do không? Và hơn nữa, nếu muốn định nghĩa lại lệnh thì làm thế nào? Cảm ơn các bạn
 
id = 580, parent = 577, thread = 521, catid = 24, locked = 0, moved = 0,
userid = kyanh, ip = 222.252.245.18, time = 2005/12/22 (1135192205) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
1/ Dùng gói xspace (xem bài của mình) để định nghĩa macro gõ tắt. Khi đó, chỉ việc gõ \tp, không cần phải gõ \tp \

2/ Dùng
\let\ps\frac


Bị lỗi thì còn do nhiều thứ. Bác gửi lên đây một tí lỗi thì /me mới chẩn đoán được!

3/ Dùng \renewcommand dể định nghĩa lại lệnh
 
id = 583, parent = 580, thread = 521, catid = 24, locked = 0, moved = 0,
userid = kyanh, ip = 222.252.245.18, time = 2005/12/22 (1135193173) ,
subject = Re:\\def là gì (phần 1, ###), hits = 0, karma = 0+0-,
Ví dụ như nếu mình định nghĩa lại lệnh phân số như thế này \def\ps{\dfrac} và trong văn bản, mình dùng là $\ps{1}{2}$ hoặc $\ps12$ đều báo lỗi. Các bạn có thể cho mình biết lý do không? Và hơn nữa, nếu muốn định nghĩa lại lệnh thì làm thế nào?
Chà, mình kô đọc kỹ bài của bác. Bác muốn như vậy không phải là định nghĩa lại lệnh, mà là định nghĩa lệnh mới

* Xem lại bài trước: định nghĩa lệnh không có tham số
* Giả sử ta muốn định nghĩa lệnh \phanso, nhận hai tham số. Làm như sau:

\def\phanso#1#2{đây là tham số #1, đây là tham số #2}

* ...
 
id = 1619, parent = 577, thread = 521, catid = 24, locked = 0, moved = 0,
userid = lyk, ip = 222.252.247.183, time = 2006/03/30 (1143734621) ,
subject = Re:\\def là gì (phần 1, bare), hits = 0, karma = 0+0-,
Cuong12giaitich:
...giả sử mình dung \def để định nghĩa lại lệnh thì không thành công. Ví dụ như nếu mình định nghĩa lại lệnh phân số như thế này \def\ps{\dfrac} và trong văn bản, mình dùng là $\ps{1}{2}$ hoặc $\ps12$ đều báo lỗi...
Lâu ngày đọc lại... bị lỗi vì lệnh \dfrac chỉ có trong gói amsmath. Nếu dùng như sau thì không bị lỗi gì cả
%\usepackage{amsmath}
\def\ps{\dfrac}

...
$\ps12$ % không bị lỗi nhé ;)