除非直接将字符串作为参数给出,否则 seqsplit 不起作用

除非直接将字符串作为参数给出,否则 seqsplit 不起作用

考虑以下示例。如果我这样做,\seqsplit{ReferencedIDs}字符串不会被拆分。另一方面,如果我直接将字符串作为参数插入,它就会被拆分。像往常一样,我不知道为什么这不起作用。有人可以告诉我吗?

\documentclass[12pt]{article}
\usepackage{seqsplit}
\begin{document}
\gdef \ReferencedIDs{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}

\seqsplit{\ReferencedIDs}  
\seqsplit{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}

\end{document}

答案1

的参数\seqsplit是按标记逐个处理的,假设它已完全展开。当您将宏(单个标记)作为参数传递时,情况并非如此。以下设置重新定义\seqsplit为在处理之前展开其参数。

在此处输入图片描述

\documentclass{article}
\usepackage{seqsplit}
\let\oldseqsplit\seqsplit% Copy \seqsplit
\renewcommand{\seqsplit}{% Redefine \seqsplit to...
  \expandafter\oldseqsplit\expandafter}% ...expand its argument before processing it
\begin{document}
\gdef \ReferencedIDs{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}

\seqsplit{\ReferencedIDs}

\seqsplit{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}

\end{document}

答案2

如果您不介意使用expl3

\usepackage{xparse}
\ExplSyntaxOn
\cs_set_eq:NN \faheem_seqsplit:n \seqsplit
\cs_generate_variant:Nn \faheem_seqsplit:n { o }

\NewDocumentCommand{\printIDs}{m}
 {
  \faheem_seqsplit:o { #1 }
 }
\ExplSyntaxOff

然后\printIDs{\ReferencedIDs}就可以了。

这与 Werner 的代码没有太大区别,但它向用户隐藏了技术细节;让我们逐行看一下。

我们从 \seqsplit 获得一个“内部”函数

\cs_set:eq:NN \faheem_seqsplit:n \seqsplit

通过这种方式,我们能够定义一个变体:

\cs_generate_variant:Nn \faheem_seqsplit:n { o }

此变体的工作原理类似于\faheem_seqsplit:n,但在使其执行之前,传递给它的参数将被扩展一次。最后

\NewDocumentCommand{\printIDs}{m}{\faheem_seqsplit:o{#1}}

定义使用该变体的用户级命令。

正如我所说,这基本上相当于

\newcommand{\printIDs}[1]{\expandafter\seqsplit\expandafter{#1}}

但它“更抽象”并且不需要您猜测正确的扩展链。

相关内容