\skipeval
和之间有什么区别\dimeval
?它们似乎产生相同的结果,但也许可以\dimeval
去除胶水?
\rule{\dimeval{ \linewidth plus 1cm minus 1cm - 1cm}}{1pt} a\\
\rule{\skipeval{\linewidth plus 1cm minus 1cm - 1cm}}{1pt} a\\
答案1
它们是 eTeX 基元的薄包装器\dimexpr
,并且\glueexpr
在规则长度等维度上下文中,两者都可以使用,但比较跳过/粘合上下文,例如设置\baselineskip
\documentclass{article}
\begin{document}
\setlength\baselineskip{\skipeval{20pt plus 2pt - 3pt}}
\showthe\baselineskip
\setlength\baselineskip{\dimeval{20pt plus 2pt - 3pt}}
\showthe\baselineskip
\end{document}
显示\skipeval
生成17.0pt plus 2.0pt
但\dimeval
生成并且 -3pt 被排版。实际上 \dimeval 由of20.0pt plus 2.0pt
终止但随后吸收了作为原始跳过组件,留下 -3pt 作为尾随标记,这些标记被排版为文本p
plus
\setlength
plus 2pt
答案2
\rule
不是比较\dimen
s 与\skip
's 的最佳工具,因为plus
或minus
规范被忽略了。
的定义\rule
是
\DeclareRobustCommand\rule{\@ifnextchar[\@rule{\@rule[\z@]}}%
\def\@rule[#1]#2#3{%
\leavevmode
\hbox{%
\setlength\@tempdima{#1}%
\setlength\@tempdimb{#2}%
\setlength\@tempdimc{#3}%
\advance\@tempdimc\@tempdima
\vrule\@width\@tempdimb\@height\@tempdimc\@depth-\@tempdima}}
标记\@width
代表width
;由于\vrule
需要\dimen
显式的或带有寄存器的 ,在后一种情况下,它会将 强制转换\skip
为\dimen
。
因此,事实上,\rule{123pt plus 12pt minus 42pt}{1pt}
无错误运行只是实现的结果,并且最终的宽度将是 123pt。
最好比较一下你得到的值。考虑一下
\documentclass{article}
\newlength{\mytest}
\begin{document}
\setlength{\mytest}{\dimeval{\linewidth plus 100pt minus 100pt - 100pt}}
\texttt{\the\mytest}
\setlength{\mytest}{\skipeval{\linewidth plus 100pt minus 100pt - 100pt}}
\texttt{\the\mytest}
\end{document}
我为了不得到小数而将1cm
其改为。100pt
顶部的“-100pt”在干什么?这就是你的尝试失败的证据不是相等的。
确实,你的
\dimeval{\linewidth plus 100pt minus 100pt - 100pt}
返回 345.0pt,因为与(基于)p
无关,所以最终 LaTeX 会\dimexpr
\dimeval
\setlength{\mytest}{345.0pt plus 100pt minus 100pt - 100pt}
变成
\mytest=345.0pt plus 100pt minus 100pt - 100pt\relax
(由于 的实施\setlength
)。部分
\mytest=345.0pt plus 100pt minus 100pt
是一个完整的\skip
规范;然后 TeX 排版-100pt
。
相反,中的参数\skipeval
有效,\glueexpr
并且长度按预期计算。
可以捕获错误输入吗\dimeval
?我认为如果不执行分配,这是不可能的,这会使命令无法扩展。