TIKZ Como capturar uma cadeia específica em um argumento

TIKZ Como capturar uma cadeia específica em um argumento

Criei uma macro que desenha diferentes tipos de coordenadas 3D (aqui: sistemaTd & sistemaT2). Quando uso o sistema incluído no tikz, a legenda do eixo Y fica em uma posição ruim.

Já usei \eixocentenas de vezes em vários arquivos, então quero encontrar uma maneira sem alterar seu número de argumentos

Acho que preciso de algo assim na definição de \eixo:

IF #2 contains the chain "sistema" DO pos="below" ELSE pos="right" ENDIF

este é o exemplo:

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

Responder1

Aqui eu uso listofitemspara procurar #2o string-separator sistema. Se encontrar (como evidenciado por um comprimento de lista > 1), ele usará o belowespecificador, caso contrário, usará 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}

insira a descrição da imagem aqui

Aqui está uma versão que também ajusta a localização do rótulo X, se bem entendi o problema:

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

insira a descrição da imagem aqui

Responder2

Você pode verificar (com calc) na hora se o eixo está mais horizontal ou vertical e anexar a etiqueta dependendo dessa informação. Dessa forma, isso continuará funcionando se você adicionar mais sistemas de coordenadas e/ou alterar sua definição.

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

insira a descrição da imagem aqui

informação relacionada