
Estou melhorando na criação de instâncias de \newcommand, mas acabei de chegar a uma parte em que meu conhecimento não é suficiente e também ler este site ou o manual não ajuda.
Basicamente, eu gostaria de criar um novo comando que defina um retângulo vertical dividido em 3 partes, até aí tudo bem, mas onde eu possa controlar se cada parte será preenchida com um booleano. O comando seria parecido (como imaginei, mas não tenho certeza se é viável):
\command{1, 0, 1};
Aqui a primeira e a terceira parte seriam preenchidas com uma cor (preto ou qualquer outra), a segunda permaneceria branca. Alternativamente, poderia ser \command{1}{0}{1};
para o mesmo resultado. Isso usaria três argumentos, mas não sei como separar os argumentos com vírgula, como mostrado acima.
O resultado seria algo assim:
Observe que eu gostaria que isso fosse dinâmico, ou seja, se eu disser 0,1,1
, as partes preenchidas seriam a segunda e a terceira, e assim por diante. Não consegui atingir nenhum nível, então não tenho um código para fornecer, mas aqui está um exemplo inicial para que você não precise reescrever todo o código (ignore as configurações que parecem desnecessárias aqui, elas são usado em outras partes do 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}
Responder1
Aqui está uma maneira de usar xparse
e l3prop
. O uso de l3prop
permite mais modificações.
Talvez a parte tikz possa ser melhorada ;-)
\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}
Aqui está uma solução 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}
É importante saber que dentro \ExplSyntaxOn
... \ExplSyntaxOff
todos os espaços são ignorados. Isso é explicado aqui:O que ExplSyntaxOn e ExplSyntaxOff fazem?. Portanto, você não pode usar opções do TikZ como minimum with
Você pode desativar temporariamente esse comportamento conforme descrito nela:Texto dentro de ExplSyntaxOn/Offou faça a configuração externa.
Conforme mencionado por egreg: Se você quiser usar algumas opções do TikZ que requerem espaço, você pode usar o símbolo ~
. Que significa:
\draw[fill=\prop_get:Nn \l_alenanno_color_prop { #3 },rounded~corners] (0,2) rectangle (1,3);
Responder2
Eu precisaria de mais ajuda no MWE para fazer isso com o Tikz, mas aqui está a parte do teste :-)
\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}
Responder3
Por que desperdiçar elétrons e usar uma lista de vírgulas? 010
transmite a mesma informação. Aqui está uma solução curta. Se você insiste em vírgulas, mude @tfor
para @for
. A solução é extensível, use quantos 0s ou 1s desejar.
\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}
Postei uma solução para ilustrar que é sempre melhor generalizar o problema. Também é melhor IMHO evitar bibliotecas pesadas quando existem soluções mais simples.