tikz/pgf: вычислить ширину \small текста

tikz/pgf: вычислить ширину \small текста

В tikz/pgf есть функция width("x"). Согласно руководству по pgf, она возвращает:

ширина (горизонтального) TeX-блока, содержащего x.

После этого предложения он начинает говорить о вещах, которых я не понимаю:

Символы кавычек необходимы для предотвращения xразбора. Важно помнить, что любое выражение расширяется с помощью \edef перед разбором, поэтому любые макросы (например, команды шрифтов вроде \ttили \Huge) должны быть «защищены» (например, \noexpand\Hugeобычно достаточно).

Мне нужно измерить ширину какого-то текста с помощью \smallмодификатора. Однако я вообще не понимаю, что \edefи \noexpandкак делать. Я перепробовал все следующие комбинации:

\pgfmathsetmacro{\mywidth}{width("{\small My Text}")}
\pgfmathsetmacro{\mywidth}{width("{\noexpand\small My Text}")}
\pgfmathsetmacro{\mywidth}{width("\small{My Text}")}
\pgfmathsetmacro{\mywidth}{width("\noexpand\small{My Text}")}
\pgfmathsetmacro{\mywidth}{width("\small My Text")}
\pgfmathsetmacro{\mywidth}{width("\noexpand\small My Text")}

Во всех случаях значение \mywidthоказывается равным нулю.

Что я делаю не так?

РЕДАКТИРОВАТЬ:

Вот MWE

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

    \begin{document}
    
    \begin{tikzpicture}
    
        \pgfmathsetmacro{\mywidthsmall}{width("{\small My Text }")}
        \pgfmathsetmacro{\mywidthregular}{width("{My Text }")}
        \node[draw] (node1) {\mywidthsmall};
        \node[draw, below = 0pt of node1] (node2) {\mywidthregular};
    
    \end{tikzpicture}
    
\end{document}

Это дает:

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

решение1

Я не понимаю, в чем здесь глубокий смысл. Но widt("abc")даетточкаценность, потому чтоширинаэтомера длиныи по определению он имеетединица длины, в данном случае баллы.

Поэтому обычно это необходимо , если эта ширина будет где-то использоваться, что дает\pgfmathsetlenghtmacro\name{widt("abc")}длинанапример 12.34пт
и меньшее \pgfmathsetmacro\name{widt("abc")}, которое стирает единичные точки и даетномернапример 12.34

Что бы ни:

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

\documentclass[a4paper]{article}
\usepackage{tikz}
\def\sampletext{{\tiny My Text}}
\def\Sampletext{{\Huge My Text}}
\begin{document}
\section{tiny}
\pgfmathsetlengthmacro{\mywidth}{width("\sampletext")} 
\sampletext~ has the width \mywidth

\section{Huge}
\pgfmathsetlengthmacro{\Mywidth}{width("\Sampletext")} 
\Sampletext~ has the width \Mywidth

\section{pgfmathset\emph{length}macro}
\begin{tikzpicture}[
mystyle/.style={align=left,inner sep=0pt, anchor=west, draw}
]
\node[mystyle, draw, text width=\mywidth+1pt] (textbox) at (0,0) {\sampletext};
\draw[red] (textbox.north west) -- +(\mywidth,0) node[right=1mm]{\mywidth+1pt};

\node[mystyle, text width=\Mywidth+0pt] (textbox) at (0,-1) {\Sampletext};
\draw[red] (textbox.north west) -- +(\Mywidth,0) node[right=1mm]{\Mywidth};
\end{tikzpicture}

\section{Let's ruin it with pgfmathsetmacro, without \emph{length}}
\pgfmathsetmacro{\Mywidth}{width("\Sampletext")} 
\begin{tikzpicture}[
mystyle/.style={align=left,inner sep=0pt, anchor=west, draw}
]
\node[mystyle, text width=\Mywidth+0pt] (textbox) at (0,-1) {\Sampletext};
\draw[red] (textbox.north west) -- +(\Mywidth,0) node[right=1mm]{\Mywidth};
\end{tikzpicture}

Box correct, because \texttt{text width=123.4} (without unit)  sets points, as one would have written \texttt{text width=123.4pt}. \par 
Draw worse, because the default unit of TikZ is \texttt{cm}. 
\end{document}

решение2

Я получаю это с помощью \pgfmathsetmacro{\mywidthsmall}{width("{\small My Text }")}.

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

\documentclass[a4paper]{article}
\usepackage{tikz}
\pgfmathsetmacro{\mywidthsmall}{width("{\small My Text }")} %<- added space
\pgfmathsetmacro{\mywidthhuge}{width("{\huge My Text }")}   %<- added space
\setlength{\parindent}{0pt}

\begin{document}
Width of {\small My Text} = \mywidthsmall

Width of {\huge My Text} = \mywidthhuge

\bigskip

Try setting node width $\ldots$

\bigskip

\begin{tikzpicture}

\node[text width=\mywidthsmall,font=\small,align=left,inner sep=0pt] at (0,0) {My Text};
\node[text width=\mywidthsmall,font=\small,inner sep=0pt] at (0,-1) {My Text My Text};

\node[text width=\mywidthhuge,font=\huge,inner sep=0pt] at (0,-3) {My Text};
\node[text width=\mywidthhuge,font=\huge,inner sep=0pt] at (0,-5) {My Text My Text};

\end{tikzpicture}
\end{document}

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