diff --git a/README.md b/README.md
index aba0f29..819eb0c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
:green_book: The [manual](https://github.com/Leedehai/typst-physics/blob/master/physica-manual.pdf).
-
+
# The physica package for Typst
@@ -17,27 +17,22 @@ This [Typst](https://typst.app) package provides handy typesetting utilities for
natural sciences, including:
* Braces,
* Vectors and vector fields,
-* Matrices,
+* Matrices, including Jacobian and Hessian,
* Dirac braket notations,
* Common math functions,
* Differentials and derivatives, including partial derivatives of mixed orders with automatic order summation,
-* Familiar "h-bar", tensor abstract index notations, isotopes,
+* Familiar "h-bar", tensor abstract index notations, isotopes, Taylor series term,
* Signal sequences i.e. digital timing diagrams.
-:warning: [Typst](https://typst.app) is in beta and evolving, and this package
-evolves with it. As a result, no backward compatibility is guaranteed yet.
-
-:information_source: In response to the official Typst package [guideline](https://github.com/typst/packages/tree/main#submission-guidelines)
-"Package names should not be merely descriptive to create level grounds for
-everybody", this package was renamed from `physics` to `physica`.
-
## A quick look
-See the [manual](https://github.com/Leedehai/typst-physics/blob/master/physica-manual.pdf) for more details.
+See the [manual](https://github.com/Leedehai/typst-physics/blob/master/physica-manual.pdf) for more details and examples.
![demo-quick](https://github.com/Leedehai/typst-physics/assets/18319900/4a9f40df-f753-4324-8114-c682d270e9c7)
-![demo-larger](https://github.com/Leedehai/typst-physics/assets/18319900/3a5cc613-bf36-4b13-ac28-790150c5fb94)
+A larger [demo.typ](https://github.com/Leedehai/typst-physics/blob/master/demo.typ):
+
+![demo-larger](https://github.com/Leedehai/typst-physics/assets/18319900/ed2d95af-4bb9-4131-957f-ffba4f932a03)
## Using physica in your Typst document
diff --git a/demo.typ b/demo.typ
index fb91f62..790e90a 100644
--- a/demo.typ
+++ b/demo.typ
@@ -9,11 +9,15 @@ curl vb(E) = - pdv(vb(B), t),
quad
tensor(Lambda,+mu,-nu) = dmat(1,RR),
quad
+dd(x,y),
+quad
+dd(vb(x),y,[3]),
+quad
dd(x,y,2,d:Delta,p:and),
quad
dv(phi,t,d:upright(D)) = pdv(phi,t) + vb(u) grad phi \
-H(f) = hmat(f;x,y),
+H(f) = hmat(f;x,y;delim:"[",big:#true),
quad
vb(v^a) = sum_(i=1)^n alpha_i vu(u^i),
quad
diff --git a/physica-manual.pdf b/physica-manual.pdf
index 90ae372..152cdae 100644
Binary files a/physica-manual.pdf and b/physica-manual.pdf differ
diff --git a/physica-manual.typ b/physica-manual.typ
index 0be2ee7..240443e 100644
--- a/physica-manual.typ
+++ b/physica-manual.typ
@@ -27,8 +27,8 @@
#align(center)[
Leedehai \
- #linkurl("GitHub repo", "https://github.com/leedehai/typst-physics") |
- #linkurl("Typst index", "https://typst.app/docs/packages/")
+ #linkurl("GitHub", "https://github.com/leedehai/typst-physics") |
+ #linkurl("Typst", "https://typst.app/docs/packages/")
]
#set par(justify: true)
@@ -211,6 +211,14 @@ All symbols need to be used in *math mode* `$...$`.
[`cprod`],
[`a cprod b` #sym.arrow $a cprod b$],
[cross product],
+
+ [`innerproduct`],
+ [`iprod`],
+ [
+ `iprod(u, v)` #sym.arrow $iprod(u, v)$ \
+ `iprod(sum_i a_i, b)` \ #sym.arrow $iprod(sum_i a_i, b)$
+ ],
+ [inner product],
)
== Matrix notations
@@ -291,29 +299,46 @@ All symbols need to be used in *math mode* `$...$`.
Jacobian matrix: `jacobianmatrix(`...`)`, i.e. `jmat(`...`)`.
#table(
- columns: (1fr, 1fr),
+ columns: (25%, auto, auto),
align: center,
stroke: none,
column-gutter: 1em,
+ [
+ \ Typst (like LaTeX) \ cramps fractions in a matrix...
+ ],
[
#hl(`jmat(f_1,f_2; x,y)`)
$ jmat(f_1,f_2;x,y) $
],
[
- #hl(`jmat(f_1,f_2; x,y,z; delim:"[")`)
- $ jmat(f_1,f_2;x,y,z;delim:"[") $
+ #hl(`jmat(f,g; x,y,z; delim:"[")`)
+ $ jmat(f,g;x,y,z;delim:"[") $
+ ],
+ [
+ \ ...but you can uncramp them using argument #hl(`big:#true`) here
+ ],
+ [
+ #hl(`jmat(f_1,f_2;x,y;big:#true)`)
+ $ jmat(f_1,f_2;x,y;big:#true) $
+ ],
+ [
+ #hl(`jmat(f,g;x,y,z;delim:"|",big:#true)`)
+ $ jmat(f,g;x,y,z;delim:"|",big:#true) $
],
)
Hessian matrix: `hessianmatrix(`...`)`, i.e. `hmat(`...`)`.
#table(
- columns: (1fr, 1fr),
+ columns: (25%, auto, auto),
align: center,
stroke: none,
column-gutter: 1em,
+ [
+ \ Typst (like LaTeX) \ cramps fractions in a matrix...
+ ],
[
#hl(`hmat(f; x,y)`)
$ hmat(f; x,y) $
@@ -322,6 +347,17 @@ Hessian matrix: `hessianmatrix(`...`)`, i.e. `hmat(`...`)`.
#hl(`hmat(; x,y,z; delim:"[")`)
$ hmat(; x,y,z; delim:"[") $
],
+ [
+ \ ...but you can uncramp them using argument #hl(`big:#true`) here
+ ],
+ [
+ #hl(`hmat(f;x,y;big:#true)`)
+ $ hmat(f;x,y;big:#true) $
+ ],
+ [
+ #hl(`hmat(;x,y,z;delim:"|",big:#true)`)
+ $ hmat(; x,y,z;delim:"|",big:#true) $
+ ],
)
Matrix built with an element building function: `xmatrix(`_m, n, func_`)`, i.e. `xmat(`...`)`. The element building function _func_ takes two integers which are the row and column numbers starting from 1.
@@ -399,22 +435,6 @@ xmat(2, 2, #g)`)
],
[ketbra],
- [`innerproduct(`_a_, _b_`)`],
- [`iprod`],
- [
- `iprod(a), iprod(u, v)` \ #sym.arrow $iprod(a), iprod(u, v)$ \
- `iprod(a, vec(1,2))` #sym.arrow $iprod(a, vec(1,2))$
- ],
- [innerproduct\ = braket],
-
- [`outerproduct(`_a_, _b_`)`],
- [`oprod`],
- [
- `oprod(a), oprod(u, v)` \ #sym.arrow $oprod(a), oprod(u, v)$ \
- `oprod(a, vec(1,2))` #sym.arrow $oprod(a, vec(1,2))$
- ],
- [outerproduct\ = ketbra],
-
[`matrixelement(`_n_, _M_, _m_`)`],
[`mel`],
[
@@ -852,6 +872,51 @@ $ isotope("Bi",a:211,z:83) --> isotope("Tl",a:207,z:81) + isotope("He",a:4,z:2)
*(4)* #hl(`isotope("Tl",a:207,z:81) --> isotope("Pb",a:207,z:82) + isotope(e,a:0,z:-1)`)
$ isotope("Tl",a:207,z:81) --> isotope("Pb",a:207,z:82) + isotope(e,a:0,z:-1) $
+=== The n-th term in Taylor series
+
+#v(1em)
+
+Function: `taylorterm(`_func_, _x_, _x0_, _idx_`)`.
+- _func_: the function e.g. `f`, `(f+g)`,
+- _x_: the variable name e.g. `x`,
+- _x0_: the variable value at the expansion point e.g. `x_0`, `(1+a)`,
+- _idx_: the index of the term, e.g. `0`, `1`, `2`, `n`, `(n+1)`.
+If _x0_ or _idx_ is in a parenthesis e.g. `(1+k)`, then the function
+automatically removes the outer parenthesis where appropriate.
+
+#align(center, [*Examples*])
+
+#grid(
+ columns: (50%, 50%),
+ row-gutter: 1em,
+ column-gutter: 2em,
+ [
+ *(1)* #hl(`taylorterm(f,x,x_0,0)`) \
+ $ taylorterm(f,x,x_0,0) $
+ ],
+ [
+ *(2)* #hl(`taylorterm(f,x,x_0,1)`) \
+ $ taylorterm(f,x,x_0,1) $
+ ],
+ [
+ *(3)* #hl(`taylorterm(f,x,(1+a),2)`) \
+ $ taylorterm(f,x,(1+a),2) $
+ ],
+ [
+ *(4)* #hl(`taylorterm(f,x,x_0,n)`) \
+ $ taylorterm(f,x,x_0,n) $
+ ],
+ [
+ *(5)* #hl(`taylorterm(F,x^nu,x^nu_0,n)`) \
+ $ taylorterm(F,x^nu,x^nu_0,n) $
+ ],
+ [
+ *(6)* #hl(`taylorterm(f_p,x,x_0,(n+1))`) \
+ $ taylorterm(f_p,x,x_0,(n+1)) $
+ ],
+)
+
+
=== Signal sequences (digital timing diagrams)
In engineering, people often need to draw digital timing diagrams for signals, like $signals("1|0|1|0")$.
diff --git a/physica.typ b/physica.typ
index b4a8271..534cdb0 100644
--- a/physica.typ
+++ b/physica.typ
@@ -206,8 +206,25 @@
#let crossproduct = $times$
#let cprod = crossproduct
+#let innerproduct(u, v) = {
+ $lr(angle.l #u, #v angle.r)$
+}
+#let iprod = innerproduct
+
// == Matrices
+// Display matrix element in display/inline style. The latter vertically
+// compresses a tall content (e.g. a fraction) while the former doesn't.
+// In Typst and LaTeX, a matrix element is automatically cramped, even if
+// the matrix is in a standalone math block.
+#let __mate(content, big) = {
+ if big {
+ math.display(content)
+ } else {
+ math.inline(content)
+ }
+}
+
#let matrixdet(..sink) = {
math.mat(..sink, delim:"|")
}
@@ -276,20 +293,20 @@
}
#let zmat = zeromatrix
-#let jacobianmatrix(fs, xs, delim:"(") = {
+#let jacobianmatrix(fs, xs, delim:"(", big: false) = {
assert(type(fs) == array, message: "expecting an array of function names")
assert(type(xs) == array, message: "expecting an array of variable names")
let arrays = () // array of arrays
for f in fs {
- arrays.push(xs.map((x) => math.frac($diff#f$, $diff#x$)))
+ arrays.push(xs.map((x) => __mate(math.frac($diff#f$, $diff#x$), big)))
}
math.mat(delim: delim, ..arrays)
}
#let jmat = jacobianmatrix
-#let hessianmatrix(fs, xs, delim:"(") = {
- assert(type(fs) == array, message: "expecting a one-element array")
- assert(fs.len() == 1, message: "expecting only one function name")
+#let hessianmatrix(fs, xs, delim:"(", big: false) = {
+ assert(type(fs) == array, message: "usage: hessianmatrix(f; x, y...)")
+ assert(fs.len() == 1, message: "usage: hessianmatrix(f; x, y...)")
let f = fs.at(0)
assert(type(xs) == array, message: "expecting an array of variable names")
let row_arrays = () // array of arrays
@@ -299,10 +316,10 @@
let xr = xs.at(r)
for c in range(order) {
let xc = xs.at(c)
- row_array.push(math.frac(
+ row_array.push(__mate(math.frac(
$diff^2 #f$,
if xr == xc { $diff #xr^2$ } else { $diff #xr diff #xc$ }
- ))
+ ), big))
}
row_arrays.push(row_array)
}
@@ -364,11 +381,6 @@
$ lr(bar.v ket#h(0pt)mid(angle.r#h(0pt)angle.l)#h(0pt)bra bar.v) $
})
-#let innerproduct = braket
-#let iprod = innerproduct
-#let outerproduct = ketbra
-#let oprod = outerproduct
-
#let matrixelement(n, M, m) = style(styles => {
$ lr(angle.l #n#h(0pt)mid(bar.v)#h(0pt)#M#h(0pt)mid(bar.v)#h(0pt)#m angle.r) $
})
@@ -663,6 +675,25 @@
math.attach((T,hphantom(sym.zwj)).join(), t: uppers.join(), b: lowers.join())
}
+#let taylorterm(fn, xv, x0, idx) = {
+ let noparen(expr) = {
+ if type(expr) == content and expr.func() == math.lr {
+ let children = expr.at("body").at("children")
+ children.slice(1, children.len() - 1).join()
+ } else {
+ expr
+ }
+ }
+
+ if idx == [0] or idx == 0 {
+ $fn (noparen(x0))$
+ } else if idx == [1] or idx == 1 {
+ $fn^((1)) (noparen(x0))(xv - x0)$
+ } else {
+ $frac(fn^((noparen(idx))) (noparen(x0)), idx !)(xv - x0)^noparen(idx)$
+ }
+}
+
#let isotope(element, /*atomic mass*/a: none, /*atomic number*/z: none) = {
$attach(upright(element), tl: #a, bl: #z)$
}