PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : befehle und keys innerhalb von makros erzeugen



rafael
09-08-2011, 08:58
Ich würde gern ein Makro erzeugen, dass für eine Zeichenkette eine Anzahl von Befehlen und keys erzeugt. Dabei soll zum Beispiel die Ausdrücke


% \makeatletter
% \define@key{mytype}{methode}{%
% \def\mytypemethode{#1}}
% \presetkeys{mytype}{methode={Voreinstellung}}{}
% \makeatother

nicht nur für "methode", sondern auch andere Ausdrücke definiert werden.
MB:

\documentclass{scrartcl}
\usepackage{xkeyval}

%%%%%%%diese Makros automatisieren
% \makeatletter
% \define@key{mytype}{methode}{%
% \def\mytypemethode{#1}}
% \presetkeys{mytype}{methode={Voreinstellung}}{}
% \makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\makeatletter
\newcommand{\makenewtype}[1]{%1. keydef und Makro \mytype#1 erzeugen
\define@key{mytype}{#1}{%
\expandafter\def\expandafter*\expandafter{\csname mytype#1\endcsname}{##1}
}
\presetkeys{mytype}{#1={Voreinstellung}}{}
}
\makeatother
\makenewtype{methode}

\newcommand{\printtype}[1]{%Ausgabe
\setkeys{mytype}{#1}
\mytypemethode
}

\begin{document}

\printtype{}%Voreinstellung
\printtype{methode={\\lokal einstellung}}

\end{document}
Ich bekomme es leider nicht hin, die Befehle zu erzeugen. Wer kann mir helfen?
Danke

sommerfee
09-08-2011, 10:01
\expandafter\def\expandafter*\expandafter{\csname mytype#1\endcsname}{##1}

Der * (Wozu ist der gedacht) und die Klammern um \csname...\endcsname stören (bei \newcommand sind die erlaubt, bei \def aber nicht), es muß also heißen:


\expandafter\def\csname mytype#1\endcsname{##1}

oder


\@namedef{mytype#1}{##1}

(\@namedef ist im LaTeX-Kernel als Abkürzung zu obrigem Code definiert)

Außerdem sind in deinen Makrodefinitionen einige Leerzeichen enthalten, die später bei der Benutzung Ärger machen könnten. Ich habe sie mal hier mittels % entfernt:



\documentclass{scrartcl}
\usepackage{xkeyval}

%%%%%%%diese Makros automatisieren
% \makeatletter
% \define@key{mytype}{methode}{%
% \def\mytypemethode{#1}}
% \presetkeys{mytype}{methode={Voreinstellung}}{}
% \makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\makeatletter
\newcommand{\makenewtype}[1]{%1. keydef und Makro \mytype#1 erzeugen
\define@key{mytype}{#1}{%
\@namedef{mytype#1}{##1}%
}%
\presetkeys{mytype}{#1={Voreinstellung}}{}%
}
\makeatother
\makenewtype{methode}

\newcommand{\printtype}[1]{%Ausgabe
\setkeys{mytype}{#1}%
\mytypemethode
}

\begin{document}

\printtype{}%Voreinstellung
\printtype{methode={\\lokal einstellung}}

\end{document}


Siehe auch: http://www.komascript.de/signifikanteLeerzeichen

rafael
09-08-2011, 10:58
Der * (Wozu ist der gedacht) und die Klammern um \csname...\endcsname stören (bei \newcommand sind die erlaubt, bei \def aber nicht), es muß also heißen:


\expandafter\def\csname mytype#1\endcsname{##1}

oder


\@namedef{mytype#1}{##1}

(\@namedef ist im LaTeX-Kernel als Abkürzung zu obrigem Code definiert)

Danke, ich hatte mal einen Codeschnipsel von Herbert Voss aus einem Forum gezogen und mit \newcommand gearbeitet hat. Ich hatte dann die Sache einfach geändert, und es gab bis heute keine Probleme. Aber durch deine Ausführung verstehe ich die Sache schon besser.

Die Sache mit den Leerzeichen... ja da hast du recht.
Also danke noch mal