这是一个最小的工作示例:
\documentclass{article}
\begin{document}
\newdimen\somelength
\somelength=1pt
\begin{picture}(0,0)
\put(\somelength,0){Some text}
\end{picture}
\end{document}
上述代码在 Linux 上编译成功(在 WSL 2 Ubuntu 和运行 Deepin Linux 的笔记本电脑上),但在 Windows 上编译失败。在 Windows 10 上,编译器给出错误消息:
Illegal unit of measure (pt inserted). \put(\somelength,0){3}
我尝试了 pdfLaTeX 和 XeLaTeX,它们都可以在 Linux 上运行,但在 Windows 上会给出相同的错误消息。我尝试添加
\setlength{\unitlength}{1pt}
在环境之前picture
,但我仍然收到错误消息。但如果我改变
\put(\somelength,0){Some text}
到
\put(3,0){Some text}
它工作得很好。看来该\put
命令不接受变量作为其坐标。
[编辑]
事实证明,这个问题实际上是由于我使用了旧版本的 TeX(2020 年 10 月之前)造成的,在那个版本中,只允许使用数字作为坐标,所以
\put(1.2em,1.5ex){text}
会导致错误。不过,在后来的版本中它变得有效(这也是我多次使用它的原因),更新 TeX 可以解决问题。这与不同的操作系统无关。
答案1
事实证明,这个问题实际上是由于我使用了旧版本的 TeX(2020 年 10 月之前)造成的,在那个版本中,只允许使用数字作为坐标,所以
\put(1.2em,1.5ex){text}
会导致错误。不过,在后来的版本中它变得有效(这也是我多次使用它的原因),更新 TeX 可以解决问题。这与不同的操作系统无关。
顺便说一下,在旧版本中,可以使用(从如何找到长度命令(例如, \textwidth)与参考值(例如, 6cm)的比率?)
\documentclass{article}
\makeatletter
\newcommand{\@DivideLengths}[2]{%
\strip@pt\dimexpr\number\numexpr\number\dimexpr#1\relax*65536/\number\dimexpr#2\relax\relax sp\relax
}
\newcommand\LengthToFloat[1]{\@DivideLengths{#1}{1pt}}
\makeatother
\begin{document}\noindent
\setlength{\unitlength}{1pt}
\begin{picture}(0,0)
\put(\LengthToFloat{12.35pt},0){Some text}
\end{picture}
\end{document}
(虽然我认为命令名称不\LengthToFloat
准确——TeX/LaTeX 没有类型系统......)