Moin Herbert,
Danke erstmal für die zusätzlichen Anregungen!

Zitat von
voss
Deine Idee funktioniert leider nicht immer, da es noch andere Typen
gibt, die ebenfalls keinMakro sind und bei Primitiven klappt die
\expandafter-Orgie sowieso nicht:
gerade die Primitiven würde ich gar nicht expandieren wollen; auf ein paar Definitionen muß ich mich auch verlassen können.

Zitat von
voss
Aha, hier schließt sich der Kreis zum \long.

Zitat von
voss
Das scheint mir so ein Teil nach dem Motto ``damned if you do, damned if you don't'' zu sein: Die Implementation hier im \emacro ließ sich recht einfach analog zum \mathchar realisieren, aber gerade \@ne wird ja nicht nur definiert, sondern bereits verwendet -- und wenn sich hier die Bedeutung ändert, führt es fast unweigerlich zu einem Fehler (wenn auch an anderer Stelle); da fragt man sich, ob die Redefinition eines \mathchar überhaupt so ohne weiteres zulässig ist ... Ich kann ja mal ein paar Warnungen ausgeben lassen;-)

Zitat von
voss
Code:
\expandafter\strip@prefix\meaning\pagebreak
Beim Versuch, den String weiter auseinanderzunehmen, bin ich hier sehr schnell an meine Grenzen gestoßen und letztlich bin ich das Problem unter Zuhilfenahme des substr-Pakets umgangen -- aber da kann ich mir später immer noch die Zähne dran ausbeißen;-)
Dabei stellte sich auch noch die Frage, was mit einem Makro passieren soll, das Parameter erwartet und wie man überhaupt an dessen Parameterliste gelangt, wenn dieses Makro auch noch einen optionalen Parameter unterstützt.
Besser erstmal abweisen:
Code:
\documentclass[12pt]{article}
\usepackage{substr}
\chardef\emacrotc=`\%
\mathchardef\emacromc="0123
\newcommand*\emacrosm{short}
\newcommand\emacrolm{long}
\makeatletter
\edef\chkstr{\string\@testopt}
\makeatother
\newcommand*\foo{foo}
\newcommand\foobar{foobar}
\newcommand*\baz[1]{baz \textit{#1}}
\newcommand\foobaz[1]{foobaz \textit{#1}}
\long\def\firstofndqi#1"#2\null{#1}
\long\def\firstofndq#1{\expandafter\firstofndqi#1"\null}
\long\def\firstofnci#1:#2\null{#1}
\long\def\firstofnc#1{\expandafter\firstofnci#1:\null}
\long\def\firstofngti#1>#2\null{#1}
\long\def\firstofngt#1{\expandafter\firstofngti#1>\null}
\newcommand\emacro[2]{%
\long\edef\emacrotmp{\meaning#1}%
\edef\emacroname{\string#1}%
\long\edef\emacrotmpii{\firstofndq{\meaning\emacromc}}%
\long\edef\emacrotmpi{\firstofndq{\emacrotmp}}%
\ifx\emacrotmpi\emacrotmpii% Test auf \mathchar
\typeout{Warnung:\string\emacro: `\emacroname' war `\emacrotmpi', wird zu Makro.}%
\edef#1{\mathchar\the#1 #2}%
\else
\long\edef\emacrotmpii{\firstofndq{\meaning\emacrotc}}%
\ifx\emacrotmpi\emacrotmpii% Test auf \char
\typeout{Warnung:\string\emacro: `\emacroname' war `\emacrotmpi', wird zu Makro.}%
\edef#1{\char\the#1 #2}%
\else
\long\edef\emacrotmpiis{\firstofngt{\meaning\emacrosm}}%
\long\edef\emacrotmpis{\firstofngt{\emacrotmp}}%
\long\edef\emacrotmpii{\firstofnc{\emacrotmpiis}}%
\long\edef\emacrotmpi{\firstofnc{\emacrotmpis}}%
\ifx\emacrotmpi\emacrotmpii% Test auf (short) macro
\ifx\emacrotmpis\emacrotmpiis% Test auf nicht optionale Parameter
\IfSubStringInString{\chkstr}{\emacrotmp}{% Test auf \@testopt
\typeout{Fehler: \string\emacro\space mag keine Makros mit optionalen Parametern...(\emacroname)}}{%
\edef#1{#1#2}}%
\else
\typeout{Fehler: \string\emacro: was soll mit Parameter(n) geschehen (\emacroname:\emacrotmp)?}%
\fi
\else
\long\edef\emacrotmpiis{\firstofngt{\meaning\emacrolm}}%
\long\edef\emacrotmpis{\firstofngt{\emacrotmp}}%
\long\edef\emacrotmpii{\firstofnc{\emacrotmpiis}}%
\long\edef\emacrotmpi{\firstofnc{\emacrotmpis}}%
\ifx\emacrotmpi\emacrotmpii% Test auf (long) macro
\ifx\emacrotmpis\emacrotmpiis% Test auf nicht optionale Parameter
\IfSubStringInString{\chkstr}{\emacrotmp}{% Test auf \@testopt
\typeout{Fehler: \string\emacro\space mag keine Makros mit optionalen Parametern...(\emacroname)}}{%
\typeout{Warnung: \string\emacro: \emacroname\space wird zu einem kurzen Makro umdefiniert!}%besitzt eh keine Parameter...
\edef#1{#1#2}}%
\else% langes Makro mit Parameter(n):
\typeout{Fehler: \string\emacro: was soll mit Parameter(n) geschehen (\emacroname:\emacrotmp)?}%
\fi
\else
\typeout{Fehler: \string\emacro\space hat sich geweigert, `\emacroname' zu expandieren!}
\fi
\fi
\fi
\fi
}
\begin{document}
\emacro\exists{\quad}
\emacro\forall{\quad}
\emacro\foo{bar}
\emacro\foobar{blubb}
\emacro\par{\foo}
\emacro\%{\quad\foo}
\emacro\pagebreak{\foo}
\emacro\foobaz{\foo}
\emacro\baz{\foo}
\verb=\exists=: $\exists A$
\verb=\forall=: $\forall B$
\verb=\%=: \%
\verb=\foo=: \foo
\verb=\foobar=: \foobar
\verb=\foobaz{bla}=: \foobaz{bla}
\verb=\baz{bla}=: \baz{bla}
\end{document}
wieder ein Stückchen mehr;-)
MfG
Lesezeichen