|
| 1 | +# Energy-Dia |
| 2 | + |
| 3 | +[日本語版](README.ja.md) |
| 4 | + |
| 5 | +**Energy-Dia** is a powerful and intuitive Typst library for creating professional energy diagrams in chemistry and physics. Built on top of CeTZ, it makes drawing atomic orbitals, molecular orbitals, and band structures effortless and beautiful. |
| 6 | + |
| 7 | +## Features |
| 8 | + |
| 9 | +- **Atomic Orbital Diagrams (AO)**: Visualize energy levels and electron configurations with support for degeneracy and spin states |
| 10 | +- **Molecular Orbital Diagrams (MO)**: Create comprehensive MO diagrams with orbital mixing and electron distribution |
| 11 | +- **Band Structure Diagrams**: Plot band structures quickly with minimal code |
| 12 | +- **Customizable**: Full control over diagram size, labels, and styling |
| 13 | +- **Simple Syntax**: Intuitive API that's easy to learn and use |
| 14 | + |
| 15 | +## Quick Start |
| 16 | + |
| 17 | +### Installation |
| 18 | + |
| 19 | +```typst |
| 20 | +#import "@preview/energy-dia:0.1.0": * |
| 21 | +``` |
| 22 | + |
| 23 | +### Simple Example |
| 24 | + |
| 25 | +```typst |
| 26 | +#ao( |
| 27 | + width: 10, |
| 28 | + height: 10, |
| 29 | + (energy: -10, electrons: 2, caption: "1s"), |
| 30 | + (energy: -3, electrons: 2, caption: "2s"), |
| 31 | + (energy: -1, electrons: 4, degeneracy: 3, up: 3, caption: "2p"), |
| 32 | +) |
| 33 | +``` |
| 34 | + |
| 35 | +## Usage Guide |
| 36 | + |
| 37 | +### Atomic Orbital Diagrams (AO) |
| 38 | + |
| 39 | +Create energy level diagrams for atomic orbitals with electron configurations. |
| 40 | + |
| 41 | +#### Basic Syntax |
| 42 | + |
| 43 | +```typst |
| 44 | +#ao( |
| 45 | + width: 10, |
| 46 | + height: 10, |
| 47 | + name: "C", |
| 48 | + exclude-energy: false, |
| 49 | + (energy: -10, electrons: 2, caption: "1s"), |
| 50 | + (energy: -3, electrons: 2, caption: "2s"), |
| 51 | + (energy: -1, electrons: 4, degeneracy: 3, up: 3, caption: "2p"), |
| 52 | +) |
| 53 | +``` |
| 54 | + |
| 55 | +#### Parameters |
| 56 | + |
| 57 | +**Diagram settings:** |
| 58 | +- `width` (length): Width of the diagram (default: 5) |
| 59 | +- `height` (length): Height of the diagram (default: 5) |
| 60 | +- `name` (string): Atom name to display (default: none) |
| 61 | +- `exclude-energy` (boolean): Hide energy values (default: false) |
| 62 | + |
| 63 | +**Orbital levels** (positional arguments, each as a dictionary): |
| 64 | +- `energy` (number): Energy value of the orbital |
| 65 | +- `electrons` (number): Number of electrons (default: 0) |
| 66 | +- `degeneracy` (number): Degeneracy of the orbital (default: 1) |
| 67 | +- `caption` (string): Label for the orbital (default: none) |
| 68 | +- `up` (number): Number of spin-up electrons (optional; if not specified, electrons alternate between up and down spins) |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +### Molecular Orbital Diagrams (MO) |
| 73 | + |
| 74 | +Visualize molecular orbital formation from atomic orbitals with orbital mixing. |
| 75 | + |
| 76 | +#### Basic Syntax |
| 77 | + |
| 78 | +```typst |
| 79 | +#mo( |
| 80 | + width: 15, |
| 81 | + height: 10, |
| 82 | + names: ("O", $"O"_2$ , "O"), |
| 83 | + exclude-energy: false, |
| 84 | + atom1: ( |
| 85 | + (energy: -14, electrons: 2, label: 1, caption: "2s"), |
| 86 | + (energy: -5, electrons: 4, degeneracy: 3, up: 3, label: 2, caption: "2p"), |
| 87 | + ), |
| 88 | + molecule: ( |
| 89 | + (energy: -16, electrons: 2, label: 3, caption: [$1sigma$]), |
| 90 | + (energy: -12, electrons: 2, label: 4, caption: [$1sigma^*$]), |
| 91 | + (energy: -8, electrons: 2, label: 5, caption: [$2sigma$]), |
| 92 | + (energy: -6, electrons: 4, degeneracy: 2, label: 7, caption: [$pi$]), |
| 93 | + (energy: -4, electrons: 2, degeneracy: 2, up: 2, label: 8, caption: [$pi^*$]), |
| 94 | + (energy: -2, electrons: 0, label: 6, caption: [$2sigma^*$]), |
| 95 | + ), |
| 96 | + atom2: ( |
| 97 | + (energy: -14, electrons: 2, label: 9, caption: "2s"), |
| 98 | + (energy: -5, electrons: 4, degeneracy: 3, up: 3, label: 10, caption: "2p"), |
| 99 | + ), |
| 100 | + (1, 3), (1, 4), (2, 5), (2, 7), (2, 8), (2, 6), |
| 101 | + (9, 3), (9, 4), (10, 5), (10, 7), (10, 8), (10, 6) |
| 102 | +) |
| 103 | +``` |
| 104 | + |
| 105 | +#### Parameters |
| 106 | + |
| 107 | +**Diagram settings:** |
| 108 | +- `width` (length): Width of the diagram (default: 5) |
| 109 | +- `height` (length): Height of the diagram (default: 5) |
| 110 | +- `names` (array): Names for left atom, molecule, and right atom (default: ()) |
| 111 | +- `exclude-energy` (boolean): Hide energy labels (default: false) |
| 112 | + |
| 113 | +**Orbital data:** |
| 114 | +- `atom1` (array): Orbitals for left atom |
| 115 | +- `molecule` (array): Molecular orbitals |
| 116 | +- `atom2` (array): Orbitals for right atom |
| 117 | + |
| 118 | +Each orbital is a dictionary with: |
| 119 | +- `energy` (number): Energy value |
| 120 | +- `electrons` (number): Number of electrons (default: 0) |
| 121 | +- `degeneracy` (number): Degeneracy (default: 1) |
| 122 | +- `caption` (string): Label (default: none) |
| 123 | +- `up` (number): Number of spin-up electrons (optional) |
| 124 | +- `label` (number): Unique identifier for connections |
| 125 | + |
| 126 | +**Connections** (positional arguments): |
| 127 | +Tuples like `(1, 3)` connect orbitals with labels 1 and 3 using dashed lines. |
| 128 | + |
| 129 | +**Important:** Each orbital array (`atom1`, `atom2`, `molecule`) must be an array, even for a single orbital. Don't forget the trailing comma: `((energy: -5, electrons: 1),)` |
| 130 | + |
| 131 | +--- |
| 132 | + |
| 133 | +### Band Structure Diagrams |
| 134 | + |
| 135 | +Plot energy diagram with minimal syntax—ideal-perfect for band structures, which have many orbitals |
| 136 | + |
| 137 | +#### Basic Syntax |
| 138 | + |
| 139 | +```typst |
| 140 | +#band( |
| 141 | + width: 5, |
| 142 | + height: 5, |
| 143 | + name: "Si", |
| 144 | + include-energy-labels: true, |
| 145 | + -5, -4, -3, 0, 1, 2 |
| 146 | +) |
| 147 | +``` |
| 148 | + |
| 149 | +#### From CSV Data |
| 150 | + |
| 151 | +```typst |
| 152 | +#let data = csv("test.csv") |
| 153 | +#let energies = data.map(row => float(row.at(0))).flatten() |
| 154 | +#band( |
| 155 | + include-energy-labels: false, |
| 156 | + ..energies |
| 157 | +) |
| 158 | +``` |
| 159 | + |
| 160 | +#### Parameters |
| 161 | + |
| 162 | +- `width` (length): Width of the diagram (default: 5) |
| 163 | +- `height` (length): Height of the diagram (default: 5) |
| 164 | +- `name` (string): Substance name to display (default: none) |
| 165 | +- `include-energy-labels` (boolean): Show energy values (default: false) |
| 166 | +- Positional arguments: Energy level values |
| 167 | + |
| 168 | +## Examples |
| 169 | + |
| 170 | +### Atomic Orbital Diagram |
| 171 | + |
| 172 | + |
| 173 | + |
| 174 | +### Molecular Orbital Diagram |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | +### Band Structure Diagram |
| 179 | + |
| 180 | + |
| 181 | + |
| 182 | +**See [demo.typ](demo/demo.typ) for complete working examples!** |
| 183 | + |
| 184 | +## Dependencies |
| 185 | + |
| 186 | +- **[CeTZ](https://github.com/cetz-package/cetz)** v0.4.2 - Drawing library (LGPL-3.0) |
| 187 | + |
| 188 | +## License |
| 189 | + |
| 190 | +This project is licensed under the **GNU General Public License v3.0**. See [LICENSE](LICENSE) for details. |
| 191 | + |
| 192 | +## Contributing |
| 193 | + |
| 194 | +Contributions are welcome! Feel free to open issues or submit pull requests. |
0 commit comments