
Betrachten Sie das folgende Beispiel. Wenn ich das mache, \seqsplit{ReferencedIDs}
wird die Zeichenfolge nicht geteilt. Wenn ich die Zeichenfolge hingegen direkt als Argument einfüge, wird sie geteilt. Wie immer weiß ich nicht, warum das nicht funktioniert. Kann mich jemand aufklären?
\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}
Antwort1
Das Argument \seqsplit
wird Token für Token verarbeitet, vorausgesetzt, dass es vollständig erweitert ist. Dies ist nicht der Fall, wenn Sie ein Makro (ein einzelnes Token) als Argument übergeben. Das folgende Setup definiert neu, \seqsplit
um sein Argument vor der Verarbeitung zu erweitern.
\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}
Antwort2
Wenn es Ihnen nichts ausmacht, verwenden Sie 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
und dann \printIDs{\ReferencedIDs}
werde ich es tun.
Dies unterscheidet sich nicht sehr von Werners Code, verbirgt aber die technischen Details vor dem Benutzer. Sehen wir uns das Zeile für Zeile an.
Wir erhalten eine „interne“ Funktion aus `\seqsplit
\cs_set:eq:NN \faheem_seqsplit:n \seqsplit
Auf diese Weise können wir eine Variante definieren:
\cs_generate_variant:Nn \faheem_seqsplit:n { o }
Diese Variante funktioniert wie \faheem_seqsplit:n
, aber bevor sie ausgeführt wird, wird das ihr übergebene Argument einmal erweitert. Schließlich
\NewDocumentCommand{\printIDs}{m}{\faheem_seqsplit:o{#1}}
definiert einen Befehl auf Benutzerebene, der die Variante verwendet.
Wie gesagt, das ist im Wesentlichen gleichbedeutend mit
\newcommand{\printIDs}[1]{\expandafter\seqsplit\expandafter{#1}}
aber es ist „abstrakter“ und erfordert nicht, dass Sie die richtige Erweiterungskette erraten.