从表格中“隐藏” \par

从表格中“隐藏” \par

我想使用宏来编写一行表格。作为此宏的一部分,有一个参数未在表格中设置,但会保存以供以后使用。应允许此未使用的参数包含。但如以下示例所示,当表格遇到(或在本例中为两个换行符)\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}的参数默认很短,因此会阻塞。 需要在参数标识符前加上 来明确地使它们变长:\NewDocumentCommandxparse\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}

相关内容