
Эта фигура, которую я нарисовал с помощью Circuitikz, является первой «сложной» фигурой, с которой мне пришлось иметь дело с момента создания первого камня, но мне бы хотелось узнать для будущих проектов, можно ли сделать ее более «экспортируемой», то есть, если изменить расстояние между триггерами, то не так много вещей изменят свое положение, в отличие от того, что происходит сейчас.
Вот что я написал:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[siunitx, RPvoltages]{circuitikzgit}
\tikzset{flipflop JK/.style={flipflop,
flipflop def={t1=Q, t3={\ctikztextnot{Q}}, t6=J, t4=K,c5=1, td=PRST,
tu=CLR},
}}
\begin{document}
\begin{center}
\begin{circuitikz}[scale=0.8, transform shape]
\node[vsourcesquareshape, rotate=90](clk){};
\draw (-3,0) node[flipflop JK,external pins width=0](FF0){};
\draw (-6,0) node[flipflop JK,external pins width=0](FF1){};
\draw (-9,0) node[flipflop JK,external pins width=0](FF2){};
\draw (-12,0) node[flipflop JK,external pins width=0](FF3){};
\draw (-15,0) node[flipflop JK,external pins width=0](FF4){};
\draw (clk.north) -- (FF0.east)node[inputarrow,rotate=180]{};
\draw (FF0.pin 1) -| (-4.5,0);
\draw (-4.5,0) -- (FF1.pin 5)node[inputarrow,rotate=180]{};
\draw (FF1.pin 1) -| (-7.5,0);
\draw (-7.5,0) -- (FF2.pin 5)node[inputarrow,rotate=180]{};
\draw (FF2.pin 1) -| (-10.5,0);
\draw (-10.5,0) -- (FF3.pin 5)node[inputarrow,rotate=180]{};
\draw (FF3.pin 1) -| (-13.5,0);
\draw (-13.5,0) -- (FF4.pin 5)node[inputarrow,rotate=180]{};
\draw (FF0.pin 1) -| (-4.5,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_0$}};
\draw (FF1.pin 1) -| (-7.5,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_1$}};
\draw (FF2.pin 1) -| (-10.5,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_2$}};
\draw (FF3.pin 1) -| (-13.5,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_3$}};
\draw (FF4.pin 1) -| (-16.5,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_4$}};
\end{circuitikz}
\end{center}
\end{document}
решение1
Я интерпретирую вопрос как желание упростить изменение некоторых характеристик схемы в глобальном масштабе. Это можно сделать с помощью chains
, \foreach
и, как указал Rmano, calc. Можно поместить триггеры в цепь и сделать остальное в цикле. Тогда эти параметры появляются только один раз и могут быть изменены в глобальном масштабе. Например, расстояние между триггерами задается как node distance
.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[siunitx, RPvoltages]{circuitikz}
\usetikzlibrary{calc,chains}
\tikzset{flipflop JK/.style={flipflop,
flipflop def={t1=Q, t3={\ctikztextnot{Q}}, t6=J, t4=K,c5=1, td=PRST,
tu=CLR},
}}
\begin{document}
\begin{center}
\begin{circuitikz}[scale=0.8, transform shape]
\node[vsourcesquareshape, rotate=90](clk){};
% do the flip flops
\begin{scope}[start chain=going left,node distance=1.5cm,
nodes={on chain,flipflop JK,external pins width=0}]
\path foreach \X in {0,...,4}
{node(FF\X){}};
\end{scope}
% determine the midpoints between the flip flops and name them
\path foreach \X in {1,...,4}
{(FF\the\numexpr\X-1|-0,0) -- coordinate (c\X) (FF\X|-0,0)};
% add one more of the points to the left
\path let \p1=($(FF0.center)-(c1)$) in (FF4.center|-0,0)
++ (-\x1,0) coordinate (c5);
% from original code
\draw (clk.north) -- (FF0.east)node[inputarrow,rotate=180]{};
% draw the stuff between those nodes
\foreach \X in {1,...,4}
{\draw (FF\the\numexpr\X-1\relax.pin 1) -| (c\X);
\draw (c\X) -- (FF\X.pin 5)node[inputarrow,rotate=180]{};
\draw (FF\the\numexpr\X-1\relax.pin 1) -| (c\X|-0,2)node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_{\the\numexpr\X-1\relax}$}};}
% use c5
\draw (FF4.pin 1) -| (c5|-0,2) node[inputarrow,rotate=90]
{\rotatebox{-90}{$Q_4$}};
\end{circuitikz}
\end{center}
\end{document}
Большое спасибо Rmano за то, что он научил меня, как запустить ваш код. Я использую последнюю версию circuitikz
на CTAN. И извините, я не могу сказать вам, как получить это на overleaf, и я ничего не знаю об исправлении проблем на overleaf.