\skipeval 和 \dimeval 之间的区别

\skipeval 和 \dimeval 之间的区别

\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 作为尾随标记,这些标记被排版为文本pplus\setlengthplus 2pt

答案2

\rule不是比较\dimens 与\skip's 的最佳工具,因为plusminus规范被忽略了。

的定义\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?我认为如果不执行分配,这是不可能的,这会使命令无法扩展。

相关内容