인수와 함께 @ifstar를 사용하는 방법

인수와 함께 @ifstar를 사용하는 방법

@ifstar스타 버전이 아닌 버전은 변수에 값을 저장하고 스타 버전은 변수에서 값을 읽는 명령을 정의하는 데 사용하고 싶습니다 . 나는 다음을 시도했다. 오류는 발생하지 않지만 값도 인쇄하지 않습니다.

\def\sndname#1{\@ifstar\@sndname{\def\@sndname{#1}}}
\sndname{Hello U2}
\sndname*

이 패턴을 사용할 수 있다는 것을 알고 있지만 한 줄로 사용할 수 있는 방법이 있나요?

\def\foo{\@ifstar\@foo\@@foo}
\def\@foo#1{...}
\def\@@foo#1{...}

답변1

\documentclass{article}
\makeatletter
\def\sndname{\@ifstar\@sndname{\def\@sndname}}
\makeatother
\begin{document}
Set it \sndname{Hello U2}and use it \sndname*.
\end{document}

비결은 \sndname인수를 읽는 것이 아니라 \def내부에서 \sndname.

답변2

LaTeX 구문 지침을 남용하고 있습니다. 명령의 * 버전에는 일반적으로 표준 버전과 동일한 필수 인수가 있어야 합니다.

대신 선택적 인수를 사용할 수 있습니다.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\sndname}{o}
 {
  \IfNoValueTF{#1}
    {\tl_use:N \l_cocomore_sndname_tl}
    {\tl_set:Nn \l_cocomore_sndname_tl { #1 }}
 }
\tl_new:N \l_cocomore_sndname_tl
\ExplSyntaxOff

\begin{document}

\sndname[Hello U2]
\sndname

\end{document}

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

그러나 더 나은 접근 방식은 변수를 설정하고 사용하기 위해 다른 명령을 사용하는 것입니다.

답변3

동의하는 @egreg의 답변에 추가로 더 나은 구문이 있지만 xparse. 주석이 달린 버전은 명령의 TeX 스타일 정의이고 주석이 없는 버전은 LaTeX 스타일 정의입니다. LaTeX 정의에서 선택적 인수는 기본값(여기서는 으로 설정됨)만 취할 수 있으며 \empty, 이는 코드에서 확인할 수 있습니다. 가 로드되지 않는 한 작동해야 합니다 \empty. 사용 시 명령 주위의 점은 추가 공백이 없는지 확인하기 위한 것입니다. (실제로 LaTeX 버전은 아마도 한 줄로 보일 수 있지만 다음과 같이 더 읽기 쉽습니다:-)

\documentclass{article}
%%%% TeX style definition
% \makeatletter
% \def\sndname{\@ifnextchar[\opt@sndname\@sndnamevar}
% \def\opt@sndname[#1]{\def\@sndnamevar{#1}}
% \makeatother

%%%% LaTeX style definition
\newcommand\sndname[1][\empty]{%
  \ifx#1\empty
    \sndnamevar
  \else
    \def\sndnamevar{#1}%
  \fi}

%%%% Load with nothing (just in case \sndname is used before loaded)
\sndname[]
%%%%
\begin{document}
Load: .\sndname[Name of snd].

Print: .\sndname.

\end{document}

관련 정보