确定 tikz 中粗体文本的宽度

确定 tikz 中粗体文本的宽度

粗体 tikz 文本装饰 |\bf|被提及作为插入螺栓 tikz 文本装饰的一种可能方法。

如何确定粗体 tikz 文本装饰的宽度?

我尝试:

\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  % ...                                                                                                                                                                                                     
  \pgfmathsetmacro{\mywidth}{width("Some text")}
  \pgfmathsetmacro{\mywidthb}{width("|\bf|Some bold text")}
  %...                                                                                                                                                                                                      
\end{tikzpicture}
\end{document}

编译遇到错误:

! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.7 ...ro{\mywidthb}{width("|\bf|Some bold text")}

宽度的应用如下将文本精确地置于路径上指定点的中心

答案1

您可以通过修补 来实现这一点\pgfmathparse。您必须用 替换两个\edef\protected@edef以下工作:

\documentclass{article}
\usepackage{tikz}

\makeatletter

\def\pgfmathparse@#1{%
    % No (math) units yet.
    \global\pgfmathunitsdeclaredfalse
    \global\pgfmathmathunitsdeclaredfalse
    % Expand expression so any remaining CSs are registers
    % or box dimensions (i.e. |\wd|, |\ht|, |\dp|).
    \protected@edef\pgfmath@expression{#1}%
    %
    \expandafter\pgfmathparse@trynumber@loop\pgfmath@expression\pgfmath@parse@stop
    %
    % this here is the _real_ parser. it is invoked by
    % \pgfmathparse@trynumber@loop if that says "this is no number"
    %\pgfmathparse@@\pgfmath@parse@stop%
}

\def\pgfmath@startgroup@#1{\protected@edef\pgfmathresult{#1}}

\makeatother

\begin{document}
\pgfmathsetmacro{\mywidth}{width("Some text")}
\pgfmathsetmacro{\mywidthb}{width("|\bf|Some bold text")}
\end{document}

答案2

首先,"|\bf|Some bold text"应该在decorations.text真正使用时"|\bfseries|Some bold text",应该看到此主题以获取更多信息,但正如你指出的那样,它们在这里都不起作用。更糟糕的是,通常的\setbox0\hbox{...}技巧不起作用,因为 TiZ 吞噬文本,参见例如这次讨论,由此我构建了一个可能的解决方案:中断tikzpicture,测量,恢复tikzpicture。当然,也可以使用不同的语法等等。

\documentclass[margin=1cm]{standalone}
\usepackage{tikz}
\makeatletter
\newcommand{\IfInTikzPic}{% https://tex.stackexchange.com/a/121309/4301
  \ifx\pgfpictureid\@undefined
    \expandafter\@secondoftwo
     \else
    \expandafter\@firstoftwo
    \fi
}
\makeatother
% cf https://tex.stackexchange.com/a/459858/121799
\newcommand{\WidthOfStuff}[1]{\IfInTikzPic{\begin{pgfinterruptpicture}%
\setbox0\hbox{#1}%
\xdef\pgfmathresult{\the\wd0}%
\end{pgfinterruptpicture}}{%
\setbox0\hbox{#1}%
\xdef\pgfmathresult{\the\wd0}}}
\begin{document}
\begin{tikzpicture}
  % ...                                                                                                                                                                                                     
  \pgfmathsetmacro{\mywidth}{width("Some text")}
  \WidthOfStuff{\textbf{Some bold text}}
  \pgfmathsetmacro{\mywidthb}{\pgfmathresult}     

  \node{\mywidth,\mywidthb};
  %...                                                                                                                                                                                                      
\end{tikzpicture}
\end{document}

相关内容