\dimexpr 给出 0pt

\dimexpr 给出 0pt

下面的表达式到底为什么会给我0.0pt

\edef\x{\the\dimexpr 3ex-1ex\relax}

我认为ex它是一个 LaTeX 单元,因为它不在 TeXbook 中。请问它在内核中定义在哪里?

编辑

非常感谢您的回答。啊,Joseph Wright\nullfont在我刚开始使用 TeX 时就告诉过我。

{A_1ex,A_3ex,A_...,A_10ex}我尝试使用与 不同的方案(可能比 更快)来完成列表\foreach\foreach无法完成此列表或{A_1pt,A_3pt,A_...,A_10pt}。以下情况通常会失败:

\newcount\cnta
\cnta\z@
\foreach \p in {A_1pt,A_3pt,A_...,A_10pt}{%
  \global\advance\cnta\@ne
  \typeout{Doing \romannumeral\cnta=\p}%
}

我在包中进行了测试,因此\nullfont是有效的。我将从允许的单位中删除与字体相关的单位,或者使其使用有条件地在文档主体中。

我上面说“可能更快”是因为我发现在列表的每个元素中\foreach查找省略号( ),通过:...

\def\pgffor@scanned{%
  \ifx\pgffor@value\pgffor@stop
    \let\pgffor@next=\pgffor@after
  \else
    \expandafter\pgffor@dots@in@
      \pgffor@value\pgffor@dots@...\pgffor@dots@@\pgffor@stop
    \ifpgffor@dots@in@
      \let\pgffor@next=\pgffor@handledots
    \else
      \let\pgffor@next=\pgffor@handlevalue
    \fi
    <more>
}

编辑

在下面的 中的定义中\foreach\relax缺少两个。或者是故意的?我不这么认为。

\def\pgffor@makealphabetic#1{%
  \pgfutil@tempcnta=#1\relax%
  \ifnum\pgfutil@tempcnta>95\relax%
    \advance\pgfutil@tempcnta by-96%
    \expandafter\def\expandafter#1\expandafter%
    {\pgffor@alpha\pgfutil@tempcnta}%
  \else%
    \advance\pgfutil@tempcnta by-64%
    \expandafter\def\expandafter#1\expandafter%
    {\pgffor@Alpha\pgfutil@tempcnta}%
  \fi%
}

编辑(2012/09/08)

{A_1ex, A_3ex, A_..., A_10ex}

我的方案恢复并使用ex已完成/已填充列表中的(原始单元)。正如 percusse 指出的那样,PGF 的方案需要

{A_1ex, A_3ex, A_...ex, A_10ex}

我的方案也可以解析,例如,

{A_1pt-2bp*3+(3cc-2ex)/2, A_1pt-3bp*3+(3cc-2ex)/2, A_..., A_1pt-12bp*3+(3cc-2ex)/2}

但是,由于解析这种类型的表达式很昂贵,并且不太可能被任何用户传递,因此我没有将其包含在相关的宏中。我已将其保留在包中作为未来的工具。例如,1pt-2bp*3+(3cc-2ex)/2解析昂贵的原因是需要安全地确认它是“可维度的”。在这种情况下,简单的计数器或维度分配并不总是有效。我欢迎在这方面提出一些想法。

一点:你无法重构语法

1pt-2bp*3+(3cc-2ex)/2

评估后。即使是 PGF 的方案也无法想象做到这一点,因为你要把什么放在 X 的位置上

{A_1pt-3bp*3+(3cc-2ex)/2, A_1pt-9bp*3+(3cc-2ex)/2, A_...X, A_1pt-27bp*3+(3cc-2ex)/2}

没有一个单位(如ptex)可保留。

也许需要类似的东西

{A_1pt-3bp*3+(3cc-2ex)/2, A_1pt-9bp*3+(3cc-2ex)/2,
  A_...1pt-?bp*3+(3cc-2ex)/2, A_1pt-27bp*3+(3cc-2ex)/2}

注意?。但是这样会不会太过分?TeX 不是理论。

答案1

exTeXbook 中对内部单元的解释如下:

ex 是当前字体的“x 高度”。

它取自\fontdimen5,如附录 F 中所述。因此,该值取决于字体。

\nullfont\edef\x{\the\dimexpr 3ex-1ex\relax}
\show\x

给出

> \x=macro:
->0.0pt.

如果你ex在 LaTeX 中使用 \documentclass0pt因为当时没有选择字体。

此外,可能还有文档类(如minimal直到没有选择字体\begin{document}

无论如何,即使 选择了某种字体\documentclass,您也无法真正知道具体是哪一种,因为文档的“真正”初始化发生在 中\begin{document}

因此,请小心使用与字体相关的单位,例如ex或,em除非您知道当前字体是什么!

(感谢 Barbara Beeton 指出这个问题!)

答案2

\foreach如果在省略号后添加ex或 ,则可以完成该列表。例如:pt

\documentclass{article}
\usepackage{pgffor}

\makeatletter
\newcount\cnta
\cnta\z@
\foreach \p in {A_1ex,A_2ex,A_...ex,A_10ex}{%
  \global\advance\cnta\@ne
  \typeout{Doing \romannumeral\cnta=\p}%
}


\begin{document}
.
\end{document}

同样适用pt

在此处输入图片描述

相关内容