
\item
다음과 같이 내부에서 호출되는지 여부에 따라 다르게 동작하는 매크로를 만들고 싶습니다.
\def\mymacro{\if<INSIDE_ITEM> do this \else do that\fi}
이것이 사용될 수 있는 예는 다음과 같습니다:
This is how my macro performs outside an item: {\mymacro}
\item{1}. And this is how it performs inside an item: {\mymacro}
비교를 위해 다음과 같이 수학 모드 내에서 호출되는지 여부에 따라 다르게 수행되는 매크로에 대해서도 비슷한 상황이 발생합니다.
\def\anothermacro{\ifmmode do this \else do that\fi}
문제는 항목의 환경이 일반 문단과 큰 차이가 없어 보인다는 점이다. 어떤 아이디어가 있나요?
PS: 저는 정말 관심이 있어요솔직한TeX(LaTeX와 반대)! 또한 추가 패키지가 필요하지 않은 간단한 솔루션도 높이 평가됩니다!
답변1
무엇과 비슷하다카보하에서 제안논평, 그러나 약간의 안전 점검을 통해 대신에 \item
새로운 길이를 사용하도록 재정의하고 전자를 plus 로 설정했습니다 . 이것은 광학적으로 구별할 수 없지만(단 몇 나노미터), 테스트에서 거짓 양성으로 이어질 가능성은 상대적으로 적다고 말하고 싶습니다.\itemindent
\parindent
\parindent
1sp
\ifdim\hangindent=\itemindent
\newdimen\itemindent
\itemindent\parindent
\advance\itemindent1sp
% the plain TeX definition is basically:
% \def\item{\par\hangindent\parindent\textindent}
\def\item{\par\hangindent\itemindent\textindent}
\def\mymacro{\ifdim\hangindent=\itemindent(INSIDE)\else(OUTSIDE)\fi}
Text text text text text text text text text \mymacro
\item{x} bla bla bla bla \mymacro
\item{x} bla bla bla bla \mymacro
Text text text text text text text text text \mymacro
\bye
답변2
의견에서 cabohah의 제안에 따라 :
\newif\ifinitem
\initemfalse
\def\mymacro{\ifinitem hi!\else bye\fi}
\def\item{\par\initemtrue\hang\textindent}
\let\oldpar\par
\def\par{\initemfalse\oldpar}
This is how my macro performs outside an item: {\mymacro}
\item{1}. And this is how it performs inside an item: {\mymacro}
Now we are no longer inside the item: {\mymacro}
\bye