\newcommand 및 부울 명령문

\newcommand 및 부울 명령문

나는 \newcommand 인스턴스를 만드는 데 점점 나아지고 있지만 내 지식만으로는 충분하지 않고 이 사이트나 매뉴얼을 읽는 것도 도움이 되지 않는 부분에 도달했습니다.

기본적으로 수직 직사각형을 세 부분으로 분할하는 새 명령을 만들고 싶습니다. 지금까지는 괜찮았지만 각 부분이 부울로 채워질지 여부를 제어할 수 있습니다. 명령은 다음과 같습니다(제가 구상했지만 실행 가능한지는 잘 모르겠습니다).

\command{1, 0, 1};여기서 첫 번째와 세 번째 부분은 색상(검은색 등)으로 채워지고 두 번째 부분은 흰색으로 유지됩니다. 또는 \command{1}{0}{1};동일한 결과가 나올 수도 있습니다. 이것은 세 개의 인수를 사용하지만 위에 표시된 것처럼 인수를 쉼표로 구분하는 방법을 모르겠습니다.

결과는 다음과 같습니다.

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

나는 이것을 동적으로 원한다는 점에 유의하십시오. 즉, 라고 말하면 0,1,1채워진 부분은 두 번째와 세 번째 등이 될 것입니다. 어떤 수준에도 도달하지 못했기 때문에 제공할 코드가 없지만 여기에 시작 예제가 있으므로 모든 코드를 다시 작성할 필요가 없습니다(여기서 불필요해 보이는 설정은 무시하세요. 문서의 다른 부분에서 사용됨):

\documentclass[10pt]{article}
\usepackage[a4paper, margin=3mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{rotating}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{tikz}

\usetikzlibrary{fit, arrows,backgrounds,patterns,shapes,shapes.multipart,positioning,calc,decorations.markings}

\begin{document}

    \begin{tikzpicture}
            \centering


    \end{tikzpicture}

\end{document}

답변1

xparse여기에 및 을 사용하는 방법이 있습니다 l3prop. 를 사용하면 l3prop더 많은 수정이 가능합니다.

아마도 tikz 부분이 개선될 수 있을 것입니다 ;-)

\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{xparse,expl3}

\ExplSyntaxOn
\prop_new:N \l_alenanno_color_prop
\prop_put:Nnn \l_alenanno_color_prop {0} {white}
\prop_put:Nnn \l_alenanno_color_prop {1} {black}

\NewDocumentCommand {\command} { > { \SplitArgument { 2 } { , } } m }
 {
  \alenanno_command_aux:nnn #1 
 }

\cs_new:Npn \alenanno_command_aux:nnn #1 #2 #3
 {
  \begin{tikzpicture}
   \draw[fill=\prop_get:Nn \l_alenanno_color_prop { #1 }] (0,0) rectangle (1,1);
   \draw[fill=\prop_get:Nn \l_alenanno_color_prop { #2 }] (0,1) rectangle (1,2);
   \draw[fill=\prop_get:Nn \l_alenanno_color_prop { #3 }] (0,2) rectangle (1,3);
  \end{tikzpicture}
 }

\ExplSyntaxOff


\begin{document}
\command{1,0,1} \command{0,0,1} \command{0,1,1}
\end{document}

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


다음을 사용하는 솔루션은 다음과 같습니다 \node.

\documentclass[10pt]{article}
\usepackage{tikz}
\tikzset{mynodestyle/.style={minimum height=1cm,minimum width=1cm,outer sep=0pt,rectangle,draw=black}}
\usepackage{xparse,expl3}

\ExplSyntaxOn
\prop_new:N \l_alenanno_color_prop
\prop_put:Nnn \l_alenanno_color_prop {0} {white}
\prop_put:Nnn \l_alenanno_color_prop {1} {black}

\NewDocumentCommand {\command} { > { \SplitArgument { 2 } { , } } m }
 {
  \alenanno_command_aux:nnn #1 
 }

\cs_new:Npn \alenanno_command_aux:nnn #1 #2 #3
 {
  \begin{tikzpicture}
   \node[mynodestyle, fill=\prop_get:Nn \l_alenanno_color_prop { #2 }] (P) {};
   \node[mynodestyle, fill=\prop_get:Nn \l_alenanno_color_prop { #1 },anchor=south] at (P.north) {};
   \node[mynodestyle, fill=\prop_get:Nn \l_alenanno_color_prop { #3 },anchor=north] at (P.south) {};
  \end{tikzpicture}
 }
\ExplSyntaxOff


\begin{document}
\command{1,0,1} \command{0,0,1} \command{0,1,1} \command{0,0,0}
\end{document}

\ExplSyntaxOn내부 의 \ExplSyntaxOff모든 공백은 무시된다는 점을 아는 것이 중요합니다 . 여기에 설명되어 있습니다.ExplSyntaxOn과 ExplSyntaxOff는 무엇을 합니까?. 따라서 다음과 같은 TikZ 옵션을 사용할 수 없습니다. minimum with설명된 대로 이 동작을 일시적으로 비활성화할 수 있습니다.ExplSyntaxOn/Off 내 텍스트아니면 밖에서 설정을 하세요.

egreg에서 언급했듯이 공백이 필요한 일부 TikZ 옵션을 사용하려면 기호를 사용할 수 있습니다 ~. 그 의미는:

\draw[fill=\prop_get:Nn \l_alenanno_color_prop { #3 },rounded~corners] (0,2) rectangle (1,3);

답변2

Tikz로 이를 구현하려면 MWE에서 더 많은 도움이 필요했지만 테스트 부분은 다음과 같습니다.

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

\documentclass[10pt]{article}


\def\command#1{\xcommand#1\relax}
\def\xcommand#1,#2,#3\relax{%
\begin{tabular}{|l|}
\relax\ifnum#1>0 \leaders\vline\fi\hskip 1em\mbox{}\\
\relax\ifnum#2>0 \leaders\vrule\fi\hskip 1em\mbox{}\\
\relax\ifnum#3>0 \leaders\vrule\fi\hskip 1em\mbox{}%
\end{tabular}}

\begin{document}

\command{1,0,1}

\bigskip

\command{0,1,0}


\end{document}

답변3

왜 전자를 낭비하고 쉼표 목록을 사용합니까? 010같은 정보를 전달합니다. 여기에 짧은 해결책이 있습니다. 쉼표를 고집하는 경우 로 변경 @tfor하세요 @for. 솔루션은 확장 가능합니다. 원하는 만큼 0 또는 1을 사용하세요.

\documentclass{article}
\usepackage{xcolor}
\fboxsep0pt
\makeatletter
\def\roll#1{%
\def\boxblack{\rule{1cm}{1cm}}%
\def\boxwhite{{\color{white}\rule{1cm}{1cm}}}%
\fbox{\parbox{1cm}{%
\@tfor\next:=#1\do{%
   \ifnum\next=0\boxblack\else\boxwhite\fi%
\par
}}}}
\makeatother
\begin{document}
\roll{01010}
\end{document}

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

문제를 일반화하는 것이 항상 최선임을 설명하는 솔루션을 게시했습니다. 더 간단한 솔루션이 존재할 때 무거운 라이브러리를 피하는 것이 가장 좋습니다.

관련 정보