
Рассмотрим следующий пример. Если я это сделаю, \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}}
но он «более абстрактный» и не требует от вас угадывания правильной цепочки расширений.