seqsplit no funciona a menos que la cadena se proporcione directamente como argumento

seqsplit no funciona a menos que la cadena se proporcione directamente como argumento

Considere el siguiente ejemplo. Si lo hago, \seqsplit{ReferencedIDs}la cuerda no se divide. Si, por el contrario, inserto la cadena como argumento directamente, lo hace. Como siempre, no sé por qué esto no funciona. ¿Alguien puede iluminarme?

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

Respuesta1

El argumento to \seqsplitse procesa token por token, asumiendo que está completamente expandido. Este no es el caso cuando se pasa una macro (un único token) como argumento. La siguiente configuración se redefine \seqsplitpara expandir su argumento antes de procesarlo.

ingrese la descripción de la imagen aquí

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

Respuesta2

Si no te importa 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

y luego \printIDs{\ReferencedIDs}lo haré.

Esto no es muy diferente del código de Werner, pero oculta los detalles técnicos al usuario; veamos línea por línea.

Obtenemos una función “interna” de `\seqsplit

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

De esta manera podemos definir una variante:

\cs_generate_variant:Nn \faheem_seqsplit:n { o }

Esta variante funciona como \faheem_seqsplit:n, pero antes de hacerla actuar, el argumento que se le pasa se expandirá una vez. Finalmente

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

define un comando de nivel de usuario que utiliza la variante.

Como dije, esto es mayormente equivalente a hacer

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

pero es "más abstracto" y no requiere que adivines la cadena correcta de expansiones.

información relacionada