我有一些元数据,我想从(程序生成的)文本文件导入到定期更新的几个字段中。对于文本文件,我有两种可能的情况:
- 一个文件n文本行
- n包含一行文本的文件
假设这些文件包含一些猴子的名字,我希望能够编写以下 MWE,其中猴子 1 和 2 的名字从和monkey1.txt
或monkey2.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}