我一直在使用 Tikz 制作流程图或框图来展示简化的相机传递函数。我已经完成了下面的代码,但还有一些问题。
我开始这个例子,它使用矩阵进行节点布局。如果这是一个不好的起点,请告诉我。
我的问题如下
你究竟如何制作一个简单的正方形,当你把东西放进去时它不会变形,或者至少会保持正方形。对于第一个块,我只想要一个有一条水平线穿过的正方形。这变得很复杂,如果没有矩阵中的新 tikz 图片,我无法做到这一点,即使这样,在箭头离开它的起点之前,节点后面还有一些额外的空间,所以我不得不使用负空间来删除它。有没有更简单的方法来做到这一点?
我发现我无法直接缩放 Integral 符号,因为它是一个需要自行调整大小的数学符号。我不得不使用 bigints 包来执行此操作。有没有办法通过 Tikz 直接缩放符号或文本?那么我可以使用正常符号
$\int$
并使用 Tikz 缩放它吗?在倒数第二个块(目前为空)中,我想要一条类似于第一个块的线,但它会像楼梯一样一点点地上升(具体来说,就像 ADC 传递函数)。有办法吗?我想也许是一个旋转 90 度的锯齿波之类的。
为什么连接线看起来似乎略微延伸到箭头末端,以致箭头尖端不够锋利?
谢谢。
\documentclass{article}
\usepackage[a4paper, landscape]{geometry}
\usepackage{tikz}
\usepackage{bigints}
\usetikzlibrary{shapes.geometric,shapes.arrows,decorations.pathmorphing}
\usetikzlibrary{matrix,chains,scopes,positioning,arrows,fit}
\begin{document}
\begin{tikzpicture}[
tip/.style={->,shorten >=0.007pt}
]
% Place all element in a matrix of nodes, called m
\matrix (m) [matrix of nodes,
column sep=5mm,
row sep=1cm,
nodes={draw, % General options for all nodes
line width=1pt,
anchor=center,
text centered,
sharp corners,
minimum width=1.5cm,
minimum height=1.5cm,
inner sep=0em,
},
% Define styles for some special nodes
right iso/.style={isosceles triangle,scale=0.5,sharp corners, anchor=center, xshift=-4mm},
txt/.style={text width=1.5cm,anchor=center},
empty/.style={draw=none},
noborder/.style={ draw=none,text width=1.5cm,anchor=center}
]
{
% First row of symbols
|[noborder]| {Input}
&
|[empty]|{\begin{tikzpicture}[inner sep=0em]
\node[draw, rectangle, minimum size=1.5cm]{};
\draw (-.75,-.75) -- (.75,.75);
%\draw (0,0) -- (1.5,1.5);
\end{tikzpicture}
}
\!\!\!\!
& |[noborder]| {Output 1}
&
{$\bigints$}
& |[noborder]| {Output 2}
& |[empty]|{\begin{tikzpicture}[inner sep=0em]
\node[draw, rectangle, minimum size=1.5cm]{};
\draw (-.75,-.75) -- (.3,.3) -- (.75,.3);
\end{tikzpicture}
}
\!\!\!\!
& % m-1-7
|[noborder]| {Output 3}
& % m-1-8
|[empty]|{\begin{tikzpicture}[inner sep=0em]
\node[draw, rectangle, minimum size=1.5cm]{};
\draw (-7.5mm,-7.5mm) -- (-6.5mm,-7.5mm);
\draw (-6.5mm,-7.5mm) -- (-6.5mm,-6.5mm);
\end{tikzpicture}
}
\!\!\!\!
& |[noborder]| {Ouput 4}
& % m-1-10
|[empty]|{\begin{tikzpicture}[inner sep=0em]
\node[draw, rectangle, minimum size=1.5cm]{};
\draw (-7.5mm,-6.5mm) .. controls (-1.5mm,-7.5mm) and (1.5mm,7.5mm) .. (7.5mm,6.5mm);
\end{tikzpicture}
}
\!\!\!\!
& |[noborder]| {Final \\ Output}
\\
}; % End of matrix
% Now, connect all nodes in a chain.
{ [start chain,every on chain/.style={join}, every join/.style={line width=1pt}]
\chainin (m-1-1);
\chainin (m-1-2) [join=by tip];
\chainin (m-1-3) [join=by tip];
\chainin (m-1-4) [join=by tip];
\chainin (m-1-5) [join=by tip];
\chainin (m-1-6) [join=by tip];
\chainin (m-1-7) [join=by tip];
\chainin (m-1-8) [join=by tip];
\chainin (m-1-9) [join=by tip];
\chainin (m-1-10) [join=by tip];
\chainin (m-1-11) [join=by tip];
};
\end{tikzpicture}
\end{document}
答案1
以下是一些答案:
使用库中的
regular polygon
形状(带有regular polygon sides=4
)shapes.geometric
(我看到您已经在使用它)。使用这个,我可以按照您(大概)想要的方式绘制正方形。之后我使用节点锚点进行定位绘制了额外的部分。您可以通过在节点本身上指定扩展来批量扩展节点。在此特定情况下,您需要对内容但不是节点形状。一种实现方法是将节点加倍:首先绘制一个空节点,然后稍后返回并放入内容(适当缩放)。
你自己找到了答案。太棒了!
by
我不知道为什么,但这与在 上指定选项有关joins
。我发现通过将样式放入 中,箭头又正确了。这也与样式every join/.style={->}
无关,因为它应该正常工作。因此,大概s 的呈现方式阻止了添加箭头时应该发生的自动缩短。如果您可以隔离此行为,则可能值得将其作为错误提交。tip
\draw[tip] (0,0) -- (1,0);
join
这是您的代码的我的版本。
\documentclass{article}
\usepackage[a4paper, landscape]{geometry}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,decorations.pathmorphing,matrix,chains,calc}
\begin{document}
\begin{tikzpicture}[
% Define styles for some special nodes
square/.style={
draw,
regular polygon,
regular polygon sides=4,
text width=1cm,
minimum width=1cm,
minimum height=1cm,
inner sep=0em
},
line width=1pt,
every on chain/.style={join},
every join/.style={line width=1pt,->}
]
% Place all element in a matrix of nodes, called m
\matrix (m) [matrix of nodes,
column sep=5mm,
row sep=1cm,
nodes={ % General options for all nodes
text centered,
anchor=center,
text width=1.5cm,
sharp corners,
minimum width=1.5cm,
minimum height=1.5cm,
inner sep=.5ex,
outer sep=0pt
},
]
{
% First row of symbols
{Input}
&
|[square]|
& {Output 1}
& |[square]|
& {Output 2}
& |[square]|
& % m-1-7
{Output 3}
& % m-1-8
|[square]|
& {Output 4}
& % m-1-10
|[square]|
& {Final \\ Output}
\\
}; % End of matrix
% Additional decorations
\draw (m-1-2.south west) -- (m-1-2.north east);
\draw (m-1-6.south west) -- ($(m-1-6.south west)!.7!(m-1-6.north east)$) -- ($(m-1-6.north east)!($(m-1-6.south west)!.7!(m-1-6.north east)$)!(m-1-6.south east)$);
\draw[decorate,decoration=zigzag] (m-1-8.south west) -- (m-1-8.north east);
\draw (m-1-10.south west) ++(0,1mm) .. controls +(6mm,-1mm) and +(-6mm,1mm) .. ($(m-1-10.north east)+(0,-1mm)$);
\node[scale=2] at (m-1-4) {$\int$};
% Now, connect all nodes in a chain.
\begin{scope}[start chain]
\chainin (m-1-1);
\chainin (m-1-2);
\chainin (m-1-3);
\chainin (m-1-4);
\chainin (m-1-5);
\chainin (m-1-6);
\chainin (m-1-7);
\chainin (m-1-8);
\chainin (m-1-9);
\chainin (m-1-10);
\chainin (m-1-11);
\end{scope}
\end{tikzpicture}
\end{document}
有结果