tikz \foreach 문 내에서 "빈" 요소를 감지하는 방법

tikz \foreach 문 내에서 "빈" 요소를 감지하는 방법

내용을 tikz 문에 제공하는 매크로를 정의하고 싶습니다 \foreach. 예를 들면 다음과 같습니다.

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

그런 다음 으로 사용됩니다 \Macro{1,2,3,4}. 때로는 "빈" 인수를 제공하고 싶습니다 \Macro{,,,4,5,5}. 나는 "빈" 인수를 감지하고 그러한 경우에 다른 작업을 수행할 수 있기를 원합니다. 나는 다음과 같은 것이 효과가 있을 것이라고 생각했습니다.

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

그러나 어떤 이유로 이것은 빈 인수를 감지하지 못하고 대신 다음을 생성합니다.

여기에 이미지 설명을 입력하세요

먼저 확장하는 등 다른 많은 것을 시도했지만 \x아직 작동하는 것을 찾지 못했습니다.

누구든지 이 작업을 수행하는 방법을 볼 수 있습니까?

[제 실제 코드는 tikzpicture환경을 생성하고 있어서 `tikz에서 꼭 사용하고 싶습니다 \foreach.]

답변1

이 같은?

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

여기에 이미지 설명을 입력하세요

답변2

질문의 매크로 문제는 다음과 같습니다.

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

이는 \detokenize인수를 확장하지 않고 두 개의 토큰 \과 를 반환한다는 것입니다 x. 이 문제는 다음을 추가하여 해결됩니다 \expandafter.

\detokenize\expandafter{\x}

전체 매크로:

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

답변3

필수 expl3답변( \detokenize\expandafter{\x}해결책이 될 것이라고 언급한 후):

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

여기에 이미지 설명을 입력하세요

주기의 현재 항목은 ( 의 정의에 #1있어야 함 )로 표시됩니다.##1\Macro

관련 정보