Für TeX hat jedes Zeichen einen „Kategorie-Code“ oder „category code“ zugeordnet, der seine Funktion festlegt. Insgesamt gibt es 16 Kategorie-Codes. Zum Beispiel hat `\` üblicherweise Kategorie-Code `0` (= escape character, leitet eine Befehlssequenz ein), `{` hat `1` (= Beginn einer Gruppe), `}` hat `2` (Ende einer Gruppe) usw. Die „normalen“ Zeichen, d.h., die kleinen und großen Buchstaben haben Kategorie-Code `11` (= letter/Buchstabe), Ziffern, Satzzeichen und andere Symbole `12` (= other/anderes Zeichen). Das Zeichen `@` hat ebenfalls Kategorie-Code `12`. Wieso ist das wichtig? Nun, Befehlssequenzen können entweder nur aus Zeichen mit Kategorie-Code `11` oder aus _einem_ Zeichen mit anderem Kategorie-Code bestehen.
Der Befehl
\makeatletter
weist nun dem Zeichen `@` Kategorie-Code `11` zu, so dass es in Namen von Befehlssequenzen verwendet werden kann. Der Befehl
\makeatother
weist `@` entsprechend Kategorie-Code `12` zu.
Verwendet wird `@` als Buchstabe, um _interne_ Makros zu schreiben, die nicht für den direkten Einsatz im Dokument gedacht sind. Hat man zum Beispiel
\makeatletter
\def\name#1{\gdef\@name{#1}}
\makeatother
dann kann `\@name` nicht direkt verwendet werden, solange `@` Kategorie-Code `12` hat. Man würde stattdessen das Makro `\@` gefolgt von den Buchstaben `n`, `a`, `m` und `e` aufrufen. Damit können interne Makros nicht aus Versehen aufgerufen oder überschrieben werden.
In Klassen- und Paket-Dateien sind `\makeatletter` und `\makeatother` nicht nötig, da dort `@` schon von vornherein Kategorie-Code `11` hat, also als Buchstabe behandelt wird. Obwohl es heutzutage meistens wohl keinen Schaden anrichtet, sollten die Befehle darum in Klassen- und Paketdateien auch nicht verwendet werden.
Manchmal ist es jedoch nötig, im Dokument auf interne Befehle zuzugreifen. Hier kommen dann `\makeatletter` und `\makeatother` zum Einsatz. Wann immer man ein Makro, das ein `@` im Namen hat definieren oder umdefinieren möchte, rahmt man die Modifikationen mit den beiden ein:
\makeatletter % setzt Kategorie-Code von @ auf 11
<Code mit Befehlen, die @ im Namen haben>
\makeatother % setzt Kategorie-Code von @ auf 12
Und bevor ich's vergesse: im LaTeX-Kernel (`latex.ltx`) sind die beiden Befehle folgendermaßen definiert:
\def\makeatletter{\catcode`\@11\relax}
\def\makeatother{\catcode`\@12\relax}
Übrigens: die LaTeX3-Programmiersprache `expl3` verwendet nicht `@` für interne Makros, sondern `_` und `:`, die normalerweise auch Kategorie-Code Kategorie-Code `7` bzw. `12` haben. Ihre Verwendung ist allerdings wesentlich systematischer als beim `@` in LaTeX 2e. Für `expl3` Code verwendet man (nachdem man das Paket [`expl3`][1] geladen hat) `\ExplSyntaxOn` und `\ExplSyntaxOff`. Ihre Funktion ist noch umfangreicher als alleine das Setzen Kategorie-Codes von `_` und `:`, aber das ist vielleicht Thema für eine andere Frage.
[1]: http://www.ctan.org/pkg/l3kernel