tikz-timing: есть ли простой способ добавить пронумерованную ось времени?

tikz-timing: есть ли простой способ добавить пронумерованную ось времени?

Обожаю tikz-timing за подготовку временных диаграмм для моего обучения. Однако я не смог найти, как добавить пронумерованную временную ось к временной диаграмме. Это полезно при показе основ проектирования тестового стенда и желании указать соответствие на диаграмме с помощью линии в исходном коде Verilog. Я думаю, что наложение TikZ могло бы работать, но я не такой уж профессионал и предпочел бы что-то, где числа добавляются автоматически. Я использую вертикальные вспомогательные линии, поэтому было бы здорово каким-то образом добавить числа над или под ними.

решение1

В . не предусмотрено специального макроса tikz-timing, но можно нарисовать такую ​​маркированную ось, используя предоставленные макросы размера и узлы.

Количество строк задается как , \nrowsа самая широкая строка как \twidth. Строки также предоставляются как узлы, называемые , row<number>и последний узел строки также называется last row. Чтобы нарисовать дополнительный материал, поместите код рисования в extracodeсреду после последней строки, как показано в примере ниже. Пожалуйста, смотрите руководство для tikz-timingполучения более подробной информации.

\documentclass[border=2mm]{standalone}
\usepackage{tikz-timing}
\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
 \begin{background}
  \vertlines[help lines]{}
  \horlines[help lines]{}
  \show\horlines
  \draw [->,>=latex] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth}
    \draw (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
 \end{background}
 %\tablegrid
\end{extracode}
\end{tikztimingtable}%
\end{document}

Результат


Если вам это нужно чаще, вы можете определить собственный макрос:

\documentclass[border=2mm,png]{standalone}
\usepackage{tikz-timing}

\newcommand{\timingaxis}[1][]{%
  \begin{scope}[#1]
  \draw [timing/table/axis] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth} {
    \draw [timing/table/axis ticks]
        (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
  }
  \end{scope}
}
\tikzset{%
    timing/table/axis/.style={->,>=latex},
    timing/table/axis ticks/.style={},
}

\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
    \timingaxis\relax
\end{extracode}
\end{tikztimingtable}%
\end{document}

решение2

Вот еще один возможный способ, использующий pgfplotsи axisсреду; он будет выглядеть так:

тест_pdf

...используя этот MWE:

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{tikz-timing}
\usetikzlibrary{intersections} %% named intersections
\usetikzlibrary{fit}
\usetikzlibrary{calc}

\makeatletter
% http://tex.stackexchange.com/questions/33703/extract-x-y-
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother

\begin{document}

\begin{tikzpicture}[timing/picture]%,timing/nodes/advanced]
\begin{axis}[clip=false,ymin = 0, ymax = 2, xmin = 0, xmax = 5]

 %\addplot [] node [] (origin) at (0,0) {}; %no
\addplot [] coordinates {(0,0)};
\node[] (refsize) at ({axis cs:1,1}) {};

\pgfplotsextra{ % must have, else \gettikzxy will not work!
\gettikzxy{(refsize)}{\rx}{\ry}
% re-convert \rx back to length, so can scale it directly in style= below:
\newlength{\trx}
\setlength{\trx}{\rx}
\typeout{rx \rx - \the\trx, ry \ry}

\timing[very thick,style={x=0.5\trx,y=\ry},name=tgraph1] at ({axis cs:1,0.5}) { HLHLHL };

% debug:
% add frame border around tgraph1
\node[fit=(tgraph1), draw, color=gray] {};
% indicate origin of tgraph1 (is lower left corner):
\node[fill,circle,color=gray] at (tgraph1.origin) {};
} % end \pgfplotsextra

\end{axis}
\end{tikzpicture}

\end{document}

Обратите внимание, что необходимо выполнить некоторые арифметические действия, чтобы масштабировать единицы графика \timingв соответствии с единицами, показанными на графике. Возможно, мой пример выше не будет выровнен с точностью до пикселя, но, по крайней мере, его настройка не выглядит такой уж сложной...

Связанный контент