tex 中的算术临时变量

tex 中的算术临时变量

我可以像这样调用宏吗

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

相关内容