
@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}