
考慮以下範例。如果我這樣做,\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}}
但它“更抽象”並且不需要您猜測正確的擴展鏈。