
私が書いたプログラムから自動的に生成された TikZ 画像がいくつか含まれた文書があります。すべての画像は非常に似ており、それぞれにさまざまな任意の RGB カラーの多数の四角形が含まれています。私の質問は次のとおりです。この多数の正方形すべてを色付けする最善の方法は何でしょうか?
これまで私が使用してきた方法は、各四角形を描く前にfillcolor
マクロを使用して色を定義し\definecolor
、その色を使用して四角形を塗りつぶすというものでした。つまり、新しい四角形を描くたびに、fillcolor
再度定義することになります。
しかし、それが正しい方法かどうかはよくわかりません。pdflatex はドキュメントをコンパイルするときに大量のメモリを必要とするようで、何らかの奇妙な理由で、5 枚以上の画像を含めるとメモリが不足します (画像を 5 枚から 6 枚に増やすときにメモリの量を 10 倍に増やしても)。定義したすべての色が格納され、再度fillcolor
呼び出す前に pdflatex に「忘れさせる」必要がある可能性はありますか\definecolor
?
アップデート:以下は、ドキュメントに含めたい TikZ 画像の例です (有限体積法と流体体積法を使用した 2 相流体シミュレーションの相分率フィールドの視覚化です。流体インターフェースが必ずしも鮮明ではないことは承知しています)。
この特定の画像は、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}]
黄色ではなく、黒がかった黄色を生成します (下の図を参照)。この指定がどのように機能するかについてのドキュメントは見つかりませんでした。どうやら、すべてのred
、green
、 のblue
値が合計され、次に各値が合計で割られるようです。つまり、指定するのは絶対バイト値ではなく、相対重みです。したがって、黄色を取得するには、 と記述します。{rgb:red,1;green:1;blue:-1}
この構文はかなり不便だと思います (さらに、どうすれば「白」を取得できるのでしょうか)。\pgfsys@color@rgb@fill
PGF は、期待どおりの動作をする内部マクロを使用します。r
、g
、 の各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 が示唆したように)。画像の外部化とメモリ消費の詳細については、の「メモリと速度の考慮事項」セクションにまとめられています。pdflatex
lualatex
\clearpage
figure
出典: 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}