Rechnen mit variablen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


MathiasG

Rechnen mit variablen

Beitrag von MathiasG »

Hallo ich habe eine Frage,

wie kann ich zwei Variablen miteinander verrechnen hier ist mein Bsp. Code:

\newcounter{xhalf};
\newcounter{temp1};
\newcounter{temp2};
\newcounter{temp3};
\newcounter{x1};
\newcounter{x2};

\setcounter{x1}{5};
\setcounter{x2}{7};

\setcounter{temp1}{\value{x1}-0.2};
\setcounter{temp2}{\value{x2}+0.2};
\setcounter{temp3}{\value{temp2}-\value{temp1}}; <- genau hier passiert der Fehler
%\setcounter{xhalf}{\value{temp3}/2}

ich hoffe ihr könnt mir weiterhelfen.

MfG
Mathias

Wegweiser

Re: Rechnen mit variablen

Beitrag von Wegweiser »

Für derartige Berechnungen gibt es eine verhältnismäßig große Auswahl an Paketen.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4268
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Re: Rechnen mit variablen

Beitrag von u_fischer »

Im Prinzip mit `\setcounter{temp3}{\inteval{\value{temp2}-\value{temp1}}}`. Aber counter enthalten Integer. `\value{x1}-0.2` macht keinen Sinn, du hast einfach nur Glück, dass es keinen Fehler gibt.

Wenn du mit Dezimalen rechnen willst, kannst du das eingebaute fp-Module nutzen (siehe interface3.pdf):
\documentclass{book}
\begin{document}
\ExplSyntaxOn
\fp_new_variable:n { A }
\fp_new_variable:n { B }
\fp_set_variable:nn { A } { 1.32 }
\fp_set_variable:nn { B } { 2.4 }
\ExplSyntaxOff


\fpeval{0.3*A+pi*B}

\end{document}

MathiasG

Re: Rechnen mit variablen

Beitrag von MathiasG »

Viele Dank erstmal für eure Hilfe, jetzt funktioniert alles erstmal soweit, jedoch habe ich ein Problem. Ich kann meine Umgebung Diagramm nur einmal verwenden möchte es aber mehrmals verwenden.

Hier meine fDiagramm:
\ProvidesPackage{fDiagramm}

\RequirePackage{tikz}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary {backgrounds}

\newenvironment{Diagramm}{

    \begin{tikzpicture}
    
    \newlength{\yPosition}
	\setlength{\yPosition}{0cm}
    
	\newlength{\xLength}
	\newcounter{xLengtZustand};
    
    \newcommand{\Sensor}[3]{
    	\node at (0,\yPosition+1.5cm) {##1};
        \node at (1.55, \yPosition+2cm) {##3};
        \node at (1.55, \yPosition+1cm) {##2};
        \draw (2,\yPosition) -- (2,\yPosition+3cm);
        \addtolength{\yPosition}{2cm} % Y-Position um 1,5 erhöhen
        
    	%\node at (0,1) {##1};
    	%\node at (1, 1.5) {##3};
  		%\node at (1, 0.5) {##2};
  		%\draw (1.5,0) -- (1.5,2);
  
  		%Zweiter Sensor
  		%\node at (1, 2.5) {0};
  		%\node at (1, 3.5) {1};
  		%\node at (0,3) {PR1};
  		%\draw (1.5,2) -- (1.5,4);
  
  		%Zeitabschnitt
  		%\draw (1.5,0.5) -- (2.5,0.5);
  		%\draw (1.5,1.5) -- (2.5,1.5);
  
  		%\draw (1.5,2.5) -- (2.5,2.5);
  		%\draw (1.5,3.5) -- (2.5,3.5);
  
  		%\node[draw, circle] (start) at (0,0) {Start};
  		%\node[draw, rectangle] (PR0) at (0,1) {Schritt 1};
  		%\node[draw, rectangle] (step2) at (0,2) {Schritt 2};
  		%\node[draw, circle] (end) at (6,0) {Ende};

  		%\draw[-] (start) -- (step1);
  		%\draw[-] (step1) -- (step2);
  		%\draw[-] (step2) -- (end);
    }
    
    \newcommand{\Label}{
		\addtocounter{xLengtZustand}{+4};    
    
    	\node[rotate=90] at (0.1, \yPosition+1.5cm) {Bauglied};
    	\node[rotate=90] at (1.55, \yPosition+1.5cm) {Zustand};
    	
    	\draw (-1,0) rectangle (1.2,\yPosition+2.5cm);
    	\draw (1.2,0) rectangle (2,\yPosition+2.5cm);
    	\draw (2,0) rectangle (\value{xLengtZustand},\yPosition+2.5cm);
    	
    	\draw (-1,\yPosition + 0.7cm) -- (2,\yPosition + 0.7cm);
    }
    
    \newcommand{\Schritte}[1]{
    
    	\newcounter{step};
    	
    	\setcounter{step}{##1};
    	%\addtocounter{step}{-2};
    	
    	\setlength{\xLength}{0cm}
    	
    	\begin{scope}[on background layer]
        	\draw[step=1cm,gray,very thin] (2,0) grid (##1+4,\yPosition + 1.2cm);
    	\end{scope}
    	
    	\foreach \x in {0,...,\value{step}} {
            \node at (\x+3,\yPosition+1.5cm) {\x};
        }

        \setcounter{xLengtZustand}{\value{step}};
    }
    
    \newcommand{\Schritt}[4]{
    	\draw[red, ultra thick] (##1+2,##2) -- (##3+2,##4);
    }
    
    \newcommand{\pup}[5]{
    	
    	\draw[fill] (##1+2,##2) circle (2pt) node[above left] {##5};
    	\draw[fill] (##3+2,##4) circle (2pt);
  
    	\draw (##1+2,##2) -- (##1+2+0.2,##2+0.4);
    	\draw[->] (##1+2+0.2,##2+0.4) -- (##3+2+0.2,##4-0.4);
    	\draw (##3+2+0.2,##4-0.4) -- (##3+2,##4);
    }
    
    \newcommand{\pdown}[5]{
    	
    	\draw[fill] (##1+2,##2) circle (2pt);
    	\draw[fill] (##3+2,##4) circle (2pt) node[above left] {##5};
  
    	\draw (##1+2,##2) -- (##1+2+0.2,##2+0.4);
    	\draw[<-] (##1+2+0.2,##2+0.4) -- (##3+2+0.2,##4-0.4);
    	\draw (##3+2+0.2,##4-0.4) -- (##3+2,##4);
    }
}
{
	\end{tikzpicture}
}


und hier rufe ich sie auf in meiner .tex Datei
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{units}
\usepackage{fDiagramm}


\author{Test}
\title{Test}

\begin{document}
\maketitle

\begin{Diagramm}
	\Sensor{Q1}{0}{1}
	\Sensor{T2}{0}{1}
	\Sensor{T1}{0}{1}
	\Schritte{6}
	\Label
	
	%Schritte für T1
	\Schritt{0}{5}{2}{5}
	\Schritt{2}{5}{2}{6}
	\Schritt{2}{6}{3}{6}
	\Schritt{3}{6}{3}{5}
	\Schritt{3}{5}{6}{5}
	\Schritt{6}{5}{6}{6}
	\Schritt{6}{6}{8}{6}
	
	%Schritte für T2
	\Schritt{0}{3}{4}{3}
	\Schritt{4}{3}{4}{4}
	\Schritt{4}{4}{5}{4}
	\Schritt{5}{4}{5}{3}
	\Schritt{5}{3}{6}{3}
	\Schritt{6}{3}{6}{4}
	\Schritt{6}{4}{8}{4}
	
	%Schritte Q1
	\Schritt{0}{1}{2}{1}
	\Schritt{2}{1}{2}{2}
	\Schritt{2}{2}{3}{2}
	\Schritt{3}{2}{3}{1}
	\Schritt{3}{1}{4}{1}
	\Schritt{4}{1}{4}{2}
	\Schritt{4}{2}{5}{2}
	\Schritt{5}{2}{5}{1}
	\Schritt{5}{1}{6}{1}
	\Schritt{6}{1}{6}{2}
	\Schritt{6}{2}{8}{2}
	
	\pdown{2}{1}{2}{6}{\unit[0,2]{mm}}
	\pdown{4}{1}{4}{4}{\unit[0,2]{mm}}
	
	\pdown{6}{1}{6}{6}{\unit[0,2]{mm}}
	\pdown{6}{1}{6}{4}{\unit[0,2]{mm}}

\end{Diagramm}

\end{document}

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

Re: Rechnen mit variablen

Beitrag von Stefan Kottwitz »

Hallo Mathias,

ich finde super, dass Du TikZ verwendest! Ich bin ein großer Freund davon, daher habe ich auch ein Buch dazu geschrieben. Auf tikz.org/sample findest Du ein Kapitel, das sich konkret mit Rechnen befasst, also mit der calc-Library, sowie for-Schleifen und Schnitte von Pfaden.

Die Diagramm-Umgebung kann man nicht mehrfach verwenden, weil innerhalb der Umgebung Längen und Makros definiert werden. Also \newlength und \newcommand sollten raus aus der Umgebung und an den Anfang der .sty-Datei.

Mit TikZ würde ich jedoch integrierte TikZ Bordmittel zum Berechnen verwenden, also calc, ggf. tikzmath oder pgfmath.

Stefan

MattGyver
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 12. Jun 2022, 12:58

Re: Rechnen mit variablen

Beitrag von MattGyver »

Habe ich auch schon versucht.
\newlength{\yPosition}
\setlength{\yPosition}{0cm}
    
\newlength{\xLength}
\newcounter{xLengtZustand};

\newenvironment{Diagramm}{

    \begin{tikzpicture}
    
    \newcommand{\Sensor}[3]{
    	\node at (0,\yPosition+1.5cm) {##1};
        \node at (1.55, \yPosition+2cm) {##3};
        \node at (1.55, \yPosition+1cm) {##2};
        \draw (2,\yPosition) -- (2,\yPosition+3cm);
        \addtolength{\yPosition}{2cm} % Y-Position um 1,5 erhöhen
        
    	%\node at (0,1) {##1};
    	%\node at (1, 1.5) {##3};
  		%\node at (1, 0.5) {##2};
  		%\draw (1.5,0) -- (1.5,2);
  
Leider gibt es dann folgenden Fehlermeldung und ich war total Hilflos.
! LaTeX Error: Missing \begin{document}.

Anscheinend kann ich es auch nicht am Anfang der Datei machen weil er die Umgebung von \begin{Document} brauch.

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

Re: Rechnen mit variablen

Beitrag von Stefan Kottwitz »

Das klingt, als hättest Du die .sty-Datei versucht zu übersetzen, und nicht das Dokument, dort steht \begin{document} ja drin. \newcommand muss auch noch raus aus tikzpicture- und Diagramm-Umgebungen.

Stefan

MattGyver
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 12. Jun 2022, 12:58

Re: Rechnen mit variablen

Beitrag von MattGyver »

Ok ich habe nochmal von vorne begonnen.

Vielleicht stelle ich mir das auch falsch vor wie das funktionieren könnt.
Ich sehe das wie bei einer Programmiersprache, ich definiere mir eine Funktion und die Kann ich mehrmals aufrufen in meinem Fall:
\newenvironment{Diagramm}{

	\def\x{0}
	\def\y{0}

    \begin{tikzpicture}
    
    \newcommand{\Sensor}[3]{
    	
    	\node at (0,\y + 1.5) {##1};
        \node at (1.55, \y + 2) {##3};
        \node at (1.55, \y + 1) {##2};
        \draw (2,\y) -- (2,\y + 3);
        \y + 2 %Hier soll der wert um zwei erhöht werden dammit beim nächsten aufruf der Text über dem alten Text ist.
    }
}
{
	\end{tikzpicture}
}
Jetzt kommt wahrscheinlich mein Denkfehler. Ich definier ja x und. y außerhalb von newcommand, deswegen denke ich das der Wert drin gespeichert wird und beim nächsten Aufruf damit weitergerechnet wird.

also wenn ich

\Sensor{Test}{0}{1}
\Sensor{Test1}{0}{1}

die Texte übereinander geschrieben werden, aber sie liegen leider aufeinander.
Ich hoffe ihr versteht was ich für ein Problem habe.

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

Re: Rechnen mit variablen

Beitrag von Stefan Kottwitz »

In jedem Aufruf der Umgebung Zähler und Makros neu anzulegen, ist ein Problem. Beim zweiten Durchlauf gibt es den Zähler schon.

Das sollte also aus der Umgebung raus und weiter oben stehen in der .sty-Datei:
\newlength{\yPosition}
\newlength{\xLength}
\newcounter{xLengtZustand}
\newcounter{step}
Der Fehler "Missing \begin{document}" kam weil Du ein Semikolon in dieser Zeile drin hattest:
\newcounter{xLengtZustand};
Das Semikolon ist ja hier "normaler Text" und dann beschwert sich LaTeX, weil das Dokument noch nicht begonnen wurde und schon soll Text ausgegeben werden.

Stefan

MattGyver
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: So 12. Jun 2022, 12:58

Re: Rechnen mit variablen

Beitrag von MattGyver »

Ich habe es jetzt mit \calc gemacht wie du es mir empfohlen hast

hier jetzt der Code in einer Datei damit es kompiliert werden kann.
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{units}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary {backgrounds}
\usetikzlibrary{calc}

\newenvironment{Diagramm}{

	\def\x{0}
	\def\y{0}

    \begin{tikzpicture}
    
    \newcommand{\Sensor}[3]{
    	
    	\node at (0,\y + 1.5) {##1};
        \node at (1.55, \y + 2) {##3};
        \node at (1.55, \y + 1) {##2};
        \draw (2,\y) -- (2,\y + 3);
        \y + 2
    }
}
{
	\end{tikzpicture}
}


\author{Test}
\title{Test}

\begin{document}
\maketitle

\begin{Diagramm}
	\Sensor{Test}{1}{2}
	\Sensor{Test2}{1}{2}
\end{Diagramm}

\begin{Diagramm}
	\Sensor{Test}{1}{2}
	\Sensor{Test2}{1}{2}
\end{Diagramm}

\end{document}

Antworten