使用 KOMA 类高效地为 tikz-timing 图绘制注释

使用 KOMA 类高效地为 tikz-timing 图绘制注释

我必须绘制一些带注释的时序图。时序应按示例所示进行注释:

\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 脚本环境的问题仍然存在。

相关内容