我正在处理信件类,并创建了一个自定义 .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
。