#1-Parameter soll statt Zahl Anzahl der Befehle ausgeben

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

Markdown is OFF

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: #1-Parameter soll statt Zahl Anzahl der Befehle ausgeben

von sLy » Di 20. Okt 2009, 20:09

Danke, hat sich erledigt.
Ich habe einfach sämtliche dateien bis auf .tex files gelöscht, dann ging es.

@Stefan
nächstes mal beschreib ichs genauer. kritik ist angekommen ;)

mfg
sLy

pstricks

von Stefan Kottwitz » Mo 19. Okt 2009, 22:31

Hallo,
sLy hat geschrieben: Wieso funktioniert das für sich alleine...:
es funktioniert nicht für sich alleine, es fehlen Dokumentklasse, Pakete u.a. Daher lässt es sich nicht für einen Vergleich testen.
sLy hat geschrieben: ...aber NICHT, wenn ich phi's code und meinen zusammenlege?
"funktioniert nicht" ist zu vage - gibt es Fehler, Warnungen, fehlende oder falsche Ausgaben? Bei mir treten jedenfalls beim Übersetzen Fehlermeldungen auf. K.A. ob Du diese oder was anderes meinst.

Stefan

von sLy » Mo 19. Okt 2009, 21:45

Hi wiedermal.

Einfache Frage:
Wieso funktioniert das für sich alleine...:

Code: Alles auswählen

\newrobustcmd*{\SStandard}[2]{%
\psset {unit=#1cm}%
	\begin{pspicture}[showgrid=true](0,0)(8,5)%
		\def\x{%
			\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)%
		 	}%
		\eappto\x{\noexpand#2}%
		\x%	
	\end{pspicture}%
}
...aber NICHT, wenn ich phi's code und meinen zusammenlege?

Code: Alles auswählen

\documentclass{minimal}

\usepackage{etoolbox}
\usepackage{pst-circ}
\usepackage{multido}

\newrobustcmd*{\WiderstandReihe}[3]{%
  \def\x{\multidipole(#1)(#2)}%
  \Multido{\i=1+1}{#3}{%
    \eappto\x{\noexpand\resistor[labeloffset=0]{$R_{\i}$}}%
  }%
  \appto\x{.}%
  \x
}

\newrobustcmd*{\SStandard}[2]{%
\psset {unit=#1cm}%
	\begin{pspicture}[showgrid=true](0,0)(8,5)%
		\def\x{%
			\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)%
		 	}%
		\eappto\x{\noexpand#2}%
		\x%	
	\end{pspicture}%
}

\begin{document}
\SStandard{1}{\WiderstandReihe(B)(C){3}}
\end{document}

von phi » Mi 14. Okt 2009, 18:48

Hier eine etwas einfachere Möglichkeit, die vor allem dokumentiere High-Level-Befehle benutzt. Ein bisschen Expansionskontrolle (mit \eappto und \noexpand) ist allerdings auch hier nötig.

Code: Alles auswählen

\documentclass{minimal}

\usepackage{etoolbox}
\usepackage{pst-circ}
\usepackage{multido}

\newrobustcmd*{\WiderstandReihe}[3]{%
  \def\x{\multidipole(#1)(#2)}%
  \Multido{\i=1+1}{#3}{%
    \eappto\x{\noexpand\resistor[labeloffset=0]{$R_{\i}$}}%
  }%
  \appto\x{.}%
  \x
}

\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{B}{C}{3}
\end{pspicture}

\end{document}

von phi » Di 13. Okt 2009, 09:16

Mit e-TeX geht das auch expandierbar und ohne Tokenregister:

Code: Alles auswählen

\documentclass{minimal}

\usepackage{etex}
\usepackage{pst-circ}

\protected\def\WiderstandReihe(#1)(#2)#3{%
  \edef\x{\noexpand\multidipole(#1)(#2)\WiderstandReiheII{1}{#3}.}%
  \x
}

\def\WiderstandReiheII#1#2{%
  \unless\ifnum#2<#1
    \noexpand\resistor[labeloffset=0]{$R_{\number#1}$}%
    \expandafter\WiderstandReiheII\expandafter{\number\numexpr#1+1}{#2}%
  \fi
} 

\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(B)(C){3}
\end{pspicture}

\end{document}

von sommerfee » Mo 12. Okt 2009, 21:24

sLy hat geschrieben:da ich im inet nichts über einen \toks befehl finde.
Gugst du hier: http://www.eijkhout.net/tbt/

Liebe Grüße,
Axel

neuer Zähler

von Stefan Kottwitz » Mo 12. Okt 2009, 20:57

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

von sLy » Mo 12. Okt 2009, 20:31

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

von Stefan Kottwitz » Mo 12. Okt 2009, 20:19

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

von sLy » Mo 12. Okt 2009, 20:04

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

Nach oben