我正在尝试创建一个更复杂的模板,但创建了这个简短的示例来记录我真正想要做的事情。
我想创建一封格式信,让用户看不到任何可能令人困惑的复杂内容。为此,我想隐藏所有数据工具内容
\documentclass{scrlttr2}
\usepackage{datatool}
\newcommand{\myDatabase}[1]{
\DTLloaddb{test}{#1}%
}
%This is not working:
%\AtBeginDocument{
% \DTLloaddb{test}{test.csv}%
% \DTLforeach{test}{\name=Name, \age=Age}{%
% \begin{letter}
%}
%
%\AtEndDocument{
% \end{letter}}
%}
\myDatabase{test.csv}
\begin{document}
\DTLforeach{test}{\name=Name, \age=Age}{% I want to remove this!
\begin{letter}% I want to remove this!
Dear Mr. \name
\end{letter}}% I want to remove this!
\end{document}
我的数据库 test.csv 看起来就像这样:
Name, Age
Alfred, 42
Brian, 23
Conrad, 66
我的主要问题是将\DTLForeach
出现在文档开头和结束处分开不起作用。我已经尝试过\bgroup
,而\egroup
不是使用括号,但这没有任何改变。
答案1
首先,环境需要一个参数,即地址。这可能是单词或单词的一部分消失letter
的原因。Dear
关于如何隐藏生成字母的机制,这里是一个包含几个元素的解决方案:
可以通过将定义放入样式文件甚至新文档类来隐藏它们(见下文)。
要将环境的内容(其主体)用作另一个命令的参数,请使用
\NewEnviron
包中的environ
。应用于您的示例:\documentclass{scrlttr2} \usepackage{datatool} \usepackage{environ} \NewEnviron{Letters}[1]{% \DTLloaddb{test}{#1}% \DTLforeach{test}{\name=Name, \age=Age}{% \begin{letter}{\name} \BODY \end{letter}% }% } \begin{document} \begin{Letters}{test.csv} \opening{Dear Mr.~\name} \end{Letters} \end{document}
最后,为了隐藏
\begin{documentclass}
和\end{documentclass}
,您必须使用\aftergroup
和技巧以使其在环境\BODY
后可用Letters
。
这是简化的输入文件:
\documentclass{myletters}
\begin{Letters}{test.csv}
\opening{Dear Mr.~\name}
\end{Letters}
将以下代码放入文件中myletters.cls
。
\ProvidesClass{myletters}[2018/07/20 My special letter class V0.42]
\LoadClass[a4paper,12pt]{scrlttr2}
% Define here any special class options
% \DeclareOption{...}{...}
% Pass all others to the underlying class
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrlttr2}}
\ProcessOptions\relax
\RequirePackage{datatool}
\newcommand\MakeLetters{%
\begin{document}
\DTLforeach{test}{\name=Name, \age=Age}{%
\begin{letter}{\name}
\ContentsOfLetter
\end{letter}%
}%
\end{document}%
}
\RequirePackage{environ}
\NewEnviron{Letters}[1]{%
\DTLloaddb{test}{#1}%
\expandafter\gdef\expandafter\ContentsOfLetter\expandafter{\BODY}%
\aftergroup\MakeLetters
}
以下是两个版本的输出: