다른 명령의 영향을 받지 않도록 명령의 일부를 접두사 또는 접미사로 "표시"합니다.

다른 명령의 영향을 받지 않도록 명령의 일부를 접두사 또는 접미사로 "표시"합니다.

나는 다소 독특한 상황에 처해 있습니다. 명령 출력의 일부를 접두사 또는 접미사로 "표시"하고 싶습니다. 예를 들어:

\newcommand{\L}[1]{L\postfix{_i}}

그런 다음 다음과 같은 작업을 수행할 수 있습니다.

\newcommand{\est}[1]{\prefixof{#1}\hat{\mainbodyof{#1}}\postfixof{#1}}

이상적으로는 일반 텍스트에서 작동해야 합니다 . 예 \est{\lambda}를 들어 . \hat{\lambda}또한 은(는) \L로 확장되어야 L_i하며 \est{\L}로 확장되어야 합니다 \hat{L}_i.

나는 이것이 TeX(튜링 완전체 등)로 가능하다는 것을 알고 있지만 어디서부터 시작해야 할지, 질문에 macros.

이 경우 @DavidCarlisle의 답변이 작동하지 않는 것 같습니다.

\documentclass{article}

\usepackage{etoolbox}

\newcommand\zzfix[3]{#1#2#3}%pre-main-post

\def\prefixof#1{\expandafter\zzpre#1\relax{#1}}
\def\postfixof#1{\expandafter\zzpost#1\relax{#1}}
\def\mainbodyof#1{\expandafter\zzmain#1\relax{#1}}


\def\zzpre#1{\ifx\zzfix#1\expandafter\oneoffive\else\expandafter\gobblepastrelax\fi}
\def\zzpost#1{\ifx\zzfix#1\expandafter\threeoffive\else\expandafter\gobblepastrelax\fi}
\def\zzmain#1{\ifx\zzfix#1\expandafter\twooffive\else\expandafter\afterrelax\fi}

\def\oneoffive#1#2#3\relax#4{#1}
\def\twooffive#1#2#3\relax#4{#2}
\def\threeoffive#1#2#3\relax#4{#3}
\def\afterrelax#1\relax#2{#2}
\def\gobblepastrelax#1\relax#2{}

\newcommand{\queueState}[1][]{\zzfix{}{\ell}{\ifstrempty{#1}{}{_{#1}}}}

\newcommand{\baseQuantity}[1]{\prefixof{#1}\bar{\mainbodyof{#1}}\postfixof{#1}}


\begin{document}
    But this does not work: $\baseQuantity{\queueState[1:N]}$
\end{document}

작동하지 않는 예

어쩌면 이것도 작동하게 만드는 것이 가능할까요?

\show\queueState산출:

> \queueState=macro:
->\@protected@testopt \queueState \\queueState {}.

답변1

여기에 이미지 설명을 입력하세요

\documentclass{article}

\newcommand\zzfix[3]{#1#2#3}%pre-main-post  



\renewcommand{\L}{\zzfix{}{L}{_i}}

\newcommand{\est}[1]{\prefixof{#1}\hat{\mainbodyof{#1}}\postfixof{#1}}

\def\prefixof#1{\expandafter\zzpre#1\relax{#1}}
\def\postfixof#1{\expandafter\zzpost#1\relax{#1}}
\def\mainbodyof#1{\expandafter\zzmain#1\relax{#1}}


\def\zzpre#1{\ifx\zzfix#1\expandafter\oneoffive\else\expandafter\gobblepastrelax\fi}
\def\zzpost#1{\ifx\zzfix#1\expandafter\threeoffive\else\expandafter\gobblepastrelax\fi}
\def\zzmain#1{\ifx\zzfix#1\expandafter\twooffive\else\expandafter\afterrelax\fi}

\def\oneoffive#1#2#3\relax#4{#1}
\def\twooffive#1#2#3\relax#4{#2}
\def\threeoffive#1#2#3\relax#4{#3}
\def\afterrelax#1\relax#2{#2}
\def\gobblepastrelax#1\relax#2{}



\begin{document}


Ideally, this should work on normal text, e.g. $\est{\lambda}$ should
expand to $\hat{\lambda}$. Also, $\L$ should expand to $L_i$, and $\est{\L}$
should expand to $\hat{L}_i$.
\end{document}

관련 정보