Cómo detectar elementos "vacíos" dentro de una declaración tikz \foreach

Cómo detectar elementos "vacíos" dentro de una declaración tikz \foreach

Quiero definir una macro que introduzca su contenido en una \foreachdeclaración tikz, por ejemplo:

\newcommand\Macro[1]{ \foreach \x in {#1} {x=\x.} }

que luego se utiliza como \Macro{1,2,3,4}. A veces quiero darle argumentos "vacíos", como \Macro{,,,4,5,5}. Me gustaría poder detectar los argumentos "vacíos" y hacer algo diferente en tales casos. Pensé que algo como lo siguiente funcionaría:

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

pero por alguna razón esto no detecta los argumentos vacíos y en su lugar produce:

ingrese la descripción de la imagen aquí

He probado muchas otras cosas, como expandir \xprimero, pero todavía tengo que encontrar algo que funcione.

¿Alguien puede ver una manera de hacer esto?

[Mi código real está generando un tikzpictureentorno, así que realmente quiero usarlo \foreachdesde `tikz.]

Respuesta1

¿Algo como esto?

\documentclass{article}
\usepackage{tikz}
\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \ifx\x\empty\relax Empty!
    \else x=\x.
    \fi 
  }
}
\begin{document}
\Macro{,,,4,5,5}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

El problema en la macro de la pregunta:

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

es que \detokenizeno expande su argumento y devuelve los dos tokens \y x. Esto se soluciona agregando un \expandafter:

\detokenize\expandafter{\x}

La macro completa:

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize\expandafter{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

Respuesta3

La respuesta obligatoria expl3(después de señalar que esa \detokenize\expandafter{\x}sería la solución):

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\blankTF}{mmm}
 {% #1 = text to test, #2 = blank case, #3 = non blank case
  \str_if_eq_x:nnTF { #1 } { } { #2 } { #3 }
 }
\NewDocumentCommand{\lforeach}{O{,}mm}
 {% #1 = delimiter, #2 = list, #3 = code
  \seq_set_split:Nnn \l_andrew_foreach_seq { #1 } { #2 }
  \seq_map_inline:Nn \l_andrew_foreach_seq { #3 }
 }
\ExplSyntaxOff

\newcommand\Macro[1]{%
  \lforeach{#1}{%
    \blankTF{##1}{Empty!}{$|$##1$|$.}
  }
}

\begin{document}

\lforeach[-]{a-b--\texttt{c}}{%
    \blankTF{#1}{Empty!}{$|$#1$|$.}
  }

\lforeach{, ,,4, 5 ,5}{%
    \blankTF{#1}{Empty!}{$|$#1$|$.}
  }

\Macro{, ,,4, 5 ,5}

\end{document}

ingrese la descripción de la imagen aquí

El elemento actual del ciclo se indica con #1(que debe estar ##1en la definición de \Macro).

información relacionada