不能。一个路径只能有一个颜色。似乎pdf格式就是这样的,记不准确了。
不能。一个路径只能有一个颜色。似乎pdf格式就是这样的,记不准确了。
你需要重新定义 \tdplotdefinepoints
.
你可能需要了解 \tikz@scan@one@point
, 以及 TikZ 的代表 xyz 坐标系的矩阵, 代表 canvas 坐标系的矩阵.
简单说, TikZ 会把 (1,2,3)
这样的坐标通过矩阵乘法, 转换为 canvas 坐标系中的二维坐标数据. 像 (A)
这样的坐标位置实际上也是二维的. 你想要的就是这个过程的逆过程, 也就是把二维的数据再变成对应的三维坐标数据, 这需要计算 canvas 坐标系矩阵的逆矩阵(参考 \pgftransforminvert
). 另外 TikZ 的 xyz 坐标系的矩阵实际是利用 3 个二维向量模拟三维标架(可以认为是2行3列的矩阵), 所以这个逆过程似乎比较困难.
可以用其他办法, 例如, 直接把 (A)
与 (1,2,3)
联系起来,
\makeatletter
\def\savemycoord(#1)(#2){
\expandafter\def\csname my@coord@(1)\endcsname{(#2)}
}
\def\readmycoord(#1){
\edef\tempsave{\csname my@coord@(#1)\endcsname}
}
这样定义后,
\savemycoord(A)(1,2,3)
\readmycoord(A)
就会把 (1,2,3)
保存到 \tempsave
.
编译下面的代码
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{plotmarks}
\usepackage{tikz-3dplot}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3 [
domain=0:1,
samples=10,
contour/number=5,
contour gnuplot,
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\end{axis}
\begin{axis}
\addplot3 [
domain=0:1,
samples=10,
contour gnuplot={contour dir=y,levels=0.5},
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\end{axis}
\end{tikzpicture}
\end{document}
后, 在主文件目录下会有两个 .table
文件, 其中就是绘制等高线的数据, 如果不嫌麻烦的话, 可以利用这些数据绘制需要的图形. 问题中的图形是平面图形, 只用到 .table
文件中的第一, 第二列数据.
如果觉得图形不够精确, 可以尝试增加 sample 的数量.
这个图就是下面的代码. 使用 LuaLaTeX 编译, 如果觉得编译太慢, 请事先修改选项 samples
的值.
各个选项的用法可以参考 pgfplots 手册.
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{plotmarks}
\usepackage{tikz-3dplot}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
samples=100,
width=30cm,
xmin=-1,xmax=2,
ymin=-1,ymax=2,
zmin=-2,zmax=2,
contour/number=10
]
\addplot3 [
domain=0:1,
contour lua,
z filter/.code={\def\pgfmathresult{-2}},
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\addplot3 [
domain=0:1,
contour lua={contour dir=x},
x filter/.code={\edef\pgfmathresult{-1}},
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\addplot3 [
domain=0:1,
contour lua={contour dir=y},
y filter/.code={\edef\pgfmathresult{2}},
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\addplot3 [
surf,
mesh/interior colormap={blueblack}{color=(black) color=(white)},
colormap/blackwhite, samples=30,
domain=0:1,
]
{sin(deg(2*pi*x))* exp(-10*(y-0.5)^2) + exp(-(x-0.5)^2*10 - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\end{axis}
\end{tikzpicture}
\end{document}
你没有用具体例子来详细表达问题,我也不好猜测你具体需要什么。还是建议你先去读一下手册。
我对 graph 库的理解是这样的。
用户可以用一些变量(参数,其实就是 pgf 的 key),来定义一种计算 node 位置的方法,这些变量例如
\tikzgraphsset{
placement/.cd,
element count/.initial=0,
chain count/.initial=0,
depth/.initial=0,
width/.initial=0,
level/.initial=0,
logical node depth/.code=\def\pgfmathresult{1},
logical node width/.code=\def\pgfmathresult{1},
}%
Graph 库的作者利用这些变量定义了几种计算方式,默认的是 /tikz/graphs/Cartesian placement
这个计算方式。对于这个计算方式来说,用户可以通过调整某些 key 的值(如 /tikz/graphs/chain shift
)来影响这个计算方式的计算结果,但计算方式的框架是不容易修改的。
详细情况请参考手册。
也可以使用 graphdrawing 库引入其他的计算方式,这个库借助 lua 来计算,我不懂 lua。熟悉 lua 的用户可以自己编写一种计算方式。
总之 graph 库以及 graphdrawing 库强调的是“自动计算,自动排布”,非常依赖算法,而不是强调人工干预。如果总是期望用户来控制各个 node 的位置,那就背离了这个思想。所以这个思想主要针对有很多 node 的情况。当然用户也可以根据情况来调整个别 node 的位置,但这不是重点。
在 node 比较多的情况下,并没有绝对的标准来判断一种排布方式是否足够美观,减少用户的干预也未必不是一个好的选择。当然这对算法的设计也就有相当的要求,不是那么轻易就能设计好。例如命令 \usegdlibrary{force}
引入的算法就参考了数篇论文。你可以搜索相关的资料,例如 胡一凡 的作品
如果你想知道如何用参数调整算法的计算结果,应该先去阅读手册,或者手册中给出的参考论文。如果你觉得英文手册不好读,倒是也有关于 graph 库的中文介绍,也不太好读。不过,只要静心读,总能读明白。
参考 knots 包,不过这个包我不熟悉。
给 node 加 transform shape
选项。
导言区使用:
\usepackage{tikz}
\usetikzlibrary{fadings,shadings,intersections}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
下面是绘图的命令:
\begin{tikzfadingfrompicture}[name=pl]
\shade[inner color=transparent!0,outer color=transparent!100](0,0) rectangle (6,2);
\end{tikzfadingfrompicture}
\begin{tikzpicture}
\path [clip] (-2,-2) rectangle (6,8);
\fill [color=black!50!white,] (-2,2.5) rectangle (6,10);
%注意坐标 (-1,3), (1,3), 与下文的坐标 (0,3) 对应
\draw [name path=p1,white,rotate=-15] (-1,10) {[rounded corners=15pt]-- (-1,3)}{[rounded corners=20pt]--(0,0)}{[rounded corners=15pt]--(1,3) -- (1,10)};
\path [name path=h] (-2,2.5)--(4,2.5);
%用到 pgfplots 的 fillbetween 库来计算下面命令中的 L2, 即下面命令画出的红色线条
\draw [draw=red,intersection segments={of=p1 and h,sequence=L2},line width=2pt];
%scale around={0.8:(0,3)}, 注意坐标 (0,3), 与上文的坐标 (-1,3), (1,3) 对应
\draw [name path=p2,white,rotate=-15,scale around={0.8:(0,3)}] (-1,10) {[rounded corners=15pt]-- (-1,3)}{[rounded corners=20pt]--(0,0)}{[rounded corners=15pt]--(1,3) -- (1,10)} ;
%再次用到 pgfplots 的 fillbetween 库
\draw [draw=orange,intersection segments={of=p2 and h,sequence=L2},line width=2pt];
%利用前文定义的 pl 做 fading 效果
\draw [line width=2pt,path fading=pl]
(0,0)..controls ++(5,0.5) and ++(2,0)..(3,1)..controls ++(-2,0) and ++(-2,0)..(3,1.5)..controls ++(2,0) and ++(-1,-0.5)..(6,2);
\end{tikzpicture}
以上只是一个简单的尝试,只是说明能用 TikZ 画,仅供参考。
\tikz{%r^2=a^2*cos(2*i)
\def\a{2}
\def\tempsave{}
\foreach \i in {-45,-44.5,...,45,135,135.5,...,225}
{
\pgfmathparse{sqrt(\a^2*cos(2*\i))}
\xdef\tempsave{\tempsave(\i:\pgfmathresult)}
}
\draw plot[smooth] coordinates {\tempsave};
}
\begin{tikzpicture}
\begin{scope}[xslant=0.5]%y=(60:1)???
\foreach \i in {0,...,6}
{
\foreach \j in {0,...,5}
{
\pgfmathparse{\j>-\i+6}
\ifnum \pgfmathresult=1
\else
\node [
% fill,
draw,
circle,inner sep=0pt,minimum size=3mm](n-\i-\j) at(\i,\j) {%
% n-\i-\j
};
\fi
}
}
\end{scope}
\draw ($(n-1-5.north)+(90:1.5)$)--($(n-1-5.north)+(90:1)$)--($(n-6-0)+(0:1)$)--++(-90:5)-|($(n-0-0)+(180:1)$)--($(n-0-5.north)+(90:1)$)--($(n-0-5.north)+(90:1.5)$);
\end{tikzpicture}
得到
其余的线可以参考其他回答。
查《source2e》, 参考 \label
与 \ref
的做法。命令 \label
将一个全局定义命令\global\@namedef
写入 .aux 文件,之后 \ref
会引用这个定义,需要编译两次。
下面是一个例子:
%命令 \TotalPointsRef{<题号宏>} 返回给 <题号宏> 分配的分数
%<题号宏> 是 \examONE 这种形式
\def\TotalPointsRef#1{
\ifdefined#1%
(total: #1)
\else%
(Ref none!!!)
\fi%
}
\TotalPointsRef\examONE
\makeatletter
%#1 代表题号,#2 代表分数
%控制序列 \examONE 代表第 ONE 题,ONE 是题号
\def\examtotalwriteout#1#2{%
\expandafter\string%
\expandafter\xdef%
\expandafter\string%
\csname exam#1\endcsname{#2}%
}
%写入 .aux 文件
\immediate\write\@auxout{%
\examtotalwriteout{ONE}{10}
}
\makeatother
命令 \label
的定义要复杂一些,可以参考《LaTeX2e 文类和宏包学习手册》和《source2e》来看。
大体意思就是这样。
在《source2e》(2021-06-01)中查到,\parbox
的外部位置参数 c
对应 \vcenter
, 猜测,盒子内容放到 $\vcenter{...}$
中,这是个垂直盒子。关于 \vcenter
可以参考《The TeXbook》,《LaTeX2e文类和宏包学习手册》,盒子 \vcenter
的中线一般与数学式的轴线对齐。不过数学式的轴线一般不与普通文字的基线对齐。
$\div\frac{A}{B}---$
\parbox[c][1cm][c]{4cm}
{\tikz[baseline=(b.base)]{
\node[draw,inner sep=0pt,outer sep=0pt](b){测试};
\draw[red] ([xshift=-5mm]b.west)--([xshift=5mm]b.east);}
案例}
\begin{tikzpicture}
\tikzset{inner color=red,outer color=black}
\pgftext{\pgfuseshading{radial}}
\draw[green,line width=1.2pt](0,0) circle (25bp);
\draw[green,line width=1.2pt](0,0) circle (50bp);
\fill[shading=radial] (5,0) circle (50bp);
\end{tikzpicture}
得到
左侧半径为 50bp 的大圆是完整的 radial 渐变。右侧圆中的渐变,就是左侧圆中,半径为 25bp 的那一部分。左侧圆环中的颜色都没有出现在右侧圆中,被裁掉了。
如果想让完整的 radial 渐变出现在右侧圆中,需要重定义 radial 渐变,或者自己另外定义一种渐变。例如重定义 radial 渐变:
\makeatletter
\pgfdeclareradialshading[tikz@radial@inner,tikz@radial@outer]{radial}{\pgfpointorigin}{%
color(0bp)=(tikz@radial@inner);
color(25bp)=(tikz@radial@outer)}
\makeatother
这样重定义 radial 渐变的半径为 25bp, 再次绘制前面的圆,得到
其中的详细原因参考 TikZ & PGF Manual 的 114.3 Using Shadings 的命令 \pgfshadepath
。
——————————————————————————————————————————————
抱歉,以上回答显然是答非所问了,请参考网友 @u33 的回答。
——————————————————————————————————————————————————————————————
转述一下 #993 的要点:
1.在\fill[fill=cyan] (0,0) circle (3);
中,颜色 cyan
是 xcolor 宏包预定义的颜色,这个颜色来自 cmyk 模式。
2.在\fill[inner color=cyan,outer color=cyan!50!white] (0,0) circle (3);
中,PGF 跟随 xcolor 认定的颜色模式,例子中是 rgb 模式。
cmyk 模式下的颜色 cyan
与 rgb 模式下的 cyan
是不一样的,出现色差。
解决的办法在 #993 中已经给出,即给 xcolor 宏包加上 cmyk
或者 rgb
选项,这是全局设定。
如果想局部设定,可以:
1.重定义颜色 cyan
为 rgb 模式下的颜色。首先获取 rgb 模式下的 cyan
的颜色数据:
\pgfshadecolortorgb{cyan}{\mycol}
\mycolred,\mycolgreen,\mycolblue
就是 0,1,1
,然后
\definecolor{cyan}{rgb}{0,1,1}
然后再填充图形。例如:
\begingroup
\definecolor{cyan}{rgb}{0,1,1}
\begin{tikzpicture}
\fill[fill=cyan] (-7,0) circle (3);
\fill[inner color=cyan,outer color=cyan!50!white] (0,0) circle (3);
\end{tikzpicture}
\endgroup
得到
2.如果你觉得 cmyk 模式下的颜色 cyan
比较养眼,可以局部的修改 radial 渐变所认定的颜色模式,即修改 \pgf@setup@shading@model
的定义,如下:
\begingroup
\makeatletter
\def\pgf@setup@shading@model{%
\pgfshadingmodelrgbtrue
\pgfshadingmodelcmykfalse
\pgfshadingmodelgrayfalse
\XC@sdef\pgf@mod@test{\XC@tgt@mod{cmyk}}%修改在这里
\def\pgf@shading@device{/DeviceRGB}%
\def\pgf@shading@ps@device{setrgbcolor}%
\def\pgf@shading@functional@range{0 1 0 1 0 1}%
\def\pgf@shading@model{rgb}%
\ifx\pgf@mod@test\XC@mod@cmyk
\def\pgf@shading@device{/DeviceCMYK}%
\def\pgf@shading@ps@device{setcmykcolor}%
\def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
\def\pgf@shading@model{cmyk}%
\pgfshadingmodelrgbfalse
\pgfshadingmodelcmyktrue
\fi
\ifx\pgf@mod@test\XC@mod@gray
\def\pgf@shading@device{/DeviceGray}%
\def\pgf@shading@ps@device{setgray}%
\def\pgf@shading@functional@range{0 1}%
\def\pgf@shading@model{gray}%
\pgfshadingmodelrgbfalse
\pgfshadingmodelgraytrue
\fi
\edef\pgf@sys@driver@dvisvgm{pgfsys-dvisvgm.def}%
\ifx\pgfsysdriver\pgf@sys@driver@dvisvgm
\def\pgf@shading@model{rgb}%
\fi
\edef\pgf@sys@driver@texforht{pgfsys-tex4ht.def}%
\ifx\pgfsysdriver\pgf@sys@driver@texforht
\def\pgf@shading@model{rgb}%
\fi
}
\makeatother
\begin{tikzpicture}
\fill[fill=cyan] (-7,0) circle (3);
\fill[inner color=cyan,outer color=cyan!50!white] (0,0) circle (3);
\end{tikzpicture}
\endgroup
%重画,做比较
\begin{tikzpicture}
\fill[fill=cyan] (-7,0) circle (3);
\fill[inner color=cyan,outer color=cyan!50!white] (0,0) circle (3);
\end{tikzpicture}
得到
\addplot+[color = red, mark options={draw=blue,fill=orange}] (0,0) -- (1,1);
关于 mark 的这几个选项都是 TikZ 选项。
\begin{tikzpicture}
\graph [
tree layout,
grow'=right,
level distance=2.5cm,
sibling distance=1mm,
sibling sep=2pt,
nodes={red,inner sep=5pt,minimum size=5mm}
]
{[number nodes, number nodes sep=*]
开始-> {
A-> {A->Ac/"(A,A)",
B,C,D},
B -> {A,B,C,D},
C -> {A,B,C,D},
D-> {A,B,C,D},
小王[>{draw=none}]--小李[>{draw=none}]->那啥,
},
};
\node [above]at(A*2 |- A*3.north){小红};
\node [above](小明)at(A*3.north){小明};
\node [above](结果)at(Ac*4 |- A*3.north){结果};
\draw [->](小明)--(结果);
\end{tikzpicture}
——————————————————————————————————————
补充,参考选项 /tikz/graph/parse
\def\mystateA{}
\foreach \i[count=\ci,remember=\i as \li] in {A,B,C,D}
{
\ifnum\ci=1\relax
\else
\xdef\mystateA{\mystateA\li->{\mystateB},}
\fi
\xdef\mystateB{}
\foreach \j[count=\cj] in {A,B,C,D}
{
\xdef\mystateB{\mystateB\j->\i\j/"(\i,\j)",}
\ifnum\ci=4\relax
\ifnum\cj=4\relax
\xdef\mystateA{\mystateA\i->{\mystateB},}
\fi
\fi
}
}
\begin{tikzpicture}
\graph [
tree layout,
grow'=right,
level distance=2.5cm,
sibling distance=1mm,
sibling sep=2pt,
nodes={red,inner sep=5pt,minimum size=5mm}
]
{
[number nodes, number nodes sep=*]
开始-> {
[parse/.expanded=\mystateA]
},
};
\node (结果)[above] at(AA*4.north){结果};
\node (小明)[above] at(A*3.north |- AA*4.north){小明};
\node (小红)[above] at(A*2.north |- AA*4.north){小红};
\end{tikzpicture}
问 tikz 画折线可以同个命令不同颜色吗?