PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schleifenbedingung mit <=



moono
16-06-2012, 23:13
Hallo zusammen

Ich baue mir gerade ein Befehlt zusammen, um Abschnitte mit zugehörigen Bildern in beliebiger Anzahl zu generieren:


\newcommand{\song}[3]{
\section{#1}
\newcounter{num}
\forloop{num}{1}{\value{num} < #3}
{
\includegraphics[width=\textwidth,height=0.95\textheight,keepaspect ratio]{#2 \arabic{num}.jpg}
}
}

Soweit so gut, läuft. ABER: ich möchte in der Schleife nicht kleiner sonder kleinerGleich abfragen:


\forloop{num}{1}{\value{num} <= #3}
{
\includegraphics[width=\textwidth,height=0.95\textheight,keepaspect ratio]{#2 \arabic{num}.jpg}
}

Ich habe schon den ganzen Abend gesucht, doch bisher keine brauchbare Lösung gefunden. Weder \le, \leg noch Versuche, #3 zu inkrementieren waren erfolgreich.


\forloop{num}{1}{\value{num} \leg #3}

Klappt leider nicht. Könnt ihr mit weiterhelfen?

mechanicus
17-06-2012, 00:56
und warum addierst du nicht einfach +1 zum Argument #3?



Marco

moono
17-06-2012, 13:26
Das habe ich probiert. Einerseits mit \advance, andererseits mit der Mathe Umgebung $-$. Hat aber beides nicht geklappt. Dann habe ich auch noch nach einer inkrementiermöglichkeit für #3 gesucht, aber auch nichts passendes gefunden. Kannst du mir sagen, wie du 1 zu #3 addieren würdest?

mechanicus
17-06-2012, 13:54
Ungetestet:


\forloop{num}{1}{\value{num} < \numexpr #3 +1 \relax}

Marco

moono
17-06-2012, 13:58
Danke, das klappt.

Wie kann ich das Thema als gelöst markieren? Habe dazu weder in der Hilfe, noch in der Bordinfo oder beim durchstöbern aller Knöpfe etwas gefunden.

mechanicus
17-06-2012, 14:09
Wie kann ich das Thema als gelöst markieren? Habe dazu weder in der Hilfe, noch in der Bordinfo oder beim durchstöbern aller Knöpfe etwas gefunden.
Gar nicht :D

Gruß
Marco

moono
17-06-2012, 16:58
Zum Glück ist's noch nicht als gelöst markiert ;) ich hab nämlich noch ein Problem:
Der Counter gilt offenbar Blockübergreifend. Hab wohl zu viel erwartet, als ich annahm, Latex mache sowas wie Datenkapselung.

Führe ich
\song... mehr als einmal aus, fällt Latex bei
\newcounter{num} auf die Nase: LaTeX Error: Command \c@num already defined. Or name \end... illegal, see p.192 of the manual.

Wie kann ich eine Variable 'unsetten'? hab's schon mit \end{\c@num} und googeln probiert. Aber ich krieg es nicht hin.

Im Tut, von dem ich Schleifen und If's in Latex kenne, steht auch nicht, dass counter Blöcke überleben und man entsprechende Massnahmen ergreifen muss: http://www.matthiaspospiech.de/blog/2008/04/13/latex-variablen-if-abfragen-und-schleifen/

mechanicus
17-06-2012, 17:25
Der Counter gilt offenbar Blockübergreifend. Hab wohl zu viel erwartet, als ich annahm, Latex mache sowas wie Datenkapselung.
Klar kann LaTeX das, aber wo hast du eine Kapselung?

Es empfiehlt sich stets die Variablen im Vorfeld zu deklarieren.



\newcounter{num}
\newcommand{\song}[3]{
\section{#1}


Hättest du ein Minimalbeispiel gebaut, wäre es wohl schon vorher aufgefallen.

moono
17-06-2012, 17:36
Klar kann LaTeX das, aber wo hast du eine Kapselung?

ein command ist doch sowas wie eine Methode, also ein Block. Da ist es doch nicht allzu falsch zu erwarten, dass eine innerhalb des Blockes deklarierte Variable ausserhalb keine Gültigkeit besitzt, bzw. nach dem abschliessen des commands vom Stack abgeräumt wird?


Es empfiehlt sich stets die Variablen im Vorfeld zu deklarieren.

Ist zwar nicht in jedem Falle schön (Ich mag keine globalen Variablen), aber löst das Problem. Danke.


Hättest du ein Minimalbeispiel gebaut, wäre es wohl schon vorher aufgefallen.

Hab ich auch. Darum habe ich ja herausgefunden, dass die Variable über den Block hinaus gültig ist. Aber ich war zu fixiert darauf, die Variable am Ende des Blockes zu unsetten, dass ich gar nicht auf die Idee kam, sie vorher zu deklarieren ;) .

mechanicus
17-06-2012, 17:48
ein command ist doch sowas wie eine Methode, also ein Block.
Das stimmt nicht. Ein Kommando ist eine Sammlung von "Sachen", die zum Zeitpunkt des Aufrufs einfach erscheinen. Willst du etwas lokal haben, so musst du es auch lokal setzen -- also durch Gruppenbildung. Bspw. {} oder \bgroup...\egroup usw. Allerdings wirkt newcounter stets global. Zuweisungen können lokal gesetzt werden.

Marco

u_fischer
17-06-2012, 18:08
ich möchte in der Schleife nicht kleiner sonder kleinerGleich abfragen:


forloop baut auf ifthen auf, also kannst die dort definierten logischen
Operatoren nutzen:

\documentclass{article}
\usepackage{forloop}
\begin{document}

\newcounter{num}

\forloop{num}{1}{\NOT{\value{num} > 10}}
{
\thenum,
}


\forloop{num}{1}{\value{num} < 10 \OR \value{num} = 10}
{
\thenum,
}

\end{document}