¿Puedo llamar a las macros algo como esto?
\StrMid{\mystring}{\X}{\X+2}\par
Entonces, me gustaría tener una ventana en ejecución de longitud 3. Y para este fin, me gustaría poder usar una variable local temporal sin nombre \X+2
como puedo en C++.
Respuesta1
Puedes usar\numexpr\X+2
para evaluar el número del 'índice' final aquí.
Por supuesto\numexpr\foo+\foobar
habrá una solución aún más flexible.
Dado que \StrMid
no es ampliable, la usabilidad \StrMid
depende del diseño real.
\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}
Esto produce or something c
aquí.
Respuesta2
Una función totalmente ampliable, con la ayuda de 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}
El segundo y tercer argumento de \stringwindow
puede ser cualquier denotación entera, es decir, también registros contadores, como por ejemplo\value{chapter}
, además de macros que se expanden a números.
Nota: los espacios no se conservan. Para ello se necesitaría una rutina más lenta.
Respuesta3
Aquí hay una solución basada en LuaLaTeX. Tenga en cuenta que la macro \StrMid
es completamente ampliable. Los tres argumentos de \StrMid
pueden consistir en (o contener) macros; el único requisito es que los argumentos se evalúen como una cadena (el primer argumento) o como números enteros (el segundo y tercer argumento). Y el resultado de \StrMid
puede asignarse a una nueva macro.
% !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}