if 문을 이해하는 데 도움이 필요합니다.
LaTeX에서 다음 의사코드를 어떻게 만드나요?
\newcommand{\@leader}{}
\newcommand{\leader}[1]{\renewcommand\@leader{#1}}
\newcommand{\donow}{
\if \@leader == {} %aka blank, null, empty
this is the false %do false
\else
\@leader %do leader
\fi
}
사용자가 문서에 다음을 추가하면
\leader{
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\leader{}
\donow
다음을 인쇄하세요
*This is an item
*this is also an item
this is the false
변수에 대한 유일한 질문은 내가 가지고 있는 솔루션이 실제로 변수를 만드는 가장 좋은 방법인가 하는 것입니다.
답변1
를 사용하여 매크로 간을 테스트할 수 있습니다 \ifx
. 즉, 의 정의가 및 실행의 정의 와 일치하는지 \ifx<csA><csB><true>\else<false>\fi
여부를 테스트합니다 .<csA>
<csB>
<true>
<false>
\documentclass{article}
\makeatletter
\newcommand{\@emptymacro}{}% Used to test against an empty macro
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifx\@something\@emptymacro %aka blank, null, empty
this is the false %do false
\else
\@something %do something
\fi
}
\makeatother
\begin{document}
\something{%
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\something{}
\donow
\end{document}
etoolbox
유사한 검사 메커니즘을 제공합니다.
\usepackage{etoolbox}
\makeatletter
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifdefempty{\@something}{%aka blank, null, empty
this is the false %do false
}{%
\@something %do something
}%
}
\makeatother
답변2
주어진 작업에 대한 표준 TeX 코드는 다음과 같습니다:
\def\something#1{\def\internal{#1}%
\ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}
위 코드의 문제점은 할당이 \something
포함되어 있기 때문에 매크로를 확장할 수 없다는 것입니다 \def
. 동일한 테스트로 확장 가능한 매크로가 필요한 경우 매개 변수의 첫 번째 토큰으로 사용되지 않은 토큰을 선택해야 하며(예: ?
예) 다음과 같이 작성할 수 있습니다.
\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}
매개변수의 첫 번째 토큰으로 절대 발생하지 않는 토큰이 무엇인지 모른다면 \detokenize
예를 들어 eTeX에서 확장 가능한 기본 요소를 사용할 수 있습니다.
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi