tex의 산술 임시

tex의 산술 임시

매크로를 이렇게 호출할 수 있나요?

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

\X+2그래서 저는 길이가 3인 실행 창을 갖고 싶습니다. 그리고 이를 위해 C++에서 할 수 있는 것처럼 이름이 지정되지 않은 임시 지역 변수를 사용할 수 있기를 원합니다 .

답변1

\numexpr\X+2여기서 end-'index'의 수를 평가하기 위해 사용할 수 있습니다 .

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

관련 정보