我正在尝试找出一种将标签定位在欧洲电阻器内的方法。
我知道答案这里,但我认为该解决方案有点太复杂了。
我已经找到了以下方法:
\documentclass{article}
\usepackage{tikz}
\usepackage[european]{circuitikz}
\begin{document}
\begin{circuitikz}
\tikzset{R/.append style={color=red, label distance=-13pt, label/align = rotate}}
\def\DIR{0,45,90,135,180,-90,-45,-135}
\foreach \i in \DIR {
\draw (0,0) to[R=$\i$, *-o] (\i:2.5);
}
\end{circuitikz}
\begin{circuitikz}
\newcommand{\vc}[1]{$\raisebox{-2.5pt}{#1}$}
\tikzset{R/.append style={color=red, label distance=-10.5pt, label/align = rotate}}
\def\DIR{0,45,90,135,180,-90,-45,-135}
\foreach \i in \DIR {
\draw (0,0) to[R=\vc{$\i$}, *-o] (\i:2.5);
}
\end{circuitikz}
\end{document}
第一个例子中的语法不需要修改实际电阻代码,但它只适用于从左到右的电阻。
第二个解决了这个问题,但需要将标签包装起来\vc{}
。
我想找到一种方法来使用第一个例子的简单语法,但让所有电阻的放置都能正常工作。有哪些可能性可以实现这一点?
有没有办法自动\vc{}
在每个电阻标签周围放置或使用其他命令?我已阅读了 CircuiTikZ 手册中有关钩子的内容,但我没有找到任何可以实现此目的的方法。
或者是否可以编写一个在绘制电阻之前调用的钩子,该钩子将检查电阻的方向,然后计算label distance
每个电阻的适当方向?
在我看来,问题与文本基线有关。我理解,当 CircuiTikZ 将电阻标签放置在电阻上方或下方时,电阻与标签文本基线之间的距离会有所不同,尽管无论标签位于电阻上方还是下方,电阻与标签之间的距离似乎都相同。是否可以调整基线位置,使基线穿过字符中间而不是底部?
CircuiTikZ 手册描述了一种定义自定义组件的方法。是否可以实现一个自定义组件来绘制一个带有标签的电阻器\raisebox
?(当然,我可以复制电阻器的原始代码并进行此更改,但我认为这太笨拙了。我想知道是否可以定义一个自定义组件,只进行这个小更改,然后调用原始代码来绘制电阻器。)
我也欢迎任何关于如何实现这一目标的其他想法。
答案1
如果你只是想要一种自动应用宏的方法,你可以在 Ti 处定义一个键钾Z 级别:
\tikzset{RV/.style={R=\vc{#1}}}
...然后使用Rv=...
而不是R=...
。
另一方面,在我看来,你想要的是欧式电阻中心的标签,例如类似于这个问题。没有提供此功能,因为它不适用于几乎所有其他组件(例如电容器)。但您可以非常轻松地“伪造”它(并且独立于角度),命名组件并使用简单的宏):
\documentclass{article}
\usepackage{a4wide}
\usepackage[european]{circuitikz}
\newcommand\centerlabel[2]{%
\node[rotate=\ctikzgetdirection{#1}] at (#1.center) {#2};
}
\begin{document}
\begin{circuitikz}[]
\def\DIR{0,45,90,135,180,-90,-45,-135}
\foreach \i in \DIR {
\draw (0,0) to[R, name=R\i, color=red, *-o] (\i:3);
\centerlabel{R\i}{\i}
}
\end{circuitikz}
\begin{circuitikz}[]
\foreach \i in {0,27,...,340} {
\draw (0,0) to[R, name=R\i, color=red, *-o] (\i:3);
\centerlabel{R\i}{\i}
}
\end{circuitikz}
\end{document}
在这种情况下,标签只是遵循组件的角度。但您可以使用数字形式\ctikzgetdirection
并使用一些数学知识来选择所需的角度;例如:
\documentclass{article}
\usepackage{a4wide}
\usepackage[european]{circuitikz}
\newcommand\centerlabel[2]{%
\pgfmathsetmacro{\dipolerot}{\ctikzgetdirection{#1}}
\pgfmathsetmacro{\myrot}{\dipolerot<90? \dipolerot :
(\dipolerot>270 ? \dipolerot: \dipolerot-180)}
\node[rotate=\myrot] at (#1.center) {#2};
}
\begin{document}
\begin{circuitikz}[]
\def\DIR{0,45,90,135,180,-90,-45,-135}
\foreach \i in \DIR {
\draw (0,0) to[R, name=R\i, color=red, *-o] (\i:3);
\centerlabel{R\i}{\i}
}
\end{circuitikz}
\begin{circuitikz}[]
\foreach \i in {0,27,...,340} {
\draw (0,0) to[R, name=R\i, color=red, *-o] (\i:3);
\centerlabel{R\i}{\i}
}
\end{circuitikz}
\end{document}