Могу ли я называть макросы как-то так?
\StrMid{\mystring}{\X}{\X+2}\par
Итак, я хотел бы иметь работающее окно длиной 3. И для этого я хотел бы иметь возможность использовать временную безымянную локальную переменную, \X+2
как я могу в C++.
решение1
Вы можете использовать \numexpr\X+2
для оценки числа конечного «индекса» здесь.
Конечно, \numexpr\foo+\foobar
это будет еще более гибкое решение.
Поскольку \StrMid
он не расширяем, удобство использования \StrMid
зависит от реального дизайна.
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\foo{10}
\def\foobar{14}
\def\mystring{And now for something completely different}
\StrMid{\mystring}{\foo}{\numexpr\foo+\foobar}
\end{document}
Это дает or something c
здесь.
решение2
Полностью расширяемая функция с помощью expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\stringwindow}{mmm}
{
\tl_map_function:fN { \tl_range:onn { #1 } { #2 } { #3 } } \use:n
}
\cs_generate_variant:Nn \tl_map_function:nN { f }
\cs_generate_variant:Nn \tl_range:nnn { o }
\ExplSyntaxOff
\begin{document}
\newcommand\mystring{Andnowforsomethingcompletelydifferent}
\newcommand{\foo}{4}
\stringwindow{\mystring}{\foo}{\foo+2}
\edef\now{\stringwindow{\mystring}{\foo}{\foo+2}}
\texttt{\meaning\now}
\end{document}
Вторым и третьим аргументами \stringwindow
могут быть любые целочисленные обозначения, то есть также регистры счетчиков, такие как \value{chapter}
, а также макросы, которые расширяются до чисел.
Примечание: пробелы не сохраняются. Для этого понадобится более медленная процедура.
решение3
Вот решение на основе LuaLaTeX. Обратите внимание, что макрос \StrMid
полностью расширяемый. Все три аргумента \StrMid
могут состоять из (или содержать) макросы; единственное требование заключается в том, чтобы аргументы оценивались как строка (первый аргумент) или целые числа (второй и третий аргументы). И результат \StrMid
может быть назначен новому макросу.
% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode} % for "\luastring" macro
\newcommand\StrMid[3]{\directlua{tex.sprint(string.sub(\luastring{#1},#2,#3))}}
\newcommand\mystring{Andnowforsomethingcompletelydifferent}
\begin{document}
\newcommand\foo{2+2} % something that evaluates to an integer in Lua
\StrMid{\mystring}{\foo}{\foo+2} % returns "now"
% assign result of \StrMid to a LaTeX macro:
\newcommand\bbar{\StrMid{\mystring}{\foo+19}{\foo+21}}
\bbar % returns "let"
\end{document}