序言中的 \settowidth 与带有 MWE 的 fontspec+lualatex 错误

序言中的 \settowidth 与带有 MWE 的 fontspec+lualatex 错误

使用 luaLaTeX 和一个相当简单的命令定义时,我遇到了一些奇怪的行为。我使用的是 TeXLive 2012,Linux x86_64。

\settowidth在序言中使用来计算以下示例中某些字符的宽度时,宽度被严重低估,并且当该宽度用于负缩进某些文本时,它不会对齐。

如果\settowidth将操作移到文档环境内部,计算就没问题。

这是一个最小工作示例:

\documentclass[12pt]{article}
  \usepackage{lipsum}
  \usepackage{fontspec}

\newdimen\arrowwidth
\settowidth{\arrowwidth}{$\rightarrow$\ }
\newcommand{\note}[1]{\noindent\hskip-\arrowwidth{$\rightarrow$\ }{#1}}

\begin{document}
\lipsum[1]
%\settowidth{\arrowwidth}{$\rightarrow$\ }
\note{HELLO WORLD!}

\lipsum[2-2]

\end{document}

如果取消注释上面的行\note{HELLO WORLD},则一切都会按预期工作。

改变12pt选项也会使问题发生很大变化。

字符不是问题。您可以用罗马文字代替右箭头,但仍然会出现问题。

有人知道这是什么原因造成的吗?还有人能重现这种情况吗?

答案1

由于技术原因,fontspec在前言完全读入后会延迟一些字体设置。特别是,执行该命令时字体大小仍为 10pt 。您可以通过强制执行该命令来\settowidth解决问题:\normalsize

\settowidth{\arrowwidth}{\normalsize$\rightarrow$\ }

但是有一种更巧妙的方法来定义你的\note命令:

\newcommand{\note}[1]{\noindent\makebox[0pt][r]{$\rightarrow$\ }#1}

不需要任何测量。

相关内容