Arithmetische Temporäre in Tex

Arithmetische Temporäre in Tex

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+2wie ich es in C++ kann.

Antwort1

\numexpr\X+2Zur Auswertung können Sie hier die Nummer des End-Index verwenden .

Natürlich \numexpr\foo+\foobarwird es eine noch flexiblere Lösung geben.

Da \StrMides nicht erweiterbar ist, hängt die Verwendbarkeit \StrMidvom 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 chier.

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, \stringwindowauch Zählerregister wie .\value{chapter}

Hinweis: Leerzeichen bleiben nicht erhalten. Hierfür wäre eine langsamere Routine erforderlich.

Bildbeschreibung hier eingeben

Antwort3

Hier ist eine LuaLaTeX-basierte Lösung. Beachten Sie, dass das Makro \StrMidvollständig erweiterbar ist. Alle drei Argumente von \StrMidkö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 \StrMidkann einem neuen Makro zugewiesen werden.

Bildbeschreibung hier eingeben

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

verwandte Informationen