Hier ist ein Vorschlag für die einfache handgemachte Methode. `etoolbox` und dessen Befehle sind dafür nicht zwingend nötig, machen das ganze aber noch ein bisschen bequemer und übersichtlicher.
Das folgende Makro prüft bei einem Eintrag, ob ein internes Makro dafür existiert und definiert es, falls nicht. Gleichzeitig wird ein Nicht-Existieren als Indiz für erste Verwendung gedeutet:
Der Code ist unabhängig von `soul` und nimmt als Beispiel das Formatieren von Namen. Die erste und die weiteren Formatierungen werden durch die Makros
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
gesteuert, die man sich aber beliebig anders definieren könnte.
\documentclass{article}
\usepackage{etoolbox}
\newrobustcmd*\name[1]{%
\ifcsdef{name@\detokenize{#1}}
{\nameformat{#1}}
{\csgdef{name@\detokenize{#1}}{}\namefirstformat{#1}}%
}
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
\begin{document}
zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip
\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}
\end{document}
![alt text][1]
----------
Achtung: verwendet man es in `\section` und es landet im Inhaltsverzeichnis, dann ist *dort* das erste Erscheinen. Das müsste man u.U. gesondert behandeln, vielleicht mit einem optionalen Stern:
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newrobustcmd*\name{%
\@ifstar
{\name@star}
{\name@nostar}%
}
\newrobustcmd*\name@nostar[1]{%
\ifcsdef{name@\detokenize{#1}}
{\nameformat{#1}}
{\csgdef{name@\detokenize{#1}}{}\namefirstformat{#1}}%
}
\newrobustcmd*\name@star[1]{\nameformat{#1}}
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
\makeatother
\begin{document}
\tableofcontents
\section{\name*{Max Mustermann}}
zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip
\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}
\end{document}
![alt text][2]
----------
**Edit**: mit Möglichkeit, die Namen zu »Resetten«
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand*\used@names{}
\newcommand*\define@name[1]{%
\csgdef{name@\detokenize{#1}}{}%
\listgadd\used@names{#1}%
}
% Achtung: nicht global und erlabut erlaubt damit auch temporäres Resetten:
\newcommand*\undefine@name[1]{\csundef{name@\detokenize{#1}}}
% Achtung: nicht global und erlabut erlaubt damit auch temporäres Resetten:
\newrobustcmd*\resetnames{%
\forlistloop{\undefine@name}{\used@names}%
\def\used@names{}%
}
\newrobustcmd*\name{%
\@ifstar
{\name@star}
{\name@nostar}%
}
\newrobustcmd*\name@nostar[1]{%
\ifcsdef{name@\detokenize{#1}}
{\nameformat{#1}}
{\namefirstformat{#1}\define@name{#1}}%
}
\newrobustcmd*\name@star[1]{\nameformat{#1}}
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
\makeatother
\begin{document}
\tableofcontents
\section{\name*{Max Mustermann}}
zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip
\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}
\section{\name*{Mia Musterfrau}}
\resetnames
zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip
\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}
\end{document}
![alt text][3]
Da `etoolbox` schon geladen ist, könnte man jetzt mit
\preto\section\resetnames
in der Präambel dafür sorgen, dass mit jedem Aufruf von `\section` ein Reset durchgeführt wird-
[1]: http://texwelt.de/wissen/upfiles/name1_1.png
[2]: http://texwelt.de/wissen/upfiles/name2.png
[3]: http://texwelt.de/wissen/upfiles/name3.png