Hello, Zef!
I have tried many note-taking apps.
Yours is most close to Logseq.
I’m impressed by how you decided The Problem of Sync: if it needs to look note from a smart kettle, so use app that is on every kettle - browser.
So I’m now really interested in moving my flow to here.
Part of my notes made by the lectures of technical subjects and include math in KaTeX expressions ($ A = B + C $)
My question is “Can I use math rendering in SilverBullet?”
This is great! I’m coming from logseq too (or strongly considering it). Is there any way to do this kind of math/katex rendering inline? I’d be willing to work on it. Maybe using MathJax?
Technically it would be possible to do this, but it would requiring the SilverBullet parser itself. It cannot be done from a plug. If anybody wants to attempt this, that’d be great. I have little current interest this myself, because I don’t use any type of formula in my daily life
no I didn’t test it, I do not know how that should be done. There is no Plugs: add command anymore and the settings for the plugin should go to ‘SETTINGS’ in yaml format, but this file also is deprecated.
I am a physics student, and the fact that SilverBullet does not support in-line math does not trouble me much because my solution is to simply write my note in LaTeX and put the LaTeX project folder into my SilverBullet space.
Within this setup I can easily link to (via wiki-link) or embed (via ![]() syntax) my notes. Many LaTeX packages aren’t supported by browser-based renderers anyway (e.g. the physics package that I use extremely frequently)!
I wrote a very simple Lua function that gives me the path to PDF files. In my SB space there is a folder tex-notes where each project note is developed inside SB-space/tex-notes/note. Given this structure, the following function
function pdfPath(pdfName)
pathLink = "[[tex-notes/"..pdfName.."/"..pdfName..".pdf]]"
return pathLink
end
maps the title of my note pdfName to the wiki-link to the file, i.e. ${pdfPath(name)} produces a wiki-link to the desired note SB-space/tex-notes/name/name.pdf.
I also think this is a quite universal work-around, e.g. if you have a Jupyter notebook or Pluto notebook or Quarto-flavoured markdown, instead of requiring SilverBullet to be able to render all of these, all one has to do is to link to the PDF version of these formats, which can be done very easily.
Ok this is pretty insane. I have to say I have written most of the code in the katex plug, so I know how the library works and all, but still … It took me 10 minutes to write this (and this includes two slash commands for easier use) very tiny space lua and look what’s possible.
Space Lua
latex = {
header = [[<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css">]],
katex = js.import("https://cdn.jsdelivr.net/npm/[email protected]/+esm")
}
function latex.inline(expression)
local html = latex.katex.renderToString(expression, {
trust = true,
throwOnError = false,
displayMode = false
})
return widget.new {
html = "<span>" + latex.header + html + "</span>"
}
end
function latex.block(expression)
local html = latex.katex.renderToString(expression, {
trust = true,
throwOnError = false,
displayMode = true
})
return widget.new {
html = "<span>" + latex.header + html + "</span>"
}
end
slashcommand.define {
name = "math",
run = function()
editor.insertAtCursor("${latex.inline[[]]}", false, true)
editor.moveCursor(editor.getCursor() - 3)
end
}
slashcommand.define {
name = "equation",
run = function()
editor.insertAtCursor("${latex.block[[]]}", false, true)
editor.moveCursor(editor.getCursor() - 3)
end
}
If ${latex.inline[[S]]} is a set, ${latex.inline[[\circ]]} is a binary operation on ${latex.inline[[S]]}, and ${latex.inline[[e \in S]]}, then ${latex.inline[[G = (S, e, \circ)]]} is called a *group* if
1. ${latex.inline[[\forall a, b \in G, \quad a \circ \ b \in G]]} (completeness);
2. ${latex.inline[[(ab)c = a(bc), \quad \forall a,b,c \in S]]} (associativity);
3. ${latex.inline[[\exists e \in S]]} such that ${latex.inline[[ae=a=ea, \quad \forall a \in S]]} (identity);
4. ${latex.inline[[\forall a \in S, \quad \exists b \in S]]} such that ${latex.inline[[ab=e=ba]]} (inverse).
The Fourier transform of a complex-valued (Lebesgue) integrable function ${latex.inline[[f(x)]]} on the real line, is the complex valued function ${latex.inline[[\hat {f}(\xi )]]}, defined by the integral
${latex.block[[\widehat{f}(\xi) = \int_{-\infty}^{\infty} f(x)\ e^{-i 2\pi \xi x}\,dx, \quad \forall \xi \in \mathbb{R}.]]}
It’s actually insane what’s possible. Only thing that bugs me here is that it (afaik) won’t work offline because the cdn resources aren’t cached. Open to ideas on this one, dependencies always have kind of been a struggle with SB.
Shouldn’t it be possible to place the files to includes somewhere within the space directory and link to it?
However, the caching argument would most probably be true, also…
Hi, I’m also checking this topic recently and I find that since we are not having proper math support yet, we should consider support the typst(have a look at the syntax and you will love it) instead of latex (or side by side from latex) for the math, which offer more modern infrastructure and better math syntax than the latex. I personally find it really enjoyable to write my math in the typst rather than in the latex.
As an example of such integration (which I’m actually using right now), we can take example from the quartz which has math engine for both katex/mathjax and typst, you can have a look at the implementation here.
My personal website is also using this feature from quartz and I must say it works perfectly well.
I do believe that we still need to make syntax compatible with the vanilla markdown for parsing the math block (and leave the parsing of the math expression to the specific math engine like mathjax/katex/typst). This way we can make it less customized to make use of good static site generator tool like quartz.
P.S: I’m also considering writing down my workflow of inter-operation between Silverbullet and the quartz, which I made seamlessly integrated and enjoy a lot of automation.
Yeah, the $$ blocks and $ ... $ inlines are very common and everybody knows them (not speaking that almost every matured static site generator supports them in some way). Perhaps we should consider hooking Lua on specific AST nodes and that way
we can have both ways at once (the Lua call ${math.inline[[ ... ]]} and the common syntax). @MrMugame Is it doable (to hook Lua on math AST nodes)?