\newcommand y declaraciones booleanas

\newcommand y declaraciones booleanas

Estoy mejorando en la creación de instancias de \newcommand pero acabo de llegar a una parte en la que mis conocimientos no son suficientes y además leer este sitio o el manual no ayuda.

Básicamente, me gustaría crear un nuevo comando que establezca un rectángulo vertical dividido en 3 partes, hasta ahora todo bien, pero donde puedo controlar si cada parte se llena con un valor booleano. El comando se vería así (como lo imaginé pero no estoy seguro de que sea factible):

\command{1, 0, 1};Aquí la primera y tercera parte se rellenarían con un color (negro o lo que sea), la segunda permanecería blanca. Alternativamente, podría ser \command{1}{0}{1};para el mismo resultado. Esto usaría tres argumentos, pero no sé cómo separar los argumentos con la coma como se muestra arriba.

El resultado sería algo como esto:

ingrese la descripción de la imagen aquí

Tenga en cuenta que me gustaría que esto fuera dinámico, es decir, si digo 0,1,1, las partes rellenas serían la segunda y la tercera, y así sucesivamente. No logré alcanzar ningún nivel, así que no tengo un código para proporcionar, pero aquí hay un ejemplo inicial para que no necesites reescribir todo el código (ignora las configuraciones que parecen innecesarias aquí, son utilizado en otras partes del documento):

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

Respuesta1

Aquí una forma de usar xparsey l3prop. El uso de l3proppermite más modificaciones.

Quizás la parte tikz pueda mejorarse ;-)

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

ingrese la descripción de la imagen aquí


Aquí una solución usando \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}

Es importante saber que en el interior \ExplSyntaxOn\ExplSyntaxOffse ignoran todos los espacios. Esto se explica aquí:¿Qué hacen ExplSyntaxOn y ExplSyntaxOff?. Por lo tanto, no puedes usar opciones de TikZ como minimum withPuedes desactivar temporalmente este comportamiento como se describe a ella:Texto dentro de ExplSyntaxOn/Offo haz la configuración afuera.

Como lo mencionó egreg: si desea usar algunas opciones de TikZ que requieren un espacio, puede usar el símbolo ~. Eso significa:

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

Respuesta2

Habría necesitado más ayuda en MWE para hacerlo con Tikz, pero aquí está la parte de prueba :-)

ingrese la descripción de la imagen aquí

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

Respuesta3

¿Por qué desperdiciar electrones y utilizar una lista de comas? 010transmite la misma información. Aquí hay una breve solución. Si insiste en las comas, cámbiela @tfora @for. La solución es extensible, utilice tantos 0 o 1 como desee.

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

ingrese la descripción de la imagen aquí

Publicé una solución para ilustrar que siempre es mejor generalizar el problema. En mi humilde opinión, también es mejor evitar bibliotecas pesadas cuando existen soluciones más simples.

información relacionada