我越来越擅长创建 \newcommand 实例,但我刚刚到达我的知识还不够的阶段,而且阅读本网站或手册也无济于事。
基本上,我想创建一个新命令,将垂直矩形分成 3 个部分,到目前为止一切顺利,但我可以控制每个部分是否用布尔值填充。该命令看起来像(正如我所设想的那样,但我不确定它是否可行):
\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}
发布了一个解决方案来说明将问题概括化总是最好的。在我看来,当存在更简单的解决方案时,最好避免使用重量级库。