
내가 작성한 프로그램에서 자동으로 생성된 일부 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 매크로에 저장한 다음 다시 정의하면 동일한 매크로가 재활용되므로 더 많은 메모리를 사용하지 않습니다.
\defincolor
그러나 PDF 엔진의 색상을 정의하는 일종의 문자 그대로 PDF 코드를 푸시하는 것도 가능합니다 . 이 경우, 내가 아는 한, 동일한 색상을 여러 번 재정의하는 데 더 이상 메모리를 사용해서는 안 됩니다.
어쨌든 만일의 경우에는 사전 정의 없이 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
구성 요소에 대한 세 개의 숫자 값을 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의 한계에 도달할 수 있습니다. 하나의 이미지가 작동하지만 둘 이상의 이미지가 실패하는 경우 이미지 외부화를 사용하면 이점을 얻을 수 있습니다. as lualatex
대신 동적 메모리 할당을 사용하면 이점을 얻을 수도 있습니다 . 또한 인접한 사이 에서도 실험해야 합니다.pdflatex
lualatex
\clearpage
figure
. 또한 TeX의 메모리에 오래된 수치가 없는지 확인하기 위해 (@JLDiaz가 주석에서 제안한 대로). 이미지 외부화 및 메모리 소비에 대한 세부 정보는 "메모리 및 속도 고려 사항" 섹션에 요약되어 있습니다.http://pgfplots.sourceforge.net/pgfplots.pdf
답변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}