Kristallstrukturen visualisieren: Von Python/ASE zu TikZ/LaTeX
Für die Halbleiterphysik-Artikel in der Knowledgebase brauchte ich Bilder der Kristallstrukturen -- Silizium, Germanium, Galliumarsenid. Statt Bilder aus dem Internet zu nehmen (Lizenzstress, falscher Stil), einfach selbst generiert.
Erster Ansatz war Python mit ASE (Atomic Simulation Environment) und matplotlib. Hat funktioniert, aber die Ergebnisse sahen nicht nach Lehrbuch aus -- elliptische Atome, willkürliche Projektion, aufgeblähte SVGs. Darum der Umstieg auf TikZ/LaTeX mit dimetrischer Projektion nach DIN ISO 5456-3.
Kubische Grundgitter
Bevor wir zu Halbleitern kommen, lohnt sich ein Blick auf die drei kubischen Grundgitter. Das macht die Halbleiterstrukturen danach viel klarer.
Einfach kubisch (sc)
Das simpelste Gitter: Ein Atom pro Ecke des Würfels. Pro Einheitszelle effektiv 1 Atom (jedes Eckatom wird von 8 Zellen geteilt: \(8 \times 1/8 = 1\)). In der Natur selten -- Polonium ist das einzige Element, das bei Raumtemperatur sc kristallisiert.
Kubisch raumzentriert (bcc)
Wie sc, aber mit einem zusätzlichen Atom in der Mitte des Würfels. Pro Einheitszelle 2 Atome. Typisch für Alkalimetalle (Na, K) und Übergangsmetalle (Fe, W, Cr).
Kubisch flächenzentriert (fcc)
Eckatome plus je ein Atom in der Mitte jeder Würfelfläche. Pro Einheitszelle 4 Atome. Sehr dichte Packung -- das ist die Struktur von Cu, Al, Au, Ag und vielen anderen Metallen.
Das fcc-Gitter ist der Baustein für alles, was jetzt kommt: Sowohl das Diamantgitter als auch die Zinkblende bestehen aus zwei fcc-Gittern.
Diamantgitter: Silizium und Germanium
Silizium und Germanium kristallisieren im Diamantgitter. Es besteht aus zwei fcc-Gittern, die um ein Viertel der Raumdiagonale (\(a/4\) in jede Richtung) gegeneinander verschoben sind. Jedes Atom ist tetraedrisch von vier Nachbarn umgeben, verbunden durch kovalente \(sp^3\)-Bindungen.
Pro Einheitszelle: 8 Atome (4 vom ersten fcc + 4 vom zweiten).
Im Bild sind die zwei fcc-Untergitter farblich getrennt -- blau und rot. Jedes rote Atom sitzt in der Lücke zwischen vier blauen und umgekehrt:
Germanium hat dieselbe Struktur, nur mit anderer Gitterkonstante (5.658 statt 5.431 Å). Hier als 2×2×2-Superzelle:
Die unterschiedlichen elektrischen Eigenschaften (Bandlücke, effektive Masse, Beweglichkeit) kommen nicht aus der Geometrie, sondern aus der unterschiedlichen Stärke des atomaren Potentials.
Zinkblende: Galliumarsenid
Galliumarsenid (GaAs) kristallisiert in der Zinkblende-Struktur. Geometrisch identisch zum Diamantgitter -- aber die zwei fcc-Untergitter sind mit verschiedenen Atomsorten besetzt: Ga (blau) auf dem einen, As (amber) auf dem anderen. Die Bindung ist nicht mehr rein kovalent, sondern hat einen ionischen Anteil.
Von sc bis Zinkblende: Der rote Faden
| Struktur | Atome/Zelle | Aufbau | Beispiele |
|---|---|---|---|
| sc | 1 | Würfel | Po |
| bcc | 2 | sc + Zentralatom | Fe, W, Na |
| fcc | 4 | sc + Flächenatome | Cu, Al, Au |
| Diamant | 8 | fcc + fcc (verschoben, gleiche Atome) | Si, Ge, C |
| Zinkblende | 8 | fcc + fcc (verschoben, verschiedene Atome) | GaAs, InP, ZnS |
Der Schlüssel: Jede Zeile baut auf der vorherigen auf. Das Diamantgitter ist einfach zwei fcc-Gitter ineinander -- mit demselben Atom. Die Zinkblende ist dasselbe, nur mit zwei verschiedenen Atomen.
Diamant vs. Zinkblende: Was ist der Unterschied?
| Eigenschaft | Diamantgitter (Si, Ge) | Zinkblende (GaAs, InP) |
|---|---|---|
| Atomsorten | Eine | Zwei (abwechselnd) |
| Bindung | Rein kovalent | Teilweise ionisch |
| Symmetrie | Höher (Inversionssymmetrie) | Niedriger (keine Inversionssymmetrie) |
| Bandstruktur | Indirekt (Si, Ge) | Oft direkt (GaAs) |
| Piezoelektrizität | Nein | Ja (folgt aus fehlender Inversionssymmetrie) |
Die fehlende Inversionssymmetrie in der Zinkblende hat handfeste Konsequenzen: Sie ermöglicht piezoelektrische Effekte und beeinflusst die Bandstruktur -- unter anderem ist das einer der Gründe, warum GaAs ein direkter Halbleiter ist und sich für LEDs und Laser eignet, während Silizium indirekt ist.
Gitterkonstanten im Vergleich
| Material | Struktur | \(a\) (Å) | \(E_g\) (eV) | Typ |
|---|---|---|---|---|
| C (Diamant) | Diamant | 3.567 | 5.47 | Isolator |
| Si | Diamant | 5.431 | 1.12 | Indirekter HL |
| Ge | Diamant | 5.658 | 0.66 | Indirekter HL |
| GaAs | Zinkblende | 5.653 | 1.42 | Direkter HL |
| InP | Zinkblende | 5.869 | 1.34 | Direkter HL |
| GaN | Wurtzit | 3.189 / 5.185 | 3.4 | Direkter HL |
GaN tanzt aus der Reihe -- es kristallisiert bevorzugt in der Wurtzit-Struktur (hexagonal statt kubisch). Das ist eine andere Geschichte.
Wie die Bilder entstehen
Erster Ansatz: ASE + matplotlib
Die Atomic Simulation Environment (ASE) ist eine Python-Bibliothek für atomistische Simulationen. Strukturen definieren und plotten geht in wenigen Zeilen:
from ase.build import bulk
from ase.visualize.plot import plot_atoms
import matplotlib.pyplot as plt
# Einfach kubisch
sc = bulk('Po', 'sc', a=3.0)
fig, ax = plt.subplots(figsize=(6, 6))
plot_atoms(sc, ax, radii=0.8, rotation=('-12x,12y,0z'))
plt.savefig('sc.svg', format='svg')
# Diamantgitter (Si)
from ase.lattice.cubic import Diamond
si = Diamond(symbol='Si', latticeconstant=5.431, size=(1,1,1))
fig, ax = plt.subplots(figsize=(6, 6))
plot_atoms(si, ax, radii=0.6, rotation=('-12x,12y,0z'))
plt.savefig('si_diamant.svg', format='svg')
# Zinkblende (GaAs)
gaas = bulk('GaAs', 'zincblende', a=5.653).repeat(2)
fig, ax = plt.subplots(figsize=(6, 6))
plot_atoms(gaas, ax, radii=0.4, rotation=('-12x,12y,0z'))
plt.savefig('gaas_kristall.svg', format='svg')
Funktioniert, hat aber Nachteile: matplotlib projiziert Kreise als Ellipsen, die Winkel sind willkürlich, und die SVGs sind mit Metadaten aufgebläht (50-130 KB pro Bild).
Aktueller Ansatz: TikZ/LaTeX
Die Bilder auf dieser Seite werden jetzt mit TikZ/LaTeX generiert, in dimetrischer Projektion nach DIN ISO 5456-3 (Achsenmaßstab 0,5 : 1 : 1, Winkel 7°/42°).
Ein Python-Skript (tools/gen_crystal_tikz.py) übernimmt alles:
- Berechnet Atompositionen (fcc-Basis, Diamond-Basis, Zinkblende)
- Findet Bonds über Abstandskriterium
- Sortiert nach Tiefe für korrekte Verdeckung
- Generiert TikZ-Code mit dimetrischen Koordinatenvektoren
- Kompiliert: latex → DVI → dvisvgm → SVG
python3 tools/gen_crystal_tikz.py # alle Strukturen
python3 tools/gen_crystal_tikz.py kristall_sc # einzelne Struktur
Die Atome werden als echte 2D-Kreise gerendert (Füllung + Highlight + Outline), nicht als transformierte 3D-Objekte. Das ergibt saubere Kugeln statt Ellipsen.
| Struktur | matplotlib | TikZ |
|---|---|---|
| sc | 25 KB | 8 KB |
| bcc | 38 KB | 8 KB |
| fcc | 50 KB | 12 KB |
| Si (Diamant) | 56 KB | 16 KB |
| Ge (2×2×2) | 128 KB | 81 KB |
| GaAs (Zinkblende) | 135 KB | 81 KB |
Weiterführendes
- ASE Dokumentation -- nützlich für Atompositionen und Gitterparameter
- ASE Lattice-Modul -- alle vordefinierten Gittertypen
- TikZ/PGF Manual -- TikZ-Referenz
- Bandstruktur -- wie aus dem Kristallgitter die elektronische Struktur folgt