매크로를 이렇게 호출할 수 있나요?
\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}