10 điểm bởi GN⁺ 2025-06-04 | 5 bình luận | Chia sẻ qua WhatsApp
  • Mở rộng cú pháp Markdown hiện có để có thể dễ dàng tạo tài liệu ở nhiều định dạng như sách, bài báo học thuật, slide, bản trình bày với vai trò là một hệ thống typography hiện đại
  • Tích hợp trực tiếp các tính năng nâng cao vào markdown như hỗ trợ hàm, sử dụng biến, câu lệnh điều kiện/vòng lặp, thư viện chuẩn, nhờ đó khác biệt với Markdown truyền thống hay LaTeX về khả năng mở rộng và tự động hóa
  • Từ một tệp nguồn duy nhất có thể tạo ra nhiều đầu ra như HTML, PDF, slide (reveal.js), paged book (paged.js), phù hợp với quy trình tạo nội dung dựa trên mã
  • Với tính năng scriptingcú pháp mở rộng giàu khả năng biểu đạt, có thể tự do hiện thực cả những nội dung phức tạp hoặc động
  • Cung cấp môi trường REPL, xem trước trực tiếp, biên dịch nhanh, cho phép chỉnh sửa và gỡ lỗi tài liệu theo thời gian thực
  • So với các công cụ hiện có, có ưu thế trước Markdown, LaTeX, Typst, AsciiDoc, MDX ở các mặt như tính năng scripting, khả năng kiểm soát tài liệu, đường cong học tập dễ tiếp cận
  • Không cần môi trường phát triển riêng hay cấu hình phức tạp, chỉ cần Java 17 trở lên là có thể sử dụng trên các hệ điều hành chính

Giới thiệu

  • Quarkdown là một hệ thống sắp chữ hiện đại được thiết kế để giúp người dùng dễ dàng tạo ra thành phẩm chất lượng cao ở nhiều định dạng, từ văn bản đơn giản đến sách, bài báo học thuật, slide, bằng cách bổ sung hàm và cú pháp mở rộng lên cấu trúc cơ bản của Markdown
  • Được phát triển dựa trên CommonMark và GFM, đồng thời hỗ trợ đầy đủ cú pháp riêng, hàm, biến và cả thư viện do người dùng tự định nghĩa
    • Cung cấp cú pháp riêng mang tên Quarkdown Flavor
    • Thông qua cú pháp mở rộng hàm Turing-complete, bổ sung vào markdown các tính năng nâng cao như hàm, câu lệnh điều kiện, vòng lặp
  • Có thể sử dụng nhiều tính năng như bố cục, nhập/xuất, toán học, câu lệnh điều kiện, vòng lặp... bằng thư viện .qmd
  • Ngay cả khi cần cấu trúc tài liệu phức tạp hoặc nội dung động, vẫn có thể nâng cao khả năng mở rộng và năng suất

Tính năng chính và cách sử dụng

  • Hỗ trợ nhiều định dạng đầu ra như HTML, slide, sách (Paged), PDF
    • Có thể chỉ định loại tài liệu bằng lời gọi hàm như .doctype {slides}, .doctype {paged}
    • Tích hợp với các engine mã nguồn mở như reveal.js, paged.js
  • Scripting và nội dung động
    • Đưa vào các yếu tố lập trình như hàm, biến, câu lệnh điều kiện, vòng lặp
    • Ví dụ: .function {greet} ... .greet {world} from:{iamgio}
  • Xem trước trực tiếp, biên dịch nhanh
    • Cung cấp tính năng xem trước theo thời gian thực và theo dõi thay đổi tệp (Watch)
    • Tăng hiệu quả làm việc với các tùy chọn -p --preview, -w --watch
  • So sánh với các công cụ tài liệu khác
    • Dễ học hơn LaTeX, và khả năng mở rộng tính năng tốt hơn Markdown
    • So với Typst, AsciiDoc, MDX cũng có thế mạnh về scripting/khả năng biểu đạt

Mục tiêu hỗ trợ

  • HTML
    • Đầu ra thông thường (mặc định)
    • Slide (sử dụng reveal.js)
    • Dạng sách/bài báo (sử dụng paged.js, cần web server)
  • PDF
    • Có thể xuất ra PDF mọi loại tài liệu và tính năng mà HTML hỗ trợ
    • Xem chi tiết về xuất PDF trong tài liệu wiki
  • Điều khiển định dạng đầu ra bằng lời gọi hàm như .doctype {slides}, .doctype {paged}

So sánh

Quarkdown Markdown LaTeX Typst AsciiDoc MDX
Tính ngắn gọn·khả năng đọc
Kiểm soát toàn bộ tài liệu
Tính năng scripting hỗ trợ một phần
Xuất dạng sách/bài viết 3rd party
Xuất bản trình bày 3rd party
Đường cong học tập xanh lá xanh lá đỏ cam xanh lá xanh lá
Hỗ trợ đầu ra HTML, PDF HTML PDF, PostScript PDF HTML, PDF, ePub HTML

5 bình luận

 
plastic041 2025-06-05

Có lẽ vì có bảng nên bố cục trên di động bị vỡ.

 
plastic041 2025-06-05

Đặt min-width: 0 cho .topic_contents là sẽ sửa được. min-width đúng là rất đau đầu...

 
xguru 2025-06-05

À, tôi đã giải quyết được bằng một cách khác rồi. Cảm ơn!

 
plastic041 2025-06-05

Cảm ơn bạn đã phản hồi nhanh~

 
GN⁺ 2025-06-04
Ý kiến trên Hacker News
  • Trình soạn thảo văn bản FOSS của tôi là KeenWrite dùng cách tiếp cận tương tự để chuyển đổi từ Markdown sang XHTML, TeX và PDF
    Kiến trúc phần mềm cho thấy có thể thiết kế chuỗi bộ xử lý như thế nào
    Lý do tôi tạo ra KeenWrite là để có thể dùng các biến như tên nhân vật hay địa danh khi viết tiểu thuyết khoa học viễn tưởng
    Xem thêm trong hướng dẫn
    Với những ai vẫn dùng pandoc và shell script, loạt bài Typesetting Markdown giải thích cách xây dựng hạ tầng dựa trên script để chuyển Markdown sang PDF
    Có thể xem thêm thông tin về KeenWrite tại đây
    Sơ đồ kiến trúc có thể xem tại đây

  • Sẽ thú vị nếu so sánh Typst, vốn gần đây nhận được rất nhiều chú ý, với dự án này, nên khá bất ngờ khi ma trận so sánh tính năng hoàn toàn không nhắc đến Typst

    • Lần trước tôi xem thì Typst chưa thể xuất ra HTML
    • Giờ thì Typst đã được nhắc đến rồi
      Nhìn chung hai dự án này có vẻ rất giống nhau
  • Tôi tự hỏi liệu bảng so sánh có chính xác không – liên kết
    Tôi tin LaTeX rõ ràng có khả năng scripting hoàn chỉnh, dù đúng là dùng khá khổ
    Tôi hoài nghi về nhận định rằng cú pháp khó hiểu của Quarkdown lại ngắn gọn và dễ đọc hơn Typst
    Tôi cũng không nghĩ đường cong học tập của nó dễ hơn Typst, trông hai bên gần như tương đương
    Tôi nghĩ LaTeX cũng có thể tạo HTML bằng tex4ht

    • Thành thật mà nói, phần lớn Markdown có thể dùng nguyên vẹn trong Quarkdown
      Rào cản gia nhập khó mà thấp hơn thế được nữa
      Tất nhiên đường cong học tập không hoàn toàn đồng nghĩa với rào cản gia nhập, nhưng hai khái niệm này chồng lấp khá nhiều
      Và “đường cong học tập” là một đặc tính mang tính chủ quan
      Đưa nó vào bảng so sánh thì ngay từ đầu đã khó tránh khỏi méo mó
      Các tính năng cụ thể thì khách quan hơn, nhưng đôi khi do đặc tính sản phẩm mà có thể không cần một số tính năng nhất định
    • Pandoc là tốt nhất cho những trường hợp sử dụng kiểu này
    • Chỉ cần nhìn TikZ và pgf là biết khả năng scripting của LaTeX và TeX tới mức nào
      Bảng so sánh rõ ràng là không chính xác
  • Bản xuất mẫu trông rất đẹp
    Nhưng tôi thường không thích khi ngôn ngữ template phình ra vì các lời gọi hàm hay độ phức tạp
    Dĩ nhiên trong ngữ cảnh này có thể nó hợp lý
    Nhưng nếu phải dùng cùng ngôn ngữ khác, chẳng hạn trong server-side rendering hay tạo tài liệu dựa trên dữ liệu, thì sẽ tốn quá nhiều thời gian qua lại giữa hai ngôn ngữ
    Ngôn ngữ template không bao giờ mạnh bằng một ngôn ngữ “thật”
    Vì vậy tôi thích kiểu JSX hoặc tagged template literal của JavaScript hơn
    Tốt hơn là dùng ngôn ngữ lập trình thực sự mà vẫn hiểu ngữ cảnh tài liệu để bớt lo chuyện escape như XSS

  • Tôi thắc mắc dự án này khác gì Quarto
    Tên cũng na ná, phần mở rộng cũng giống, định hướng cũng tương tự nhưng tính năng lại có vẻ ít hơn – Quarto

    • Quarto là người kế thừa trên thực tế của hệ sinh thái R Markdown
      FAQ nói rõ là do cùng nhóm phát triển làm ra
    • Tôi cũng định hỏi đúng câu này
      Vài ngày trước một người bạn cho tôi xem cách họ viết lại toàn bộ kịch bản bài giảng bằng Quarto và còn nhúng cả phần trình chiếu, nhìn khá gọn gàng
      Việc Quarto tích hợp tốt với R Studio và Jupyter Notebook là một ưu điểm lớn
    • Việc tên giống nhau có lẽ là một cách nhắc đến hay liên hệ với QuarkXPress
      Tôi nghĩ đây là hiện tượng kiểu tiến hóa hội tụ
  • Thật thú vị khi thứ có thể trông như “planet” thực ra lại là một quark, cụ thể là down quark
    Dự án rất ngầu, nhưng vì QuarkXPress là một thương hiệu nổi tiếng trong ngành xuất bản nên việc dùng từ “Quark” làm tên hệ thống xuất bản hơi rủi ro
    Có thể xem thông tin đăng ký nhãn hiệu liên quan tại đây, tại đây
    (Tôi cũng thắc mắc vì sao lại có hai đăng ký nhãn hiệu cho cùng một từ)

  • Trong mọi thread thảo luận về lĩnh vực này lúc nào cũng có đến 70% bình luận kiểu “sao không dùng LaTeX?”, nên để tôi nói rõ trước
    Tôi thực sự cần một hệ thống dàn trang hiện đại dựa trên Markdown
    Tôi mong có nhiều nỗ lực thay thế LaTeX hơn
    LaTeX thực sự rất bất tiện và cổ lỗ, và tôi muốn có một hệ thống cho phép markup linh hoạt hơn
    Kể cả nếu cú pháp dài ra khi tính năng phong phú hơn thì vẫn rõ ràng là cần một vùng nằm giữa Markdown và thứ mạnh hơn một chút
    Nhưng tôi có cảm giác dự án này không phải thứ tôi tìm kiếm
    Nhìn ví dụ thì có vẻ nó chỉ nghiêng về phía mạnh hơn Markdown một chút, chứ chưa đủ để thay thế hẳn LaTeX (hay Typst)
    Loại hệ thống tài liệu này phải dùng thật sự “mượt”, còn cái này không cho tôi cảm giác đó

    1. Thêm nữa nó dựa trên JVM nên tôi thậm chí còn không muốn cài
      Điều này không tốt cho khả năng lan truyền
    2. Tôi cũng không thích cú pháp
      Tôi muốn nó tương thích với Markdown thường càng nhiều càng tốt, nhưng việc bắt buộc thụt lề cho tham số hàm khiến có vẻ cả tài liệu sẽ bị thụt vào, trong khi điểm mở rộng của Markdown thông thường lại tự nhiên hơn ở dạng code block kiểu ```plugin-name`
      Sự khác biệt cú pháp có thể buộc phải thay đổi cấu trúc của cả tài liệu
    3. Khái niệm “Markdown tốt hơn” theo tôi phù hợp hơn với trường hợp bắt đầu từ ghi chú cá nhân rồi dần phát triển thành tài liệu công khai
      Nếu làm tài liệu để xuất bản thì cứ dùng LaTeX cũng được
      Hữu ích nhất là khi nó tích hợp tốt vào ứng dụng ghi chú
      Có thể vẫn có người làm trong Emacs hay Vim, nhưng tôi cũng phải thú nhận rằng một người hoài cổ như tôi cuối cùng vẫn chuyển sang Obsidian và các ứng dụng tương tự
      Sẽ hay hơn nếu có phần giúp kiểm soát cấu trúc tài liệu tốt hơn trong ứng dụng ghi chú, hoặc kết nối thêm tính năng xuất bản
      Nếu là ứng dụng độc lập thì tôi không rõ vì sao phải dùng nó
      Ít ra Typst còn có editor online, mọi người đều dùng cái đó
    • LaTeX không phải đồ rác cũ kỹ mà là một trong những phần mềm tốt nhất
      Điều cốt lõi là không thêm những thứ vô ích vào tài liệu
  • Những hệ thống như thế này (bao gồm Typst) về cơ bản là để dàn trang văn bản dài như bài báo khoa học
    Tôi muốn nó trở thành một lựa chọn thay thế cho HTML, nhưng dù đã thử Typst, tôi vẫn thấy các tác giả hầu như chỉ quan tâm đến “bài báo hay văn bản dài”
    Tôi cũng muốn làm những thứ như biểu mẫu, hóa đơn, tờ rơi, danh thiếp, nhưng các yếu tố như vậy dường như nằm ngoài mối quan tâm của họ
    (Thực ra tôi đang nghĩ đến Sile, nhưng Typst cũng tương tự)
    Tôi chưa dùng sâu Typst vì nó mang tính thương mại

    • Tôi không rõ có lý do đặc biệt nào khiến không thể dùng Typst cho những thứ như biểu mẫu, hóa đơn như đã nêu hay không
      Đặc biệt là biểu mẫu tương tác thì tôi nghe nói đã được làm rồi (backend của pdf writer đã hỗ trợ một phần)
      Có lẽ sau một thời gian nữa Typst sẽ có tính năng biểu mẫu – xem issue
    • Tôi nghĩ vì mảng này gần với “thiết kế đồ họa” hơn là “dàn trang”
      Những thứ như hóa đơn, tờ quảng cáo, danh thiếp đòi hỏi đặt các phần tử nhỏ thật chính xác vào giữa trang hoặc sát mép, mà việc này thuận tiện hơn với công cụ WYSIWYG
      Chỉ dàn trang dựa trên văn bản thì sẽ phải thử sai quá nhiều
      Ví dụ báo lá cải có dòng chữ phải chảy và ôm quanh hình ảnh hay các khung cắt chứ không phải hình chữ nhật, nên làm việc đó chỉ bằng tọa độ mà không nhìn trực tiếp gần như là cực kỳ khó
    • Editor online của Typst là dịch vụ thương mại, nhưng bản thân Typst được mở theo giấy phép Apache 2.0
      Tôi cài qua cargo bằng Rust và dùng hoàn toàn ổn mà không cần editor online
    • Typst có thể dùng cục bộ và bỏ qua hoàn toàn phần thương mại
      Nó khá dễ để tạo nhiều loại tài liệu khác nhau
      Tôi đã dùng nó như một lựa chọn thay thế để làm slide và handout
    • Lần “dùng thực tế” đầu tiên của tôi với Typst là làm poster, và nó dễ hơn LaTeX rất nhiều
      Dù vẫn còn thiếu vài tính năng như bọc ảnh hay text flow, nhưng ngay cả trong TeX đây cũng là việc khó và Typst dự kiến sẽ bổ sung sau
      Ví dụ poster
  • Cái này trông gần như y hệt reStructuredText (rST)
    Cú pháp hàm của Quarkdown (.somefunction {đối số} {đối số} nội dung) và cú pháp hàm của rST (.. somefunction:: {đối số} {đối số} nội dung) rất giống nhau

  • Có quá nhiều thứ như Markdown, Quarkdown, Typst mà lại không được chuẩn hóa, nên cuối cùng tôi quay về HTML+CSS

    • XML thì sao?
      Tôi chưa trực tiếp dùng thử nhưng đang cân nhắc khá nghiêm túc
      Các định dạng còn lại đều phức tạp và có đường cong học tập, làm cản trở chính việc viết lách
      Với XML tôi có thể tự định nghĩa tag, rồi dùng parser để tạo ra nhiều cấu trúc khác nhau như tự động sinh chú thích cuối trang
      Không biết có ai từng dùng cách tiếp cận như vậy chưa
    • Markdown ở mức cơ bản thực sự rất hiệu quả
      Vấn đề là quá nhiều người cứ chất thêm hệ thống lên trên nó, trong khi ngay từ đầu họ đang cố giải quyết một thứ “phức tạp hơn”
      Họ tưởng là đang cải tiến một hệ thống vốn dành cho mục đích đơn giản, nhưng thực ra lại không nhận ra giới hạn của nó, và chỉ làm tăng thêm sự lặp lại lẫn rối rắm không cần thiết
      Không phải thiếu tính năng, mà là đang dùng vượt ra ngoài phạm vi mục tiêu thiết kế
      Thậm chí nếu Windows Notepad có thêm định dạng văn bản thì về bản chất tôi cũng không cho đó là cải tiến
      Vì Notepad vốn đã có vai trò nguyên bản của nó
    • Cũng có Org-mode đã trưởng thành và đáng tin cậy
      Nếu bạn không ghét Emacs thì đây là một lựa chọn tốt
    • Tôi cũng thấy việc thao tác DOM trong phát triển web bằng HTML, CSS, Javascript còn vui hơn
      Không cần phải nhớ hàng trăm framework và cú pháp phức tạp đến thế
      Chỉ cần ra lệnh cho AI tạo một bộ chuyển đổi markdown sang html cũng ổn
    • Nếu tính năng tự động hoàn thành của các trình soạn thảo văn bản năm 2005 đã hỗ trợ cân bằng thẻ, thụt lề và highlight tốt như bây giờ, có lẽ các định dạng như JSON, YAML, Markdown đã không phổ biến đến mức này
      Ngay cả trong The Art of Unix Programming xuất bản năm 2003 cũng có nói rằng chỉnh XML trực tiếp là một nỗi đau, nên người ta phải tạo ra đủ loại định dạng và parser mới