Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Laws of Form

kevgerkevger3k downloads

Create, manage and display Laws of Form expressions like ((a)) (b) = a (b).

Add to Obsidian
  • Overview
  • Scorecard
  • Updates4

[exampleModulator.png]

This plugin adds to Obsidian the ability to transform linear Laws of Form bracket expressions into their familiar two-dimensional graphical representation. An introduction to Laws of Form would go beyond the scope here. It is assumed that the reader is familiar with the concepts.


Useful links

  • Laws of Form Playground – React Library
  • Authors website
  • Source Code
  • LoF50

🗒 Code blocks

This plugin renders the laws of form expressions inside lof code blocks. Every code block starts with the lof keyword.

```lof
(()) ()
```

This block will look rendered like the LoF formalism. [exampleSimple.png]


Ⓞ Drawing distinctions

  1. A cross is marked with ()
  ()
  1. Any text in space is interpreted as the content of the space
  ((Observer) Society)
  1. You can nest crosses
  ((())())
  1. A Re-Entry is made out of two identifiers. $id and [id]. $id denotes the space that enters into [id]. id must be a number. There can be multiple $ids in a space, but only the rightmost counts.
  (([0]a)$0b)
  (([42]$42) Autopoiesis)
  1. A space can also re-enter into two locations (see limitations).
  (([0]c)([0]a)$0b)
  1. Multiple Re-Entries are also possible
  ([3]([0]$0)([1]$1)$3)
  1. This is how you could implement the modulator function (see the first image above)
```lof font-size: 20px
  (((((((([0]a$1)$6[2])[1]$3)[0]$4)a$5)$2[6])[5]) [4]$0)
```

Equations & Separators

Because of the way the interpreter works, non LoF expressions (e.g., plain text, emojis) or separate LoF expressions within the same line must be explicitly factored out/separated.

Separation of expressions is needed for equations.

For example

```lof
() () = () 
```

without separators would be rendered like this [exampleFalse.png] To render the expression above correctly, it must be split into three parts with the separator (by default "::") for correct display.

```lof
() () :: = :: ()
```

This results in the correct form [exampleCorrect.png] Everything between separators is just interpreted as plain text. Thus brackets "(),[]" and "$" will not be interpreted. The default separator can be individually overwritten using the separator keyword in the block parameters or globally inside the settings.

The last unclosed separator will move the uninterpreted text to the right.

```lof font-size:24px; 
((a)b)
::=:: ((a)b)((a)b) :: C5
::=:: ((a)((b)))((a)b) :: C1
::=:: ((((a)b)a)(((a)b)(b))) :: J2
::=:: ((((a)b)a)((b))) :: C4
```

will lead to [exampleEquations.png]


🌈 Style Customization

Using inline CSS, full customization of the expression style is possible. For example, if we want to have a red font color, set the font size to 22 pixels and have "Chalkduster" as the font, we can do that with the following inline CSS.

```lof font-family: Chalkduster; font-size: 20px; color: red;
((a[0])b$0)

((aasdasdasd[0])(b[0])$0c)()

([0]$0Autopoiesis)
```

This block will look rendered like this

[exampeStyling.png]

⚠️ Reducing the font size (e.g., font-size: 50%; font-size: 0.8em; font-size: 12px;) is the most important customization in case expressions are too long and wrap around.

Global styling can be applied inside the plugin settings.


⚠️ Limitations

The entire drawing of the crosses and re-entries is done using divs. Each cross is a div. This allows many degrees of freedom, but this also comes with limitations, especially for the Re-Entry. HTML/CSS permits to use at most one :before and :after pseudo element (which is used for the Re-Entry) per div. Thus, for each Re-Entry we can have at most two spaces where it can re-enter. For the majority of cases, two re-enters per re-entry are perfectly sufficient. Sometimes using complicated nested Re-Entries it is necessary to rearrange expressions in case of display errors.

71%
HealthGood
ReviewCaution
About
Render Laws of Form bracket expressions into two-dimensional graphical diagrams directly from lof code blocks. Support nested distinctions, crosses and re-entries using $id and [id], multiple re-entries, and separators to mix plain text and equations cleanly.
DrawingVisualizationCode
Details
Current version
1.0.3
Last updated
3 years ago
Created
3 years ago
Updates
4 releases
Downloads
3k
Compatible with
Obsidian 1.1.9+
Platforms
Desktop, Mobile
License
MIT
Report bugRequest featureReport plugin
Author
kevgerkevger
kevingerman.de
GitHubkevger
  1. Community
  2. Plugins
  3. Drawing
  4. Laws of Form

Related plugins

Mermaid Tools

Improved Mermaid.js experience: visual toolbar with common elements and more.

Kroki

Render Kroki diagrams.

Excalidraw

Visual PKM powerhouse. Create and edit Excalidraw drawings.

tldraw

Integration with tldraw, allowing users to draw and edit content on a virtual whiteboard.

Advanced Canvas

Supercharge your canvas experience. Create presentations, flowcharts and more.

Templater

Create and use dynamic templates.

Maps

Adds a map layout to bases so you can display notes as an interactive map view.

Life Tracker

Capture and visualize the data that matters in your life.

PlantUML

Generate PlantUML diagrams.

Ink

Hand write or draw directly between paragraphs using a digital pen, stylus, or Apple pencil.