두 개의 값이 포함된 새 명령(그 중 하나는 처음에 언급됨)

두 개의 값이 포함된 새 명령(그 중 하나는 처음에 언급됨)

두 개의 값이 있는 새 명령을 정의하고 싶습니다. 하나는 작성자의 이름이고 다른 하나는 그의 사망 날짜입니다. 두 번째 값은 명령이 처음 사용될 때만 언급되고 나중에는 작성자 이름만 언급됩니다. 그렇게하는 방법?

답변1

자신을 재정의하는 명령 쌍을 사용할 수 있습니다.

\makeatletter
\newcommand*\einstein{Albert Einstein\death@einstein}
\def\death@einstein{ ($\dagger$~1955/04/18)\def\death@einstein{}}
\makeatother

그런 다음 사용할 때마다 \einstein이름이 Albert Einstein즉시 인쇄되고 \death@einstein. 후자는 인쇄 ($\dagger$~1955/04/18)한 다음 정의합니다.그 자체다음에 사용할 때는 아무것도 아닙니다.

\documentclass{article}

\makeatletter
\newcommand*\einstein{Albert Einstein\death@einstein}
\def\death@einstein{ ($\dagger$~1955/04/18)\def\death@einstein{}}
\makeatother

\begin{document}

\einstein \par
\einstein

\end{document}

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

한두 번 이상 필요할 경우 자동화할 수 있습니다.

\documentclass{article}

\makeatletter
\newcommand*\newperson[3]{%
  \def#1{#2\csname death@#2\endcsname}%
  \@namedef{death@#2}{ ($\dagger$~#3)\@namedef{death@#2}{}}%
}
\makeatother

\newperson\einstein{Albert Einstein}{1955/04/18}
\newperson\planck{Max Planck}{1947/10/04}

\begin{document}

\einstein \par
\einstein

\planck \par
\planck

\end{document}

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

답변2

부울 검사가 포함된 대체 버전:

\documentclass{article}
\usepackage{xspace}
\newif\ifauthordisplayed         % create boolean
\authordisplayedfalse            % set to false
\def\am{%
\ifauthordisplayed%              % if boolean true
Ali Mabrook\xspace%              % print only the name
\else
Ali Mabrook (died 2016)\xspace%  % print name and date
\authordisplayedtrue%            % and set boolean to true
\fi%
}
\begin{document}
\am was an author. His name is \am.
\end{document}

동일한 이름을 가진 패키지의 매크로 \xspace는 구두점, 각주 등이 뒤에 오는 경우를 제외하고 단어 뒤에 공백을 삽입합니다. 이는 문서에서 매크로가 호출될 때 매크로 처리 절차에 의해 원래 공백이 제거되기 때문에 유용합니다.

결과:

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

이는 패키지를 사용하는 둘 이상의 작성자에 대해 일반화될 수 있습니다 xkeyval. 이 솔루션을 작동시키려면 를 사용하여 구성해야 하는 몇 가지 명령이 있습니다 \csname. 예를 들어 인수에 포함된 키에 대한 부울은 을 #1사용하여 구성할 수 있으며 로 만든 매크로 \expandafter\newif\csname if#1displayed\endcsname에서 키 값을 읽는 것과 유사합니다 . 물론 이것은 읽기가 쉽지는 않지만 단계가 명확하기를 바랍니다.\KV@\define@key

MWE:

\documentclass{article}
\usepackage{xkeyval}
\usepackage{xspace}
\makeatletter
\newcommand{\addauthor}[3]{%
% create boolean for the key in argument #1
\expandafter\newif\csname if#1displayed\endcsname
% set boolean to false
\csname #1displayedfalse\endcsname
% define function for this key
\define@key{myauthors}{#1}{%
% if displayed before
\csname if#1displayed\endcsname
% print just the name
#2%
\else%
% print full info and set boolean to true
#2 (died #3)%
\csname #1displayedtrue\endcsname
\fi%
}
}

% call command that is created by define@key
\newcommand{\displayauthor}[1]{%
\csname KV@myauthors@#1\endcsname{}\xspace%
}
\makeatother

\begin{document}
\addauthor{am}{Ali Mabrook}{2016}
\addauthor{js}{John Smith}{2004}

\displayauthor{am} was an author. His name was \displayauthor{am}.

\displayauthor{js} was an author. His name was \displayauthor{js}.

\end{document}

결과:

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

관련 정보