Wie kann ich ein einfaches TeX-Makro erstellen, das sich unterschiedlich verhält, je nachdem, ob es innerhalb eines \items aufgerufen wird oder nicht?

Wie kann ich ein einfaches TeX-Makro erstellen, das sich unterschiedlich verhält, je nachdem, ob es innerhalb eines \items aufgerufen wird oder nicht?

Ich möchte ein Makro erstellen, das sich unterschiedlich verhält, je nachdem, ob es innerhalb eines aufgerufen wird oder nicht \item, wie zum Beispiel

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

Hier ist ein Beispiel, wo dies verwendet werden könnte:

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

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

Zum Vergleich: Eine ähnliche Situation betrifft Makros, die sich je nachdem, ob sie im Mathematikmodus aufgerufen werden oder nicht, unterschiedlich verhalten, wie zum Beispiel:

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

Das Problem ist, dass es keinen großen Unterschied zwischen der Umgebung eines Artikels und einem normalen Absatz zu geben scheint. Irgendwelche Ideen?

PS: Mich interessiert wirklichschmucklosTeX (im Gegensatz zu LaTeX)! Außerdem wäre eine unkomplizierte Lösung, die keine zusätzlichen Pakete erfordert, sehr willkommen!

Antwort1

Ähnlich wieAbonnierenvorgeschlagen in einemKommentar, aber mit einer kleinen Sicherheitsüberprüfung: Ich definiere neu, \itemum eine neue Länge \itemindentanstelle von zu verwenden \parindent, und setze die vorherige auf \parindentplus 1sp. Dies ist optisch nicht zu unterscheiden (nur ein paar Nanometer), aber die Wahrscheinlichkeit, dass der Test \ifdim\hangindent=\itemindentzu einem falschen Positiv führt, ist meiner Meinung nach relativ gering.

\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

Bildbeschreibung hier eingeben

Antwort2

Ich folge dem Vorschlag von cabohah in den Kommentaren:

\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

Bildbeschreibung hier eingeben

verwandte Informationen