LaTeX: использовать несколько символов в строке - PullRequest
0 голосов
/ 14 октября 2010

Мне нужен макрос, который извлекает пары чисел из строки, которая выглядит следующим образом:

  n1-m1,n2-m2,n3-m3,n4-m4  (it could be longer)

где n1, m1, n2, m2, ... - числа от 0 до 15. Как я могу получить пары (n1, m1) и (n2, m2), (n3, m3) и т. Д внутри моего макроса? Мне нужно будет использовать каждую пару один раз, после чего я могу, при необходимости, игнорировать пару.

Предполагая, что каждая цифра является двузначным числом (это не изящная вещь), и, вырезав код, который я нашел Дебилски на этом форуме, мне удалось получить первую пару, выполнив следующее:

\documentclass[11pt]{article}
\def\macroGetPairs #1{\getPairs#1.\wholeString}
\def\getPairs#1#2-#3#4,#5\wholeString {
\if#1.%
\else
  % Test if pair was successfully extracted
  Got pair (#1#2,#3#4). Still left: #5\\

  % Begin recursion
  %\takeTheRest#5\ofTheString
\fi}


\def\takeTheRest#1\ofTheString\fi
{\fi \getPairs#1\wholeString}


\begin{document}
\macroGetPairs{10-43,40-51,60-73,83-97}
\end{document}

Однако я не уверен, как заставить рекурсию работать на меня, чтобы получить остальные пары. Я думал, что это просто раскомментирует строку

  %\takeTheRest#5\ofTheString

должен это сделать, но он не работает. Обратите внимание, что тестовый вызов макроса:

\macroGetPairs{10-43,40-51,60-73,83-97}

Есть предложения? Большое спасибо,

ERM

1 Ответ

0 голосов
/ 20 октября 2010

Похоже, ваш тест заработал:

\documentclass{article}

\def\macroGetPairs#1{\getPairs#1,.\wholeString}
\def\getPairs#1#2-#3#4,#5\wholeString {%
  Got pair (#1#2,#3#4).\\
\if#5.\else%
  \getPairs#5\wholeString
\fi}

\begin{document}
\noindent\macroGetPairs{10-43,40-51,60-73,83-97}
\end{document}

Ваш код в основном работал, но у \getPairs не было возможности сопоставить свои данные в последнем расширении (\getPairs 83-97). Ваш тест конца рекурсии (\if#1.) также тестировал #1 вместо #5, что я и сделал здесь. Возможно, если бы был какой-то другой способ форматирования аргумента в \getPairs, который бы сработал.

...