使用 catchfile 包从外部文件指定字母类 \address

使用 catchfile 包从外部文件指定字母类 \address

我正在处理信件类,并创建了一个自定义 .cls 文件,其中处理了信件的大部分格式。从用于生成信件(或电话,我可能在下面提到过)的 .tex 文件中,我指定了发件人和收件人地址等。理想情况下,我会通过文件名指定这些文件。有人建议为此使用 catchfile 包文件。在自定义类文件中,我可以手动输入一个地址作为字母环境实例的参数,但是,我似乎无法使用捕获文件引用位于单独文件,例如地址簿的条目。

这是一个工作示例,其中使用 catchfile 来读取来自地址。

共同文件:

地址.tex

868 Sunrise Ave. \\
Garden City \\

正文.tex

\lipsum[1]

thelettera.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{thelettera}[]
\LoadClass[]{letter}
\RequirePackage{lipsum}
\RequirePackage{catchfile}
\RequirePackage[textwidth=345.0pt,%
top=2in,
headheight=1.0in,
headsep=0.20in]{geometry}
\newcommand{\getfromaddress}[1]{\CatchFileDef{\thefromaddress}{#1}{}}
\signature{Mae L. Mann}
\AtBeginDocument{%
\pagestyle{empty}
\makeatletter
\let\ps@firstpage\ps@plain
\makeatother
  \begingroup\def\tempa{\endgroup\begin{letter}{1234 Central St. \\ Western City}}
    \expandafter\tempa\expandafter{\thefromaddress}%
  \opening{\theopening}
}%
\AtEndDocument{%
\closing{\theclosing}
\ps{\thepostscript}
\end{letter}
}

lettera.tex

\NeedsTeXFormat{LaTeX2e}
\documentclass{thelettera}
\getfromaddress{address.tex}
\newcommand{\theopening}{Dear Recipient}
\newcommand{\theclosing}{Sincerely,}
\newcommand{\thepostscript}{}
\begin{document}
\input{body.tex}
\end{document}

为了说明这个问题,如果我使用这个类文件

theletterb.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{theletterb}[]
\LoadClass[]{letter}
\RequirePackage{lipsum}
\RequirePackage{catchfile}
\RequirePackage[textwidth=345.0pt,%
top=2in,
headheight=1.0in,
headsep=0.20in]{geometry}
\newcommand{\getfromaddress}[1]{\CatchFileDef{\thefromaddress}{#1}{}}
\newcommand{\gettoaddress}[1]{\CatchFileDef{\thetoaddress}{#1}{}}
\signature{Mae L. Mann}
\AtBeginDocument{%
\pagestyle{empty}
\makeatletter
\let\ps@firstpage\ps@plain
\makeatother
  \begingroup\def\tempa{\endgroup\begin{letter}{\thetoaddress}}
    \expandafter\tempa\expandafter{\thefromaddress}%
  \opening{\theopening}
}%
\AtEndDocument{%
\closing{\theclosing}
\ps{\thepostscript}
\end{letter}
}

并且这个类文件的调用

letterb.tex

\NeedsTeXFormat{LaTeX2e}
\documentclass{theletterb}
\getfromaddress{address.tex}
\gettoaddress{address.tex}
\newcommand{\theopening}{Dear Recipient}
\newcommand{\theclosing}{Sincerely,}
\newcommand{\thepostscript}{}
\begin{document}
\input{body.tex}
\end{document}

我收到一个错误:

! LaTeX Error: There's no line here to end.

任何意见或建议都非常感谢。如果解决方案很简单,我不会感到惊讶。

答案1

参数的\begin{letter}处理方式很特别:第一个\\是另一个宏的参数分隔符,而不是简单的换行命令。因此\begin{letter}必须一个明确的\\,它不,如果参数是\thetoaddress

使用\expandonce(由 提供etoolbox,因此我使用\providecommand以防您决定也加载此包)我们只扩展参数一次并使其在 中不可扩展\edef

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{theletterb}[]
\LoadClass[]{letter}
\RequirePackage{lipsum}
\RequirePackage{catchfile}
\RequirePackage[
  textwidth=345.0pt,%
  top=2in,
  headheight=1.0in,
  headsep=0.20in
]{geometry}

\newcommand{\getfromaddress}[1]{\CatchFileDef{\thefromaddress}{#1}{}}
\newcommand{\gettoaddress}[1]{\CatchFileDef{\thetoaddress}{#1}{}}
\providecommand{\expandonce}{\unexpanded\expandafter}

\signature{Mae L. Mann}
\AtBeginDocument{%
  \pagestyle{empty}
  \let\ps@firstpage\ps@plain
  \begingroup\edef\x{\endgroup
    \noexpand\begin{letter}{\expandonce{\thetoaddress}}
      {\expandonce{\thefromaddress}}}\x
  \opening{\theopening}
}%
\AtEndDocument{%
  \closing{\theclosing}
  \ps{\thepostscript}
  \end{letter}
}

几点说明:该命令不适用于文档(尽管它没有坏处),而是适用于类和包。在类文件中\NeedsTeXFormat{LaTeX2e}不需要发出\makeatletter和,如果您需要在文档中给出的命令中使用 -commands,则必须使用两个声明\makeatother\AtBeginDocument@大约 \AtBeginDocument

相关内容