
내용을 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
답변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