Kann ich Makros so nennen
\StrMid{\mystring}{\X}{\X+2}\par
Ich hätte also gerne ein laufendes Fenster der Länge 3. Und zu diesem Zweck möchte ich in der Lage sein, temporäre unbenannte lokale Variablen zu verwenden, \X+2
wie ich es in C++ kann.
Antwort1
\numexpr\X+2
Zur Auswertung können Sie hier die Nummer des End-Index verwenden .
Natürlich \numexpr\foo+\foobar
wird es eine noch flexiblere Lösung geben.
Da \StrMid
es nicht erweiterbar ist, hängt die Verwendbarkeit \StrMid
vom tatsächlichen Design ab.
\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}
Das ergibt sich or something c
hier.
Antwort2
Eine vollständig erweiterbare Funktion mit Hilfe von 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}
Das zweite und dritte Argument von kann jede ganzzahlige Bezeichnung sein, also neben Makros, die zu Zahlen erweitert werden, \stringwindow
auch Zählerregister wie .\value{chapter}
Hinweis: Leerzeichen bleiben nicht erhalten. Hierfür wäre eine langsamere Routine erforderlich.
Antwort3
Hier ist eine LuaLaTeX-basierte Lösung. Beachten Sie, dass das Makro \StrMid
vollständig erweiterbar ist. Alle drei Argumente von \StrMid
können aus Makros bestehen (oder diese enthalten); die einzige Voraussetzung ist, dass die Argumente entweder als Zeichenfolge (das erste Argument) oder als Ganzzahlen (das zweite und dritte Argument) ausgewertet werden. Und das Ergebnis von \StrMid
kann einem neuen Makro zugewiesen werden.
% !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}