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.

Einfach kubisch (sc)

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 raumzentriert (bcc)

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.

Kubisch flächenzentriert (fcc)

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:

Silizium-Diamantgitter: 2 fcc-Untergitter

Germanium hat dieselbe Struktur, nur mit anderer Gitterkonstante (5.658 statt 5.431 Å). Hier als 2×2×2-Superzelle:

Germanium 2×2×2

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.

GaAs-Kristallstruktur

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:

  1. Berechnet Atompositionen (fcc-Basis, Diamond-Basis, Zinkblende)
  2. Findet Bonds über Abstandskriterium
  3. Sortiert nach Tiefe für korrekte Verdeckung
  4. Generiert TikZ-Code mit dimetrischen Koordinatenvektoren
  5. 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


Erstellt: 03.04.2026