Anzeige:
Ergebnis 1 bis 3 von 3

Thema: \csname und Zähler als Argument von \ifthenelse

  1. #1
    Registrierter Benutzer
    Registriert seit
    31.03.2011
    Beiträge
    12

    \csname und Zähler als Argument von \ifthenelse

    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.

    Code:
    \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

  2. #2
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Du musst
    Code:
    \def\temp
    in
    Code:
    \edef\temp
    ändern, damit das \temp bei der \ifthenelse Abfrage auch jedesmal richtig definiert ist.

    Etwas kürzer wäre übrigens folgende Variante:
    Code:
    \documentclass{article}
    
    \makeatletter
    \def\@authors{}
    \renewcommand*\author[1]{\g@addto@macro\@authors{#1,}}
    \newcommand*\PrintNames{%
      \@for\next:=\@authors\do{%
        \expandafter\if\expandafter\relax\expandafter\detokenize\expandafter{\next}\relax
        \else
          Name:~\next\par
        \fi}}
    \makeatother
    
    \begin{document}
    
    \author{Alice}\author{Bob}\author{}
    \PrintNames
    
    \end{document}
    oder mit expl3:

    Code:
    \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
    Geändert von cgnieder (19-07-2012 um 21:28 Uhr)
    Clemens

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.03.2011
    Beiträge
    12
    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

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •