LaTeX3:\dim_set:Nn 带有 l3calc 或 calc 类型维度表达式

LaTeX3:\dim_set:Nn 带有 l3calc 或 calc 类型维度表达式

当我尝试使用 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语法。要么使用模块中的函数l3calccalc_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但代码应该是可靠的。)

相关内容