我正在使用艾克斯垂直对齐语言学注释包。由于各种原因,我有一些看起来像这样的东西:
\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}