“合并”后续基于计数器的命令

“合并”后续基于计数器的命令

我正在尝试实现两个简单的段落编号命令\verse\subverse。当\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

相关内容