导入特定文本文件内容(导入到 monkey macro 中)

导入特定文本文件内容(导入到 monkey macro 中)

我有一些元数据,我想从(程序生成的)文本文件导入到定期更新的几个字段中。对于文本文件,我有两种可能的情况:

  • 一个文件n文本行
  • n包含一行文本的文件

假设这些文件包含一些猴子的名字,我希望能够编写以下 MWE,其中猴子 1 和 2 的名字从和monkey1.txtmonkey2.txt文件中提取monkeys.txt,两个名字各占一行。

\documentclass{article}

\newcommand\monkeyOne{Name of monkey 1}
\newcommand\monkeyTwo{Name of monkey 2}

\begin{document}

\monkeyOne{} just threw some poo at \monkeyTwo{}. 

\end{document}

答案1

该命令\definemonkey有三个主要参数:要定义的控制序列、要加载的文件名和项目编号。在普通版本中,<filename><itemnumber>.txt使用文件,在 *-variant 行中使用<itemnumber>from <filename>.txt。对于 *-form,文件只读取一次。

诀窍是使用\tl_set_from_file:Nnn(与相同\CatchFileDef),并为 * 形式添加非标准行终止符,用于构建序列,然后从中提取适当的项目。

\begin{filecontents*}{monkey1.txt}
Name of monkey 1
\end{filecontents*}
\begin{filecontents*}{monkey2.txt}
Name of monkey 2
\end{filecontents*}
\begin{filecontents*}{monkeys.txt}
Name of monkey 1
Name of monkey 2
\end{filecontents*}

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definemonkey}{smmm}
 { % #2 = command name, #3 = file (prefix), #4 = number
  \IfBooleanTF{#1}
   {
    \holene_define_monkey_file:Nnn #2 { #3 } { #4 }
   }
   {
    \holene_define_monkey_single:Nnn #2 { #3 } { #4 }
   }
 }

\cs_new_protected:Nn \holene_define_monkey_single:Nnn
 {
  \tl_set_from_file:Nnn #1 { \endlinechar=\c_minus_one } { #2#3.txt }
 }

\cs_new_protected:Nn \holene_define_monkey_file:Nnn
 {
  \seq_if_exist:cF { l__holene_define_monkey_#2_seq }
   {
    \seq_new:c { l__holene_define_monkey_#2_seq }
    \tl_set_from_file:Nnn \l_tmpa_tl { \endlinechar=`^^J } { #2.txt }
    \seq_set_split:cnV { l__holene_define_monkey_#2_seq } { ^^J } \l_tmpa_tl
   }
  \tl_set:Nx #1 { \seq_item:cn { l__holene_define_monkey_#2_seq } { #3 } }
 }

\cs_generate_variant:Nn \seq_set_split:Nnn { cnV }

\ExplSyntaxOff

\definemonkey{\monkeyOne}{monkey}{1}
\definemonkey{\monkeyTwo}{monkey}{2}

\definemonkey*{\monkeyOneA}{monkeys}{1}
\definemonkey*{\monkeyTwoA}{monkeys}{2}

\begin{document}

\monkeyOne{} just threw some poo at \monkeyTwo{}. 

\monkeyOneA{} just threw some poo at \monkeyTwoA{}. 

\end{document}

在此处输入图片描述

答案2

从这里开始。每个名字的末尾都有一个多余的空格,应该删除。

在此处输入图片描述

\documentclass{article}

\usepackage{filecontents}

% these files will be external in the application
\begin{filecontents}{monkey1.tex}
Nim Chimpsky
\end{filecontents}
\begin{filecontents}{monkey2.tex}
Washoe
\end{filecontents}

\newcommand\monkeyOne{\input{monkey1}}
\newcommand\monkeyTwo{\input{monkey2}}

\begin{document}

\monkeyOne{} just threw some poo at \monkeyTwo{}. 

\end{document}

相关内容