\newcommand 和布林語句

\newcommand 和布林語句

我在創建 \newcommand 實例方面做得越來越好,但我剛剛到達了我的知識還不夠的部分,並且閱讀此網站或手冊也沒有幫助。

基本上我想建立一個新命令,設定一個分為三部分的垂直矩形,到目前為止一切順利,但我可以控制每個部分是否填入布林值。該命令看起來像(正如我所設想的,但我不確定它是否可行):

\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您可以暫時停用此行為,如她所述:ExplSyntaxOn/Off 內的文本或在室外進行設定。

正如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。解決方案是可擴展的,可以使用任意數量的 0 或 1。

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

在此輸入影像描述

發布一個解決方案來說明,概括問題總是最好的。恕我直言,當有更簡單的解決方案時,最好避免使用重量級函式庫。

相關內容