seqsplit funktioniert nur, wenn die Zeichenfolge direkt als Argument angegeben wird

seqsplit funktioniert nur, wenn die Zeichenfolge direkt als Argument angegeben wird

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 \seqsplitwird 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, \seqsplitum sein Argument vor der Verarbeitung zu erweitern.

Bildbeschreibung hier eingeben

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

verwandte Informationen