
Является ли следующий метод правильным для разделения содержимого до и после первого знака равенства?
\documentclass{article}
\ExplSyntaxOn
\cs_new:Npn\getbefore:w#1=#2\q_stop{#1}
\cs_new:Npn\getafter:w#1=#2\q_stop{#2}
\NewDocumentCommand\beforeafter{m}{
\getbefore:w#1\q_stop
\par
\getafter:w#1\q_stop
}
\ExplSyntaxOff
\begin{document}
\beforeafter{a=2+3}
\end{document}
PS: обе части фактически будут сохранены в переменных списка токенов для дальнейшей обработки.
решение1
Этот подход не использует L3, а listofitems
парсер. Отдельные части самого последнего парсинга можно получить через \gotten[1]
, \gotten[2]
и т.д. Общее количество частей доступно через \listlen\gotten[]
.
\documentclass{article}
\usepackage{listofitems}
\setsepchar{=}
\newcommand\beforeafter[1]{%
\readlist*\gotten{#1}%
\foreachitem\z\in\gotten[]{%
\ifnum\zcnt=1\else\par\fi
$\z$%
}
}
\begin{document}
\beforeafter{a=2+3}
With 3 pieces:
\beforeafter{a = 2+3 = z_1}
\end{document}
решение2
Это простой и понятный метод, не требующий изобретения велосипеда:
\seq_set_split:Nnn \l_tmpa_seq { = } { #1 }
\tl_set:Ne \l_tmpa_tl { \seq_item:Nn \l_tmpa_seq { 1 } }
\tl_set:Ne \l_tmpb_tl { \seq_item:Nn \l_tmpa_seq { 2 } }
Что делать, если у вас больше одного =
токена?
Вы можете разделить хранение пробелов и =
последующее восстановление токенов:
\seq_set_split_keep_spaces:Nnn \l_tmpa_seq { = } { #1 }
\seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
\tl_set:Ne \l_tmpa_tl { \tl_trim_spaces:V \l_tmpa_tl }
\tl_set:Ne \l_tmpb_tl { \seq_use:Nn \l_tmpa_seq { = } }
\tl_set:Ne \l_tmpb_tl { \tl_trim_spaces:V \l_tmpb_tl }
Пространство вокруг элементов слева от первого =
обрезается, как и вокруг остальных.