我的意思是 C++ 进行一些计算而不是将代码作为文本插入。
答案1
在这个解决方案中,我使用的工具fancyvrb
将 C++ 源代码写入名为 的文件hello.cpp
。然后我继续编译写入的文件并执行程序。最后我包括程序生成的输出。
您需要--shell-escape
让示例发挥作用。
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{hello.cpp}
#include <fstream>
int main() {
std::ofstream out;
out.open("cpp-out.txt");
out << "Hello World!" << std::endl;
out.close();
return 0;
}
\end{VerbatimOut}
\immediate\write18{g++ -o hello hello.cpp}
\immediate\write18{./hello}
\input{cpp-out.txt}
\end{document}
其他例子
我们可以使用这种技术以类似的方式包含 C 代码(当然我们需要使用另一个编译器)。在这个例子中,我利用这一点来快速计算阶乘:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{fac.c}
#include <stdio.h>
long long factorial(int n) {
if (n <= 1) return 1;
return n*factorial(n-1);
}
int main(int argc, char* argv[]) {
int n = atoi(argv[1]);
printf("%lld\n", factorial(n));
return 0;
}
\end{VerbatimOut}
\immediate\write18{gcc -o fac fac.c}
\newcommand\factorial[1]{%
\immediate\write18{./fac #1 > /tmp/result.tex}%
\input{/tmp/result.tex}%
}
\factorial{5}
\factorial{20}
\end{document}
现在将相同的代码与 一起使用lualatex
,将产生相同的输出:
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function factorial(n)
if (n <= 1) then
return 1
end
return n*factorial(n-1)
end
\end{luacode*}
\begin{document}
\newcommand\factorial[1]{%
\luaexec{tex.sprint(string.format("\%d", factorial(#1)))}%
}
\factorial{5}
\factorial{20}
\end{document}
答案2
不可以,除了排版之外,你不能让 TeX 程序本身直接处理 C++ 源代码。
C++ 是一种编译语言,因此必须将源代码转换为汇编语言,然后由单独的编译器进行汇编和链接,以创建可执行二进制文件。
TeX 是一种解释型语言,其中 TeX 程序充当“文档编译器”,因此它会解释源代码并输出二进制可执行文件,而不是(最初)可从中生成文档的 DVI 文件格式。它无法自行编译 C++ 代码。
您可以在编译 TeX 文档时使用 来从 TeX 文档中调用 C++ 可执行程序--shell-escape
。该可执行程序最初可以由任何编程语言编译而成;它与 TeX 无关。
我想你可以将 C++ 代码写入 TeX 文件中,让 TeX 将代码写出到单独的文件中,用调用 C++ 编译器--shell-escape
,然后调用生成的可执行文件(假设编译成功)——但是为什么呢?
如果您想要将多个独立程序的结果编写到脚本中,请使用 Bash 或其他为此目的而设计的程序。