#1-Parameter soll statt Zahl Anzahl der Befehle ausgeben

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


sLy
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 30. Sep 2009, 17:41

#1-Parameter soll statt Zahl Anzahl der Befehle ausgeben

Beitrag 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:

Code: Alles auswählen

\WiderstandParallel {3}
Mit dem Parameter drei soll jetzt der eigentliche Befehl

Code: Alles auswählen

 \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

Code: Alles auswählen

 \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"

Code: Alles auswählen

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

Code: Alles auswählen

\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

IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Beitrag 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:

Code: Alles auswählen

\resistor[labeloffset=0]{$R_\b$}
Wie man Schleifen in Latex programmiert, weiß ich leider nicht.

Gruß,

Irena

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2007
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Schleifen

Beitrag von Stefan Kottwitz »

Hallo sLy,

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

Viele Grüße,

Stefan

sLy
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 30. Sep 2009, 17:41

Beitrag 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?

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2007
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Schleife mit \multido

Beitrag 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

Code: Alles auswählen

\multido{\I=0+1}{3}{\resistor[labeloffset=0]{$R_\I$}}
Stefan

sLy
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 30. Sep 2009, 17:41

Re: Schleife mit \multido

Beitrag 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:

Code: Alles auswählen

%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
Dateianhänge
Minibeispiel.tex
(1.84 KiB) 619-mal heruntergeladen

sLy
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 30. Sep 2009, 17:41

Beitrag 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."

Code: Alles auswählen

\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

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2007
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

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

Code: Alles auswählen

\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

sLy
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 30. Sep 2009, 17:41

Beitrag 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

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2007
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

neuer Zähler

Beitrag von Stefan Kottwitz »

Hallo sly,

wenn Herberts Code so nicht funktioniert, dann hier ein Vorschlag mit einem eigenen Zähler:

Code: Alles auswählen

\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

Antworten