从逗号分隔列表解析的每个项目末尾添加空格:如何避免这种情况?

从逗号分隔列表解析的每个项目末尾添加空格:如何避免这种情况?

我正在构建一个用于排版凯尔特音乐曲调书的软件包。我提供的一项功能是命令\altnames,它以逗号分隔的备选曲调名称列表作为参数。以下是\altnames单个文档文件中显示的命令的 MWE:

\documentclass{article}
\makeatletter

\newcounter{loopitemcounter}\setcounter{loopitemcounter}{0}

\def\listingloopENDMARKER{\listingloopENDMARKER}

\long\def\listingloop#1in#2#3{%
   \looppicker{#1}{#3}#2,\listingloopENDMARKER,%
}

\long\def\looppicker#1#2#3,{%
   \def\tempitem{#3}%
   %\ifx\tempitem\listingloopENDMARKER
   \ifx\listingloopENDMARKER\tempitem %
      \let\next=\relax%
   \else %
      \def#1{#3}%
      \ifnum\value{loopitemcounter}=0
         #2%
      \else %
         ,\space#2%
      \fi
      \def\next{\looppicker{#1}{#2}}%
   \fi
   \stepcounter{loopitemcounter}
   \next
}

\newcommand{\altnames}[1]{%
   \listingloop\@picked@name in{#1}{%
      \textit\@picked@name
   }
}

\makeatother
\begin{document}
\altnames{The Day After,Trump? Really?,The End Days}
\end{document}

\looppicker命令打印从列表中解析出的每个曲调名称,每个名称后跟一个逗号和一个空格(最后一个除外)。我得到的结果如下: 上述 MWE 的结果,在 tune neames 后显示空格

名称之间添加的逗号和空格\looppicker符合预期,但正如您所见,每个名称后面都添加了一个额外的空格,逗号。我该如何避免这种情况?

\listingloop\@picked@name in{#1}{%我认为in 中的行是\altnames源,特别是单词“in”之前的空格。这对我来说是有道理的,因为“in”是分隔符,它之前的所有内容(包括空格)在命令中都成为 #1 \listingloop。正如您所料,简单地删除空格会造成严重破坏。我尝试改为使用_in_作为分隔符,但得到了相同的结果。所以,现在我认为该\listingloop\@picked@name in{#1}{%行是不是罪魁祸首。任何见解都非常感谢。这个问题让我困惑不已,我怀疑 TeX 宏定义及其参数的解析方式存在更深层次、更微妙的问题,我根本无法理解。

答案1

在 的定义之后%添加一个:\stepcounter{loopitemcounter}\looppicker

\long\def\looppicker#1#2#3,{%
   \def\tempitem{#3}%
   %\ifx\tempitem\listingloopENDMARKER
   \ifx\listingloopENDMARKER\tempitem %
      \let\next=\relax%
   \else %
      \def#1{#3}%
      \ifnum\value{loopitemcounter}=0
         #2%
      \else %
         ,\space#2%
      \fi
      \def\next{\looppicker{#1}{#2}}%
   \fi
   \stepcounter{loopitemcounter}% <- here
   \next
}

相关内容