PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eigene Makros funtionieren wegen versch. Packet nicht



sLy
08-10-2009, 09:10
Hallo alle zusammen,

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.
Ich habe dieses Problem bereits in einem anderen Forum gepostet und dort wurde mir gesagt, dass zwar \multido und auch \forloop in normalem Rahmen funktionieren, doch als Argument von \multidipole geht das nicht so einfach, da es die folgenden Argumente "bearbeitet" und mit den Makros danach nicht klarkommt.

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 ein kompilierbares Minibeispiel:


%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}



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.
Falls ihr ebenfalls beispielcode verwendet, wäre ich für viele erklährende Kommentare sehr dankbar.

Viele Grüße,
sLy

voss
08-10-2009, 10:05
Falls ihr ebenfalls beispielcode verwendet, wäre ich für viele erklährende Kommentare sehr dankbar.


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}



Herbert

sLy
11-10-2009, 18:23
Hi,
danke für deine antwort.
Leider werden die Widerstände nicht der reihe nach nummeriert, sondern heißen alle R3

Da ich diese syntax nicht einfach in meinen Quellcode einbinden kann, sondern sie auch noch verstehen muss, wäre ich für eine erklärung sehr dankbar (z.b. allgemeine syntax des \toks befehls)

was bedeuten die @ zeichen hinter den variablen?

mfg
sLy

voss
03-11-2009, 23:27
Leider werden die Widerstände nicht der reihe nach nummeriert, sondern heißen alle R3

Da ich diese syntax nicht einfach in meinen Quellcode einbinden kann, sondern sie auch noch verstehen muss, wäre ich für eine erklärung sehr dankbar (z.b. allgemeine syntax des \toks befehls)

was bedeuten die @ zeichen hinter den variablen?


habe jetzt erst die Frage gesehen. Hast du sie gelöst?

Herbert

rais
06-11-2009, 20:01
Hallo Herbert,

ganz schön harte Nuss;-)
Ich denke mal das Problem ist hier, daß `\the\count@' genau so in \toks@ landet (eben nicht der aktuelle Zählerstand) und an diesem aktuellen-Zählerstand-in-\toks@ hab ich mir erstmal die Zähne dran ausgebissen ... bis ich mich gefragt hab, warum nicht zweimal durchzä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@}
\newcounter{wid@r}
\newcommand*\init@wid{\setcounter{wid@r}{0}}
\newcommand*\next@wid{\stepcounter{wid@r}}
\def\WiderstandReihe#1{%
\begingroup
\InitToks
\AddToks{\init@wid}%
\AddToks{\multidipole(B)(C)}%
\init@wid
\loop\ifnum\c@wid@r<#1\relax
\next@wid
\AddToks{\resistor[labeloffset=0]{$R_{\next@wid\thewid@r}$}}%
\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}

MfG