Temporales aritméticos en tex

Temporales aritméticos en tex

¿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+2como 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 \StrMidno es ampliable, la usabilidad \StrMiddepende 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 caquí.

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 \stringwindowpuede 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.

ingrese la descripción de la imagen aquí

Respuesta3

Aquí hay una solución basada en LuaLaTeX. Tenga en cuenta que la macro \StrMides completamente ampliable. Los tres argumentos de \StrMidpueden 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 \StrMidpuede asignarse a una nueva macro.

ingrese la descripción de la imagen aquí

% !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}

información relacionada