
次の例を考えてみましょう。これを実行すると、\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}}
しかし、それは「より抽象的」であり、正しい展開の連鎖を推測する必要はありません。