PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Liste dynamisch erstellen und ausgeben



Dee
05-04-2010, 13:33
Hallo,

ich beziehe mich auf diesen Thread (http://www.mrunix.de/forums/showthread.php?t=63031).

Ich möchte eine Liste mit Links dynamisch erstellen. Heißt, wenn ich \AddLink{http...} aufrufe, soll dieser zu einer Liste hinzugefügt werden, diese wird dann am Ende ausgegeben.

Für die Realisierung gibt es, glaube ich, drei Möglichkeiten:


\documentclass{scrartcl}

\newcommand*{\PrintLinksI}{}
\newcommand*{\PrintLinksII}{}
\newcommand*{\PrintLinksIII}{}

% mit expandafter
\newcommand*{\AddLinkI}[1]{%
\expandafter\def\expandafter\PrintLinksI\expandaft er{\PrintLinksI{} #1}%
}

% mit \addto
\makeatletter
\newcommand*{\AddLinkII}[1]{%
\g@addto@macro{\PrintLinksII}{#1 }%
}
\makeatother

% mit \let
\newcommand*{\AddLinkIII}[1]{%
\let\PrintLinksAlt\PrintLinksIII%
\renewcommand*\PrintLinksIII{\PrintLinksAlt{} #1}%
}

\begin{document}

Beispieltext fuer mrunix.de\AddLinkI{http://www.mrunix.de/} und fuer die
Wikipedia\AddLinkI{http://de.wikipedia.org/}.\\

Links:\PrintLinksI{}\\

Beispieltext fuer mrunix.de\AddLinkII{http://www.mrunix.de/} und fuer die
Wikipedia\AddLinkII{http://de.wikipedia.org/}.\\

Links:\PrintLinksII{}\\

Beispieltext fuer mrunix.de\AddLinkIII{http://www.mrunix.de/} und fuer die
Wikipedia\AddLinkIII{http://de.wikipedia.org/}.\\

Links:\PrintLinksIII{}\\

\end{document}

Lösung I und II funktionieren, Lösung III wird beendet mit


! TeX capacity exceeded, sorry [input stack size=5000].
\PrintLinksAlt ->\PrintLinksAlt
{} http://www.mrunix.de/
l.40 Links:\PrintLinksIII
{}\\

Die Frage ist also, wo mein Rekursionsfehler in Lösung III liegt.


Nun ist das Problem eigentlich gelöst, aber ich möchte das Ganze auch per tth (http://hutchinson.belmont.ma.us/tth/) in HTML exportieren. Leider kommt tth nicht mit Lösung I und II zurecht. Bei Lösung I werden die Links direkt in den Text gesetzt. Bei Lösung II kennt tth das \g@addto@macro nicht und erweitert die Liste daher nicht.

Meine Hoffnung ist, dass Lösung III nach obiger Fehlerbehebung mit tth klappt.

Viele Grüße
Dee

bischi
05-04-2010, 14:11
Was spricht gegen die Verwendung von Bibtex?

MfG Bischi

voss
05-04-2010, 14:14
Ich möchte eine Liste mit Links dynamisch erstellen. Heißt, wenn ich \AddLink{http...} aufrufe, soll dieser zu einer Liste hinzugefügt werden, diese wird dann am Ende ausgegeben.

Für die Realisierung gibt es, glaube ich, drei Möglichkeiten:

Die Frage ist also, wo mein Rekursionsfehler in Lösung III liegt.


Nun ist das Problem eigentlich gelöst, aber ich möchte das Ganze auch per tth (http://hutchinson.belmont.ma.us/tth/) in HTML exportieren. Leider kommt tth nicht mit Lösung I und II zurecht. Bei Lösung I werden die Links direkt in den Text gesetzt. Bei Lösung II kennt tth das \g@addto@macro nicht und erweitert die Liste daher nicht.

Meine Hoffnung ist, dass Lösung III nach obiger Fehlerbehebung mit tth klappt.



\newcommand*{\AddLinkIII}[1]{%
\edef\PrintLinksIII{\PrintLinksIII #1}}

Herbert

Dee
05-04-2010, 15:54
@bischi: Ich bin nicht sicher, ob tth bibtex wirklich korrekt versteht. Ich bräuchte diese Funktion in einem Dokument aber 10 Mal für einzelne Artikel. Ich weiß nicht, ob bibtex das so einfach kann.

@Herbert: Besten Dank, funktioniert wie üblich perfekt. :) (Und schade, dass ich nicht nach Dortmund kommen konnte, ggf. sehen wir uns aber in Trier.)

Edit: Ah, okay, klappt nur für den obigen Fall. Das ist immer der Nachteil von Minimalbeispielen. Sie sind sind oft zu minimal. Ich möchte das ganze nun gerne als echte Liste haben:


\newcommand*{\AddLinkIII}[1]{%
\edef\PrintLinksIII{\PrintLinksIII \item #1}}

Links:
\begin{enumerate}
\PrintLinksIII
\end{enumerate}


Das führt zu:


! Undefined control sequence.
\enumerate ...ce \@enumdepth \@ne \edef \@enumctr
{enum\romannumeral \the \@...
l.42 ...runix.de\AddLinkIII{http://www.mrunix.de/}
und fuer die


Und als Vorwarnung: Das \AddLinkIII kriegt noch einen optionalen Parameter, aber das sollte hoffentlich kein Problem sein.

Viele Grüße
Dee

voss
05-04-2010, 16:32
Edit: Ah, okay, klappt nur für den obigen Fall. Das ist immer der Nachteil von Minimalbeispielen. Sie sind sind oft zu minimal. Ich möchte das ganze nun gerne als echte Liste haben:




\documentclass{scrartcl}

\newtoks\itemToks
\newcommand\additemtoks[1]{%
\itemToks\expandafter{\the\itemToks \item #1}}
\newcommand*\resetitemtoks{\itemToks{}}
\newcommand*\printitemtoks{\the\itemToks}
\resetitemtoks
\begin{document}

Beispieltext fuer mrunix.de\additemtoks{http://www.mrunix.de/} und fuer die
Wikipedia\additemtoks{http://de.wikipedia.org/}.

Links:
\begin{enumerate}
\printitemtoks
\end{enumerate}

\end{document}

Herbert

Dee
05-04-2010, 17:06
Hm, tth ist deprimierend. Es kennt leider kein newtoks, kein itemtoks und mit expandafter hat es ja auch Probleme. Das wäre also Lösung Nummer drei (oder vier, je nach Zählweise), die mit pdflatex funktioniert, mit tth aber nicht. :(

Aber ich behelfe mir jetzt mit einer kleinen Notlösung. Da ich nicht für beides die gleiche Lösung brauche, werde ich für tth folgendes Konstrukt nutzen:


\documentclass{scrartcl}

\newcounter{linkcounter}
\newcommand*{\PrintLinksIII}{}
\newcommand*{\AddLinkIII}[1]{%
\edef\PrintLinksIII{\PrintLinksIII{}[\arabic{linkcounter}]\stepcounter{linkcounter} #1\\}}

\begin{document}
\setcounter{linkcounter}{1}

Beispieltext fuer mrunix.de\AddLinkIII{http://www.mrunix.de/} und fuer die
Wikipedia\AddLinkIII{http://de.wikipedia.org/}. \AddLinkIII{http://de.wikipedia.org/}\\

Links:\\
\PrintLinksIII

\end{document}

Es ist zwar LaTeX-technisch nicht so schön, dass ich aus der Liste normalen Text mache, aber es funktioniert zumindest. :)

Sollte jemand eine noch bessere Lösung haben, bin ich für Vorschläge offen.

Viele Grüße
Dee

Dee
13-04-2010, 18:04
Muss doch noch etwas nachfragen. Ich weiß nicht, ob es an tth oder LaTeX liegt, aber scheinbar klappt das \edef nur lokal. Kann das sein?

So wird bei (man beachte die geschweiften Klammern)


\documentclass{scrartcl}

\newcounter{linkcounter}
\newcommand*{\PrintLinksIII}{}
\newcommand*{\AddLinkIII}[1]{%
\edef\PrintLinksIII{\PrintLinksIII{}[\arabic{linkcounter}]\stepcounter{linkcounter} #1\\}}

\begin{document}
\setcounter{linkcounter}{1}

\textit{Beispieltext fuer mrunix.de\AddLinkIII{http://www.mrunix.de/} und fuer die
Wikipedia\AddLinkIII{http://de.wikipedia.org/}.} \AddLinkIII{http://de.wikipedia.org/}\\

Links:\\
\PrintLinksIII

\end{document}

nur ein Link aufgelistet - und zwar der letzte. Die anderen beiden innerhalb der \textit{...} fehlen.

Kann ich das irgendwie global machen, dass es für das ganze Dokument gilt, bis ich es selbst zurücksetzt, und nicht nur in einem Block? Ansonsten brauche ich für tth doch wieder eine andere Lösung. :(

Gruß Dee

PS: Betrifft nicht nur Blöcke, sondern auch Links in Aufzählungen. Auch die erscheinen nicht.

Dee
16-04-2010, 05:26
Keiner mehr eine Idee?

Gruß Dee

u_fischer
16-04-2010, 08:32
Ich kann mir ehrlich gesagt überhaupt nicht vorstellen, dass (und wie) dein Code überhaupt funktioniert. \stepcounter ist doch nicht expandierbar und schon \edef\PrintLinksIII{\stepcounter{linkcounter}} gibt Fehler.

Abgesehen davon: \edef ist lokal, die globale Variante heißt \xdef.