为非技术用户创建美观的格式信函

为非技术用户创建美观的格式信函

我正在尝试创建一个更复杂的模板,但创建了这个简短的示例来记录我真正想要做的事情。

我想创建一封格式信,让用户看不到任何可能令人困惑的复杂内容。为此,我想隐藏所有数据工具内容

\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
}

以下是两个版本的输出:

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

相关内容