修复方式\pgfmath@selectfont

修复方式\pgfmath@selectfont

为什么在表达式\uline中使用会pgfmath导致错误?

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\begin{document}
\pgfmathparse{width("\uline{blabla}")}
\end{document}

错误:

! Undefined control sequence.
\ULset ->\UL@setULdepth \def \UL@leadtype 
                                          {\leaders \hrule \@height \UL@heig...
l.6 ...se{width("\let\uline\relax\uline{blabla}")}

! TeX capacity exceeded, sorry [input stack size=5000].
\UL@on #1->\leavevmode 
                       \UL@ender \let \UL@on \UL@onin \everymath {\UL@hrest ...
l.6 ...se{width("\let\uline\relax\uline{blabla}")}

!  ==> Fatal error occurred, no output PDF file produced!

我的\uline宏嵌入在其他宏中,所以我不能简单地不把它写在那里。我曾想过\uline在数学表达式中暂时取消定义(我不需要它来计算宽度,对吧!),但这只会让事情变得更加神秘:错误仍然存​​在(似乎\let永远不会执行)。

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\begin{document}
\pgfmathparse{width("\let\uline\relax\uline{blabla}")}
\end{document}

答案1

它具有过早扩展的所有迹象,但通常的\protect方法似乎在这里不起作用。您可以使用盒子寄存器来确保安全:

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\begin{document}
\sbox{0}{\uline{blabla}}
\typeout{\the\wd0}
\pgfmathparse{width("\usebox{0}")}
\typeout{\pgfmathresult}
\end{document}

运行没有错误并\pgfmathresult获取正确的值:

26.66675pt
26.66675

答案2

还有一次中间检查,正如 David Carlisle 注意到的那样,它会导致早期扩展。因此更多的保护会有所帮助。如果文本是粗体等,这也是必要的\textbf

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\begin{document}
\pgfmathparse{width("\noexpand\noexpand\noexpand\uline{blabla}")}
\pgfmathresult
\end{document}

答案3

修复方式\pgfmath@selectfont

\uline这对于和的组合很有效width

代码

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\makeatletter
\def\pgf@tempa{\let\uline\relax}
\expandafter\def\expandafter\pgfmath@selectfont\expandafter{\expandafter\pgf@tempa\pgfmath@selectfont}
\makeatother

\begin{document}
\uline{blabla}

\pgfmathparse{width("\uline{blabla}")}
\pgfmathresult

\uline{blabla}
\end{document}

输出

在此处输入图片描述

\let

如果在 之外\uline使用,则可以暂时消除。 将其本地化并在文档的其余部分中正常工作。\let\uline\relax\pgfmathparse\uline

为了访问该组之外的结果,我们需要定义\pgfmathresult全局(通过\xdef)。

代码

\documentclass{article}
\usepackage[normalem]{ulem}
\usepackage{tikz}

\begin{document}
\begingroup
  \let\uline\relax
  \pgfmathparse{width("\uline{blabla}")}%
  \xdef\pgfmathresult{\pgfmathresult}% make \pgfmathresult global
\endgroup
\pgfmathresult
\end{document}

相关内容