К сожалению, нет.Как говорится в пакете xstring :
Макросы этого пакета не могут быть просто расширены
(раздел 3.2 файла xtring_doc_en.pdf.)
Эта «расширяемая» концепция, если вы с ней не знакомы, в TeX довольно проблематичная тема.Проще говоря, то, что не расширяется, не может быть оценено как аргумент.Все, что использует назначение где-либо, гарантированно не будет расширяемым в большинстве разновидностей TeX, но существуют и другие нерасширяемые триггеры.Решение таких проблем довольно сложно для тех, кто не знаком с внутренней работой «рта» TeX (той части TeX, которая обрабатывает такие вещи, как расширение).
Подсказка: ЕслиКод LaTeX генерируется сценарием: используйте сценарий для преобразования выражений времени, потому что практически любой язык программирования легче использовать, чем TeX, когда дело доходит до манипулирования строками.(Или почти что-нибудь еще в этом отношении.)
Пакет xstring подсказывает выход: вы можете сохранить результат большинства операций в переменной, добавив[\variable]
до конца звонков.Это означает, что вам нужно переписать \timetominutes
во что-то, что будет создавать результат по частям, а затем сохранить этот результат в последовательности команд для использования в дальнейшем.
Использование:
\timetominutesinto\somevar{8:00A} % \somevar contains 48
\expandafter\myfunc\expandafter{\somevar} % calls \myfunc{48}
Обратите внимание на использование \expandafter
, которое говорит TeX выполнить простое одноуровневое расширение (оценку) последовательности команд после следующего.Если вы не используете эти два \expandafter
с, вы получите \somevar
в качестве аргумента \myfunc
, а не 48
.
(Внимание! Впереди уродливый код TeX!)
\makeatletter % allow @ in command names
\def\timetominutesinto#1#2{%
% #1 = command to store the result in
% #2 = the text to parse
% \ttm@tempa and \ttm@tempb are temporary variables for this macro
\let\ttm@tempa\empty % make the command empty
\IfSubStr{#2}{P}{%
\def\ttm@tempa{720+}% set tempa to "720+"
\StrBetween{#2}{:}{P}[\ttm@tempb]% store substring between : and P into tempb
\edef\ttm@tempa{\ttm@tempa \ttm@tempb}% set tempa to tempa + tempb
}{%
\def\ttm@tempa{0+}% set tempa to 0+
\StrBetween{#2}{:}{A}[\ttm@tempb]% store substring between : and A into tempb
\edef\ttm@tempa{\ttm@tempa \ttm@tempb}% set tempa to tempa + tempb
}%
\edef\ttm@tempa{\ttm@tempa+60*}% set tempa to tempa + "+60*"
\StrBefore{#2}{:}[\ttm@tempb]% store substring before : into tempb
% now, set #1 to the result of evaluating the formula returned by concatenating
% tempa and tempb
\edef#1{\numexpr \ttm@tempa \ttm@tempb}%
}
\def
- это примитив TeX, соответствующий \newcommand
/ \renewcommand
LaTeX.\edef
означает Расширение \def
, которое оценивает определение перед присвоением результата последовательности команд.\numexpr
вычисляет простое числовое выражение, например x + m + h * 60, созданное вышеуказанной командой.
Это такжеМожно рассчитать результат сразу как число, не выстраивая формулу, используя целочисленную арифметику.Но это сделает код еще более удаленным от вашего первоначального намерения.
Эти манипуляции со строками можно выполнять через сам TeX, без использования пакета xstring
(даже расширяемого в данном конкретном случае).Но это довольно низкоуровневый материал, который нельзя легко повторить, если вы не волшебник TeX.