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}}

しかし、それは「より抽象的」であり、正しい展開の連鎖を推測する必要はありません。

関連情報