この例は実際に必要な長さよりもずっと長いのですが、今はそれを短縮する時間がありません (申し訳ありません)。
この例のすべてが期待通りに動作するを除外するmy fill
キーとして定義されるはずのキー。.is choice
しかし、コンパイルしようとすると、LaTeXは次のようにエラーを出します。
! Package pgfkeys Error: I do not know the key '/tikz/my fill=blue' and I am go
ing to ignore it. Perhaps you misspelled it.
my fill=<color>
の各出現をに置き換えるとmy <color>
、コードは正しくコンパイルされます。
%-*-mode:LaTeX-*-
\documentclass[border=8]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{arrows.meta}
\usepackage{etoolbox}
\let\x\expandafter
\makeatletter
%-@-(1)---------------------------------------------------------------------
\long\def\if@node@defined(#1)#2#3{%%
\@ifundefined{pgf@sh@ns@#1}%%
{#3}%% FALSE: "yes" it's undefined
{#2}}% TRUE: "no" it's not undefined
\def\ifsquarenodedefined#1{%%
\x\let\x\ae@tmp\csname ae@#1@node\endcsname
\x\if@node@defined\x(\ae@tmp){\booltrue{#1.bool}}{\boolfalse{#1.bool}}}
\providebool{nw.bool}
\providebool{ne.bool}
\providebool{sw.bool}
\providebool{se.bool}
%-@-(2)---------------------------------------------------------------------
%% First call the function to read the "optional" arguments, which really
%% aren't so optional. The optional arguments should be passed as
%% [#1;#2;#3] where #1 is actually required.
\newcommand\aesquare{\ae@square}
%% #1=nw,ne,se,sw ==> set the right angle for the triangle to be colored
%% #2=sets the optional arguments to be passed to the draw command.
%% #3=sets the optional arguments to be passed to the fill command.
\def\ae@square[#1;#2;#3]{%%
\def\@@ae@corner{#1}%%
\def\@@ae@draw{#2}%%
\def\@@ae@fill{#3}
\@ae@square}
%% This next macro is the meat of the business. It will only draw and fill
%% the triangle defined by the passed nodes if, in fact, the nodes are
%% already defined.
\def\@ae@square(#1,#2,#3){%%
%%
\pgfmathsetmacro\ae@node@nx{int(#2+1)}%%
\pgfmathsetmacro\ae@node@ny{int(#3-1)}%%
%% set the macros that `\ifsquarenodedefined` expects to already be
%% defined.
\edef\ae@nw@node{A#2#3}%%
\edef\ae@ne@node{A\ae@node@nx#3}%%
\edef\ae@se@node{A\ae@node@nx\ae@node@ny}%%
\edef\ae@sw@node{A#2\ae@node@ny}%%
%% set the booleans that will be tested next.
\ifsquarenodedefined{nw}%%
\ifsquarenodedefined{ne}%%
\ifsquarenodedefined{se}%%
\ifsquarenodedefined{sw}%%
%% only draw and fill a triangle if the corners are all properly defined.
\ifboolexpr{
bool {nw.bool} and
bool {ne.bool} and
bool {se.bool} and
bool {sw.bool} }
{
\x\ifstrequal\x{\@@ae@corner}{nw}{\ae@set{a}{sw}\ae@set{b}{nw}\ae@set{c}{ne}}{}
\x\ifstrequal\x{\@@ae@corner}{ne}{\ae@set{a}{nw}\ae@set{b}{ne}\ae@set{c}{se}}{}
\x\ifstrequal\x{\@@ae@corner}{se}{\ae@set{a}{ne}\ae@set{b}{se}\ae@set{c}{sw}}{}
\x\ifstrequal\x{\@@ae@corner}{sw}{\ae@set{a}{se}\ae@set{b}{sw}\ae@set{c}{nw}}{}
\draw[\@@ae@draw] (\ae@a) -- (\ae@b) -- (\ae@c) -- cycle;
\fill[\@@ae@fill] (\ae@a) -- (\ae@b) -- (\ae@c) -- cycle;
}{}}
\def\ae@set#1#2{%%
\x\edef\csname ae@#1\endcsname{\csname ae@#2@node\endcsname}}
\makeatother
\begin{document}%%'
\begin{tikzpicture}[my dot/.style={fill,circle,inner sep=1.5pt},>={To[scale=2]},
my colors/.style={
my gray/.style={gray},
my blue/.style={blue!30},
my red/.style={red},
my green/.style={green},
},
my same colors/.style={
my gray/.style={gray},
my blue/.style={gray},
my red/.style={gray},
my green/.style={gray},
},
my fill/.is choice,
my fill/blue/.style={my blue},
my fill/gray/.style={my gray},
my fill/red/.style={my red},
my fill/green/.style={my green},
my draw/.style={line width=0.8pt},
my colors,
x=1.5cm,y=1.5cm
]
\coordinate (A11) at (0,0);
\foreach \myx in {0,...,6}
{
\foreach \myy in {0,...,6}
{
\coordinate (A\myx\myy) at (\myx,\myy);
}
}
\foreach \myx in {0,...,6}
{
\foreach \myy in {0,...,6}
{
\pgfmathsetmacro\aeinta{int(\myx)}%%
\pgfmathsetmacro\aeintb{int(\myy)}%%
\ifnumcomp{\aeinta}{<}{3}
{
\ifnumcomp{\aeintb}{<}{4}
{
\aesquare[ne;my draw;my fill=blue](A,\myx,\myy)
}
{
\aesquare[se;my draw;my fill=red](A,\myx,\myy)
}
}
{
\ifnumcomp{\aeintb}{<}{4}
{
\aesquare[nw;my draw;my fill=green](A,\myx,\myy)
}
{
\aesquare[sw;my draw;my fill=gray](A,\myx,\myy)
}
}
}
}
\draw[my draw] (A00) rectangle (A66);
\end{tikzpicture}
\end{document}%%'
選択キーを正しく動作させる方法を誰か説明してもらえますか?
正常に動作し、キーがmy colors
選択されると、結果は次のようになります。
答え1
.is choice
あなたの問題は( によって使用)とは関係ありませんmy fill=blue
。 でも同じエラーが発生しますfill=blue
。あなたの問題は、pgfkey によるマクロの展開に関連しています。pgfkey はキー を認識しますが、値 を持つmy flll=blue
キーは認識しません。my fill
blue
最初の解決策:
交換する :
\fill[\@@ae@fill]...
による:
\expandafter\fill\expandafter[\@@ae@fill]...
2番目の解決策:
交換する:
\def\@@ae@fill{#3}
による:
\tikzset{@@ae@fill/.style={#3}}
次に、次のものを置き換えます。
\fill[\@@ae@fill]...
による:
\fill[@@ae@fill]...