\newcommand и логические операторы

\newcommand и логические операторы

Я становлюсь лучше в создании экземпляров \newcommand, но я только что достиг той части, где моих знаний просто недостаточно, а чтение этого сайта или руководства не помогает.

В принципе, я хотел бы создать новую команду, которая устанавливает вертикальный прямоугольник, разделенный на 3 части, пока все хорошо, но где я могу контролировать, заполняется ли каждая часть булевым значением. Команда будет выглядеть так (как я себе это представлял, но не уверен, что это осуществимо):

\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Вы можете временно отключить это поведение, как она описала:Текст в ExplSyntaxВкл/Выклили выполните настройку снаружи.

Как отметил egreg: Если вы хотите использовать некоторые опции TikZ, требующие пробела, вы можете использовать символ ~. Это означает:

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

решение2

Мне бы потребовалась дополнительная помощь в MWE, чтобы сделать это с Tikz, но вот часть тестирования:-)

введите описание изображения здесь

\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. Решение расширяемое, используйте столько нулей или единиц, сколько захотите.

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

введите описание изображения здесь

Опубликовал решение, чтобы проиллюстрировать, что всегда лучше обобщить проблему. Также лучше избегать тяжеловесных библиотек, когда существуют более простые решения.

Связанный контент