Использование расстояний относительно шрифта в tikzpictures

Использование расстояний относительно шрифта в tikzpictures

Когда я использую scaleв tikzpictures (без transform shape), размер текста в узлах не меняется (что хорошо и правильно). Предположим теперь, что я хочу поместить какой-то узел в масштабированный график, используя расстояние, пропорциональное шрифту узла; я наивно полагал, что могу использовать exкоординаты, но см. ниже...

Я также распечатал значения координат, и\pgf@yyчто должно дать единичный вектор, но есть кое-что, чего мне здесь не хватает...

Есть ли способ выразить расстояние, пропорциональное размеру шрифта (по умолчанию), независимо от масштаба?

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

введите описание изображения здесь

решение1

Ваш 1emпреобразуется во время чтения в систему координат, на которую затем влияет масштаб изображения. Вы можете использовать reset cmдля локального сброса матрицы преобразования координат, локально отменяя эффект масштаба изображения.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1em) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
  \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
  \path[reset cm] (A) ++(0,1em) coordinate(B);
  \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
  \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
  \path[reset cm] (A) ++(0,1em) coordinate(B);
  \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\end{document}

решение2

Одним из вариантов является локальная переустановка шкалы (см. ответ Марсдена), но есть и лучший способ.

С scale=factor,всекоординаты масштабируются на factor, независимо от их размерности (в то время как единичные векторы не изменяются, как вы обнаружили). Вместо этого переопределите длину единичных векторов в соответствии с желаемым масштабированием. Например, с y={(0cm,2cm)}, в то время как (0,0) -- (1,0)будет вдвое больше обычного расстояния, координаты с размерностями, такими как (0,1ex), не изменятся:

\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1cm}
\end{tikzpicture}
\begin{tikzpicture}[baseline, x={(2cm,0cm)},y={(0cm,2cm)}]
    % Identical code to previous picture:
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path[scale=1] (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1cm}
\end{tikzpicture}
\end{document}

Выход:

выход

Обратите внимание, что расстояние между Aи Bне изменилось, а \the\pgf@yyувеличилось вдвое, как и ожидалось.

решение3

Почему бы вам не поместить B как узел?(с относительным размещением)?

Это решит все ваши проблемы.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\tikzset{node distance=1ex}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \node[above=of A,anchor=base](B){$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    %\path (A) ++(0,1ex) coordinate(B)node{y};
    \node[above=of A,anchor=base] (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    %\path (A) ++(0,1ex) coordinate(B)node{y};
    \node[above=of A,anchor=base] (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

Скриншот

решение4

Ответ Эрика Марсденахорошо объясняет, что происходит. Однако я бы просто прочитал соответствующую запись матрицы преобразования (это запись 22) и "инвертировал" ее. Это трюк, который я также использовал (без инверсии, конечно) для масштабирования ширины линии с помощью формы, потому что по умолчанию она не масштабируется.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

введите описание изображения здесь

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