TIKZ So erfassen Sie eine bestimmte Kette in einem Argument

TIKZ So erfassen Sie eine bestimmte Kette in einem Argument

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 \eixohundertmal 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 listofitemszu suchen . Wenn es dieses findet (was durch eine Listenlänge > 1 belegt wird), verwendet es den Spezifizierer, andernfalls verwendet es .#2sistemabelowright

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

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

verwandte Informationen