TEX における算術一時変数

TEX における算術一時変数

マクロをこのように呼び出すことはできますか

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

したがって、長さ 3 の実行ウィンドウが必要です。この目的のために、\X+2C++ の場合と同様に、一時的な名前のないローカル変数を使用できるようにしたいと考えています。

答え1

\numexpr\X+2ここで終了インデックスの数を評価するために を使用できます。

もちろん、\numexpr\foo+\foobarさらに柔軟なソリューションになります。

\StrMidは拡張できないため、使いやすさは\StrMid実際のデザインに依存します。

\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}

ここでこれが起こりますor something c

答え2

完全に拡張可能な機能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}

の 2 番目と 3 番目の引数には\stringwindow、任意の整数表記、つまり、 などのカウンタ レジスタ\value{chapter}や、数値に展開されるマクロを指定できます。

注意: スペースは保持されません。このためには、より遅いルーチンが必要になります。

ここに画像の説明を入力してください

答え3

これは LuaLaTeX ベースのソリューションです。マクロは\StrMid完全に拡張可能であることに注意してください。 の 3 つの引数は\StrMidすべてマクロで構成 (またはマクロを含む) できます。唯一の要件は、引数が文字列 (最初の引数) または整数 (2 番目と 3 番目の引数) のいずれかに評価されることです。また、 の結果を\StrMid新しいマクロに割り当てることができます。

ここに画像の説明を入力してください

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

関連情報