Pruebas condicionales sobre variables de cadena en la biblioteca tikzmath

Pruebas condicionales sobre variables de cadena en la biblioteca tikzmath

¿Es posible probar cadenas en la biblioteca tikzmath? (Por ejemplo, si <variable>=<expresión de cadena> entonces foo)

Intenté una prueba ingenua y me devolvió este error:

Package PGF Math Error: Unknown function `text' (in ' text== text').

MWE a continuación:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{math}
\begin{document}
\tikzmath{
    let \str = text;
    if \str == \str then {%
        let \str = bird;
    };
}%
\str
\end{document}

Respuesta1

La \tikzmathcaracterística no permite comparaciones de cadenas. Puedes utilizar una estrategia diferente:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{math}
\usepackage{pdftexcmds}

\makeatletter
\newcommand{\strequal}[2]{\pdf@strcmp{#1}{#2}==0}
\makeatother


\begin{document}
\tikzmath{
    let \str = text;
    if \strequal{\str}{\str} then {%
        let \str = bird;
    };
}%
\str

\tikzmath{
    let \str = text;
    if \strequal{\str}{bird} then {%
        let \str = bird;
    };
}%
\str
\end{document}

La carga pdftexcmdsgarantiza la compatibilidad entre motores.

ingrese la descripción de la imagen aquí

Respuesta2

Puede usar expl3's \tl_if_eq:nnTF(que puse a disposición fuera del \ExplSyntaxOnuso \cs_set_eq:NN) dentro de a tikzpicture (pero no en, \tikzmathya que intentaría nuevamente evaluar sus cadenas como nombres de funciones).

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{calc}
\usetikzlibrary{math}
\ExplSyntaxOn
\cs_set_eq:NN \tlIfEqnnTF \tl_if_eq:nnTF
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
  \tlIfEqnnTF{foo}{bar}
    {\node at (0,0) {correct};}
    {\node at (0,0) {false};}
\end{tikzpicture}
\end{document}

Respuesta3

Aquí hay una solución TeX básica.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{math}

\newcommand{\ifstrA}{}% reserve global names
\newcommand{\ifstrB}{}
\newcommand{\ifstr}[4]{% #1 = string A, #2 = stirng B, #3 = true, #4= false
  \def\ifstrA{#1}%
  \def\ifstrB{#2}%
  \ifx\ifstrA\ifstrB #3\relax
  \else #4\relax
  \fi}

\begin{document}
\ifstr{text}{text}{bird}{oops}
\end{document}

información relacionada