下面的表达式到底为什么会给我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}
没有一个单位(如pt
或ex
)可保留。
也许需要类似的东西
{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
ex
TeXbook 中对内部单元的解释如下:
ex 是当前字体的“x 高度”。
它取自\fontdimen5
,如附录 F 中所述。因此,该值取决于字体。
\nullfont\edef\x{\the\dimexpr 3ex-1ex\relax}
\show\x
给出
> \x=macro:
->0.0pt.
如果你ex
在 LaTeX 中使用前 \documentclass
,0pt
因为当时没有选择字体。
此外,可能还有文档类(如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
。