seqsplit não funciona a menos que a string seja fornecida diretamente como argumento

seqsplit não funciona a menos que a string seja fornecida diretamente como argumento

Considere o seguinte exemplo. Se eu fizer isso, \seqsplit{ReferencedIDs}a string não será dividida. Se, por outro lado, eu insiro a string como argumento diretamente, isso acontece. Como sempre, não sei por que isso não está funcionando. Alguém pode me esclarecer?

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

Responder1

O argumento to \seqsplité processado token por token, assumindo que esteja totalmente expandido. Este não é o caso quando você passa uma macro (um único token) como argumento. A configuração a seguir redefine \seqsplitpara expandir seu argumento antes de processá-lo.

insira a descrição da imagem aqui

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

Responder2

Se você não se importa em usar 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

e então \printIDs{\ReferencedIDs}farei.

Isto não é muito diferente do código de Werner, mas esconde os detalhes técnicos do usuário; vamos ver linha por linha.

Obtemos uma função “interna” de `\seqsplit

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

Desta forma podemos definir uma variante:

\cs_generate_variant:Nn \faheem_seqsplit:n { o }

Esta variante funciona como \faheem_seqsplit:n, mas antes de agir, o argumento passado a ela será expandido uma vez. Finalmente

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

define um comando de nível de usuário que usa a variante.

Como eu disse, isso é basicamente equivalente a fazer

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

mas é “mais abstrato” e não exige que você adivinhe a cadeia correta de expansões.

informação relacionada