LaTeX3 循环扩展为重复的 {}

LaTeX3 循环扩展为重复的 {}

我正在使用艾克斯垂直对齐语言学注释包。由于各种原因,我有一些看起来像这样的东西:

\ex
  \begingl
    \gla \rlap{thisisaverylongword} @ {} @ {} @ {} @ {} @ {} // 
    \glb this- is- a- very- long- word //
    \glb gloss- of- the- word- bits- above //
    \glb \rlap{a.word.that.is.long} {} {} {} {} {} //
  \endgl
\xe

不断地为每一列写@ {}和是很乏味的{},所以我想写一个宏来发出一些这样的空{}单元格,带或不带额外的@。所以像这样:

\ex
  \begingl
    \gla \rlap{thisisaverylongword} \exnull*{5} // 
    \glb this- is- a- very- long- word //
    \glb gloss- of- the- word- bits- above //
    \glb \rlap{a.word.that.is.long} \exnull{5} //
  \endgl
\xe

带星号的版本\gla会输出一个@ {}由空格分隔的五个序列,即@ {} @ {} @ {} @ {} @ {}。不带星号的版本只会输出{} {} {} {} {}没有任何@s 的序列。我开始使用 LaTeX3 执行此操作,但发现{}丢失了,而且空格也消失了。请注意,我不能用于~空格,因为空格在\begingl宏观上意味着‘列分隔’,但~事实并非如此。

有没有关于一个简单的 do-while 循环的建议,它可以发出多个{}和空格字符?我有一种潜伏在阴影中的沉重感觉\expandafter。如果没有必要,我宁愿不去弄乱 ExPex 的内部结构;它是用纯 TeX 编写的。

答案1

问题是\gla它的输入被分成空格进行扩展。但是,无论有多少个\expandafter都无法解决这个问题,因为 TeX 无法知道\exnull会出现在哪里。

您可以在扫描空格之前完全扩展该行,但这可能会产生不利影响:请小心并记住\protect在必要时添加。

\documentclass{article}
\usepackage{expex,xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\exnull}{sm}
 {
  \IfBooleanTF{#1}
    {\prg_replicate:nn { #2 } { @~{}~ }}
    {\prg_replicate:nn { #2 } { {}~ }}
 }
\ExplSyntaxOff

\makeatletter
\def\glw@gla@a #1//{%
  \bgroup
  \protected@edef\JAMES@temp{#1 }%
  \expandafter\ling@usearg\expandafter\glw@gla@b\JAMES@temp\@nil
}
\makeatother


\begin{document}

\ex
  \begingl
    \gla \rlap{thisisaverylongword} @ {} @ {} @ {} @ {} @ {} // 
    \glb this- is- a- very- long- word //
    \glb gloss- of- the- word- bits- above //
    \glb \rlap{a.word.that.is.long} {} {} {} {} {} //
  \endgl
\xe

\ex
  \begingl
    \gla \rlap{thisisaverylongword} \exnull*{5} // 
    \glb this- is- a- very- long- word //
    \glb gloss- of- the- word- bits- above //
    \glb \rlap{a.word.that.is.long} \exnull{5} //
  \endgl
\xe

\end{document}

在此处输入图片描述

相关内容