其他例子

其他例子

我的意思是 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 或其他为此目的而设计的程序。

相关内容