
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, \item
um eine neue Länge \itemindent
anstelle von zu verwenden \parindent
, und setze die vorherige auf \parindent
plus 1sp
. Dies ist optisch nicht zu unterscheiden (nur ein paar Nanometer), aber die Wahrscheinlichkeit, dass der Test \ifdim\hangindent=\itemindent
zu 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
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