\newcommand und Boolesche Anweisungen

\newcommand und Boolesche Anweisungen

Ich werde immer besser darin, \newcommand-Instanzen zu erstellen, bin aber gerade an einem Punkt angelangt, wo meine Kenntnisse einfach nicht mehr ausreichen und auch das Lesen dieser Site oder des Handbuchs hilft nicht weiter.

Im Grunde möchte ich einen neuen Befehl erstellen, der ein vertikales Rechteck in drei Teile aufteilt, soweit so gut, aber bei dem ich steuern kann, ob jeder Teil mit einem Booleschen Wert gefüllt wird. Der Befehl würde so aussehen (wie ich es mir vorgestellt habe, aber ich bin nicht sicher, ob es machbar ist):

\command{1, 0, 1};Hier würden der erste und dritte Teil mit einer Farbe (schwarz oder was auch immer) gefüllt, der zweite Teil würde weiß bleiben. Alternativ könnte es \command{1}{0}{1};dasselbe Ergebnis bringen. Dies würde drei Argumente verwenden, aber ich weiß nicht, wie man Argumente wie oben gezeigt mit dem Komma trennt.

Das Ergebnis sähe ungefähr so ​​aus:

Bildbeschreibung hier eingeben

Beachten Sie, dass ich dies dynamisch gestalten möchte, d. h. wenn ich sage 0,1,1, wären die ausgefüllten Teile der zweite und dritte und so weiter. Ich habe es nicht geschafft, irgendeine Ebene zu erreichen, daher kann ich keinen Code bereitstellen, aber hier ist ein erstes Beispiel, damit Sie nicht den gesamten Code neu schreiben müssen (ignorieren Sie die Einstellungen, die hier unnötig erscheinen, sie werden in anderen Teilen des Dokuments verwendet):

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

Antwort1

Hier eine Möglichkeit mit xparseund l3prop. Die Verwendung von l3propermöglicht weitere Modifikationen.

Vielleicht kann der Tikz-Teil verbessert werden ;-)

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

Bildbeschreibung hier eingeben


Hier eine Lösung mit \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}

Wichtig zu wissen ist, dass innerhalb von \ExplSyntaxOn... \ExplSyntaxOffalle Leerzeichen ignoriert werden. Dies wird hier erklärt:Was machen ExplSyntaxOn und ExplSyntaxOff?. Sie können TikZ-Optionen wie diese nicht verwenden. minimum withSie können dieses Verhalten vorübergehend deaktivieren, wie hier beschrieben:Text innerhalb von ExplSyntaxEin/Ausoder führen Sie die Einstellung im Freien durch.

Wie von egreg erwähnt: Wenn Sie einige TikZ-Optionen verwenden möchten, die ein Leerzeichen erfordern, können Sie das Symbol verwenden ~. Das bedeutet:

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

Antwort2

Um das mit Tikz zu machen, hätte ich im MWE mehr Hilfe gebraucht, aber hier ist der Testteil:-)

Bildbeschreibung hier eingeben

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

Antwort3

Warum Elektronen verschwenden und eine Kommaliste verwenden? 010vermittelt die gleiche Information. Hier ist eine kurze Lösung. Wenn Sie auf Kommas bestehen, ändern Sie @tforzu @for. Die Lösung ist erweiterbar, verwenden Sie so viele 0en oder 1en, wie Sie möchten.

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

Bildbeschreibung hier eingeben

Habe eine Lösung gepostet, um zu veranschaulichen, dass es immer am besten ist, das Problem zu verallgemeinern. Meiner Meinung nach ist es auch am besten, schwergewichtige Bibliotheken zu vermeiden, wenn es einfachere Lösungen gibt.

verwandte Informationen