listofitems 包的一个问题

listofitems 包的一个问题

在 Windows 10 上使用 MiKTeX 2.9 时,我遇到了问题listofitmes。代码如下:

    % arara: xelatex: { shell: true }
    \documentclass{article}
    \usepackage{fontspec}
    \usepackage{listofitems}
    \usepackage{ifthen}
    
    \newenvironment{RuneQuoteDebug}[1]{
      \begin{quote}
        \setsepchar{,}
        \readlist\args{#1}
        number of items = \argslen\par
        \showitems\args\par
        \foreachitem\list\in\args{
          Top level list item number \listcnt{}: \list\par
          \readlist\chars\list
          \foreachitem\cc\in\chars{
            Second level list item number \cccnt{}: \cc\par
            \ifthenelse{\equal{\cc}{\string 0}}
              {}
              {\cc}
          }
        }
      }{
      \end{quote}
    }
    
    \def\li{46,69,55}
    
    \begin{document}
    \begin{RuneQuoteDebug}{\li}\end{RuneQuoteDebug}
    \begin{RuneQuoteDebug}{0,\li}\end{RuneQuoteDebug}
    \begin{RuneQuoteDebug}{\li,\li}\end{RuneQuoteDebug}
    \end{document}

我运行相同的用户定义环境三次。第一次列表中只有一个时间,第二次有两个项目、一个占位符和列表。最后有两个测试项目实例。我原本以为不会有问题,直到我在生成的 .pdf 输出中看到问题。接下来,我编写了的调试版本RuneQuoteDebug。这揭示了列表包含一个项目与包含多个项目时的差异。我不知道这种差异是否是设计使然,而且我承认编程解决它并不难。如果这是我做错的事情,我正在寻找更正。因为总有可以改进的地方,所以我一定会认真对待任何建议。因此,我希望无论传递给环境的项目数量有多少,代码都能以相同的方式工作。

笔记:基于我上面所说的内容,我刚刚测试了另一种方法。看来这种行为故意的我只是没有搞清楚处理单个项目的情况需要什么。正如我应该从一些示例代码中推断的那样,可以使用花括号对项目进行分区。这意味着,不用使用占位符(必须允许),只需使用一个简单的{{\li}}就足够了。正如伟大的 Emily LaTilla 所说的那样“没关系。“我想如果你愿意的话我几乎不会抱怨改进......

答案1

这不是一个错误,而是一个功能。组成列表的单独控制序列是假定\def实际所需列表的,因此在读取列表之前控制序列会被扩展一次。

对于单级解析,解决方案可能是将其添加\empty到列表末尾,这样\li就不会预先扩展单个条目。但是,您的任务执行嵌套解析。因此,我建议在这里通过添加逗号分隔符将空白条目添加到列表末尾,。然后也使用\ignoreemptyitems声明,以便忽略最后的空白条目。

    % arara: xelatex: { shell: true }
    \documentclass{article}
%    \usepackage{fontspec}
    \usepackage{listofitems}
    \usepackage{ifthen}
    
    \newenvironment{RuneQuoteDebug}[1]{
      \begin{quote}
        \setsepchar{,}
        \ignoreemptyitems
        \readlist\args{#1}
        number of items = \argslen\par
        \showitems\args\par
        \foreachitem\list\in\args{
          Top level list item number \listcnt{}: \list\par
          \readlist\chars\list
          \foreachitem\cc\in\chars{
            Second level list item number \cccnt{}: \cc\par
            \ifthenelse{\equal{\cc}{\string 0}}
              {}
              {\cc}
          }
        }
      }{
      \end{quote}
    }
    
    \def\li{46,69,55}
    
    \begin{document}
    \begin{RuneQuoteDebug}{\li,}\end{RuneQuoteDebug}
    \begin{RuneQuoteDebug}{0,\li}\end{RuneQuoteDebug}
    \begin{RuneQuoteDebug}{\li,\li}\end{RuneQuoteDebug}
    \end{document}

在此处输入图片描述

相关内容