我正在制作一份宾客名单,我会将其打印在贴纸上,然后剪下来,贴到信封上。这意味着每个宾客/宾客组周围都会画一个边界框作为切割指南。对于边界框,我使用软件包fancybox
并按照其文档中的示例创建一个fminipage
允许在框内换行的环境。
我定义了一个\newcommand{\guest}[1]...
,内容是:
\begin{fminipage}{\textwidth}
\center #1
\end{fminipage}
成功了。我只需输入:
\guest{Luke Skywalker}
\guest{Obi-Wan Kenobi}
\guest{Han Solo\\
Princess Leia}
卢克和欧比旺有自己的盒子,然后汉索罗和莱娅公主被放在一个盒子里。
现在,我想使用快捷方式。我该如何实现,以便只需输入以下内容:
Luke Skywalker
Obi-Wan Kenobi
{Han Solo
Princess Leia}
看起来这可能是一个深层内核黑客,我对此一无所知。但当然,社区知道的任何信息总是受欢迎的。
答案1
这里的一个轻微的障碍是您的参数中也有换行符,当然您也不希望它们变成 \guest 命令。
但如果你不是把这当作编程练习,我建议你看一下数据工具包它允许你使用 CSV 文件进行操作,因此你需要一个如下所示的来宾文件
Obi-Wan Kenobi
Luke Skywalker
Han Solo;Princess Leia
或类似的东西。
答案2
显然,我的第一个回答是基于对问题的(部分?)误解,所以这是第二个回答。这次没有外部文件。
\documentclass{article}
% this is just for demonstration purposes:
\newcommand{\guest}[1]{{\message{[Inviting: #1]}}}
\begin{document}
\begingroup\obeylines%
\def\doguests#1^^M{%
\ifx\relax#1\relax\else%
\guest{#1}\expandafter\doguests\fi}%
\def^^M{ and }\doguests%
Luke Skywalker
Obi-Wan Kenobi
{Han Solo
Princess Leia}
\endgroup
\end{document}
答案3
正如 Ulrich 所说,最好使用包。但是,如果包不能轻松地完成您想要的工作,您可以自己动手:
\documentclass{article}
% this is just for demonstration purposes:
\newcommand{\guest}[1]{{\let\\\relax\message{[Inviting: #1]}}}
\newread\guests
\newcommand{\readguests}
{\read\guests to \invitee
\ifeof\guests\else
\guest{\invitee}\expandafter\readguests\fi
}
\begin{document}
\openin\guests=guests.list
{\endlinechar=-1 \readguests}
\closein\guests
\end{document}
编辑:我可能应该添加一些解释。如果没有\endlinechar=-1
,每次读取都会在末尾包含一个空格标记。更重要的是,最后一次读取将返回一个\par
标记而不是空的,因此必须更改对文件末尾的检查。
修改 2:使用\ifeof
原语检查文件结尾。请注意这个位置有点不直观后但是\read
:在文件末尾,将读入空的标记列表,并且只有在此之后才\ifeof
变为真。