Вот что я делаю:
\documentclass{article}
\usepackage{calc}
\newlength{\foo}
\newcommand{\zzz}{5}
\setlength{\foo}{\zzz * 2in}
\usepackage[paperwidth=\foo,paperheight=\foo]{geometry}
\begin{document}
\end{document}
Я получаю:
! Illegal unit of measure (pt inserted).
<to be read again>
*
l.5 \setlength{\foo}{\zzz * 2in}
Как это сделать правильно?
решение1
Порядок аргументов инструкции \setlength
имеет значение. Ваш код имеет
\newlength{\foo}
\newcommand{\zzz}{5}
\setlength{\foo}{\zzz * 2in}
TeX начинает со скалярного числа (5) и получает указание умножить его на длину (2 дюйма). Такие изменения типа на лету — в данном случае: от скаляра к переменной длины — не допускаются.
Напротив, синтаксис выражения
\setlength{\foo}{2in * \zzz}
вполне приемлемо, так как TeX начинает с длины (2 дюйма) и умножает ее на скаляр (5), в результате чего получается другая длина (10 дюймов).
решение2
\documentclass{article}
\usepackage{calc}
\newlength{\foo}
\newcommand{\zzz}{5}
\setlength{\foo}{ 2in * \zzz }
\usepackage[paperwidth=\foo,paperheight=\foo]{geometry}
\begin{document}
\end{document}