我正在尝试实现两个简单的段落编号命令\verse
和\subverse
。当\verse
命令后跟\subverse
(不考虑空格和换行符)时,只应显示反向计数器。
这里有一些例子:
我设法生成了以下似乎可以工作的代码:
\int_new:N \g__test_peek_int
\cs_new:Nn \__test_peek_remove_spaces_and_pars:n
{
\peek_catcode_remove:NTF \c_space_token
{ \__test_peek_remove_spaces_and_pars:n {#1} }
{
\peek_meaning_remove:NTF \par
{ \__test_peek_remove_spaces_and_pars:n {#1} }
{
\int_gincr:N \g__test_peek_int
\cs_gset:cn
{ __test_peek_ \int_use:N \g__test_peek_int : }
{#1}
\use:c
{ __test_peek_ \int_use:N \g__test_peek_int : }
}
}
}
\newcounter { verse }
\newcounter { subverse } [ verse ]
\DeclareDocumentCommand \theverse {}
{ \arabic { verse } }
\DeclareDocumentCommand \thesubverse {}
{ \theverse . \arabic { subverse } }
\DeclareDocumentCommand \verse {}
{
\refstepcounter { verse }
\__test_peek_remove_spaces_and_pars:n
{
\peek_meaning:NF \subverse
{
\textbf { \theverse . ~ }
\__test_peek_remove_spaces_and_pars:n {}
}
}
}
\DeclareDocumentCommand \subverse {}
{
\refstepcounter { subverse }
\textbf { \thesubverse . ~ }
\__test_peek_remove_spaces_and_pars:n {}
}
这可能远非最好的方法。
然而,有一个问题是我想支持\labels
。更具体地说,构造\verse \label{mylabel} \par \subverse text
应该产生1.1. text
。但是,\label
命令“中断”了 peek 循环,并且\verse
/\subverse
未“合并”。
有没有一个(最好是基于 LaTeX3 的)解决方案来解决这个问题,也许通过扩展命令后的标记直到找到\verse
一个\subverse
或另一个非空间非标记?\par