Circuitikz 使用挂钩或自定义组件通过欧洲电阻调整标签基线位置

Circuitikz 使用挂钩或自定义组件通过欧洲电阻调整标签基线位置

我正在尝试找出一种将标签定位在欧洲电阻器内的方法。

我知道答案这里,但我认为该解决方案有点太复杂了。

我已经找到了以下方法:

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

circuitikz 欧洲电阻标签示例

第一个例子中的语法不需要修改实际电阻代码,但它只适用于从左到右的电阻。

第二个解决了这个问题,但需要将标签包装起来\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}

在此处输入图片描述

相关内容