tex 中的算術臨時變量

tex 中的算術臨時變量

我可以這樣稱呼宏嗎

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

所以,我想要一個長度為 3 的運行視窗\X+2

答案1

您可以\numexpr\X+2在此使用 order 來評估結束「索引」的數量。

當然,\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都可以由(或包含)宏組成;唯一的要求是 args 計算結果為字串(第一個參數)或整數(第二個和第三個參數)。並且, 的結果\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}

相關內容