我正在构建一个用于排版凯尔特音乐曲调书的软件包。我提供的一项功能是命令\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
命令打印从列表中解析出的每个曲调名称,每个名称后跟一个逗号和一个空格(最后一个除外)。我得到的结果如下:
名称之间添加的逗号和空格\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
}