tikz-timing: ¿existe una forma sencilla de agregar un eje de tiempo numerado?

tikz-timing: ¿existe una forma sencilla de agregar un eje de tiempo numerado?

Me encanta el tikz-timing para preparar diagramas de tiempo para mi enseñanza. Sin embargo, una cosa que no he podido encontrar es cómo podría agregar un eje de tiempo numerado a un diagrama de tiempo. Esto es útil cuando se muestran los conceptos básicos del diseño del banco de pruebas y se desea indicar la correspondencia en el diagrama con una línea en la fuente Verilog. Me imagino que una superposición de TikZ podría funcionar, pero no soy un gran profesional y preferiría algo donde los números se agreguen automáticamente. Estoy usando las líneas de ayuda verticales, por lo que de alguna manera agregar números encima o debajo de ellas sería genial.

Respuesta1

No hay una macro dedicada proporcionada por tikz-timing, pero es posible dibujar dicho eje etiquetado utilizando las macros de tamaño y los nodos proporcionados.

El número de filas viene dado por \nrowsy la fila más ancha por \twidth. Las filas también se proporcionan como nodos llamados row<number>y el nodo de la última fila también recibe un nombre last row. Para dibujar material adicional, coloque el código de dibujo en un extracodeentorno después de la última fila como se muestra en el siguiente ejemplo. Consulte el manual de tikz-timingpara obtener más detalles.

\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}

Resultado


Si necesita esto con más frecuencia, puede definir una macro propia:

\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}

Respuesta2

Aquí hay otra forma posible, utilizando pgfplotsy el axismedio ambiente; se vería así:

prueba_pdf

... usando este 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}

Tenga en cuenta que es necesario hacer un poco de aritmética para escalar las unidades del \timinggráfico a las unidades que se muestran en el gráfico; tal vez mi ejemplo anterior no esté alineado con píxeles perfectos, pero al menos no se ve todo. así de difícil de configurar...

información relacionada