如何将整个输入流(直到 EOF)插入到输出流中?

如何将整个输入流(直到 EOF)插入到输出流中?

我正在尝试自动生成简历的文本版本。我想为任何潜在的人类读者添加一条注释(据我所知,大多数纯文本简历只是通过数据挖掘程序扫描的)。但是,在简历内部执行此操作本身就很expl3繁琐 — 您只能查看这么多次\c_space_tl,否则就会失去其个性和个人特色。

我想简单地设置一种方法,通过路径获取外部文件的全部内容并将其推送到我正在写入的流中。最直接的方法是什么?

我有一个如下所示的设置:

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn

\tl_const:Nn \g_resume_preamble_path_tl { preamble.txt }
\tl_const:Nn \g_resume_textout_path_tl { resume.out.txt }

\ior_new:N \g_resume_preamble_ior
\ior_open:Nn \g_resume_preamble_ior { \g_resume_preamble_path_tl }
\iow_new:N \g_resume_textout_iow
\iow_open:Nn \g_resume_textout_iow { \g_resume_textout_path_tl }

\begin{document}
ducks
\end{document}

答案1

如果您想要做的只是逐行读取文件并根据输入进行“处理”,那么(实验性的)\ior_str_map_inline:Nn似乎就是您想要的:

\ior_str_map_inline:Nn \g_resume_preamble_ior
  { \iow_now:Nn \g_resume_textout_iow {#1} }

(我们没有预先构建等效于“catchfile”的东西,尽管你显然可以通过映射来管理或多或少这个想法。)

答案2

哇噢

egreg 建议使用arara,所以我将提供一个规则来复制文件。:)我可能会在下一个版本中包含一些文件处理规则,以简化这些任务。

不用多说,以下是规则,名为copy.yaml

!config
identifier: copy
name: Copy
command: <arara> @{isTrue(isNotEmpty(source) && isNotEmpty(target), copy.concat(' "').concat(source).concat('" "').concat(target).concat('"'))}
arguments:
- identifier: copy
  default: <arara> @{isWindows('cmd /c copy', 'cp')}
- identifier: source
  flag: <arara> @{parameters.source}
- identifier: target
  flag: <arara> @{parameters.target}

此规则背后的想法是,当两者之一缺失时,复制source到或不执行任何操作。该功能可帮助我们在从一个操作系统切换到另一个操作系统时防止未知命令。在您的文件中,示例用法如下:targetisWindows.tex

% arara: copy: { source: preamble.txt, target: resume.out.txt }
% arara: pdflatex
% ...
\documentclass{article}
...

我们就完成了。:)

相关内容