
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:
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 xparse
y l3prop
. El uso de l3prop
permite 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}
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
… \ExplSyntaxOff
se ignoran todos los espacios. Esto se explica aquí:¿Qué hacen ExplSyntaxOn y ExplSyntaxOff?. Por lo tanto, no puedes usar opciones de TikZ como minimum with
Puedes 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 :-)
\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? 010
transmite la misma información. Aquí hay una breve solución. Si insiste en las comas, cámbiela @tfor
a @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}
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.