Niestety, nie. Jak xstring stanach pakiet:
makr tego pakietu nie są czysto rozszerzalna
(sekcja 3.2 xtring_doc_en.pdf.)
Ten "rozbudowy" pojęcie, jeśli ciebie "Nie jestem zaznajomiony z tym, jest dość owłosiony temat w TeX. Mówiąc prosto, czegoś, co nie jest rozszerzalne, nie można ocenić jako argumentu. Wszystko, co używa gdzieś przydziału, jest gwarantowane, że nie jest rozszerzalne w większości odmian TeX, ale istnieją również inne nierozszerzalne wyzwalacze. Rozwiązanie takich problemów jest trudne dla każdego, kto nie jest zaznajomiony z wewnętrznym działaniem "ust" TeX-a (części TeX-a, która zajmuje się ekspansją).
Podpowiedź: Jeśli kod LaTeX jest generowany przez skrypt: użyć skryptu do przekształcania wyrażeń czasu, bo prawie każdy język programowania, jest łatwiejszy w użyciu niż TeX, jeśli chodzi o ciąg manipulacji. (Lub czegokolwiek innego w tym zakresie.)
xstring pakiet ma wskazywać na wyjście: można przechowywać wynik większości operacji w zmiennej, dodając [\variable]
do końca połączenia. Oznacza to, że trzeba przepisać \timetominutes
na coś, co buduje wynik po fragmencie, a następnie zapisać ten wynik w sekwencji poleceń do późniejszego wykorzystania.
Zastosowanie:
\timetominutesinto\somevar{8:00A} % \somevar contains 48
\expandafter\myfunc\expandafter{\somevar} % calls \myfunc{48}
Uwaga zastosowanie \expandafter
, który mówi tex do wykonać proste rozszerzenie jednego poziomu (oceny) sekwencji poleceń po następnego.Jeśli nie użyjesz obu tych \expandafter
s, otrzymasz \somevar
jako argument do \myfunc
, a nie 48
.
:
\makeatletter % allow @ in command names
\def\timetominutesinto#1#2{%
% #1 = command to store the result in
% #2 = the text to parse
% \[email protected] and \[email protected] are temporary variables for this macro
\let\[email protected]\empty % make the command empty
\IfSubStr{#2}{P}{%
\def\[email protected]{720+}% set tempa to "720+"
\StrBetween{#2}{:}{P}[\[email protected]]% store substring between : and P into tempb
\edef\[email protected]{\[email protected] \[email protected]}% set tempa to tempa + tempb
}{%
\def\[email protected]{0+}% set tempa to 0+
\StrBetween{#2}{:}{A}[\[email protected]]% store substring between : and A into tempb
\edef\[email protected]{\[email protected] \[email protected]}% set tempa to tempa + tempb
}%
\edef\[email protected]{\[email protected]+60*}% set tempa to tempa + "+60*"
\StrBefore{#2}{:}[\[email protected]]% store substring before : into tempb
% now, set #1 to the result of evaluating the formula returned by concatenating
% tempa and tempb
\edef#1{\numexpr \[email protected] \[email protected]}%
}
\def
jest TeX prymitywny odpowiadający lateksu za \newcommand
/\renewcommand
(Uwaga brzydki kod TeX przodu!). \edef
oznacza Rozszerzanie \def
, które ocenia definicję przed przypisaniem wyniku do sekwencji poleceń. \numexpr
oblicza proste wyrażenie liczbowe, takie jak x + m + h * 60 utworzone przez powyższe polecenie.
Możliwe jest również natychmiastowe obliczenie wyniku jako liczby, bez tworzenia wzoru, za pomocą arytmetycznych liczb całkowitych. Ale to uczyniłoby kod jeszcze bardziej odległym od pierwotnego zamiaru.
Możliwe jest wykonywanie tych operacji na łańcuchach za pomocą samego TeX-a, bez użycia pakietu xstring
(nawet rozszerzalnego w tym konkretnym przypadku). Ale to dość niski poziom rzeczy, których nie da się łatwo powtórzyć, jeśli nie jesteś wizualizerem TeX.
Dlaczego na świecie chcesz to zrobić w LaTeX? Można napisać skrypt w innym języku, aby odczytać ciąg, przetwarzać, a następnie wyprowadzać do TikZ. –
brzmi jak zadanie dla luatex. Przepraszam, nie mogę podać rozwiązania w Lua. Jestem pewien, że mógł to zrobić ktoś inny. – Mica
Zainspirował mnie rozszerzalność składni TikZ i myśl, że mogę stworzyć coś podobnego do rozszerzenia. Jak się okazało, myliłem się. – Ethan