为什么在表达式\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}