Git Product home page Git Product logo

hypher's Introduction

Typst

Documentation Typst App Discord Server Apache-2 License Jobs at Typst

Typst is a new markup-based typesetting system that is designed to be as powerful as LaTeX while being much easier to learn and use. Typst has:

  • Built-in markup for the most common formatting tasks
  • Flexible functions for everything else
  • A tightly integrated scripting system
  • Math typesetting, bibliography management, and more
  • Fast compile times thanks to incremental compilation
  • Friendly error messages in case something goes wrong

This repository contains the Typst compiler and its CLI, which is everything you need to compile Typst documents locally. For the best writing experience, consider signing up to our collaborative online editor for free. It is currently in public beta.

Example

A gentle introduction to Typst is available in our documentation. However, if you want to see the power of Typst encapsulated in one image, here it is:

Example

Let's dissect what's going on:

  • We use set rules to configure element properties like the size of pages or the numbering of headings. By setting the page height to auto, it scales to fit the content. Set rules accommodate the most common configurations. If you need full control, you can also use show rules to completely redefine the appearance of an element.

  • We insert a heading with the = Heading syntax. One equals sign creates a top level heading, two create a subheading and so on. Typst has more lightweight markup like this, see the syntax reference for a full list.

  • Mathematical equations are enclosed in dollar signs. By adding extra spaces around the contents of an equation, we can put it into a separate block. Multi-letter identifiers are interpreted as Typst definitions and functions unless put into quotes. This way, we don't need backslashes for things like floor and sqrt. And phi.alt applies the alt modifier to the phi to select a particular symbol variant.

  • Now, we get to some scripting. To input code into a Typst document, we can write a hash followed by an expression. We define two variables and a recursive function to compute the n-th fibonacci number. Then, we display the results in a center-aligned table. The table function takes its cells row-by-row. Therefore, we first pass the formulas $F_1$ to $F_8$ and then the computed fibonacci numbers. We apply the spreading operator (..) to both because they are arrays and we want to pass the arrays' items as individual arguments.

Text version of the code example.
#set page(width: 10cm, height: auto)
#set heading(numbering: "1.")

= Fibonacci sequence
The Fibonacci sequence is defined through the
recurrence relation $F_n = F_(n-1) + F_(n-2)$.
It can also be expressed in _closed form:_

$ F_n = round(1 / sqrt(5) phi.alt^n), quad
  phi.alt = (1 + sqrt(5)) / 2 $

#let count = 8
#let nums = range(1, count + 1)
#let fib(n) = (
  if n <= 2 { 1 }
  else { fib(n - 1) + fib(n - 2) }
)

The first #count numbers of the sequence are:

#align(center, table(
  columns: count,
  ..nums.map(n => $F_#n$),
  ..nums.map(n => str(fib(n))),
))

Installation

Typst's CLI is available from different sources:

  • You can get sources and pre-built binaries for the latest release of Typst from the releases page. Download the archive for your platform and place it in a directory that is in your PATH. To stay up to date with future releases, you can simply run typst update.

  • You can install Typst through different package managers. Note that the versions in the package managers might lag behind the latest release.

    • Linux: View Typst on Repology
    • macOS: brew install typst
    • Windows: winget install --id Typst.Typst
  • If you have a Rust toolchain installed, you can also install the latest development version with cargo install --git https://github.com/typst/typst --locked typst-cli. Note that this will be a "nightly" version that may be broken or not yet properly documented.

  • Nix users can use the typst package with nix-shell -p typst or build and run the bleeding edge version with nix run github:typst/typst -- --version.

  • Docker users can run a prebuilt image with docker run -it ghcr.io/typst/typst:latest.

Usage

Once you have installed Typst, you can use it like this:

# Creates `file.pdf` in working directory.
typst compile file.typ

# Creates PDF file at the desired path.
typst compile path/to/source.typ path/to/output.pdf

You can also watch source files and automatically recompile on changes. This is faster than compiling from scratch each time because Typst has incremental compilation.

# Watches source files and recompiles on changes.
typst watch file.typ

Typst further allows you to add custom font paths for your project and list all of the fonts it discovered:

# Adds additional directories to search for fonts.
typst compile --font-path path/to/fonts file.typ

# Lists all of the discovered fonts in the system and the given directory.
typst fonts --font-path path/to/fonts

# Or via environment variable (Linux syntax).
TYPST_FONT_PATHS=path/to/fonts typst fonts

For other CLI subcommands and options, see below:

# Prints available subcommands and options.
typst help

# Prints detailed usage of a subcommand.
typst help watch

If you prefer an integrated IDE-like experience with autocompletion and instant preview, you can also check out the Typst web app, which is currently in public beta.

Community

The main place where the community gathers is our Discord server. Feel free to join there to ask questions, help out others, share cool things you created with Typst, or just to chat.

Aside from that there are a few places where you can find things built by the community:

If you had a bad experience in our community, please reach out to us.

Contributing

We would love to see contributions from the community. If you experience bugs, feel free to open an issue. If you would like to implement a new feature or bug fix, please follow the steps outlined in the contribution guide.

To build Typst yourself, first ensure that you have the latest stable Rust installed. Then, clone this repository and build the CLI with the following commands:

git clone https://github.com/typst/typst
cd typst
cargo build --release

The optimized binary will be stored in target/release/.

Another good way to contribute is by sharing packages with the community.

Pronunciation and Spelling

IPA: /taɪpst/. "Ty" like in Typesetting and "pst" like in Hipster. When writing about Typst, capitalize its name as a proper noun, with a capital "T".

Design Principles

All of Typst has been designed with three key goals in mind: Power, simplicity, and performance. We think it's time for a system that matches the power of LaTeX, is easy to learn and use, all while being fast enough to realize instant preview. To achieve these goals, we follow three core design principles:

  • Simplicity through Consistency: If you know how to do one thing in Typst, you should be able to transfer that knowledge to other things. If there are multiple ways to do the same thing, one of them should be at a different level of abstraction than the other. E.g. it's okay that = Introduction and #heading[Introduction] do the same thing because the former is just syntax sugar for the latter.

  • Power through Composability: There are two ways to make something flexible: Have a knob for everything or have a few knobs that you can combine in many ways. Typst is designed with the second way in mind. We provide systems that you can compose in ways we've never even thought of. TeX is also in the second category, but it's a bit low-level and therefore people use LaTeX instead. But there, we don't really have that much composability. Instead, there's a package for everything (\usepackage{knob}).

  • Performance through Incrementality: All Typst language features must accommodate for incremental compilation. Luckily we have comemo, a system for incremental compilation which does most of the hard work in the background.

hypher's People

Contributors

grantm11235 avatar ilyvion avatar jakobrs avatar laurmaedje avatar reknih avatar tomas-vl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

hypher's Issues

Incorrect hyphen right after apostrophe in French

In French, a hyphen can be added right after an apostrophe, which is incorrect.12

This can be reproduced in Typst with the following code.

#set text(lang: "fr")
#set page(width: 1.8cm)
#set par(justify: true)
Aujourd'hui

Au- // jourd’- // hui

Note that this does not happen when the language is set to English.

Footnotes

  1. Wikipedia (fr) states "On ne coupe jamais à la position d’une apostrophe", which means "One should never hyphen on an apostrophe."

  2. http://plumefrancaise.fr/la-cesure-en-typographie (fr)

"Strange" Behaviour

I'm very new for Rust and I am working on small projects to learn it. So, I have the following code to count the syllables:

s.split_whitespace().for_each(|word| {
                let syllables = hyphenate(word, Lang::English);
                println!("{:?} has {} syllables", word, syllables.clone().count());
                count += syllables.count();
            });

where s is the just &str. So, I am splitting the thing to words and call hyphenate on each word. But I get the following output:

"An"
"An" has 1 syllables
Syllables { word: "An", cursor: 0, levels: [0] }
"old"
"old" has 1 syllables
Syllables { word: "old", cursor: 0, levels: [0, 0] }
"silent"
"silent" has 1 syllables
Syllables { word: "silent", cursor: 0, levels: [0, 2, 4, 0, 0] }
"pond"
"pond" has 1 syllables
Syllables { word: "pond", cursor: 0, levels: [0, 0, 0] }

So, is that something I don't get about how I should call the function? I've tried the example and it worked correctly.
Sorry and thank you!

Support language loading at runtime

A lot of languages have hyphenation definitions under non permissive license. Therefore they are not included in hyper.

Support hyphenation loading at runtime! This would allow typst to better support more languages for which permissive license hyphenation files are not available and can not be included in hypher.

Support loading any/all locales individually

It feels very anglocentric to have a dedicated feature for just the English locale.

You either get a nice, small package if all you need is the rules for English, or you have to take on the entire dataset if you want to use it with any other language, even if it's just a single other one.

Feature `norwegian` is always mandatory

It seems as if the Norwegian language is always mandatory if the default flags are turned off. Though, I'm not sure if I'm missing something. I had a quick look at the code, and it looks to me like the feature flag norwegian is only applied to no, but not to nb and nn in hypher/src/lang.rs, thus making it mandatory:

 156   #[cfg(feature = "norwegian")]
 157   b"no" => Some(Self::Norwegian),
 158   b"nb" => Some(Self::Norwegian),
 159   b"nn" => Some(Self::Norwegian),

I haven't tried fixing it yet, but I figure it should be an easy fix.

Consider avoiding the build script

I read your blog post through the Rust reddit, and this looks like an amazing piece of work! I just wanted to highlight one potential improvement:

You currently generate code in a build script. As far as I can tell, the code generation step relies only on data that is available in your repository, that is, it does not depend on the build environment or any external input.

In such cases, a build script doesn't seem to be the best way to take care of code generation. Instead, consider adding an integration test that generates the code and store it in the repository. This means that downstream users no longer need to compile the build script and the downloaded resources from crates.io can contain the generated state machine directly instead of having to download all the pattern files. If you do it right, CI can check that the generated code is in sync with the pattern files in the repo.

You can find one example of this approach here: mattsse/chromiumoxide#80. Writing up a blog post on this pattern is on my list, would be interested in your feedback.

Forgotten changes in edfa5f9

There are two places that were forgotten in edfa5f9.

  • The following doc comment:

    hypher/src/lib.rs

    Lines 98 to 101 in edfa5f9

    /// # Panics
    ///
    /// Panics if the word is more than 38 bytes long and the `alloc` feature is
    /// disabled.

  • The README:

    hypher/README.md

    Lines 17 to 18 in edfa5f9

    - No allocations unless when hyphenating very long words (>= 39 bytes). You can
    disable the `alloc` feature, but then overly long words lead to a panic.

Support for Malayalam (ml) Language - Hyphenation

This is to request the Malayalam language hyphenation support in Typst.

"Malayalam is one of the main languages spoken (by 40 million people) in South India, with a rich cultural and literary history. It is one of the oldest languages in India with classical language status."

Issue

Malayalam text output by Typst has too much spacing between some words.

Sample in Typst

nicola-tesla-ml-typst

Sample Text in Latex with Proper hyphenation and justification

nicola-tesla-ml-latex

References:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.