PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeichen zählen (die Variable enthält)



moono
19-01-2013, 19:14
Hallo zusammen

Ich weiss, das Thema wurde schon oft angeschnitten, aber alle Beiträge, die ich gefunden habe, laufen ins Leere.

Ich habe einen Command, dem zwei Variablen #1 und #2 übergeben werden. Dazu wird eine Variable \mode global im Dokument gesetzt. Wenn die Variable \mode "1" zurückgibt, soll in der Command der Inhalt von #1 ausgegeben werden, wenn sie "2" zurückgibt den Inhalt von #2. Sollte die anzuzeigende Variable leer sein, so soll auch die andere ausgegeben werden.

Mein Problem ist nun, dass das Compilen scheitert, weil dem Command zu stark verschachtelte (zu komplexe) Inhalte und Commands übergeben werden.
Meine Idee nun: einfach die Zeichen zählen, ist die Länge 0, dann ist die Variable leer. Nur, wie zähl ich die? Hat jemand eine Idee?

Mein aktueller Code:


% document mode
% @modes: all, notes, chords
\def\mode{notes}

% songParts
% @param notes
% @param chords
\newcommand{\songParts}[2]{
%if mode=notes + notes given -> print note, else chords
\ifthenelse{\equal{\mode}{notes}}{
%\ifthenelse{\equal{#1}{}}{#2}{#1}
#1
}{}
%if mode=chords + chords given -> print chords, else notes
\ifthenelse{\equal{\mode}{chords}}{
%\ifthenelse{\equal{#2}{}}{#1}{#2}
#2
}{}
% mode all
\ifthenelse{\equal{\mode}{all}}{
#1
#2
}{}
}



Code, wie ich ihn mir ungefähr vorstelle:


% document mode
% @modes: all, notes, chords
\def\mode{notes}

% songParts
% @param notes
% @param chords
\newcommand{\songParts}[2]{
%if mode=notes + notes given -> print note, else chords
\ifthenelse{\equal{\mode}{notes}}{
\ifthenelse{\equal{\count{#1}}{\count{}}}{#2}{#1}
}{}
%if mode=chords + chords given -> print chords, else notes
\ifthenelse{\equal{\mode}{chords}}{
\ifthenelse{\equal{\count{#2}}{\count{}}}{#1}{#2}
}{}
% mode all
\ifthenelse{\equal{\mode}{all}}{
#1
#2
}{}
}

rais
19-01-2013, 23:24
Meine Idee nun: einfach die Zeichen zählen, ist die Länge 0, dann ist die Variable leer. Nur, wie zähl ich die? Hat jemand eine Idee?

eine Anzahl Zeichen könntest Du z.B. mit dem stringstrings-Paket ermitteln -- der Befehl hieße dann \stringlength.
Oder Du weist einem Längenregister die Breite des übergebenen Arguments zu und wertest die Länge entsprechend aus. Das ginge z.B. mit


\settowidth\foo{#1}%

Oder Du schaust mit sowas wie


\ifx\relax#1\relax
%hier ist #1 leer
\else
%hier steht was in #1
\fi

nach, ob was im übergebenen Parameter drin ist...

MfG