
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 \seqsplit
para expandir seu argumento antes de processá-lo.
\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.