我正在尝试从文件中读取内容,然后在公式中使用它:
\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
答案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}