Como posso criar uma macro simples do TeX com desempenho diferente dependendo de ser ou não chamada de dentro de um \item?

Como posso criar uma macro simples do TeX com desempenho diferente dependendo de ser ou não chamada de dentro de um \item?

Eu gostaria de criar uma macro que se comporte de maneira diferente dependendo de ser chamada ou não de dentro de um arquivo \item, como

\def\mymacro{\if<INSIDE_ITEM> do this \else do that\fi}

Aqui está um exemplo onde isso pode ser usado:

This is how my macro performs outside an item: {\mymacro}

\item{1}. And this is how it performs inside an item: {\mymacro}

Para efeito de comparação, uma situação semelhante diz respeito às macros que apresentam desempenho diferente dependendo de serem chamadas ou não no modo matemático, como:

\def\anothermacro{\ifmmode do this \else do that\fi}

O problema é que não parece haver grande diferença entre o ambiente de um item e um parágrafo normal. Alguma ideia?

PS: Estou realmente interessado emsimplesTeX (em oposição ao LaTeX)! Além disso, uma solução simples que não requer nenhum pacote extra seria muito apreciada!

Responder1

Semelhante ao quecabohahsugerido em umComente, mas com uma pequena verificação de segurança: eu redefino \itempara usar um novo comprimento \itemindentem vez de \parindente defino o anterior como \parindentplus 1sp. Isso é opticamente indistinguível (apenas alguns nanômetros), mas as chances de o teste \ifdim\hangindent=\itemindentlevar a um falso positivo são relativamente pequenas, eu diria.

\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

insira a descrição da imagem aqui

Responder2

Seguindo a sugestão do cabohah nos comentários:

\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

insira a descrição da imagem aqui

informação relacionada