Seite 1 von 2

Rechnen mit variablen

Verfasst: Do 25. Apr 2024, 10:48
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

Re: Rechnen mit variablen

Verfasst: Do 25. Apr 2024, 11:28
von Wegweiser
Für derartige Berechnungen gibt es eine verhältnismäßig große Auswahl an Paketen.

Re: Rechnen mit variablen

Verfasst: Do 25. Apr 2024, 12:33
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}

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 09:42
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}

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 09:56
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

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 10:06
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.

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 10:42
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

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 12:59
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.

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 13:12
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

Re: Rechnen mit variablen

Verfasst: Fr 26. Apr 2024, 13:21
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}