我想使用宏来编写一行表格。作为此宏的一部分,有一个参数未在表格中设置,但会保存以供以后使用。应允许此未使用的参数包含。但如以下示例所示,当表格遇到(或在本例中为两个换行符)\par
时,表格会中断。\par
\documentclass{article}
\usepackage{xparse,expl3}
\ExplSyntaxOn
\NewDocumentCommand{\AddTalk}{mmm}{
\tl_new:c {l_#1_title_tl}
\tl_set:cn {l_#1_title_tl} {#2}
\tl_new:c {l_#1_abstract_tl}
\tl_set:cn {l_#1_abstract_tl} {#3}
#2 & #1 \\
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{ll}
\AddTalk{foo}{This is the title}{This is the abstract}
\AddTalk{bar}{Another title}{Another abstract}
\AddTalk{spock}{A breakage}{This abstract
%
contains a paragraph break.}
\end{tabular}
\end{document}
(删除注释掉的换行符即可查看失败。)
所以我的问题是:如何\AddTalk
从中“隐藏”未使用的参数的内容tabular
?或者更一般地说,有没有更好的方法来实现我想要实现的目标?
答案1
问题不在于。 用 定义的命令(以及其他命令){tabular}
的参数默认很短,因此会阻塞。 需要在参数标识符前加上 来明确地使它们变长:\NewDocumentCommand
xparse
\par
+
\NewDocumentCommand{\AddTalk}{mm+m}{ ... }
答案2
除了长参数的问题之外,您的代码还有一个很大的弱点:您对标记列表变量的分配是本地的,因此它们会在&
扫描下一个变量时立即消失,也就是说,几乎立即消失。
您应该进行全局分配,并且可能构建属性列表变量更好:
\documentclass{article}
\usepackage{xparse,expl3}
\ExplSyntaxOn
\NewDocumentCommand{\AddTalk}{ m m +m }
{
\prop_new:c { g_talks_#1_prop }
\prop_gput:cnn { g_talks_#1_prop } { title } { #2 }
\prop_gput:cnn { g_talks_#1_prop } { abstract } { #3 }
#2 & #1 \\
}
\NewDocumentCommand{\gettitle} { m }
{
\prop_get:cn { g_talks_#1_prop } { title }
}
\NewDocumentCommand{\getabstract} { m }
{
\prop_get:cn { g_talks_#1_prop } { abstract }
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{ll}
\AddTalk{foo}{This is the title}{This is the abstract}
\AddTalk{bar}{Another title}{Another abstract}
\AddTalk{spock}{A breakage}{This abstract
contains a paragraph break.}
\end{tabular}
\bigskip
\noindent\textbf{\gettitle{spock}:} \getabstract{spock}
\end{document}