Como usar \input dentro de \setlength?

Como usar \input dentro de \setlength?

Estou tentando isso:

\documentclass{article}
\usepackage{calc}
\newlength{\foo}
\newcommand{\zzz}{\input{size.txt}}
\setlength{\foo}{2in * \zzz}
\usepackage[paperwidth=\foo,paperheight=\foo]{geometry}
\begin{document}
\end{document}

Mas estou recebendo:

! Missing number, treated as zero.
<to be read again>
                   \let
l.5 \setlength{\foo}{2in * \zzz}

Como consertar isto?

Responder1

O comando LaTeX \inputnão é expansível: isso se deve em parte ao fato de ele fazer uma verificação 'segura' da existência de um arquivo e em parte devido ao suporte às sintaxes primitiva ( \input <file>) e LaTeX ( \input{<file>}) do TeX. Isso significa que se você quiser trabalhar por expansão, como faz aqui, você precisa usar a primitiva

\begin{filecontents*}[overwrite]{size.txt}
5%
\end{filecontents*}
\documentclass{article}
\usepackage{calc}
\newlength{\foo}
\makeatletter
\let\primitiveinput\@@input
\makeatother
\newcommand{\zzz}{\primitiveinput size.txt }
\setlength{\foo}{2in * \zzz}
\usepackage[paperwidth=\foo,paperheight=\foo]{geometry}
\begin{document}
\end{document}

Você precisará garantir que seu arquivo de entrada não contenha um \partoken: adicionei um exemplo usando um caractere de comentário.

informação relacionada