Temporários aritméticos em tex

Temporários aritméticos em tex

Posso chamar macros de algo assim

\StrMid{\mystring}{\X}{\X+2}\par

Então, eu gostaria de ter uma janela em execução de comprimento 3. E para esse fim, gostaria de poder usar uma variável local temporária sem nome, \X+2como posso em C++.

Responder1

Você pode usar \numexpr\X+2para avaliar o número do 'índice' final aqui.

Claro que \numexpr\foo+\foobarserá uma solução ainda mais flexível.

Como \StrMidnão é expansível, a usabilidade \StrMiddepende do design 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}

Isso rende or something caqui.

Responder2

Uma função totalmente expansível, com a ajuda 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}

O segundo e terceiro argumentos de \stringwindowpodem ser qualquer denotação inteira, ou seja, também registros contadores, como \value{chapter}, além de macros que se expandem para números.

Nota: os espaços não são preservados. Uma rotina mais lenta seria necessária para isso.

insira a descrição da imagem aqui

Responder3

Aqui está uma solução baseada em LuaLaTeX. Observe que a macro \StrMidé totalmente expansível. Todos os três argumentos \StrMidpodem consistir em (ou conter) macros; o único requisito é que os argumentos sejam avaliados como uma string (o primeiro argumento) ou números inteiros (o segundo e o terceiro argumentos). E o resultado de \StrMidpode ser atribuído a uma nova macro.

insira a descrição da imagem aqui

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

informação relacionada