将 skip(粘合)与 pgfmath 一起使用(从粘合长度中截断加/减部分)?

将 skip(粘合)与 pgfmath 一起使用(从粘合长度中截断加/减部分)?

考虑以下 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一般而言?)无法处理胶水型长度,特别是plusminus部分。

使用胶粘式长度跳过时我有什么选择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;拉伸和收缩组件被丢弃。\tlen1pt

总之\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

相关内容