Seite 1 von 2

#1-Parameter soll statt Zahl Anzahl der Befehle ausgeben

Verfasst: Mi 30. Sep 2009, 18:06
von sLy
Hallo allezusammen,

ich bin neu hier und schreibe gerade meine Facharbeit mit LaTex. Hierzu soll ich die darstellung von Schaltbildern mit dem Erweiterungspaket pst-circ
vereinfachen. Bin noch ein absoluter LaTex-Frischling, weshalb ich nun auf die Hilfe dieses Forums setzte.

Hier ist mein Problem:
Ich möchte meinen eigenen Befehl schreiben, der so aussehen soll:
\WiderstandParallel {3}
Mit dem Parameter drei soll jetzt der eigentliche Befehl
 \resistor[labeloffset=0]{$R_1$}
3mal ausgegeben werden, wobei die Wiederstände nicht alle "R_1" heißen sollen, sondern fortlaufend nummeriert werden.

Um in pst-circ mehrere Widerstände hintereinander zu schalten, muss man den Befehl
 \multidipole (B) (C) \resistor [labeloffset=0] {$R_1$}\resistor [labeloffset=0] {$R_2$}\resistor [labeloffset=0] {$R_3$}. %Hier sind also 3 Widerstände hintereinandergeschalten. Die punkte B und C sind Punkt in einem Koordinatensystem, zwischen denen die Widerstände seien sollen. Der Punkt am Ende beendet \multidipole.
verwenden.
Wenn ich also jetzt meinen obigen Befehl"\WiderstandParallel {3}" eintippe, muss seine "Ausgabe"
 \multidipole (B) (C) \resistor [labeloffset=0] {$R_1$}\resistor [labeloffset=0] {$R_2$}\resistor [labeloffset=0] {$R_3$}. 
sein.
Hier ist mein bisheriger (sehr anfängerhafter) Versuch:
\def\WiderstandReihe#1{
\multidipole(B)(C)
\newcount\a \newcount\b
\b=#1
\advance\b by 1
\loop
\advance\a by 1 
\resistor[labeloffset=0]{$R_1$}
\ifnum\a<\b
\repeat
Ich hoffe ihr könnt mir helfen. Danke im vorraus. Falls ich mein (doch recht kompliziertes) Problem zu umständlich geschildert haben sollte, fragt bitte nach.

mfg
sLy

Verfasst: Mi 30. Sep 2009, 18:24
von IrenaSekuta
Hallo,

hab zwar auch nicht sehr viel Ahnung vom Programmieren in Latex, aber ich weiß nicht genau, wofür Du 2 Zähler brauchst.

Zumindest musst Du den Zähler hinter dein $R_ setzen:
\resistor[labeloffset=0]{$R_\b$}
Wie man Schleifen in Latex programmiert, weiß ich leider nicht.

Gruß,

Irena

Schleifen

Verfasst: Mi 30. Sep 2009, 18:26
von Stefan Kottwitz
Hallo sLy,

willkommen im Forum!
Du könntest multido verwenden, oder forloop.

Viele Grüße,

Stefan

Verfasst: Mi 30. Sep 2009, 18:42
von sLy
hi,
danke für die schnelle antwort.

könntest du vllt. bitte multido oder forloop schon in den code einbauen, als eine art beispiel?

Schleife mit \multido

Verfasst: Fr 2. Okt 2009, 18:29
von Stefan Kottwitz
Hallo sLy,
sLy hat geschrieben:könntest du vllt. bitte multido oder forloop schon in den code einbauen
Beispiele findest Du etwa in der Doku zu multido. In den Code einbauen ist wenig gut möglich, da Du oben keinen lauffähigen Code angegeben hast, an dem man mal testen kann. Sinnvoll ist immer die Angabe eines compilierbaren Minimalbeispiels, das ist noch besser als eine ausführliche Beschreibung mit lauter Code-Stücken, die sich kaum jemand zusammensetzt.

Gehen könnte etwas wie
\multido{\I=0+1}{3}{\resistor[labeloffset=0]{$R_\I$}}
Stefan

Re: Schleife mit \multido

Verfasst: Mi 7. Okt 2009, 13:10
von sLy
Stefan hat geschrieben:Hallo sLy,
... In den Code einbauen ist wenig gut möglich, da Du oben keinen lauffähigen Code angegeben hast, an dem man mal testen kann. Sinnvoll ist immer die Angabe eines compilierbaren Minimalbeispiels, das ist noch besser als eine ausführliche Beschreibung mit lauter Code-Stücken, die sich kaum jemand zusammensetzt...
Stefan
ok, kann ich machen. Hoffe das hilft hier weiter:
%Festlegung der Dokumentklasse:
\documentclass[a4paper,twoside,]{article}

%Auflistung aller verwendeten Packete:
\usepackage{endnotes} %Erlaubt weitere Endnoten-Optionen
\usepackage{ngerman} %Aktiviert u. a. die deutsche Trennung
\usepackage[latin1]{inputenc}	%Erlaubt, dass Umlaute normal geschrieben werden können
\usepackage{enumerate} %Erlaubt erweiterte Listen-Optionen
\usepackage{url} %Unterstützt die Darstellung von URLs
\usepackage{geometry} %Definiert die Seitenränder, Texthöher und -breite, sowie Hoch- oder Querformat
\usepackage{graphicx} %Erleichterung der Arbeit mit Bildern
\usepackage{rotating} %Rotieren von Texten
\usepackage{color} %Für Farbe im Text
\usepackage{verbatim} %Erleichtert das unveränderte setzen von Text (z.B. Syntax)
\usepackage{pstricks,pst-circ} %Ermöglicht das erstellen von Schaltbildern
\usepackage{multido}%Ermöglicht Schleifen

\begin{document}

%_____________________________________________________________________________________________________________________________

\def\WiderstandReihe#1{
\multidipole(B)(C)%
\multido{\I=1+1}{#1}{\resistor[labeloffset=0]{$R_\I$}}%
.
}

So ist es:
\newline
\bigskip


\begin{pspicture}[showgrid=true](0,0)(8,5)
	 \pnode(0.5,4.5){A}
	 \pnode(0.5,1.75){B}
	 \pnode(7.5,1.75){C}
	 \pnode(7.5,4.5){D}
	 \battery (D)(A){$U_0$}
	 \wire (A)(B)
	 \wire (C)(D)
   \WiderstandReihe{3}	
\end{pspicture}

\newline
\bigskip
\bigskip
\bigskip
\bigskip


So sollte es sein:
\newline
\bigskip


\begin{pspicture}[showgrid=true](0,0)(8,5)
	 \pnode(0.5,4.5){A}
	 \pnode(0.5,1.75){B}
	 \pnode(7.5,1.75){C}
	 \pnode(7.5,4.5){D}
	 \battery (D)(A){$U_0$}
	 \wire (A)(B)
	 \wire (C)(D)
   \multidipole(B)(C)%
   \resistor[labeloffset=0]{$R_1$} \resistor[labeloffset=0]{$R_2$} \resistor[labeloffset=0]{$R_3$}%
   .	
\end{pspicture}


\end{document}
Im anhang befindet sich noch die tex-datei.
mfg
sLy

Verfasst: Mo 12. Okt 2009, 20:04
von sLy
Hier die Lösung von H.Voss persönlich:

"Das ist nicht so einfach, weil \multidipole erst alle Bauteile sammeln muss. Mit \multido werden sie aber vorher schon "zerlegt". Mit \toks@ kann man jetzt erstmal alle Bauteile sammeln und am Ende komplett ausgeben, so als hätte man sie getippt."
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pst-circ} 

\makeatletter
\newcommand*\InitToks{\toks@={}}
\newcommand\AddToks[1]{\toks@=\expandafter{\the\toks@ #1}}
\newcommand*\PrintToks{\the\toks@}

\def\WiderstandReihe#1{%
 \begingroup
 \InitToks
 \AddToks{\multidipole(B)(C)}%
 \count@=0 %
 \loop\ifnum\count@<#1\relax
  \advance\count@ by 1 %
  \AddToks{\resistor[labeloffset=0]{$R_{\the\count@}$}}%
 \repeat
 \AddToks{.}%
 \PrintToks
 \endgroup}
\makeatother

\begin{document}

\begin{pspicture}[showgrid=true](0,0)(8,5)
 \pnode(0.5,4.5){A}
 \pnode(0.5,1.75){B}
 \pnode(7.5,1.75){C}
 \pnode(7.5,4.5){D}
 \battery (D)(A){$U_0$}
 \wire (A)(B)
 \wire (C)(D)
 \WiderstandReihe{3}  
\end{pspicture}

\end{document}
Da mir H.Voss seinen quellcode (trotz bitten) nicht erklärt, wäre ich für eine möglichst genaue Erklärung sehr dankbar.
Außerdem funktioniert die Benennung der Wiederstände nicht (sie heißen alle R_3 statt der reinfolge nach nummeriert)

grüße,
sLy

Verfasst: Mo 12. Okt 2009, 20:19
von Stefan Kottwitz
sLy hat geschrieben: Außerdem funktioniert die Benennung der Wiederstände nicht (sie heißen alle R_3 statt der reinfolge nach nummeriert)
Oben sprachst Du ja noch von fortlaufender Nummerierung. Wenn überall 3 stehen soll, kannst eine Zeile so ändern:
\AddToks{\resistor[labeloffset=0]{$R_3$}}%
Also 3 statt des Zählers \the\count@. Wenn es variabel, doch je Zeichnung gleich sein soll, kann man einen weiteren Parameter einführen:
\def\WiderstandReihe#1#2{%
 \begingroup
 \InitToks
 \AddToks{\multidipole(B)(C)}%
 \count@=0 %
 \loop\ifnum\count@<#1\relax
  \advance\count@ by 1 %
  \AddToks{\resistor[labeloffset=0]{$R_{#2}$}}%
 \repeat
 \AddToks{.}%
 \PrintToks
 \endgroup}
\makeatother
...
\WiderstandReihe{3}{3}
Stefan

Verfasst: Mo 12. Okt 2009, 20:31
von sLy
nein, hier liegt ein missverständnis vor.

die Widerstände sollen schon alle der reihe nach nummeriert sein (als R_1, R_2, usw...)
Leider werden sie (trotz des \count) NICHT so nummeriert. -> es liegt im quellcode irgend ein felher vor

Außerdem wollte ich bitte den quellcode von Voss erklärt bekommen, da ich im inet nichts über einen \toks befehl finde.
(von wegen nach jeder zeile ein kommentar alla: "hier wird das und jenes gemacht)
gruß,
sLy

neuer Zähler

Verfasst: Mo 12. Okt 2009, 20:57
von Stefan Kottwitz
Hallo sly,

wenn Herberts Code so nicht funktioniert, dann hier ein Vorschlag mit einem eigenen Zähler:
\newcounter{wid}
\newcommand*\InitWid{\setcounter{wid}{1}}
\newcommand*\ShowWid{\thewid\stepcounter{wid}}
...
\def\WiderstandReihe#1{%
 \begingroup
 \InitToks
 \InitWid
 \AddToks{\multidipole(B)(C)}%
 \count@=0 %
 \loop\ifnum\count@<#1\relax
  \advance\count@ by 1 %
  \AddToks{\resistor[labeloffset=0]{$R_{\ShowWid}$}}%
 \repeat
 \AddToks{.}%
 \PrintToks
 \endgroup}
Läuft das bei Dir wie gewünscht?

Stefan