Ich habe ein Makro erstellt, das verschiedene Arten von 3D-Koordinaten zeichnet (hier: sistemaTd & sistemaT2). Wenn ich das in Tikz enthaltene System verwende, liegt die Legende der Y-Achse an einer schlechten Position.
Ich habe es \eixo
hundertmal in verschiedenen Dateien verwendet und möchte daher einen Weg finden, ohne die Anzahl der Argumente zu ändern
Ich glaube, ich brauche so etwas in der Definition von \eixo
:
IF #2 contains the chain "sistema" DO pos="below" ELSE pos="right" ENDIF
hier ist das Beispiel:
\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen}
\tikzset{sistemaTd/.style={y={(1 cm,0 cm)},z={(0 cm, 1 cm)},x={(-0.5 cm, -0.5 cm)}}}
\tikzset{sistemaTe/.style={x={(0 cm,1 cm)},y={(1 cm, 0 cm)},z={(-0.5 cm, -0.5 cm)}}}
%eixo{dim}{color, etc} Ejemplo: \texttt{eixo}{black!80,sistemaTd,-latex...}
\newcommand{\eixo}[2]{
\begin{scope}[->,#2]
\draw (0,0,0) -- (#1,0,0) node[right]{$X$};
\draw (0,0,0) -- (0,#1,0) node[below]{$Y$}; %node[below]{$Y$}
\draw (0,0,0) -- (0,0,#1) node[right]{$Z$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\eixo{3}{gray,sistemaTd}
\begin{scope}[xshift=5.5cm]
\eixo{3}{gray,sistemaTe}
\end{scope}
\begin{scope}[xshift=11cm]
\eixo{3}{gray} %note the legend of Y axis
\end{scope}
\end{tikzpicture}
\end{document}
Antwort1
Hier verwende ich , um nach dem String-Trennzeichen listofitems
zu suchen . Wenn es dieses findet (was durch eine Listenlänge > 1 belegt wird), verwendet es den Spezifizierer, andernfalls verwendet es .#2
sistema
below
right
\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen,listofitems}
\tikzset{sistemaTd/.style={y={(1 cm,0 cm)},z={(0 cm, 1 cm)},x={(-0.5 cm, -0.5 cm)}}}
\tikzset{sistemaTe/.style={x={(0 cm,1 cm)},y={(1 cm, 0 cm)},z={(-0.5 cm, -0.5 cm)}}}
%eixo{dim}{color, etc} Ejemplo: \texttt{eixo}{black!80,sistemaTd,-latex...}
\newcommand{\eixo}[2]{
\begin{scope}[->,#2]
\draw (0,0,0) -- (#1,0,0) node[right]{$X$};
\setsepchar{sistema}%
\readlist\argtwo{#2}%
\ifnum\listlen\argtwo[]>1\relax
\draw (0,0,0) -- (0,#1,0) node[below]{$Y$};
\else
\draw (0,0,0) -- (0,#1,0) node[right]{$Y$};
\fi
\draw (0,0,0) -- (0,0,#1) node[right]{$Z$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\eixo{3}{gray,sistemaTd}
\begin{scope}[xshift=5.5cm]
\eixo{3}{gray,sistemaTe}
\end{scope}
\begin{scope}[xshift=11cm]
\eixo{3}{gray} %note the legend of Y axis
\end{scope}
\end{tikzpicture}
\end{document}
Hier ist eine Version, die auch die Position des X-Labels anpasst, wenn ich das Problem richtig verstehe:
\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen,listofitems}
\tikzset{sistemaTd/.style={y={(1 cm,0 cm)},z={(0 cm, 1 cm)},x={(-0.5 cm, -0.5 cm)}}}
\tikzset{sistemaTe/.style={x={(0 cm,1 cm)},y={(1 cm, 0 cm)},z={(-0.5 cm, -0.5 cm)}}}
%eixo{dim}{color, etc} Ejemplo: \texttt{eixo}{black!80,sistemaTd,-latex...}
\newcommand{\eixo}[2]{
\begin{scope}[->,#2]
\setsepchar{sistema}%
\readlist\argtwo{#2}%
\ifnum\listlen\argtwo[]>1\relax
\draw (0,0,0) -- (#1,0,0) node[right]{$X$};
\draw (0,0,0) -- (0,#1,0) node[below]{$Y$};
\else
\draw (0,0,0) -- (#1,0,0) node[below]{$X$};
\draw (0,0,0) -- (0,#1,0) node[right]{$Y$};
\fi
\draw (0,0,0) -- (0,0,#1) node[right]{$Z$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\eixo{3}{gray,sistemaTd}
\begin{scope}[xshift=5.5cm]
\eixo{3}{gray,sistemaTe}
\end{scope}
\begin{scope}[xshift=11cm]
\eixo{3}{gray} %note the legend of Y axis
\end{scope}
\end{tikzpicture}
\end{document}
Antwort2
Sie können (mit calc
) vor Ort prüfen, ob die Achse eher horizontal oder vertikal verläuft und je nach dieser Information die Beschriftung anbringen. Auf diese Weise funktioniert dies auch dann noch, wenn Sie weitere Koordinatensysteme hinzufügen und/oder deren Definition ändern.
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{calc}
\tikzset{sistemaTd/.style={y={(1 cm,0 cm)},z={(0 cm, 1 cm)},x={(-0.5 cm, -0.5 cm)}}}
\tikzset{sistemaTe/.style={x={(0 cm,1 cm)},y={(1 cm, 0 cm)},z={(-0.5 cm, -0.5 cm)}}}
%eixo{dim}{color, etc} Ejemplo: \texttt{eixo}{black!80,sistemaTd,-latex...}
\newcommand{\eixo}[2]{
\begin{scope}[->,#2]
\draw (0,0,0) -- (#1,0,0)
let \p1=($(#1,0,0)-(0,0,0)$),\n1={abs(sin(atan2(\y1,\x1))))} in
\ifdim\n1<0.4pt [below] \else [right] \fi node {$X$};
\draw (0,0,0) -- (0,#1,0) let \p1=($(0,#1,0)-(0,0,0)$),\n1={abs(sin(atan2(\y1,\x1))))} in
\ifdim\n1<0.4pt [below] \else [right] \fi node {$Y$};
\draw (0,0,0) -- (0,0,#1) let \p1=($(0,0,#1)-(0,0,0)$),\n1={abs(sin(atan2(\y1,\x1))))} in
\ifdim\n1<0.4pt [below] \else [right] \fi node{$Z$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\eixo{3}{gray,sistemaTd}
\begin{scope}[xshift=5.5cm]
\eixo{3}{gray,sistemaTe}
\end{scope}
\begin{scope}[xshift=11cm]
\eixo{3}{gray} %note the legend of Y axis
\end{scope}
\end{tikzpicture}
\end{document}