Арифметические временные элементы в тексе

Арифметические временные элементы в тексе

Могу ли я называть макросы как-то так?

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

Итак, я хотел бы иметь работающее окно длиной 3. И для этого я хотел бы иметь возможность использовать временную безымянную локальную переменную, \X+2как я могу в C++.

решение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}

Вторым и третьим аргументами \stringwindowмогут быть любые целочисленные обозначения, то есть также регистры счетчиков, такие как \value{chapter}, а также макросы, которые расширяются до чисел.

Примечание: пробелы не сохраняются. Для этого понадобится более медленная процедура.

введите описание изображения здесь

решение3

Вот решение на основе LuaLaTeX. Обратите внимание, что макрос \StrMidполностью расширяемый. Все три аргумента \StrMidмогут состоять из (или содержать) макросы; единственное требование заключается в том, чтобы аргументы оценивались как строка (первый аргумент) или целые числа (второй и третий аргументы). И результат \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}

Связанный контент