越来越少
越来越少
这家伙很懒,什么也没写!

注册于 4年前

回答
27
文章
0
关注者
1

查《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);}
  案例}

9481b5e56181b10f591a784680c74466.png

\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}

得到
89342789a0be7f0fbc227ba5ccfdaf61.png
左侧半径为 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, 再次绘制前面的圆,得到
1f83e993db1825e14cf5520f32b0c70f.png

其中的详细原因参考 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

得到
1c1c5ecdb710e13ae17b02bb10335f59.png

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}

得到
44b5f6228538af60b84354985ee01984.png

 \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}

2d2da10ccc9a16b604d1e1fc8925a5a4.png
——————————————————————————————————————
补充,参考选项 /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}

这里的 step 应该是相邻两个 mark 的间距,在

between positions 0 and 1 step <x> with ...

中,参数 <x> 会被 \pgfmathparse 处理,参数 <x> 的两个特征:(1)正负号,(2)是否带有长度单位,都对间距有影响。例如 0.2, 那么间距就是 0.2*L, 其中的 L 是被装饰路径的总长度。作为装饰的 mark 是逐个创建的,在创建过程中,如果剩余的、尚未被装饰的路径长度小于 0.2*L, 那么就不做装饰。详细情况参考《pgflibrarydecorations.markings.code.tex》。

如果希望 mark 出现在被装饰路径的末端,那么应注意路径长度与 mark 间距相搭配,就是说,L/间距 应该是个整数。

如果不搭配,还想把一个 mark 放在路径的末端,可以这么做

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.markings}
\tikzset{
  zhuangding A/.style={
    decorate,
    decoration={
      markings,
      mark=between positions 0 and 1 step 15mm with
        {\node[circle,draw=black,fill=white]{};},
    },
  },
  zhuangding B/.style={
    decorate,
    decoration={
      markings,
      mark=at position 1 with
        {\node[circle,draw=black,fill=white]{};},
    },
  },
}
\begin{document}
\begin{tikzpicture}
  \draw[postaction={zhuangding A},postaction={zhuangding B}](0,0)--(11,0);
  \draw[red,postaction={zhuangding A},postaction={zhuangding B}](0,-3)--(16,-3);
\end{tikzpicture}
\end{document}

我大略查了一下,如果想单纯获取一个路径的长度,可以这么做:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}
\begin{document}
\begin{tikzpicture}
  \draw [save path=\aaaa] (0,0) arc [start angle=60,end angle=180,x radius=2,y radius=1];
\end{tikzpicture}

\makeatletter
\pgf@decorate@parsesoftpath\aaaa\bbbb
\meaning\pgf@decorate@totalpathlength

\meaning\bbbb
\makeatother
\end{document}

其中的 \pgf@decorate@totalpathlength 就是路径的总长度。

命令 \pgfmathsetmacro, \pgfmathtruncatemacro, \tikzset 的作用可以参考 PGF 的手册。

命令

\pgfmathsetmacro{\nA}{TDunit("(A_1)-(P_1)x(P_2)-(P_1)")}

的意思是,先用 \pgfmathparse 解析 TDunit("(A_1)-(P_1)x(P_2)-(P_1)"), 然后把解析结果保存到 \nA 中。其中的 TDunit 是在《tikzlibrary3dtools.code.tex》中定义的一个函数,定义是:

\pgfmathdeclarefunction{TDunit}{1}{%normalized vector
\begingroup% 
\pgfmathsetmacro{\pgfutil@tmpv}{TD("#1")}%
\pgfmathsetmacro{\pgfutil@tmpn}{sqrt(TD("(\pgfutil@tmpv)o(\pgfutil@tmpv)"))}%
\ifdim\pgfutil@tmpn pt<0.002pt\relax
\PackageWarning{3dtools}{Vector too short, cannot normalize it.}%
\let\pgfmathresult\pgfutil@tmpv%
\else
\pgfmathsetmacro{\pgfutil@tmpn}{1/\pgfutil@tmpn}%
\pgfmathparse{TD("\pgfutil@tmpn*(\pgfutil@tmpv)")}%
\fi
\pgfmathsmuggle\pgfmathresult\endgroup}%

命令 \tikzset{3d/ordered paths/pA/.style={fill=red}} 定义一个 style, 也就是把 fill=red 保存到键 3d/ordered paths/pA 中。

命令 \tikzset{3d/draw ordered paths={pC,pB,pA}} 执行 3d/draw ordered paths={pC,pB,pA} 这个键,其中 pC,pB,pA 是键 3d/draw ordered paths 处理的参数。这个键在《tikzlibrary3dtools.code.tex》中定义:

\tikzset{...
...
3d/draw ordered paths/.code={%
  \tikzset{3d/temporary list 1/.initial={#1},
      3d/draw ordered path/.list={#1}}%  
  },...
...
}

我没有仔细阅读《tikzlibrary3dtools.code.tex》,不了解其中的函数、键、命令的具体作用。

建议先阅读 PGF 手册的 'Mathematical and Object-Oriented Engines' 的 Mathematical Engine 部分,以及 'Key Management' 部分。

我把你的代码改动了两个定义

%%属性
\newcommand{\shuxing}[1]{%
    \ifnum\value{shuxingcount}=0
%        \protected\def\shuxingall{#1}
        \def\shuxingall{#1}
    \else
        \let\oldshuxing\shuxingall
%        \protected\def\shuxingall{\oldshuxing \ \newline         #1}
        \edef\shuxingall{\oldshuxing\noexpand\newline #1}
    \fi
    \stepcounter{shuxingcount}
}

%%加入操作和属性
\newenvironment*{addshuxing}[3]
{
    \def\leiming{#2}%
    \def\fangwei{#3}
    \def\shuxingall{}%
    \setcounter{shuxingcount}{0}%
    \tikzstyle{thislei}=[lei moshi, rectangle split parts=2, #1]
}%
{
    \let\BaoneiOld\Baonei
%    \protected\xdef\Baonei{\BaoneiOld (class-\leiming)}
    \xdef\Baonei{\BaoneiOld (class-\leiming)}
}

然后编译得到
0cbb447004b09221637217f0af86f585.png
还建议把下面定义

%包
\newenvironment{bao}[1]{
    \def\Baonei{}
    \def\Baoming{#1}
}{
    \begin{pgfonlayer}{background}
        \node[>=angle 90,draw, inner sep=1, fit = \Baonei] (\Baoming) {};
        \node[>=angle 90,draw, anchor=south west] (\Baoming-head) at
        (\Baoming.north west) {\Baoming};
    \end{pgfonlayer}
}

中的 >=angle 90, 去掉。

对于 TikZ 来说,一个路径只能有一个颜色。pgfplots 差不多可以实现你要的效果,例如 pgfplots 手册的 ‘Providing Color Data – Point Meta’ 这一节里的例子,如果把例子的图像放大,就会看到曲线实际是折线段,每一段都有自己的颜色,例如下图(pgfplots 手册的237页):
520c18c2b2c282d831d7268ff00b2580.png

也可以参考 pgfmanual 的 transparency group=knockout 这个选项,只是稍微麻烦一点,而且有的 PDF 阅读器不支持这种效果。

%\usepackage{pgfplots}
\begin{tikzpicture}
\begin{axis}[
view/az=120,
axis lines=center,
axis on top,
axis equal=true,
enlarge x limits,
trig format plots=rad,
xlabel=$x$,ylabel=$y$,zlabel=$z$,
colormap/viridis,
%shader=interp,
]
\addplot3 [
surf,
samples=50,
samples y=20,
domain=-pi/2:pi/2,
domain y=0:1
] ({sin(x)},{cos(x)},y);
\end{axis}
\end{tikzpicture}

ffa16be897476fd41f89978ef020d082.png

TikZ 的 fill 用于二维的填充,默认采用 /tikz/nonzero rule 这个规则来判断图形的内部。你填充的路径是用三维坐标构造的,但 TikZ 会把它转换为二维路径,再做填充。

我能想到的思路是,先做一个有空缺的段落,然后把一个盒子放到空缺处,整个段落最好位于一个页面上。

建议参考

  1. shapepar, rjlpshap 宏包,
  2. 链接\cutout 命令
  3. The TeXbook 的 101 页
  4. tikz 的 /tikz/remember picture 选项以及相关内容

整个过程可能比较麻烦。

参照手册的例子,把你的数据保存为文件 datafile.dat, 然后

\pgfplotstableread{datafile.dat}\datatable
\begin{tikzpicture}
\begin{axis}[
  view={160}{45},
  colorbar horizontal]
\addplot3 [
  mesh/ordering=y varies,
  mesh/rows=48,
  contour filled={
    number=40,
    handler/.style=smooth,
  }]
table {\datatable};
\end{axis}
\end{tikzpicture}

得到

37504f29de5bc781cd0e9ed39316a888.png

你的数据没有 scanline, 而且是先让 y 变量变化,再让 x 变量变化,所以需要参考以下选项

/pgfplots/mesh/rows
/pgfplots/mesh/cols
/pgfplots/mesh/ordering
/pgfplots/mesh/num points

发布
问题