##################################################################
# Modul um Dateien in Latex zu erzeugen
# Letzte Aenderung: 10.01.2012
##################################################################
use POSIX qw /floor ceil/;
use Math::Trig;
use strict;
use warnings;

# Variablen
my (
	$xmin,                   $ymin,                   $xmax,
	$ymax,                   $scalex,                 $scaley,
	$scalez,                 $skalierungvorgenommenx, $skalierungvorgenommeny,
	$skalierungvorgenommenz, $schnittx,               $schnitty,
	$schnittvorgenommenx,    $schnittvorgenommeny,    $farbe,
	$linienart,              $linienstaerke,          $fuellfarbe,
	$fuellart,               $tree,                   $groessesetzen,
	$groessex,               $groessey,               $groessez,
	$kopf,                   $schriftgroesse,         $erstex1,
	$erstex2,                $erstey1,                $erstey2,
	$schnittz,               $schnittvorgenommenz
);

$tree = 0;

$groessesetzen = 0;
$groessex = $groessey = $groessez = 0;

# Min+Max des Bildes
$xmin    = $ymin    = $xmax    = $ymax    = 0;
$erstex1 = $erstex2 = $erstey1 = $erstey2 = 0;

#package dateierzeugen;
# Minimum und Maximum setzen
sub setminmax {
	my ( $min, $xodery, $minmax ) = @_;

	if ( $xodery eq "x" ) {
		if   ( $minmax eq "min" ) { $xmin = $min; }
		else                      { $xmax = $min; }
	}
	if ( $xodery eq "y" ) {
		if   ( $minmax eq "min" ) { $ymin = $min; }
		else                      { $ymax = $min; }
	}

}

# Wie ist das Minimum und Maximum?
sub getminmax {
	my ( $xodery, $minmax ) = @_;
	if ( $xodery eq "x" ) {
		if   ( $minmax eq "min" ) { return nachkommastellen( $xmin, 4 ); }
		else                      { return nachkommastellen( $xmax, 4 ); }
	}
	if ( $xodery eq "y" ) {
		if   ( $minmax eq "min" ) { return nachkommastellen( $ymin, 4 ); }
		else                      { return nachkommastellen( $ymax, 4 ); }
	}
}

my $setmaxberechnung = 1;

sub setmaxberechnung {
	my ($wert) = @_;
	$setmaxberechnung = $wert;
}

sub getmaxberechnung { return $setmaxberechnung; }

# Minimum und Maximum des Bildes setzen
sub minmax {
	my ( $xminlokal, $yminlokal, $xmaxlokal, $ymaxlokal ) = @_;

	if (   ( istzahl($xminlokal) == 1 )
		&& ( istzahl($yminlokal) == 1 )
		&& ( istzahl($xmaxlokal) == 1 )
		&& ( istzahl($ymaxlokal) == 1 ) )
	{

		if ( getmaxberechnung == 1 ) {
			if ( $erstex1 == 0 ) {
				setminmax( $xminlokal, "x", "min" );
				$erstex1 = 1;
			}
			else {
				setminmax( min( $xminlokal, getminmax( "x", "min" ) ),
					"x", "min" );
			}
			if ( $erstex2 == 0 ) {
				setminmax( $xmaxlokal, "x", "max" );
				$erstex2 = 1;
			}
			else {
				setminmax( max( $xmaxlokal, getminmax( "x", "max" ) ),
					"x", "max" );
			}
			if ( $erstey1 == 0 ) {
				setminmax( $yminlokal, "y", "min" );
				$erstey1 = 1;
			}
			else {
				setminmax( min( $yminlokal, getminmax( "y", "min" ) ),
					"y", "min" );
			}
			if ( $erstey2 == 0 ) {
				setminmax( $ymaxlokal, "y", "max" );
				$erstey2 = 1;
			}
			else {
				setminmax( max( $ymaxlokal, getminmax( "y", "max" ) ),
					"y", "max" );
			}
		}
	}
}
### Allgemeine Variablen
# Skalierung des Bildes
$scalex = $scaley = $scalez = 1;
$skalierungvorgenommenx = $skalierungvorgenommeny = $skalierungvorgenommenz = 0;

sub setskalierung {
	my ( $skale, $xyz ) = @_;

	if ( $skale != 0 ) {
		if ( $xyz eq "x" ) { $scalex = $skale; }
		if ( $xyz eq "y" ) { $scaley = $skale; }
		if ( $xyz eq "z" ) { $scalez = $skale; }
	}
}

sub getskalierung {
	my ($xyz) = @_;
	if ( $xyz eq "x" ) { return $scalex; }
	if ( $xyz eq "y" ) { return $scaley; }
	if ( $xyz eq "z" ) { return $scalez; }

}

# Ueberpruefen, ob die Skalierung schon vorgenommen wurde, wenn ja, bleibt es bei dem alten und wenn nein, wird die Skalieng neu gesetzt
sub skalierungsetzen {
	my ( $skalierung, $xoderyoderz ) = @_;
	if ( $xoderyoderz eq "x" ) {
		if ( $skalierungvorgenommenx == 0 ) {
			setskalierung( $skalierung, "x" );
			$skalierungvorgenommenx = 1;
		}
	}
	if ( $xoderyoderz eq "y" ) {
		if ( $skalierungvorgenommeny == 0 ) {
			setskalierung( $skalierung, "y" );
			$skalierungvorgenommeny = 1;
		}
	}
	if ( $xoderyoderz eq "z" ) {
		if ( $skalierungvorgenommenz == 0 ) {
			setskalierung( $skalierung, "z" );
			$skalierungvorgenommenz = 1;
		}
	}
}

sub setgross {
	my ($gross) = @_;
	$groessesetzen = $gross;
}

sub getgross { return $groessesetzen; }

sub setgroesse {
	my ( $skale, $xyz ) = @_;
	if ( $xyz eq "x" ) { $groessex = $skale; }
	if ( $xyz eq "y" ) { $groessey = $skale; }
	if ( $xyz eq "z" ) { $groessez = $skale; }

}

sub setausmasse {
	my ( $x, $y ) = @_;
	setgross(1);
	setgroesse( $x, "x" );
	setgroesse( $y, "y" );
}

sub setgrossskalierung {
	my ( $breitex, $breitey ) = @_;
	if ( $breitex != 0 ) { setskalierung( getgroesse("x") / $breitex, "x" ); }
	if ( $breitey != 0 ) { setskalierung( getgroesse("y") / $breitey, "y" ); }
}

sub setgrossskalierung3d {
	my ( $breitex, $breitey, $breitez ) = @_;
	if ( getgroesse("x") != 0 ) {
		$scalex = nachkommastellen( getgroesse("x") / $breitex, 6 );
		$scaley = nachkommastellen( getgroesse("y") / $breitey, 6 );
		$scalez = nachkommastellen( getgroesse("z") / $breitez, 6 );
	}
}

sub getgroesse {
	my ($xyz) = @_;
	if ( $xyz eq "x" ) { return $groessex; }
	if ( $xyz eq "y" ) { return $groessey; }
	if ( $xyz eq "z" ) { return $groessez; }

}

# Schnittpunkte des Bildes
$schnittx = $schnitty = $schnittvorgenommenx = $schnittvorgenommeny =
  $schnittvorgenommenz = 0;

sub setschnitt {
	my ( $schnitt, $xyz ) = @_;
	if ( $xyz eq "x" ) { $schnittx = $schnitt; }
	if ( $xyz eq "y" ) { $schnitty = $schnitt; }
	if ( $xyz eq "z" ) { $schnittz = $schnitt; }
}

sub getschnitt {
	my ($xyz) = @_;
	if ( $xyz eq "x" ) { return $schnittx; }
	if ( $xyz eq "y" ) { return $schnitty; }
	if ( $xyz eq "z" ) { return $schnittz; }
}

sub schnittsetzen {
	my ( $schnitt, $xyz ) = @_;
	if ( $xyz eq "x" ) {
		if ( $schnittvorgenommenx == 0 ) {
			setschnitt( $schnitt, "x" );
			$schnittvorgenommenx = 1;
		}
	}
	if ( $xyz eq "y" ) {
		if ( $schnittvorgenommeny == 0 ) {
			setschnitt( $schnitt, "y" );
			$schnittvorgenommeny = 1;
		}
	}
	if ( $xyz eq "z" ) {
		if ( $schnittvorgenommenz == 0 ) {
			setschnitt( $schnitt, "z" );
			$schnittvorgenommenz = 1;
		}
	}
}

$farbe = "black";

sub setfarbe {
	my ($farbwahl) = @_;
	$farbe = $farbwahl;
}

sub getfarbe { return $farbe; }
$fuellfarbe = "black!20";

sub setfuellfarbe {
	my ($farbwahl) = @_;
	$fuellfarbe = $farbwahl;
}

sub getfuellfarbe { return $fuellfarbe; }
$linienart = "solid";

sub setlinienart {
	my ($linie) = @_;
	$linienart = $linie;
}

sub getlinienart { return $linienart; }
$linienstaerke = 1;

sub setlinienstaerke {
	my ($linie) = @_;
	$linienstaerke = $linie;
}

sub getlinienstaerke { return $linienstaerke; }
$fuellart = "solid";

sub setfuellart {
	my ($farbwahl) = @_;
	$fuellart = $farbwahl;
}

sub getfuellart { return $fuellart; }

### Soll der Kopf der Datei mit ausgegeben werden? Standard ist ja.

$kopf = 1;

sub setkopf {
	my ($kopfhier) = @_;
	$kopf = $kopfhier;
}

sub getkopf { return $kopf; }

sub einstellungen {
	my ( $layer, $farbe, $fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	my (
		$farbeersatz,     $fuellartersatz,      $fuellfarbeersatz,
		$linienartersatz, $linienstaerkeersatz, $parameterersatz
	);
	if ( ( $farbe eq "" ) || ( $farbe eq getfarbe() ) ) { $farbeersatz = ""; }
	else { $farbeersatz = "linecolor=" . $farbe . ", "; }
	if ( ( $fuellart eq "" ) || ( $fuellart eq getfuellart() ) ) {
		$fuellartersatz = "";
	}
	else { $fuellartersatz = "fillstyle=" . $fuellart . ", "; }
	if ( ( $fuellfarbe eq "" ) || ( $fuellfarbe eq getfuellfarbe() ) ) {
		$fuellfarbeersatz = "";
	}
	else { $fuellfarbeersatz = "fillcolor=" . $fuellfarbe . ", "; }
	if ( ( $linienart eq "" ) || ( $linienart eq getlinienart() ) ) {
		$linienartersatz = "";
	}
	else { $linienartersatz = "linestyle=" . $linienart . ", "; }
	if ( ( $linienstaerke eq "" ) || ( $linienstaerke eq getlinienstaerke() ) )
	{
		$linienstaerkeersatz = "";
	}
	else { $linienstaerkeersatz = "linewidth=" . $linienstaerke . "pt, "; }
	if   ( $parameter eq "" ) { $parameterersatz = ""; }
	else                      { $parameterersatz = $parameter; }
	schreibeinarray(
		$layer,
		sprintf(
			"\\psset{%s%s%s%s%s%s}",
			$farbeersatz,     $fuellartersatz,      $fuellfarbeersatz,
			$linienartersatz, $linienstaerkeersatz, $parameterersatz
		)
	);
}

sub einstellungenkopf {
	my ( $layer, $farbe, $fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	my (
		$farbeersatz,     $fuellartersatz,      $fuellfarbeersatz,
		$linienartersatz, $linienstaerkeersatz, $parameterersatz
	);

	if   ( ( $farbe eq "" ) ) { $farbeersatz = ""; }
	else                      { $farbeersatz = "linecolor=" . $farbe . ", "; }
	if ( ( $fuellart eq "" ) ) { $fuellartersatz = ""; }
	else { $fuellartersatz = "fillstyle=" . $fuellart . ", "; }
	if ( ( $fuellfarbe eq "" ) ) { $fuellfarbeersatz = ""; }
	else { $fuellfarbeersatz = "fillcolor=" . $fuellfarbe . ", "; }
	if ( ( $linienart eq "" ) ) { $linienartersatz = ""; }
	else { $linienartersatz = "linestyle=" . $linienart . ", "; }
	if ( ( $linienstaerke eq "" ) ) { $linienstaerkeersatz = ""; }
	else { $linienstaerkeersatz = "linewidth=" . $linienstaerke . "pt, "; }
	if   ( $parameter eq "" ) { $parameterersatz = ""; }
	else                      { $parameterersatz = $parameter; }
	schreibeinarray(
		$layer,
		sprintf(
			"\\psset{%s%s%s%s%s%s}",
			$farbeersatz,     $fuellartersatz,      $fuellfarbeersatz,
			$linienartersatz, $linienstaerkeersatz, $parameterersatz
		)
	);
	abstand($layer);

	setfarbe($farbe);
	setfuellart($fuellart);
	setfuellfarbe($fuellfarbe);
	setlinienstaerke($linienstaerke);
	setlinienart($linienart);
}

# Befehl erzeugen
sub befehlerzeugen {
	my ( $layer, $befehl, $farbe, $linienart, $linienstaerke, $parameter,
		$pfeilart, $anhang )
	  = @_;
	befehlfuellungerzeugen(
		$layer,    $befehl,    $farbe,         "",
		"",        $linienart, $linienstaerke, $parameter,
		$pfeilart, $anhang
	);
}

sub befehlfuellungerzeugen {
	my (
		$layer,      $befehl,    $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter,
		$pfeilart,   $anhang
	) = @_;

	my (
		$farbeersatz,     $fuellartersatz,      $fuellfarbeersatz,
		$linienartersatz, $linienstaerkeersatz, $parameterersatz
	);

	if ( ( $farbe eq "" ) || ( $farbe eq getfarbe() ) ) { $farbeersatz = ""; }
	else { $farbeersatz = "linecolor=" . $farbe . ", "; }
	if ( ( $fuellart eq "" ) || ( $fuellart eq getfuellart() ) ) {
		$fuellartersatz = "";
	}
	else { $fuellartersatz = "fillstyle=" . $fuellart . ", "; }
	if ( ( $fuellfarbe eq "" ) || ( $fuellfarbe eq getfuellfarbe() ) ) {
		$fuellfarbeersatz = "";
	}
	else { $fuellfarbeersatz = "fillcolor=" . $fuellfarbe . ", "; }
	if ( ( $linienart eq "" ) || ( $linienart eq getlinienart() ) ) {
		$linienartersatz = "";
	}
	else { $linienartersatz = "linestyle=" . $linienart . ", "; }
	if ( ( $linienstaerke eq "" ) || ( $linienstaerke eq getlinienstaerke() ) )
	{
		$linienstaerkeersatz = "";
	}
	else { $linienstaerkeersatz = "linewidth=" . $linienstaerke . "pt, "; }
	if   ( $parameter eq "" ) { $parameterersatz = ""; }
	else                      { $parameterersatz = $parameter; }

	if ( $pfeilart eq "" ) {
		if (   ( $farbeersatz eq "" )
			&& ( $fuellartersatz      eq "" )
			&& ( $fuellfarbeersatz    eq "" )
			&& ( $linienartersatz     eq "" )
			&& ( $linienstaerkeersatz eq "" )
			&& ( $parameterersatz     eq "" ) )
		{
			schreibeinarray( $layer, sprintf( "\\%s%s%%", $befehl, $anhang ) );
		}
		else {
			schreibeinarray(
				$layer,
				sprintf(
					"\\%s[%s%s%s%s%s%s]%s%%",
					$befehl,          $farbeersatz,
					$fuellartersatz,  $fuellfarbeersatz,
					$linienartersatz, $linienstaerkeersatz,
					$parameterersatz, $anhang
				)
			);
		}
	}
	else {
		if (   ( $farbeersatz eq "" )
			&& ( $fuellartersatz      eq "" )
			&& ( $fuellfarbeersatz    eq "" )
			&& ( $linienartersatz     eq "" )
			&& ( $linienstaerkeersatz eq "" )
			&& ( $parameterersatz     eq "" ) )
		{
			schreibeinarray( $layer,
				sprintf( "\\%s{%s}%s%%", $befehl, $pfeilart, $anhang ) );
		}
		else {
			schreibeinarray(
				$layer,
				sprintf(
					"\\%s[%s%s%s%s%s%s]{%s}%s%%",
					$befehl,          $farbeersatz,
					$fuellartersatz,  $fuellfarbeersatz,
					$linienartersatz, $linienstaerkeersatz,
					$parameterersatz, $pfeilart,
					$anhang
				)
			);
		}
	}
}
$schriftgroesse = 10;

sub setschriftgroesse {
	my ($groesse) = @_;
	$schriftgroesse = $groesse;
}

sub getschriftgroesse { return $schriftgroesse; }

my $beschriftunggroesse = "normalsize";

sub setbeschriftunggroesse {
	my ($groesse) = @_;
	$beschriftunggroesse = $groesse;
}

sub getbeschriftunggroesse { return $beschriftunggroesse; }

sub beschriftunggroesse {
	my ( $text, $groesse ) = @_;
	my $ausgabe;

	if ( $groesse eq "normalsize" ) { $ausgabe = $text; }
	else { $ausgabe = "\\" . $groesse . "{" . $text . "}"; }
	return $ausgabe;
}

sub textfarbe {
	my ( $text, $farbe ) = @_;
	my $ausgabe;
	if ( $farbe eq getfarbe() ) { $ausgabe = $text; }
	else { $ausgabe = "\\color{" . $farbe . "}{" . $text . "}"; }
	return $ausgabe;
}

sub abstand {
	my ($layer) = @_;
	schreibeinarray( $layer, sprintf("") );
}

sub kommentar {
	my ( $layer, $text ) = @_;
	schreibeinarray( $layer, sprintf( "%%%% %s", $text ) );
}

sub komm {
	my ($text) = @_;
	kommentar( 10, $text );
}

sub hilfe {
	my ( $layer, $text, $var ) = @_;
	schreibeinarray( $layer, sprintf( "%% %s: %s", $text, $var ) );
}

sub usepackage {
	my ( $parameter, $befehl ) = @_;

	if ( getkopf() == 1 ) {
		if ( $parameter eq "" ) {
			schreibeinarray( 104, sprintf( "\\usepackage{%s}", $befehl ) );
		}
		else {
			schreibeinarray( 104,
				sprintf( "\\usepackage[%s]{%s}", $parameter, $befehl ) );
		}
		if ( $befehl eq "pst-tree" ) {
			if ( $tree == 0 ) {
				pstricks(
					104,
					"\\newcommand{\\knoten}[2][white]
{\\Tr{\\psframebox[fillcolor=#1!50,fillstyle=solid]{#2}}}"
				);
				$tree = 1;
			}
		}
	}

}

#### Pictureumgebung

sub beginpicture {
	my ($layer) = @_;

	schreibeinarray(
		$layer,
		sprintf(
			"\\begin{pspicture}(%g,%g)(%g,%g)\n",
			getminmax( "x", "min" ),
			getminmax( "y", "min" ),
			getminmax( "x", "max" ),
			getminmax( "y", "max" )
		)
	);

}

sub setachsenbild {
	my ($layer) = @_;

	my ( $xeinteilung, $yeinteilung, $zeinteilung );

	if ( getachsen() == 1 ) {
		if ( get3dzeichnen() == 1 ) {
			if (   ( getachsengraph3d("xmax") == getachsengraph3d("xmin") )
				|| ( getachsengraph3d("xmax") == 0 ) )
			{
				$xeinteilung = 0;
			}
			else {
				if ( getachsengraph3d("xmax") - getachsengraph3d("xmin") <= 1 )
				{
					$xeinteilung = schoenetabelle( getachsengraph3d("xmax") );
				}
				else {
					if ( schoenetabelle( getachsengraph3d("xmax") ) <= 1 ) {
						$xeinteilung = 1;
					}
					else {
						$xeinteilung =
						  schoenetabelle( getachsengraph3d("xmax") );
					}
				}
			}
			if (   ( getachsengraph3d("ymax") == getachsengraph3d("ymin") )
				|| ( getachsengraph3d("ymax") == 0 ) )
			{
				$yeinteilung = 0;
			}

			else {
				if ( getachsengraph3d("ymax") - getachsengraph3d("ymin") <= 1 )
				{
					$yeinteilung = schoenetabelle( getachsengraph3d("ymax") );
				}
				else {
					if ( schoenetabelle( getachsengraph3d("ymax") ) <= 1 ) {
						$yeinteilung = 1;
					}
					else {
						$yeinteilung =
						  schoenetabelle( getachsengraph3d("ymax") );
					}
				}
			}

			if (   ( getachsengraph3d("zmax") == getachsengraph3d("zmin") )
				|| ( getachsengraph3d("zmax") == 0 ) )
			{
				$zeinteilung = 0;
			}
			else {
				if ( getachsengraph3d("zmax") - getachsengraph3d("zmin") <= 1 )
				{
					$zeinteilung = schoenetabelle( getachsengraph3d("zmax") );
				}
				else {
					if ( schoenetabelle( getachsengraph3d("zmax") ) <= 1 ) {
						$zeinteilung = 1;
					}
					else {
						$zeinteilung =
						  schoenetabelle( getachsengraph3d("zmax") );
					}
				}
			}

			achsen3d(
				$layer,                   getfarbe(),
				getlinienstaerke(),       getlinienart(),
				"->",                     getachsengraph3d("xmin"),
				getachsengraph3d("xmax"), getachsengraph3d("ymin"),
				getachsengraph3d("ymax"), getachsengraph3d("zmin"),
				getachsengraph3d("zmax"), $xeinteilung,
				"normal",                 getmarkierung("x"),
				$yeinteilung,             "normal",
				getmarkierung("y"),       $zeinteilung,
				"normal",                 getmarkierung("z"),
			);

		}
		else {
			if ( getschnitt("x") < getachsengraph("xmin") ) {
				schnittsetzen( getachsengraph("xmin"), "x" );
			}
			if ( getschnitt("y") < getachsengraph("ymin") ) {
				schnittsetzen( getachsengraph("ymin"), "y" );
			}
			if ( getbalken() == 1 ) {

				if ( getmarkierung("x") eq "\$x\$" ) {
					setmarkierung( "", "x" );
				}
				if ( getmarkierung("y") eq "\$y\$" ) {
					setmarkierung( "", "y" );
				}

				if ( getrelativ() == 1 ) { setskalierung( 0.1, "x" ); }
				achsen(
					$layer,
					getfarbe(),
					getlinienstaerke(),
					getlinienart(),
					"->",
					getachsengraph("xmin"),
					getachsengraph("xmax") +
					  schoenetabelle( getachsengraph("xmax") ),
					getachsengraph("ymin"),
					getachsengraph("ymax") +
					  schoenetabelle( getachsengraph("ymax") ),
					schoenetabelle(
						getachsengraph("xmax") +
						  schoenetabelle( getachsengraph("xmax") )
					),
					"normal",
					getmarkierung("x"),
					getachsengraph("ymax") * 2,
					"normal",
					getmarkierung("y")
				);

			}

			elsif ( getpikto() == 1 ) {
				if ( getmarkierung("x") eq "\$x\$" ) {
					setmarkierung( "", "x" );
				}
				if ( getmarkierung("y") eq "\$y\$" ) {
					setmarkierung( "", "y" );
				}

				achsen(
					$layer,
					getfarbe(),
					getlinienstaerke(),
					getlinienart(),
					"->",
					getachsengraph("xmin"),
					getachsengraph("xmax") +
					  schoenetabelle( getachsengraph("xmax") ),
					getachsengraph("ymin"),
					getachsengraph("ymax") +
					  schoenetabelle( getachsengraph("ymax") ),
					schoenetabelle(
						getachsengraph("xmax") +
						  schoenetabelle( getachsengraph("xmax") )
					),
					"keine",
					getmarkierung("x"),
					getachsengraph("ymax") * 2,
					"keine",
					getmarkierung("y")
				);
			}

			elsif ( getsaeule() == 1 ) {
				if ( getmarkierung("x") eq "\$x\$" ) {
					setmarkierung( "", "x" );
				}
				if ( getmarkierung("y") eq "\$y\$" ) {
					setmarkierung( "", "y" );
				}
				if ( getrelativ() == 1 ) { setskalierung( 0.1, "y" ); }
				achsen(
					$layer,
					getfarbe(),
					getlinienstaerke(),
					getlinienart(),
					"->",
					getachsengraph("xmin"),
					getachsengraph("xmax") +
					  schoenetabelle( getachsengraph("xmax") ),
					getachsengraph("ymin"),
					getachsengraph("ymax") +
					  schoenetabelle( getachsengraph("ymax") ),
					getachsengraph("xmax") * 2,
					"normal",
					getmarkierung("x"),
					schoenetabelle(
						getachsengraph("ymax") +
						  schoenetabelle( getachsengraph("ymax") )
					),
					"normal",
					getmarkierung("y")
				);
			}
			else {
				if (
					schoenetabelle(
						getachsengraph("xmax") - getachsengraph("xmin")
					) <= 1
				  )
				{
					$xeinteilung = 1;
				}
				else {
					$xeinteilung =
					  schoenetabelle(
						getachsengraph("xmax") - getachsengraph("xmin") );
				}
				if (
					schoenetabelle(
						getachsengraph("ymax") - getachsengraph("ymin")
					) <= 1
				  )
				{
					$yeinteilung = 1;
				}
				else {
					$yeinteilung =
					  schoenetabelle(
						getachsengraph("ymax") - getachsengraph("ymin") );
				}
				achsen(
					$layer,                 getfarbe(),
					getlinienstaerke(),     getlinienart(),
					"->",                   getachsengraph("xmin"),
					getachsengraph("xmax"), getachsengraph("ymin"),
					getachsengraph("ymax"), $xeinteilung,
					"normal",               getmarkierung("x"),
					$yeinteilung,           "normal",
					getmarkierung("y")
				);
			}

		}
	}

	setachsen(2);

}

sub setgitterbild {
	my ($layer) = @_;
	

	if ( getachsen() != 1 ) {
		settexthier("");
		my ( $xeinteilung, $yeinteilung, $zeinteilung );
		if ( getschnitt("x") < getachsengraph("xmin") ) {
			schnittsetzen( getachsengraph("xmin"), "x" );
		}
		if ( getschnitt("y") < getachsengraph("ymin") ) {
			schnittsetzen( getachsengraph("ymin"), "y" );
		}

		if ( getgitter() == 1 ) {
			if ( get3dzeichnen() == 1 ) {
				if ( getachsengraph3d("xmax") == getachsengraph3d("xmin") ) {
					$xeinteilung = 0;
				}
				else {
					$xeinteilung =
					  schoenetabelle(
						getachsengraph3d("xmax") - getachsengraph3d("xmin") );
				}
				if ( getachsengraph3d("ymax") == getachsengraph3d("ymin") ) {
					$yeinteilung = 0;
				}
				else {
					$yeinteilung =
					  schoenetabelle(
						getachsengraph3d("ymax") - getachsengraph3d("ymin") );
				}
				if ( getachsengraph3d("zmax") == getachsengraph3d("zmin") ) {
					$zeinteilung = 0;
				}
				else {
					$zeinteilung =
					  schoenetabelle(
						getachsengraph3d("zmax") - getachsengraph3d("zmin") );
				}
				kariert3d(
					$layer,                   "lightgray",
					0.25,                     "solid",
					getachsengraph3d("xmin"), getachsengraph3d("ymin"),
					getachsengraph3d("zmin"), getachsengraph3d("xmax"),
					getachsengraph3d("ymax"), getachsengraph3d("zmax"),
					$xeinteilung,             0,
					0,                        $yeinteilung,
					0,                        0,
					$zeinteilung,             0,
					0
				);

			}
			else {
				$xeinteilung =
				  schoenetabelle(
					getachsengraph("xmax") - getachsengraph("xmin") );
				$yeinteilung =
				  schoenetabelle(
					getachsengraph("ymax") - getachsengraph("ymin") );
				kariert(
					$layer,                 "lightgray",
					0.25,                   "solid",
					getachsengraph("xmin"), getachsengraph("ymin"),
					getachsengraph("xmax"), getachsengraph("ymax"),
					$xeinteilung,           0,
					0,                      $yeinteilung,
					0,                      0
				);
			}
		}

		if ( getmatheheft() == 1 ) {
			setmatheheft(2);
			matheheft( $layer, "lightgray", getachsengraph("xmin"),
				getachsengraph("ymin"), getachsengraph("xmax"),
				getachsengraph("ymax") );
		}

		settexthier("");
		setgitter(2);
	}
}

sub endpicture {
	my ($layer) = @_;
	pstricks( $layer, "\\end{pspicture}" );
}

### Pstrickstext
sub pstricks {
	my ( $layer, $pstrickstext ) = @_;
	schreibeinarray( $layer, sprintf( "%s", $pstrickstext ) );
}

sub latex {
	my ( $layer, $latextext ) = @_;
	pstricks( $layer, $latextext );
}

sub schleife {
	my ( $layer, $variable, $start, $ende, $schritt ) = @_;

	my $weitehier = abrunden( ( ( ( $ende - $start ) / $schritt ) + 1 ), 1 );
	my $text =
	    "\\multido{\\"
	  . $variable . "="
	  . $start . "+"
	  . $schritt . "}{"
	  . $weitehier . "}{%%";
	pstricks( $layer, $text );

}

sub schleifeanzahl {
	my ( $layer, $variable, $start, $anzahl, $schritt ) = @_;
	my $text =
	    "\\multido{\\"
	  . $variable . "="
	  . $start . "+"
	  . $schritt . "}{"
	  . $anzahl . "}{%%";
	pstricks( $layer, $text );
}

sub schleifenende {
	my ($layer) = @_;
	pstricks( $layer, "}" );
}

1;
