PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text an Makro anhängen



heinzi
16-02-2011, 17:08
Hallo,

ich möchte einen LaTeX-Befehl definieren, mit dem ich an eine im Hintergrund existierende Variable Text anhängen kann. Ein anderer Befehl soll den Inhalt der Variable ausgeben.
Beispiel:


\insert{text1}
\insert{text2}

\print



Die \insert-Befehle sollten gar nichts ausgeben, der \print-Befehl dann "text1text2".

Mein erster Versuch sah folgendermaßen aus:

\documentclass[a4paper,10pt]{scrartcl}

\usepackage[utf8x]{inputenc}
\usepackage{ngerman}

\begin{document}

\newcommand{\insertdata}[1]
{
\let\origdata\listdata
\renewcommand*{\listdata}{\origdata #1}
}

\newcommand*\origdata{}
\newcommand*\listdata{}


\insertdata{bla}
\insertdata{test}

\listdata

\end{document}
Hier bekomme ich die Fehlermeldung "TeX capacity exceeded, sorry [input stack size=5000]".

Ich weiß ehrlich gesagt nicht, was \noexpand macht, aber mit folgender Änderung scheint es zumindest keinen Stackoverflow mehr zu geben:

\newcommand{\insertdata}[1]
{
\let\origdata\listdata
\renewcommand*{\listdata}{\noexpand\origdata #1}
}

\newcommand*\origdata{}
\newcommand*\listdata{}
Dafür gibt er aber nur "test" aus und vergisst den Text des ersten \insertdata-Aufrufes.

Ein anderer Ansatz war folgender:

\newcommand{\insertdata}[1]
{
\makeatletter
\g@addto@macro{\listdata}{#1}
\makeatother
}

\newcommand*\origdata{}
\newcommand*\listdata{}
Hier behauptet er nun "Undefined control sequence \insertdata".

Gibt es einen Weg, die von mir gewünschte Funktionalität zu erhalten?

u_fischer
16-02-2011, 17:33
\makeatletter
\newcommand*\listdata{}
\newcommand{\insertdata}[1]
{\g@addto@macro\listdata{#1}}
\makeatother

heinzi
16-02-2011, 18:36
Es funktioniert - vielen Dank :)

Schweinebacke
17-02-2011, 09:02
Vielleicht interessiert Dich auch noch das Paket etoolbox, das u. a. auch Befehle zum hinten und vorne Anfügen bereitstellt.