TikZ 画像で多数の任意の RGB カラーを使用するにはどうすればよいでしょうか?

TikZ 画像で多数の任意の RGB カラーを使用するにはどうすればよいでしょうか?

私が書いたプログラムから自動的に生成された TikZ 画像がいくつか含まれた文書があります。すべての画像は非常に似ており、それぞれにさまざまな任意の RGB カラーの多数の四角形が含まれています。私の質問は次のとおりです。この多数の正方形すべてを色付けする最善の方法は何でしょうか?

これまで私が使用してきた方法は、各四角形を描く前にfillcolorマクロを使用して色を定義し\definecolor、その色を使用して四角形を塗りつぶすというものでした。つまり、新しい四角形を描くたびに、fillcolor再度定義することになります。

しかし、それが正しい方法かどうかはよくわかりません。pdflatex はドキュメントをコンパイルするときに大量のメモリを必要とするようで、何らかの奇妙な理由で、5 枚以上の画像を含めるとメモリが不足します (画像を 5 枚から 6 枚に増やすときにメモリの量を 10 倍に増やしても)。定義したすべての色が格納され、再度fillcolor呼び出す前に pdflatex に「忘れさせる」必要がある可能性はありますか\definecolor?

アップデート:以下は、ドキュメントに含めたい TikZ 画像の例です (有限体積法と流体体積法を使用した 2 相流体シミュレーションの相分率フィールドの視覚化です。流体インターフェースが必ずしも鮮明ではないことは承知しています)。

異なる色の 1990 個の正方形を含む TikZ 画像

この特定の画像は、1990 個の塗りつぶされた正方形と 4 個の塗りつぶされていない正方形で構成されています。

まず、各正方形に対してfillcolorが で定義され\definecolor、正方形はその色で塗りつぶされます。

\definecolor{fillcolor}{rgb}{1.000000,0.241735,0.000000}
\fill[fillcolor] (0.203125,0.578125) rectangle (0.218750,0.593750);

次に各正方形の辺を描きます。例えば

\draw (0.203125,0.578125) rectangle (0.218750,0.593750);

答え1

コメントで述べたように、\definecolorが単に色の定義を TeX マクロに格納する場合、それを再定義しても同じマクロが再利用されるため、メモリが余分に使用されることはありません。

ただし、PDF エンジンの色を定義する何らかのリテラル PDF コードをプッシュしている可能性もあります\defincolor。この場合、私が理解している限りでは、同じ色を何度も再定義するためにメモリが使用されることもないはずです。

とにかく、念のため、事前の定義なしで RGB カラーを使用することは可能です。方法は次のとおりです。

  • 原則として、tikzは という形式の色指定を認識します{rgb:red,255;green,255;blue:255}。しかし、これは期待通りには解釈されません。たとえば、 は[fill={rgb:red,255;green,255;blue,0}]黄色ではなく、黒がかった黄色を生成します (下の図を参照)。この指定がどのように機能するかについてのドキュメントは見つかりませんでした。どうやら、すべてのredgreen、 のblue値が合計され、次に各値が合計で割られるようです。つまり、指定するのは絶対バイト値ではなく、相対重みです。したがって、黄色を取得するには、 と記述します。{rgb:red,1;green:1;blue:-1}この構文はかなり不便だと思います (さらに、どうすれば「白」を取得できるのでしょうか)。

  • \pgfsys@color@rgb@fillPGF は、期待どおりの動作をする内部マクロを使用します。 rg、 の各bコンポーネントの 3 つの数値を 0 ~ 255 の値として受け取ります。したがって、このマクロを使用して、塗りつぶしコマンドの直前に塗りつぶし色を設定できます。

いくつかのオプションを示すコードは次のとおりです。

\documentclass{article}
\usepackage{tikz}

% Define a more convenient macro without @ in its name
\makeatletter
\def\fillRGB#1#2#3{\pgfsys@color@rgb@fill{#1}{#2}{#3}}
\makeatother
\begin{document}

% Standard xcolor defined color
\definecolor{RGByellow}{RGB}{255,255,0}

% Some examples
\tikz{\node[draw,fill=RGByellow]{defined colour};}

\tikz{\node[draw,fill={rgb:red,255;green,255;blue,0}]{Tikz rgb: 255,255,0};}

\tikz{\node[draw,fill={rgb:red,1;green,1;blue,-1}]{Tikz rgb: 1,1,-1};}

\tikz{\fillRGB{255}{255}{0}\node[fill,draw]{{\tt fillRGB: 255,255,0} };}

\end{document}

結果:

結果

答え2

\definecolorあなたのアプローチは問題ないと思います。

私の提案は、tikzではなくPGF基本レイヤーを使用することです。つまり、次のようなものを使用することです。

\definecolor{fillcolor}{...}
\pgfsetfillcolor{fillcolor}
\pgfsetstrokecolor{fillcolor!80!black}
\pgfpathrectangle{...}{...}
\pgfusepathqfillstroke
% next one, no scope in-between...
\definecolor{fillcolor}{...}
\pgfsetfillcolor{fillcolor}
\pgfsetstrokecolor{fillcolor!80!black}
\pgfpathrectangle{...}{...}
\pgfusepathqfillstroke

いくつかのコマンドはスペルミスしている可能性がありますので (暗記して引用しました)、pgfmanual.pdf に記載されているコマンドを調べてください。

ストロークと塗りつぶしパスを組み合わせて色だけを変えるという私の提案は、あなたにとって意味があるかもしれませんし、tikz パスにも適用できるかもしれません。これにより、メモリ消費量とタイプセット時間も削減されるはずです。

質問の範囲外ですが、私の提案は描画色を使うことです。これはfillcolor!80!blackデフォルトの色にヒントを得たものですpgfplots。黒いアウトラインに比べて目立たない色だと思います。また、pgfplots にはここでと同じ使用例があります。ここで記述しているのは、実際にはファセットシェーディングと明示的な色入力を備えたメッシュ/サーフェスの一種です (pgfplots: と\addplot3[surf]比較してください) 。pgfplots: 任意の RGB カラーを使用して (3D) サーフに色を付ける) 。

メモリ削減後でも、データ ポイントは「たくさん」あります (TeX が処理できる量という意味で)。そのため、メモリ削減後でも、最終的には TeX の限界に達する可能性があります。1 つの画像が機能するが、複数の画像が機能しない場合は、画像の外部化を使用すると効果的です。のlualatex代わりにを使用すると、動的メモリ割り当てが効果的です。また、隣接する環境間で を試して、TeX がメモリに古い図を保持しないようにする必要があります (コメントで @JLDiaz が示唆したように)。画像の外部化とメモリ消費の詳細については、の「メモリと速度の考慮事項」セクションにまとめられています。pdflatexlualatex\clearpagefigure出典: http://www.sourceforge.net/pgfplots

答え3

赤と青(オレンジ、黄色、緑、シアン経由)の間の滑らかでシンプルな陰影を作成するには、Hsbカラー モデル(xcolorパッケージによって提供)を使用できます。

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \foreach \x in {0,...,9}{
    \foreach \y in {0,...,9}{
      \pgfmathtruncatemacro{\myhue}{(\y*10+\x)*2.5}
      \definecolor{col}{rgb:Hsb}{\myhue,1,1}
      \draw[fill=col] (\x,\y) rectangle ++(1,1);
    }
  }
\end{tikzpicture}
\end{document}

または(別の構文を使用):

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \colorlet{redhsb}[hsb]{red}%
  \colorlet{bluehsb}[hsb]{blue}%
  \foreach \x in {0,...,9}{
    \foreach \y in {0,...,9}{
      \pgfmathtruncatemacro{\rat}{\y*10+\x}
      \colorlet{col}[rgb]{bluehsb!\rat!redhsb}
      \draw[fill=col] (\x,\y) rectangle ++(1,1);
    }
  }
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

この方法は、多数の小さな正方形 (ここでは 100 x 100) に使用できます。

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \colorlet{redhsb}[hsb]{red}%
  \colorlet{bluehsb}[hsb]{blue}%
  \foreach \x in {0,...,100}{
    \foreach \y in {0,...,100}{
      \pgfmathtruncatemacro{\rat}{(cos(\x*4)+sin(\y*4))*25+50}
      \colorlet{col}[rgb]{bluehsb!\rat!redhsb}
      \draw[fill=col,line width=.1pt] (\x*.1,\y*.1) rectangle ++(.1,.1);
    }
  }
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

関連情報