Sử dụng địa phương {
... }
các nhóm một cách khôn ngoan
Như đã chỉ ra trong câu trả lời này , các ký tự hoạt động như ~
có thể được sử dụng làm tên macro. Thật không may, ~
là ký tự hoạt động duy nhất theo mặc định và việc thay đổi catcode cho một ký tự khác rất tốn kém: \catcode`!13
mất 12 byte. Nếu định nghĩa macro mới chỉ cần trong một vùng nhỏ trong mã của bạn, các nhóm cục bộ có thể là một giải pháp.
Khi TeX vào một nhóm cục bộ mới được mở bởi {
, nó sẽ tạo một cấp độ nhóm mới trên ngăn xếp lưu nội bộ. Điều này có nghĩa là tất cả các macro và thanh ghi hiện tại được lưu. Bất kỳ sửa đổi nào đối với chúng (trừ khi được đánh dấu rõ ràng là \global
) hiện chỉ hoạt động cho đến khi nhóm được đóng lại }
. Điều này có nghĩa rằng~
có thể được xác định lại trong một nhóm, được sử dụng ở đó với định nghĩa mới và định nghĩa cũ sẽ tự động được khôi phục sau khi nhóm kết thúc.
Đây là một ví dụ:
\def~{abc}
~ -- {\def~{123}~} -- ~
Đầu ra này
abc - 123 - abc
Một tác dụng phụ thú vị của cơ chế nhóm này là các giá trị cũ vẫn có sẵn trong nhóm cho đến khi chúng được thay đổi ở đó. Để minh họa điều đó, hãy tưởng tượng chúng ta muốn in một số ký tự dựa trên giá trị của bộ đếm, đệm chúng với khoảng trắng có độ dài cố định và tiếp tục với giá trị bộ đếm ban đầu. Điều này có thể đạt được bằng cách sau:
\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.
đầu ra nào
In một char 3 lần, pad với 7 dấu cách và tiếp tục với x = 3.
Hành vi nhóm này đặc biệt quan trọng nếu bạn muốn sử dụng các macro tiêu chuẩn của TeX để lặp \loop ... \repeat
lồng nhau. Các macro này xác định các lệnh nội bộ và sử dụng chúng để xác định cách tiến hành. Lồng chúng mà không đặt vòng lặp bên trong vào dấu ngoặc nhọn sẽ gây nhầm lẫn các lệnh nội bộ và dẫn đến hành vi không mong muốn.