将换行符扩展为自定义命令

将换行符扩展为自定义命令

我正在制作一份宾客名单,我会将其打印在贴纸上,然后剪下来,贴到信封上。这意味着每个宾客/宾客组周围都会画一个边界框作为切割指南。对于边界框,我使用软件包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变为真。

相关内容