如何将文件内容用作长度的数值?

如何将文件内容用作长度的数值?

我正在尝试从文件中读取内容,然后在公式中使用它:

\documentclass{article}
\usepackage{calc}
\newcommand\x{\input{size.txt}}
\setlength\parskip{1pt * \x}
\begin{document}
Hello, world!
\end{document}

我越来越:

! Missing number, treated as zero.
<to be read again>
                   \let
l.4 \setlength\parskip{1pt * \x}

怎么了?

答案1

使用\read而不是\input

在此处输入图片描述

\documentclass{article}
\newread\foo
\openin\foo=size.txt
\read\foo to \x

\setlength\parskip{\x pt}
\begin{document}
Hello, world!

a new paragraph
\end{document}

哪里size.txt

20

答案2

您可以使用catchfile

%%% filecontents is used just to make the example self-contained
\begin{filecontents*}{\jobname.txt}
20
\end{filecontents*}

\documentclass{article}
\usepackage{catchfile}
\usepackage{calc}

%%%
% define \x to be the contents of the file
\CatchFileDef{\x}{\jobname.txt}{}

% now use it
\setlength\parskip{1pt * \x}
%%%

\begin{document}

Hello, world! \the\parskip

\end{document}

在此处输入图片描述

然后,您可以在任何需要的地方和时间使用\x它。不过,我会使用更具描述性的名称。

对于单次使用,我不会留下 的定义;在这种情况下,你可以用以下\x代码替换对中的代码:%%%

%%%
\begingroup\CatchFileDef{\x}{\jobname.txt}{}
\edef\x{\endgroup\noexpand\setlength\parskip{1pt * \x}}\x
%%%

这是一个更通用的版本,它允许您对文件内容执行各种操作。在第二个参数中,\usefile您可以使用#1来引用文件内容。

\begin{filecontents*}{\jobname.txt}
20
\end{filecontents*}

\documentclass{article}
\usepackage{calc}

\ExplSyntaxOn

\NewDocumentCommand{\usefile}{mm}
 {% #1 = file name, #2 = action to perform
  \yegor_usefile:nn { #1 } { #2 }
 }

\tl_new:N \l__yegor_usefile_tl

\cs_new_protected:Nn \yegor_usefile:nn
 {
  \cs_set_protected:Nn \__yegor_usefile_aux:n { #2 }
  \file_get:nnN { #1 } { } \l__yegor_usefile_tl
  \__yegor_usefile_aux:V \l__yegor_usefile_tl
 }
\cs_new_protected:Nn \__yegor_usefile_aux:n {}
\cs_generate_variant:Nn \__yegor_usefile_aux:n { V }

\ExplSyntaxOff

\usefile{\jobname.txt}{\setlength{\parskip}{1pt * #1}}

\begin{document}

Hello, world! \the\parskip

\end{document}

答案3

问题是,你的 newcommand 会扩展并只包含 size.tex 的内容(就我而言)。它不进行数值转换,而且似乎没有明显的方法来做到这一点。

也许如果你看一下 TEX 手册,可能会有一种方法可以获取字节数。

\documentclass{article}
\usepackage{calc}
\newcommand\x{\input{size}}
%\setlength\parskip{1pt * \x}
\begin{document}
Hello, world!

\x{}
\end{document}

请猜一下 size.tex 的内容 ;-)

在此处输入图片描述

附言:您可能会成功使用包stringstrings,请stringlength参阅 https://mirror.marwan.ma/ctan/macros/latex/contrib/stringstrings/stringstrings.pdf

答案4

一种方法是使用-shell-escape选项执行命令来获取所需的值。在下面的 MWE 中,文件MySize.txt的值为 30,该值用于设置\parskip

在此处输入图片描述

参考:

代码:

\begin{filecontents*}{MySize.txt}
30
\end{filecontents*}%

\documentclass{article}

%% https://tex.stackexchange.com/questions/102365/specify-file-name-shell-access-via-input
\makeatletter
\newcommand\GetShellOutput[1]{%
    %% #1 = file name
  \begingroup\endlinechar=\m@ne\everyeof{\noexpand}%
  \edef\TempResult{\endgroup
    \def\noexpand\ShellOutput{%
      \@@input|"cat #1" }}%
  \TempResult}
\makeatother

\newcommand\SetValueFromFile[2]{%
    %% #1 = macro to set
    %% #2 = file to read (which contains an integer)
    \GetShellOutput{#2}%
    \def#1{\ShellOutput}%
}%

\SetValueFromFile{\GivenInteger}{MySize.txt}
\setlength\parskip{\GivenInteger pt}


\begin{document}
Hello, world!

Hello again.
\end{document}

相关内容