我想要在一个文档中执行各种计算,但我希望这些计算的结果显示在文档的开头。
我有以下方法,但不幸的是输出始终为 0。
\documentclass{article}
\usepackage{fp} % Paket für die Berechnungen
\usepackage{etoolbox} % Paket für zusätzliche Befehle wie \AtEndDocument
% Befehl zur Speicherung des Ergebnisses definieren
\newcommand{\result}{0}
\begin{document}
% Das Ergebnis der Berechnung wird hier angezeigt
Das Ergebnis der Berechnung ist: \result
% Weitere Inhalte des Dokuments...
% ...
% Berechnung am Ende des Dokuments durchführen
\AtEndDocument{
\FPeval{\result}{clip(2*3+4)}
\global\let\result\result % Das Ergebnis global verfügbar machen
}
\end{document}
我该如何更改代码以显示正确的结果?我不想使用任何其他文件。
答案1
TeX 会扩展宏,因此不可能\result
扩展到文件中稍后定义的某个内容。但您可以使用钩子\AtEndDocument
(您不需要etoolbox
)将值写入aux
文件。这就是标签的工作原理。
\documentclass{article}
\usepackage{fp} % Paket für die Berechnungen
% Befehl zur Speicherung des Ergebnisses definieren
\newcommand*{\result}{0}
\begin{document}
% Das Ergebnis der Berechnung wird hier angezeigt
Das Ergebnis der Berechnung ist: \result
\makeatletter
% Berechnung am Ende des Dokuments durchführen
\AtEndDocument{%
\FPeval{\result}{clip(2*3+4)}%
\write\@auxout{\global\string\def\string\result{\result}}%
}
\makeatother
\end{document}
显然,您需要运行 TeX 至少两次才能正确显示结果。
答案2
添加到现场Campa 的回答,我会添加一个界面来管理任意数量的变量。
这是为 量身定制的fp
。在计算结束时,您可以使用存储值的宏(默认)保存该值并为其命名(在示例x
和中) 。y
\result
在 LaTeX 运行结束时,收集的值将被转储到辅助文件中,以便可以在下一次运行开始时读入它们。
\documentclass{article}
\usepackage[nomessages]{fp}
\ExplSyntaxOn
\prop_new:N \g_hr_variables_out_prop
\prop_new:N \g_hr_variables_in_prop
\NewDocumentCommand{\savevariable}{O{\result}m}
{
\prop_gput:Nne \g_hr_variables_out_prop { #2 } { #1 }
}
\NewDocumentCommand{\printvariable}{m}
{
\prop_item:Nn \g_hr_variables_in_prop { #1 }
}
\NewDocumentCommand{\VARIABLES}{m}
{
\prop_gset_from_keyval:Nn \g_hr_variables_in_prop { #1 }
}
\AtEndDocument
{% dump the variables in the aux file
\iow_shipout:ce { @mainaux }
{
\VARIABLES
{
\prop_map_function:NN \g_hr_variables_out_prop \__hr_variables_dump:nn
}
}
}
\cs_new:Nn \__hr_variables_dump:nn { #1=#2, }
\ExplSyntaxOff
\begin{document}
Variable $x$ is $\printvariable{x}$.
Variable $y$ is $\printvariable{y}$.
\section{Main}
We set a variable to \FPadd{\result}{2}{2}\savevariable{x}\result
We set another variable to \FPmul{\y}{2}{3}\savevariable[\y]{y}\y
\end{document}
运行结束时,aux 文件将具有
\VARIABLES {
x=4.000000000000000000,
y=6.000000000000000000,
}
当变量发生变化时,这显然需要运行两次。