TeX

Tên

Để tỏ lòng quý trọng đến Viện Công nghệ California (Caltech), nơi Knuth nhận bằng tiến sĩ, tên TeX được dụng ý dùng với phát âm "tekh", trong đó "kh" đại diện cho âm cuối của loch trong tiếng Scotland hay tên của nhà soạn nhạc người Đức Bach (theo Bảng chữ cái phiên âm quốc tế IPA /tɛx/). Chữ X được dùng để đại diện cho chữ χ (chi) trong tiếng Hy Lạp. TeX là dạng viết tắt của τέχνη (technē), tiếng Hy Lạp có nghĩa là "nghệ thuật" và "thủ công", cũng là chữ căn nguyên của technical (kĩ thuật).
Tên được xếp chữ với "E" nằm bên dưới đường ngang; nếu hệ thống không hỗ trợ subscript, nó được viết "ước chừng" là "TeX".
Các ủng hộ viên của TeX phát triển thêm các tên gọi từ "TeX" — như TeXnician (người dùng phần mềm TeX), TeXhacker (người lập trình TeX), TeXmaster (người lập trình thông thạo TeX), TeXhax, và TeXnique.

Lịch sử

Knuth bắt đầu viết TeX vì ông cảm thấy khó chịu khi chất lượng sắp chữ bị giảm sút trong các quyển I-III của tác phẩm The Art of Computer Programming (Nghệ thuật lập trình máy tính) hoành tráng của ông, được sắp xếp bởi Tập đoàn Monotype. Với phong thái của một hacker điển hình thôi thúc giải quyết vấn đề một lần cho mãi mãi, ông bắt đầu thiết kế ngôn ngữ sắp chữ của riêng mình. Vào ngày 13 tháng 5 năm 1977, ông đã viết một bản ghi nhớ để tự mô tả các tính năng cơ bản của TeX. Ông dự tính hoàn thành trong kỳ nghỉ phép năm 1978 nhưng phải đến hơn 10 năm sau, tức năm 1989, ngôn ngữ này mới ngưng bổ sung thêm tính năng.
Guy Steele tình cờ ở Stanford trong mùa hè năm 1978, khi Knuth phát triển phiên bản TeX đầu tiên. Khi Steele quay lại Viện Công nghệ Massachusetts (MIT) mùa thu năm ấy, ông viết lại phần nhập/xuất (I/O) của TeX để chạy dưới Hệ thống chia sẻ thời gian không tương thích (ITS).
Phiên bản TeX đầu tiên được viết bằng ngôn ngữ lập trình SAIL để chạy trên một PDP-10 dưới hệ điều hành WAITS của Đại học Stanford. Ở các phiên bản TeX sau này, Knuth phát minh khái niệm lập trình văn chương (literate programming), một phương thức tạo ra mã nguồn có tính tương thích và tài liệu có liên kết chéo với chất lượng cao (dĩ nhiên được sắp chữ bằng TeX) từ một cùng tập tin nguyên thuỷ. Ngôn ngữ được dùng gọi là WEB và tạo ra chương trình ở dạng DEC PDP-10 Pascal.
Một phiên bản mới của TeX được viết lại từ đầu và gọi là TeX82 do được xuất bản vào năm 1982. Trong số những thay đổi đáng chú ý có, thuật toán gạch nối ban đầu đã được thay thế bằng một thuật toán mới được viết bởi Frank Liang. TeX82 cũng sử dụng số học cố định điểm thay vì dấu phẩy động, để đảm bảo khả năng tái tạo kết quả trên phần cứng máy tính khác nhau và bao gồm một ngôn ngữ lập trình Turing hoàn chỉnh. Năm 1989, Donald Knuth phát hành phiên bản mới của TeX và METAFONT. Mặc dù mong muốn giữ cho chương trình ổn định, Knuth nhận ra rằng 128 ký tự khác nhau cho đầu vào văn bản không đủ để chứa ngôn ngữ nước ngoài; thay đổi chính trong phiên bản 3.0 của TeX là khả năng làm việc với đầu vào 8 bit, cho phép thực hiện 256 ký tự khác nhau trong đầu vào văn bản.
Kể từ phiên bản 3, TeX đã sử dụng một hệ thống đánh số phiên bản riêng, các cập nhật được biểu thị bằng cách thêm vào một chữ số vào cuối số thập phân, sao cho số phiên bản tiệm cận π. Phiên bản hiện tại của TeX là 3.14159265; nó được cập nhật lần cuối 2014-01-12. Đây là sự phản ánh thực tế rằng TeX hiện rất ổn định và chỉ các cập nhật nhỏ được dự tính thực hiện. Thiết kế đã bị hoãn lại sau phiên bản 3.0 và không có tính năng mới hoặc thay đổi cơ bản nào được thêm vào, vì vậy tất cả các phiên bản mới hơn sẽ chỉ chứa các bản sửa lỗi. Mặc dù chính Donald Knuth đã đề xuất một vài lĩnh vực mà TeX có thể đã được cải thiện. Vì lý do này, ông đã nói rằng "thay đổi cuối cùng nhất (thực hiện trước khi tôi chết)" sẽ chuyển số phiên bản thành π, tại điểm đó mọi bọ (bug) còn lại sẽ thành tính năng". Tương tự như vậy, các phiên bản của METAFONT sau 2.0 tiếp cận tiệm cận e và một sự thay đổi tương tự sẽ được áp dụng sau khi Knuth qua đời.
Vì mã nguồn của TeX về cơ bản nằm trong phạm vi công cộng, các lập trình viên khác được phép (hay được khuyến khích) cải thiện hệ thống, nhưng được yêu cầu sử dụng tên khác để phân phối TeX đã sửa đổi, có nghĩa là mã nguồn có thể vẫn phát triển. Ví dụ, dự án Omega được phát triển sau năm 1991, chủ yếu để tăng cường khả năng sắp xếp đa ngôn ngữ của TeX. Knuth đã tạo ra các phiên bản sửa đổi "không chính thức", chẳng hạn như TeX-XeT, cho phép người dùng trộn các văn bản được viết bằng các hệ thống viết từ trái sang phải và phải sang trái trong cùng một tài liệu.

Hệ thống sắp chữ

Các lệnh trong TeX thường bắt đầu với dấu chéo ngược và được nhóm bằng dấu ngoặc nhọn. Tuy nhiên hầu hết các đặc tính pháp cú của TeX có thể được thay đổi ngay trong lúc dùng, khiến một nguồn TeX khó có thể phân tích cấu trúc bởi bất cứ gì trừ chính bản thân TeX. TeX là một ngôn ngữ dựa trên macro và biểu tượng (token): nhiều lệnh, bao gồm hầu hết các lệnh do người dùng định nghĩa, được mở rộng trong lúc dùng cho đến khi chỉ còn các biểu tượng không thể mở rộng thêm được nữa và chúng sẽ được thực thi. Bản thân sự mở rộng này thực tế không gây tác dụng phụ. Đệ quy lặp (tail recursion) các macro không tốn bộ nhớ, và có sẵn cấu trúc if-then-else. Điều này khiến TeX trở thành ngôn ngữ Turing trọn vẹn (Turing-complete) ngay cả ở mức độ mở rộng.
Hệ thống có thể được chia đại khái thành 4 cấp độ: ở cấp độ đầu, TeX phân tích từ vựng để tìm các chuỗi điều khiển. Bước kế tiếp, chuỗi điều khiển mở rộng (như câu điều kiện hoặc macro đã được định nghĩa) được thay bởi văn bản của chính chúng. Ở giai đoạn 3, các ký tự được xếp thành đoạn văn; thuật toán ngắt đoạn của TeX tối ưu hoá điểm ngắt cho toàn đoạn. Văn bản được phân thành trang ở bước cuối.
Hệ thống TeX hiểu biết chính xác kích thước tất cả ký tự và ký hiệu, và nó dùng thông tin này để tính toán sắp xếp tối ưu số chữ trong dòng và dòng trong trang. Sau đó nó tạo tập tin DVI (viết tắt cho "device independent", độc lập với thiết bị) chứa vị trí chung cuộc cho mọi ký tự. Tập tin dvi này có thể được in trực tiếp với driver máy in phù hợp, hoặc có thể được chuyển sang các định dạng khác. Ngày nay, PDFTeX thường được dùng để bỏ qua giai đoạn phát sinh DVI.
Hầu hết chức năng được cung cấp bởi các tập tin định dạng. Các định dạng thường gặp là TeX thuần tuý của Knuth, LaTeX (có ở khắp các ngành kĩ thuật), và ConTeXt (chủ yếu được dùng cho xuất bản trên desktop).
Tác phẩm tham khảo cơ bản cho TeX là hai quyển đầu bộ Computers and Typesetting (Máy tính và sắp chữ) của Knuth, The TeXbook và TeX: The Program (có chứa toàn bộ mã nguồn được chú thích của TeX).
TeX thường được phân phối cùng với Metafont, một chương trình đồng hành cũng được phát triển bởi Knuth cho phép miêu tả các font chữ bằng thuật toán. Cấu trúc thư mục cài đặt TeX / Metafont được chuẩn hoá trong cây thư mục texmf.

Giấy phép

Giấy phép cho quyền phân phối và sửa đổi tự do nhưng yêu cầu bất cứ phiên bản sửa đổi nào cũng không được gọi là TEX, TeX, hay bất cứ thứ gì tương tự có thể gây nhầm lẫn, tương tự như một thương hiệu. Bộ thử TRIPTRAP giúp kiểm tra một ứng dụng có thực sự là TEX hay không.

Chất lượng

Mặc dù được viết kĩ lưỡng, TeX quá lớn (và cũng chứa quá nhiều kĩ thuật mới mẻ) đến nỗi nó được cho là đã phát hiện ít nhất một lỗi lập trình trong mỗi hệ thống Pascal dùng để biên dịch. TeX chạy trên gần như mọi hệ điều hành.
Knuth treo giải thưởng bằng tiền cho những ai phát hiện và thông báo lỗi (lỗi lập trình) trong TeX. Giải thưởng cho mỗi lỗi khởi đầu với $2,56 và nhân đôi mỗi năm cho đến khi nó đóng băng; giá trị hiện tại là $327,68. Tuy nhiên điều này không làm Knuth nghèo túng, vì có rất ít lỗi được phát hiện; và trong đa số trường hợp tờ ngân phiếu chứng minh trao cho người tìm ra lỗi thường được đóng thành khung thay vì đổi thành tiền.

Các khía cạnh khoa học máy tính của TeX

Phần mềm TeX hội tụ một số thuật toán thú vị, đã dẫn đến một số luận án của các học trò của Knuth. Thí dụ, thuật toán dấu nối từ (hyphenation) (công trình của Frank Liang) được dùng để quy định ưu tiên cho dấu ngắt trong nhóm các chữ cái.
Thuật toán ngắt dòng là thí dụ cho lập trình động. Bài toán ngắt một đoạn văn n chữ thành các dòng có độ phức tạp thực 2^n, nhưng với lập trình động, bố trí tối ưu toàn bộ có thể rút ra theo thời gian tỉ lệ với số từ và số từ trong một dòng. Luận án của Michael Plass cho thấy cách thức bài toán ngắt trang có thể NP-trọn vẹn (NP-complete) vì các tình huống nảy sinh khi đặt hình ảnh.
Chương trình đồng hành Metafont để phát sinh ký tự dùng đường cong Bezier theo cách khá chuẩn, nhưng Knuth cống hiến nhiều vào việc bài toán chuyển hình ảnh thành định dạng bitmap (rasterizing). Một luận án khác, bởi John Hobby, khảo sát hơn nữa bài toán số hoá "đường cọ" (brush trajectories). Thuật ngữ này xuất phát từ sự kiện rằng Metafont miêu tả ký tự như chúng được vẽ bởi các cọ trừu tượng.

Công cụ tương thích

Trên hệ thống tương thích UNIX (gồm cả Mac OS X), TeX được phân phối ở dạng teTeX. Trên Windows, có bản phân phối MiKTeX và bản phân phối fpTeX.
Trình soạn thảo văn bản TeXmacs là chương trình soạn thảo văn bản khoa học WYSIWYG có dụng ý tương thích với TeX. Nó dùng các font của Knuth, và có thể phát sinh kết quả TeX. LyX là công cụ tương tự.