3 điểm bởi GN⁺ 2024-07-21 | 2 bình luận | Chia sẻ qua WhatsApp
  • Typst là hệ thống dàn trang dựa trên markup hướng tới sức mạnh ngang tầm LaTeX nhưng dễ học và dễ dùng hơn; kho lưu trữ này bao gồm trình biên dịch và CLI cần thiết để biên dịch tài liệu cục bộ
  • Cung cấp markup tích hợp cho các tác vụ định dạng cơ bản, hàm linh hoạt, scripting tích hợp, dàn công thức, quản lý tài liệu tham khảo và thông báo lỗi thân thiện
  • Hướng tới thời gian biên dịch nhanh nhờ biên dịch gia tăng; typst watch theo dõi thay đổi của mã nguồn và biên dịch lại nhanh hơn so với việc biên dịch từ đầu mỗi lần
  • CLI có thể được cài bằng binary phát hành, trình quản lý gói, cargo, Nix hoặc Docker; tạo PDF bằng typst compile file.typ và có thể chỉ định đường dẫn font tùy chỉnh
  • Nguyên tắc thiết kế là đạt được sự đơn giản nhờ tính nhất quán, sức mạnh nhờ khả năng kết hợp, và hiệu năng nhờ tính gia tăng; mục tiêu là tốc độ đủ để xem trước tức thì

Typst cung cấp những gì

  • Typst là hệ thống dàn trang dựa trên markup được thiết kế để mạnh mẽ như LaTeX nhưng dễ học và dễ sử dụng hơn
  • Các tính năng chính gồm
    • Markup tích hợp cho các tác vụ định dạng thường dùng
    • Các hàm linh hoạt cho những tác vụ khác
    • Hệ thống scripting được tích hợp chặt chẽ
    • Dàn công thức, quản lý tài liệu tham khảo, v.v.
    • Thời gian biên dịch nhanh dựa trên biên dịch gia tăng
    • Thông báo lỗi thân thiện khi có vấn đề
  • Kho lưu trữ này chứa trình biên dịch Typst và CLI cần thiết để biên dịch tài liệu Typst cục bộ
  • Nếu muốn trải nghiệm soạn thảo tốt hơn, có thể dùng trình biên tập trực tuyến cộng tác miễn phí

Cú pháp và mô hình soạn thảo

  • Typst dùng set rule như #set để thiết lập thuộc tính của các phần tử, chẳng hạn kích thước trang hoặc đánh số tiêu đề
    • Nếu đặt chiều cao pageauto, kích thước sẽ tự điều chỉnh theo nội dung
    • Nếu cần kiểm soát đầy đủ hơn, có thể dùng show rules để định nghĩa lại hoàn toàn diện mạo của phần tử
  • Tiêu đề được viết bằng cú pháp = Heading
    • Một dấu = tạo tiêu đề cấp cao nhất, == tạo tiêu đề cấp dưới
    • Có thể xem danh sách đầy đủ các markup nhẹ trong tài liệu syntax
  • Công thức được bao bằng dấu đô la
    • Nếu thêm khoảng trắng quanh nội dung công thức, có thể đặt công thức thành một khối riêng
    • Các định danh nhiều chữ cái sẽ được diễn giải là định nghĩa và hàm của Typst nếu không được đặt trong dấu ngoặc kép
    • Các mục như floor, sqrt không cần dấu gạch chéo ngược
    • phi.alt áp dụng modifier alt cho phi để chọn một biến thể ký hiệu cụ thể
  • Scripting nhập mã trong tài liệu bằng cách viết biểu thức sau dấu thăng (#)
    • Ví dụ tính số Fibonacci thứ n bằng 2 biến và một hàm đệ quy
    • Hàm table nhận các ô theo từng hàng
    • Dùng toán tử trải .. để truyền các phần tử mảng làm từng đối số riêng

Cài đặt và dùng CLI

  • Typst CLI có thể được cài đặt qua nhiều cách
    • Mã nguồn và binary dựng sẵn của bản phát hành mới nhất có trên releases page
    • Đặt binary vào thư mục nằm trong PATH, sau đó có thể cập nhật bằng typst update
    • Phiên bản từ trình quản lý gói có thể chậm hơn bản phát hành mới nhất
  • Ví dụ cài đặt bằng trình quản lý gói như sau
  • Nếu có Rust toolchain, có thể cài bằng cargo
    • Bản phát hành mới nhất: cargo install --locked typst-cli
    • Bản phát triển: cargo install --git https://github.com/typst/typst --locked typst-cli
  • Nix và Docker cũng được hỗ trợ
    • Nix: nix-shell -p typst
    • Typst flake: nix run github:typst/typst-flake -- --version
    • Docker: docker run ghcr.io/typst/typst:latest --help
  • Lệnh biên dịch cơ bản như sau
    • typst compile file.typ: tạo file.pdf trong thư mục làm việc
    • typst compile path/to/source.typ path/to/output.pdf: tạo PDF tại đường dẫn được chỉ định
  • Theo dõi thay đổi được chạy bằng typst watch file.typ
    • Typst dùng biên dịch gia tăng, nên nhanh hơn so với biên dịch từ đầu mỗi lần
  • Cũng có các lệnh liên quan đến font
    • typst compile --font-path path/to/fonts file.typ: chỉ định thêm thư mục tìm kiếm font
    • typst fonts --font-path path/to/fonts: in danh sách font tìm thấy trong hệ thống và thư mục được chỉ định
    • TYPST_FONT_PATHS=path/to/fonts typst fonts: cách dùng biến môi trường theo cú pháp Linux
  • Các lệnh con và tùy chọn khác có thể xem bằng typst help; trợ giúp cho lệnh cụ thể xem bằng typst help watch

Môi trường chỉnh sửa và cộng đồng

  • Nếu cần trải nghiệm tích hợp kiểu IDE, tự động hoàn thành và xem trước tức thì, có thể dùng ứng dụng web Typst miễn phí
  • Language server do cộng đồng tạo ra, Tinymist, đã được tích hợp vào nhiều extension cho trình soạn thảo
  • Không gian cộng đồng tập trung ở ForumDiscord server
    • Forum phù hợp để đặt câu hỏi, giúp đỡ người dùng khác và chia sẻ sản phẩm tạo bằng Typst
    • Discord phù hợp hơn cho câu hỏi nhanh, thảo luận liên quan đến đóng góp và trò chuyện
  • Typst Universe là nơi cộng đồng chia sẻ template và package
  • Có thể gửi package tự tạo lên package repository

Đóng góp và build

  • Nếu gặp lỗi, có thể mở issue; nếu muốn triển khai tính năng mới hoặc sửa lỗi, hãy làm theo contribution guide
  • Để tự build, cài Rust ổn định mới nhất rồi chạy các lệnh sau
  • Binary đã tối ưu sẽ được lưu trong target/release/
  • Chia sẻ package với cộng đồng cũng là một cách đóng góp

Cách phát âm và viết tên

  • Cách phát âm IPA của Typst là /taɪpst/
  • "Ty" được phát âm như Ty trong Typesetting, còn "pst" như pst trong Hipster
  • Khi viết Typst, hãy xem đây là danh từ riêng và dùng chữ T viết hoa

Nguyên tắc thiết kế

  • Typst được thiết kế xoay quanh ba mục tiêu: Power, simplicity, performance
  • Mục tiêu là một hệ thống mạnh ngang LaTeX, dễ học và dễ dùng, đồng thời đủ nhanh để hỗ trợ xem trước tức thì
  • Đơn giản nhờ tính nhất quán

    • Trong Typst, nếu biết cách làm một việc, bạn có thể áp dụng kiến thức đó cho các tác vụ khác
    • Nếu có nhiều cách làm cùng một việc, chúng nên nằm ở các mức trừu tượng khác nhau
    • = Introduction#heading[Introduction] là ví dụ được chấp nhận dù làm cùng một việc, vì cái trước là cú pháp rút gọn của cái sau
  • Mạnh mẽ nhờ khả năng kết hợp

    • Thay vì đặt tùy chọn cho mọi thứ, Typst chọn thiết kế gồm một số ít thành phần có thể kết hợp theo nhiều cách
    • TeX cũng là một hệ thống cấp thấp có thể kết hợp, nhưng mọi người lại dùng LaTeX thay thế
    • Trong LaTeX, nhiều trường hợp sẽ phụ thuộc vào package kiểu \usepackage{knob}
  • Hiệu năng nhờ tính gia tăng

    • Mọi tính năng ngôn ngữ của Typst phải phù hợp với biên dịch gia tăng
    • comemo xử lý phần lớn công việc liên quan đến biên dịch gia tăng ở hậu trường

Tài trợ và hỗ trợ

  • Các nguồn hỗ trợ chính cho công việc mã nguồn mở của Typst được liệt kê như sau
    • Posit: tài trợ kỹ sư trình biên dịch toàn thời gian
    • NLnet: hỗ trợ công việc trên Typst thông qua nhiều khoản tài trợ từ quỹ NGI Zero Core
    • Science & Startups: tài trợ phát triển Typst từ tháng 1 đến tháng 6 năm 2023 thông qua Berlin Startup Scholarship
    • Zerodha: tài trợ một lần
  • Danh sách này chỉ bao gồm các khoản đóng góp cho công việc mã nguồn mở đã vượt quá hoặc dự kiến vượt quá €10K

2 bình luận

 
sebul 2025-02-28

Đọc LeTeX là “latex” à? Chắc phải là “laytech” mới đúng chứ.

 
GN⁺ 2024-07-21
Ý kiến trên Hacker News
  • Typst khá tuyệt, và tổ chức của chúng tôi cũng rất hài lòng với nó
    Vì mỗi đêm phải tạo hơn 1,5 triệu PDF, chúng tôi đã thử nhiều giải pháp như Puppeteer để chuyển HTML→PDF, pdflatex, lualatex, v.v.; Typst nhanh hơn vài bậc độ lớn và cũng nhẹ tài nguyên hơn
    Trải nghiệm lập trình viên khi tạo template PDF bằng LaTeX không tốt, nhưng template Typst thì khá trực quan
    Tôi đã viết chi tiết hơn trên blog về stack tạo PDF quy mô lớn này: https://zerodha.tech/blog/1-5-million-pdfs-in-25-minutes

    • Tôi chưa từng nghe trường hợp nào tạo tài liệu PDF ở tốc độ như vậy
      Tôi đang làm một sản phẩm báo cáo PDF hàng loạt dựa trên Puppeteer; nếu dùng cả job ban đêm, caching và xử lý song song thì hiệu năng cũng khá ổn
      https://www.cx-reports.com
    • Không biết bạn đã thử ReportLab chưa
      Ngày xưa khi phải xử lý một bài toán tương tự, đó là một giải pháp tốt
      Quy mô không đến mức kia, nhưng vẫn dùng được
    • Tôi tò mò không biết tổ chức của bạn có đóng góp ngược lại cho dự án gì không, hoặc ít nhất có hỗ trợ tài chính không
    • Tôi tò mò use case nào cần tạo nhiều PDF đến vậy
  • Tôi đã viết khá nhiều bài tập bằng Typst, và việc viết học thuật trở nên gọn hơn, cuốn hơn, thậm chí có thể nói là thú vị hơn
    Nhờ tính chất hàm trong cú pháp Typst, tôi không phải chịu những hành vi thất thường thường thấy trong Microsoft Word hiện nay, và đôi khi cả Google Docs
    Nếu dùng một IDE cục bộ như VSCode thì gần như có đủ các tính năng mong muốn
    So với LaTeX, việc dàn trang toàn bộ tài liệu trực quan hơn nhiều, nhưng khi viết dài phần triển khai phương trình kéo qua nhiều trang, tôi thấy LaTeX dễ gõ hơn
    Cú pháp LaTeX gần với Markdown hơn là một ngôn ngữ lập trình hàm, nên khi dàn các công thức có nhiều hàm, chỉ số trên và chỉ số dưới, ta không phải suy nghĩ trước nhiều

    • Với tư cách người từng viết học thuật, tôi hy vọng các tạp chí sẽ hỗ trợ Typst, hoặc các plugin/bridge sang LaTeX/Word sẽ ổn định
      Hiện tại có lẽ tôi sẽ không viết bài báo bằng Typst
      Khi đưa ra ngoài tổ chức thì gần như chắc chắn phải chuyển đổi, và arXiv cũng yêu cầu mã nguồn LaTeX
      Ngày nay hệ sinh thái công cụ quanh LaTeX khá tốt, và cũng có nhiều IDE hỗ trợ
      Cá nhân tôi dùng Org-Mode của Emacs, biên dịch ra LaTeX
    • Tham khảo thêm: Typst đã có hỗ trợ LaTeX một phần thông qua gói mitex
      https://github.com/mitex-rs/mitex
    • Với những người hầu như không cần công thức, tôi tò mò nó có lợi thế gì so với dùng Markdown
  • Có nhiều thảo luận cũ và tài liệu liên quan: https://hn.algolia.com/?q=typst
    1 năm trước, 146 bình luận: https://news.ycombinator.com/item?id=35250210
    8 tháng trước, 34 bình luận: https://news.ycombinator.com/item?id=38354422
    2 năm trước, 53 bình luận: https://news.ycombinator.com/item?id=34423590
    2 năm trước, 30 bình luận: https://news.ycombinator.com/item?id=32209794

  • Thật ngạc nhiên khi xuất HTML không phải là tính năng cốt lõi ngay từ đầu mà hiện vẫn đang được phát triển
    Việc LaTeX có mối quan hệ không mấy ăn khớp với web có vẻ là phần mà một dự án cạnh tranh bắt đầu mới đáng lẽ đã cố giải quyết nghiêm túc từ sớm
    [0] https://github.com/typst/typst/issues/721

    • Typst là công cụ muốn cạnh tranh với LaTeX
      Cả hai đối mặt cùng một vấn đề: web và giấy hoạt động hoàn toàn khác nhau, và có những khái niệm không thể dịch qua lại
      Vì vậy cần định nghĩa cách để kết quả dàn trang có thể nằm tự nhiên trong môi trường khác
      Nếu Typst nhắm đến HTML ngay từ đầu thì việc phát triển hẳn sẽ dễ hơn nhiều, nhưng khi đó nó sẽ chẳng hơn một trình tạo site quá phức tạp là bao
      Việc nhắm đến PDF trước cho thấy họ thực sự có ý định cạnh tranh với LaTeX
    • Xuất HTML của LaTeX dạo này đã khá ổn, nhưng đó là kết quả của rất nhiều nỗ lực phi thường từ nhiều người dành cho một hệ thống vốn không hề được thiết kế để hỗ trợ việc đó
      Nếu bắt đầu một hệ thống markup mới mà không có kế hoạch tạo tài liệu có khả năng truy cập, thì tôi cho đó là một quyết định rất tệ
      Tôi sẽ không dùng Typst cho đến khi nó có thể tạo tài liệu có khả năng truy cập
    • Đây là một trong những vấn đề lớn
      Tôi không thích PDF
    • Tôi nghe nói pandoc hoạt động khá tốt cho mục đích này
    • Chắc bạn cũng biết TeX ra đời trước web nhiều năm
  • Tôi đang chờ LaTeX biến mất và Typst thay thế nó
    Trải nghiệm sử dụng hoàn toàn khác, và kết quả đầu ra rất ấn tượng
    Cho đến nay tôi tạo file TeX bằng template Jinja2, nhưng Typst có thể nhận JSON từ dòng lệnh, dễ dùng và đủ mạnh để loại bỏ hoàn toàn bước Python
    Chưa kể thời gian biên dịch tính bằng mili giây

    • Phần scripting rất tốt
      Ban đầu, do quen cách làm trong LaTeX, tôi đã thử tạo template Typst bằng template Go
      Nhưng thật tốt khi biết Typst có thể dùng JSON trực tiếp một cách dễ dàng trong engine scripting của chính nó
  • Năm 1999, khi đang làm thực tập sinh, tôi được giao viết tài liệu tiêu chuẩn cho nhóm công tác chuẩn điện thoại VoIP của TIA
    Tổ chức tiêu chuẩn hóa có một template Word mà mọi người đều dùng, nhưng với tư cách là sinh viên kỹ thuật đã dùng và thích LaTeX một thời gian, tôi nghĩ: “Dù sao đầu ra cuối cùng cũng là PDF, định dạng chắc cũng đẹp hơn, vậy tại sao không dùng LaTeX?”
    Thực tế, bản xuất từ LaTeX đẹp hơn, và sếp thích kết quả mà hoàn toàn không biết tôi không dùng Word
    Các thành viên nhóm công tác cũng phản hồi tốt, kiểu như “cậu này thật sự có tài”
    Với một startup, việc tạo ấn tượng tốt với các tập đoàn lớn tham gia nhóm công tác là cực kỳ quan trọng đối với tương lai của công ty, thậm chí có thể là sự sống còn
    Nhưng rồi một ngày sếp hỏi: “Cậu có thể gửi tài liệu Word đó cho một nhân vật cấp cao ở một tập đoàn lớn có thể sẽ mua lại chúng ta không? Họ muốn dùng nó làm template tài liệu mới”, và tôi có cảm giác hụt hẫng như hồi bốn tuổi cùng bạn tè thử vào tủ quần áo rồi bị mẹ bắt gặp
    Cuối cùng tôi thuê một người bạn vất vả viết lại toàn bộ bằng Word suốt cuối tuần, và sếp đã nhận được tài liệu
    Công ty được mua lại sau 18 tháng với giá 100 triệu USD
    Dù sao thì LaTeX trông vẫn đẹp hơn Word gấp 1000 lần

  • Cái này có vẻ là đối thủ của các dịch vụ như Overleaf hay CodiMD
    Tuy lại là một cú pháp khác, nhưng hình như pandoc có hỗ trợ
    Gần đây tôi lập trình bằng R nên ngày càng dùng Quarto nhiều hơn, đặc biệt là vì nó tạo ra đầu ra khá tốt như HTML
    Nhưng các công cụ này vẫn chưa giải quyết được hai vấn đề quan trọng trong môi trường học thuật: cung cấp so sánh khác biệt tốt cho reviewer, và dễ chia sẻ cũng như bình luận với cộng tác viên không rành kỹ thuật
    Vì vậy, ít nhất trong việc viết khoa học ở lĩnh vực của tôi, có lẽ Word vẫn sẽ khó bị thay thế trong nhiều năm tới
    [1] https://github.com/overleaf/overleaf
    [2] https://github.com/hackmdio/codimd
    [3] https://pandoc.org/typst-property-output.html
    [4] https://quarto.org/

    • Tôi dùng Quarto khá nhiều
      Khi dùng GT, đầu ra Typst PDF có cảm giác hơi thô hơn LaTeX PDF một chút
      Hy vọng sẽ được cải thiện
  • So với LaTeX, điểm khiến tôi lấn cấn nhất ở Typst là nó chưa xử lý tốt các tính năng typography tinh vi cơ bản
    Ví dụ, trong chế độ toán học, phần xử lý các loại khoảng cách (mathop, mathbin, mathrel, v.v.) hay kích thước dấu phân cách (big, bigg, v.v.) còn thiếu

  • Trông thật sự ổn và tôi định sẽ thử dùng
    Nhưng tôi cứ nghĩ thế này
    Xác suất tôi ước đoán rằng sau 15 năm nữa LaTeX vẫn miễn phí và được bảo trì: 99.9999%
    Xác suất tôi ước đoán rằng sau 15 năm nữa một công cụ mới khác vẫn miễn phí và được bảo trì: 5%

    • Đây là lời nguyền của một hệ thống ra đời sớm và đủ tốt
      bash và vài thứ khác cũng vậy
      Dù có nhiều lựa chọn thay thế tốt hơn, điểm đau vẫn chưa đủ lớn nên chúng không bị thay thế
  • Tôi thích Typst
    Nó đặc biệt tốt khi xử lý đầu vào được tạo bằng lập trình, và flag --input có thể nhận JSON
    Trong file, có thể dễ dàng lấy JSON bằng hàm chuyên dụng json.decode()
    Việc tạo ra kết quả ổn định rất dễ, nên trong dự án của tôi, tôi cũng đã chuyển từ LaTeX sang Typst
    [0] https://typst.app/docs/reference/foundations/sys/
    [1] https://resgen.app