seqsplit не работает, если строка не указана напрямую в качестве аргумента

seqsplit не работает, если строка не указана напрямую в качестве аргумента

Рассмотрим следующий пример. Если я это сделаю, \seqsplit{ReferencedIDs}строка не будет разделена. Если же я вставлю строку как аргумент напрямую, то она будет разделена. Как обычно, я не знаю, почему это не работает. Может кто-нибудь просветить меня?

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

решение1

Аргумент \seqsplitобрабатывается по токенам, предполагая, что он полностью развернут. Это не тот случай, когда вы передаете макрос (один токен) в качестве аргумента. Следующая настройка переопределяет его \seqsplitдля развертывания аргумента перед его обработкой.

введите описание изображения здесь

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

решение2

Если вы не против использования 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

и тогда \printIDs{\ReferencedIDs}сделаю.

Это не сильно отличается от кода Вернера, но скрывает технические детали от пользователя; давайте рассмотрим построчно.

Мы получаем «внутреннюю» функцию из `\seqsplit

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

Таким образом, мы можем определить вариант:

\cs_generate_variant:Nn \faheem_seqsplit:n { o }

Этот вариант работает как \faheem_seqsplit:n, но перед тем как он начнет действовать, переданный ему аргумент будет расширен один раз. Наконец

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

определяет команду уровня пользователя, которая использует вариант.

Как я уже сказал, это по сути эквивалентно выполнению

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

но он «более абстрактный» и не требует от вас угадывания правильной цепочки расширений.

Связанный контент