当我尝试使用 LaTeX3 命令设置带有 l3calc/calc 类型维度表达式的维度寄存器时,出现错误\dim_set:Nn
。即使将整个表达式包装进去也\dim_eval:n{}
无济于事。我该怎么办?
\documentclass{article}
\usepackage{expl3}
\usepackage{l3calc}
\begin{document}
\newlength{\mydim}
\setlength\mydim{15pt*\ratio{5pt}{10pt}} %this works
\typeout{\the\mydim} %7.5pt
\ExplSyntaxOn
\dim_set:Nn\mydim{15pt*\ratio{5pt}{10pt}} %error
\dim_set:Nn\mydim{\dim_eval:n{15pt*\ratio{5pt}{10pt}}} %same error
\ExplSyntaxOff
\typeout{\the\mydim} %don't get here
\end{document}
答案1
dim_set
使用 e-TeX 语法,而不是calc
语法。要么使用模块中的函数l3calc
(calc_dim_set
等等),要么将表达式转换为 e-TeX 语法:
\calc_dim_set:Nn\mydim{15pt*\ratio{5pt}{10pt}}
\dim_set:Nn\mydim{5pt*15/10}
答案2
它的工作原理calc
是,它需要\setlength
进行大量扫描才能工作。因此,如果你看看\ratio
外部只是\setlength
。\relax
另一方面,\dim_set:Nn
更类似于直接设置 TeX dimen 寄存器:定义是(在原语中)
\protected \def \dim_set:Nn #1#2 { #1 \dimexpr #2 \relax }
而 \dim_eval:n
\def \dim_eval:n #1 { \the \dimexpr #1 \relax }
所以当你尝试做
\dim_set:Nn \mydim { 20pt * \ratio { 5pt } { 10pt } }
\ratio
是\relax
,由于维度表达式提前结束,您会收到错误。
现在,关于该怎么做,我猜这需要 LaTeX3 团队的一点考虑。我们最近已经搬走了,l3calc
因为expl3
其中一些不再那么有用,但我们知道有些部分肯定有用。我猜我们这里需要一个可扩展\dim_ratio:nn
函数来返回两个维度表达式之间的比率。我会安排将其添加到expl3
:可能要等到 TeX Live 2011 冻结后才会发布 CTAN,但完成后我会在此处发布代码作为编辑。
我现在有一些可扩展比率函数的代码,因此可以在内部使用\dim_set:Nn
:
\cs_new_nopar:Npn \dim_ratio:nn #1#2
{ \dim_ratio_aux:n {#1} / \dim_ratio_aux:n {#2} }
\cs_new_nopar:Npn\dim_ratio_aux:n #1
{ \exp_after:wN \int_value:w \dim_eval:w #1 \dim_eval_end: }
\cs_new_protected_nopar:Npx \dim_ratio_aux:w
{
\cs_set_nopar:Npn \exp_not:N \dim_ratio_aux:w ##1 \tl_to_str:n { pt }
{##1}
}
\dim_ratio_aux:w
expl3
这将在今天晚些时候进入开发版本。(这在 中有效sp
,因此如果给出的话数字会相当大,pt
但代码应该是可靠的。)