通过最小工作示例演示问题
我在文件中保存了以下 LaTeX 代码~/Test.tex
。
\documentclass{article}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\newlength{\mytrianglewidth}
\begin{document}
\settowidth{\mytrianglewidth}{$\smallblacktriangleright$}
\the\mytrianglewidth
\end{document}
该代码创建了一个类的文档article
。它加载STIX 两个数学font,它使命令 等可用\smallblacktriangleright
。然后它创建一个名为 的新长度变量\mytrianglewidth
。在文档主体中,它将长度变量初始化为与\smallblacktriangleright
命令关联的字形的宽度。最后,它打印出长度变量的值。
然后我在终端中执行了以下命令。
> cd ~
> lualatex Test
编译成功完成,并创建了文件~/Test.pdf
。在 PDF 查看器中打开时,该文件显示字符串6.76pt
。
到目前为止一切顺利。我现在将命令移至\settowidth
序言末尾,然后重新编译。编译失败,并~/Test.log
包含以下消息。
! Undefined control sequence.
<recently read> \smallblacktriangleright
l.7 ...\mytrianglewidth}{$\smallblacktriangleright$}
?
! Emergency stop.
<recently read> \smallblacktriangleright
l.7 ...\mytrianglewidth}{$\smallblacktriangleright$}
End of file on the terminal!
问题
有没有办法访问STIX 两个数学字体在序言中,这是否会导致编译失败?
动机
之所以有这个愿望,是为了能够定义命令,比如\mymarginpar
在这个答案。
可能的解决方案
解决这个问题的一种方法是将\settowidth
命令传递给\AtBeginDocument
钩子,因此:
...
\AtBeginDocument{\settowidth{\mytrianglewidth}{$\smallblacktriangleright$}}
\begin{document}
...
这个方法可行,但感觉像是作弊,因为 的值\smallblacktriangleright
在前言中并没有真正被访问。我想知道还有其他方法可以解决这个问题。