我必须绘制一些带注释的时序图。时序应按示例所示进行注释:
\documentclass{report}
%\documentclass{scrreport}
\usepackage{tikz}
\usepackage{tikz-timing}[2014/10/29]
\begin{document}
\begin{tikzpicture}
\timing at(1,3) {3H 20U 4H 13U 6H};
\timing at(1,2.5) {23D{2} 4X 19D{2} };
\draw (1.75,4) -- +(0,-.6);
\draw (6.58,4) -- +(0,-.6);
\draw (7.58,4) -- +(0,-.6);
\draw (10.68,4) -- +(0,-.6);
\draw[<->] (1.75,3.8) -- (6.58,3.8);
\draw[<->] (6.58,3.8) -- (7.58,3.8);
\draw[<->] (7.58,3.8) -- (10.68,3.8);
\node at (4.3,4) {Transmit};
\node at (7.05,4) {Idle};
\node at (9.0,4) {Receive};
\end{tikzpicture}
\end{document}
编辑:\timing 线显示导线上的信号。信号电平一开始为“高”。有两个包含信息的高/低电平信号突发。实际信息并不重要。这就是为什么这里显示为“X”无关紧要,而不是稳定的“高”。
该图将描述这些爆发的各个阶段。详细信息请参阅随图表提供的文本。
这种方法虽然有效,但很麻烦,容易出错。X 位置(1.75、6.58、7.58、10.68)只能通过视觉检测。而且必须重复输入这些值。如果需要更改时间,几乎\timing at(1,3) {3H 10U 4H 13U 6H};
所有内容都必须更改。
此外,如果您想将 TikZ 图片与 KOMA 脚本一起使用,整个构造将受到影响。这会阻止将 tikz-timing 代码放在可重复使用的 TeX 包含文件中。
- 如何才能更高效的绘制注释?
- 如何根据时序图位置计算注释的位置?
- 无论是否使用 KOMA 脚本,如何才能让 TikZ 绘图变得更加健壮?
答案1
所以你的问题本质上可以归结为:如何获取时序图中某个转换的坐标以便对其进行注释。
该tikz-timing
包为时序图设置了一些锚点,但遗憾的是,这些锚点太少,无法满足您的需求。但您可以定义从.high start
表示时序图左上角的锚点偏移的坐标。您需要为要引用的时序图指定一个name
,然后您可以将此名称与锚点结合使用。
该tikz-timing
软件包将默认单位设置为 1.6 ex。使用此默认单位,您可以轻松计算转换之间的距离。例如,对于您希望放置从 到H
的第一个转换U
发生的第一个坐标,您知道它位于左侧三个单位处(因为您3H
在计时函数中定义)。因此,如果您用 命名时序图a
,则可以用 引用此坐标([xshift=3*1.6ex]a.high start)
。
最后,您可以使用这些坐标来绘制线条、箭头并在箭头上放置标签(我建议您这样做,而不是使用使用明确坐标放置的节点)。
现在,如果您更改时序图,您仍然需要更改坐标,但是一旦您更改它们,所有其他内容至少都会自动更改。
无论您使用 KOMA 类还是其他文档类,这都应该有效。
\documentclass{report}
%\documentclass{scrreport}
\usepackage{tikz}
\usepackage{tikz-timing}
\begin{document}
\begin{tikzpicture}
\timing[name=a] at(1,3) {3H 20U 4H 13U 6H};
\timing at(1,2.5) {23D{2} 4X 19D{2} };
\coordinate (a1) at ([yshift=5pt, xshift=3*1.6ex]a.high start);
\coordinate (a2) at ([yshift=5pt, xshift=23*1.6ex]a.high start);
\coordinate (a3) at ([yshift=5pt, xshift=27*1.6ex]a.high start);
\coordinate (a4) at ([yshift=5pt, xshift=40*1.6ex]a.high start);
\draw (a1) -- +(0,.6);
\draw (a2) -- +(0,.6);
\draw (a3) -- +(0,.6);
\draw (a4) -- +(0,.6);
\draw[<->] ([yshift=10pt]a1) -- ([yshift=10pt]a2) node[midway, above] {Transmit};
\draw[<->] ([yshift=10pt]a2) -- ([yshift=10pt]a3) node[midway, above] {Idle};
\draw[<->] ([yshift=10pt]a3) -- ([yshift=10pt]a4) node[midway, above] {Receive};
\end{tikzpicture}
\end{document}
答案2
我找到了部分解决方案。这样可以避免重复数字。此外,还计算了文本的位置。
\begin{tikzpicture}
\timing at(1,3) {3H 20U 4H 13U 6H};
\timing at(1,2.5) {23D{2} 4X 19D{2} };
% change the X values only at these lines
\def\a{1.75}
\def\b{6.65}
\def\c{7.58}
\def\d{10.68}
% calculate the mid values between pairs
\pgfmathdivide{\a+\b}{2} \let\mab\pgfmathresult
\pgfmathdivide{\b+\c}{2} \let\mbc\pgfmathresult
\pgfmathdivide{\c+\d}{2} \let\mcd\pgfmathresult
% now don't use any magic number anmyore.
\draw (\a,4) -- +(0,-.6);
\draw (\b,4) -- +(0,-.6);
\draw (\c,4) -- +(0,-.6);
\draw (\d,4) -- +(0,-.6);
\draw[<->] (\a,3.8) -- (\b,3.8);
\draw[<->] (\b,3.8) -- (\c,3.8);
\draw[<->] (\c,3.8) -- (\d,3.8);
\node at (\mab,4) {Transmit};
\node at (\mbc,4) {Idle};
\node at (\mcd,4) {Receive};
\end{tikzpicture}
这种方法只是部分有效,因为级别变化的实际 X 位置仍需手动输入。但至少 X 位置是在单个位置输入的。
KOMA 脚本环境的问题仍然存在。