PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : \csname und Zähler als Argument von \ifthenelse



simon
19-07-2012, 20:52
Liebes Forum.

Über den umdefinierten Befehl \author definiere ich mir beliebig viele Namen, die dann per \PrintNames der Reihe nach und untereinander ausgebeben werden sollen. Das funktioniert auch ganz prima -- siehe Quellcode.



\documentclass{article}
\RequirePackage{ifthen}

\makeatletter
\newcounter{@AuthorCounter}
\setcounter{@AuthorCounter}{0}
\newcounter{@CurAuthor}

\renewcommand\author[1]{\stepcounter{@AuthorCounter}
\expandafter\def\csname author\the\value{@AuthorCounter} \endcsname{#1}}

\newcommand\PrintNames{
\setcounter{@CurAuthor}{0}
\whiledo{\value{@CurAuthor}<\value{@AuthorCounter}}{%
\stepcounter{@CurAuthor}%
\def\temp{\csname author\the\value{@CurAuthor} \endcsname}
%% \ifthenelse{\equal{\temp}{}}{}%
{Name:~\temp\par}
}}
\makeatother


\begin{document}

\author{Alice}\author{Bob}\author{}
\PrintNames

\end{document}


Wenn ich nun aber die mit %% markierte Zeile dazunehme (um "leere" Namen zu unterdrücken), dann gibt es eine Fehlermeldung:
You can't use `the charachter 1' after \the.

Leider konnte ich das Beispiel nicht noch weiter runterdampfen. Umso mehr würde ich mich freuen, wenn jemand von Euch Rat weiß.

Danke und Gruß,
Simon

cgnieder
19-07-2012, 22:17
Du musst

\def\temp
in

\edef\temp
ändern, damit das \temp bei der \ifthenelse Abfrage auch jedesmal richtig definiert ist.

Etwas kürzer wäre übrigens folgende Variante:

\documentclass{article}

\makeatletter
\def\@authors{}
\renewcommand*\author[1]{\g@addto@macro\@authors{#1,}}
\newcommand*\PrintNames{%
\@for\next:=\@authors\do{%
\expandafter\if\expandafter\relax\expandafter\deto kenize\expandafter{\next}\relax
\else
Name:~\next\par
\fi}}
\makeatother

\begin{document}

\author{Alice}\author{Bob}\author{}
\PrintNames

\end{document}

oder mit expl3:


\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\seq_new:N \l_my_authors_seq

\RenewDocumentCommand \author { m }
{\seq_put_right:Nn \l_my_authors_seq { #1 } }
\NewDocumentCommand \PrintNames {}
{
\seq_map_inline:Nn \l_my_authors_seq
{ \tl_if_blank:nF { ##1 } { Name:~##1\par } }
}
\ExplSyntaxOff

\begin{document}

\author{Alice}\author{Bob}\author{}
\PrintNames

\end{document}

Grüße

simon
20-07-2012, 07:53
Lieber Clemens.
Hab vielen Dank. Es funktioniert!

(Deine Alternativlösungen werde ich mir in einer ruhigen Minute ansehen. Mein Beispiel war Teil einer wesentlich größeren Konstruktion, die ich für den Moment besser unangetastet lasse. Aber bei einem möglichen Neuentwurf werden Deine Ideen sicherlich eine Hilfe sein.)

Es grüßt
Simon