考虑以下 MWE:
\documentclass{article}
\usepackage{tikz}
\newlength{\tlen}
\newlength{\tlenB}
\begin{document}
\setlength{\tlen}{2cm}
\typeout{check 1, tlen is: \the\tlen}
\pgfmathsetlength{\tlenB}{2cm}
\typeout{check 1, tlenB is: \the\tlenB}
\setlength{\tlen}{2cm plus 2pt minus 1pt}
\typeout{check 2, tlen is: \the\tlen}
\pgfmathsetlength{\tlenB}{2cm plus 2pt minus 1pt}
\typeout{check 2, tlenB is: \the\tlenB}
\end{document}
其输出结果如下:
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011)
...
check 1, tlen is: 56.9055pt
check 1, tlenB is: 56.9055pt
check 2, tlen is: 56.9055pt plus 2.0pt minus 1.0pt
! Package PGF Math Error: Unknown operator `p' or `pl' (in '2cm plus 2pt minus
1pt').
See the PGF Math package documentation for explanation.
Type H <return> for immediate help.
...
l.15 ...hsetlength{\tlenB}{2cm plus 2pt minus 1pt}
因此,显然\pgfmathsetlength
(或pgfmath
一般而言?)无法处理胶水型长度,特别是plus
和minus
部分。
使用胶粘式长度跳过时我有什么选择pgfmath
?如果没有更好的选择,那么我只会选择固定部分(即我可以忍受plus
/minus
可拉伸/可收缩部分被截断)...
(提醒自己:这里有关于胶水的很好的介绍:什么是胶水拉伸?)
答案1
看看它是如何\pgfmathsetlength
工作的(来自pgfmathcalc.code.tex
):
\def\pgfmathsetlength#1#2{%
\expandafter\pgfmath@onquick#2\pgfmath@%
{%
% Ok, quick version:
\begingroup%
\pgfmath@selectfont%
#1#2\unskip%
\expandafter\endgroup%
\expandafter#1\the#1\relax%
}%
{%
\pgfmathparse{#2}%
\ifpgfmathmathunitsdeclared%
#1\pgfmathresult mu\relax%
\else%
#1\pgfmathresult pt\relax%
\fi%
}%
\ignorespaces%
}
当第二个参数以 开头时,将选择“快速版本” +
(请参阅手册中的第 88.3 节),但此处并非如此。在“正常情况下”,表达式将照常进行求值并转换为十进制数(即单位点);如果原始表达式有mu
单位,则最终设置也将带有mu
单位。
就你的情况来说,
\pgfmathparse{2cm plus 2pt minus 1pt}
尝试,这是非法的,并抛出
! Package PGF Math Error: Unknown operator `p' or `pl' (in '2cm plus 2pt minus 1pt').
这不会发生在
\pgfmathparse{\tlen}
因为在后一种情况下,\pgfmathsetlength{\tlenB}{\tlen}
橡胶长度 ( \skip
) 被强制转换为刚性长度 ( ) ,所以将通过以下方式执行。\dimen
用简单的 TeX 术语来说,如果你这样做
\newskip\tlen
\newdimen\temp
\tlen=1pt plus 2pt minus 3pt % a silly value just for example
\temp=\tlen
寄存器设置为\dimen
;拉伸和收缩组件被丢弃。\tlen
1pt
总之\pgfmathsetlength
,刚性长度。相反,LaTeX\newlength
分配了一个橡胶长度登记。
不幸的术语冲突案例。经验法则是记住,橡胶长度在 TikZ 图片中没有用处(除非在其中排版文本,但这是另一回事),而在文本模式下,橡胶长度与刚性长度一样有用。
答案2
我在写问题时偶然发现了这一点,所以我最好记下来:通过替换上面代码中的以下代码片段:
...
\setlength{\tlen}{2cm plus 2pt minus 1pt}
\typeout{check 2, tlen is: \the\tlen}
\pgfmathsetlength{\tlenB}{\tlen}
\typeout{check 2, tlenB is: \the\tlenB}
...
...代码将会编译而不会出现错误,并输出以下输出:
check 1, tlen is: 56.9055pt
check 1, tlenB is: 56.9055pt
check 2, tlen is: 56.9055pt plus 2.0pt minus 1.0pt
check 2, tlenB is: 56.9055pt
...这意味着只要通过设置粘合长度\setlength
,这样的长度就可以(显然)用作的参数\pgfmathsetlength
,并且它将传递 - 其中和plus
从变量minus
中截断\pgfmathsetlength
。