除非直接將字串作為參數給出,否則 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}}

但它“更抽象”並且不需要您猜測正確的擴展鏈。

相關內容