一 我想通过 foreach 语句得到以下图形
我的代码如下:
\begin{tikzpicture}[x=2.5cm,y=-1.5cm,-stealth]
\foreach \x/\y/\m in {
1/1/H,
1/2/M,
2/1/N,
2/2/K}
{\node (\x\y)at(\x,\y){\m};}
\foreach \x/\y/\m/\n in
{
11/12/f/above,
12/22/g/below,
11/21/m/left,
21/22/n/right
}
{\draw(\x)--(\y)node[pos=.5,\n]{$\m$};}
\end{tikzpicture}
但是关于箭头上的标签的位置的foreach参数n 不能正常输出参数的位置,会报错,请问该怎么把标签的位置也归于 foreach 语句里面?
二 我想用 foreach 语句绘制 graph 环境中的图形,大概是以下这样
我的代码如下:
\begin{tikzpicture}
\foreach \x/\y in {a1/a2,a2/a3,a3/a4}
{\graph{\x->\y};}
\end{tikzpicture}
但最后的结果是
各部分 graph 中的图形不会展开,而会重叠起来,请问这样该如何解决?
问题里长代码要换行再点上面的“代码”才可以正确输出代码,不然问题根本不能看。
第一个,\node
选项里的 \n
没展开,tikz 检测不到它的内容,要先展开:
\begin{tikzpicture}[x=2.5cm,y=-1.5cm,-stealth]
\foreach \x/\y/\m in {
1/1/H,
1/2/M,
2/1/K,
2/2/N}
{\node (\x\y)at(\x,\y){\m};}
\foreach \x/\y/\m/\n in
{
11/21/f/above,
12/22/g/below,
11/12/m/left,
21/22/n/right
}
{\expanded{\noexpand\draw(\x)--(\y)node[pos=.5,\n]{$\m$};}}
\end{tikzpicture}
第二个,\foreach \x/\y in {..} {\graph{\x->\y};}
相当于 \graph{\x->\y};\graph{\x->\y};..
,显然不等于 \graph{a1->a2->a3->a4}
。
你这个需求,手册上有一个例子:
可以用 /tikz/graph/parse
键:
\def\mychain#1{
\def\mytext{a1}
\foreach \x in {2,...,#1} {\xdef\mytext{\mytext->a\x}}
}
\tikzgraphsset{my chain/.style={
/utils/exec=\mychain{#1},
parse/.expand once=\mytext}
}
\begin{tikzpicture}
\graph {[my chain=4]};
\end{tikzpicture}
明白了,谢谢您
您好,对您第二个问题的回答,关于defmychain#1这个宏命令,能否将它再封装成一个带两个参数的宏命令,参数就是初值 a1和 x 的取值 2,...,#1,然后在graph 中直接调用这个宏命令加上两个参数就可以,这样对其他同类型的但x 的取值不同的graph 环境也能用这样的命令,而不需要每次都输入defmychain#1这样一堆代码。请问可以这样实现吗?该怎么操作?
@u26254 可以这样改:
@u10307 好的,谢谢大佬
@u10307 请问大佬这个怎么放在 graph 中使用,可以举个例子吗?
@u26254 比如原来的
\graph {[my chain=4]}
相当于\graph{[my chain={a}{4}]}
。@u10307 谢谢
@u10307 大佬还有个问题,如果我想在这个图形下面再绘制一个同类型的图形,仍然使用 my chain语句,但只显示第一个,第二个不显示。比如这样
我想在 a1->...下面再画 b1->...但只能显示a1->...这一个图形,请问这是怎么回事?
@u26254 graph 不支持这么写,只能把前面的结果保存起来。
不如直接写
\graph{a1->a2->a3->a4; b1->b2->b3->b4;};
@u10307 好的,谢谢