
Я хотел бы создать макрос, который ведет себя по-разному в зависимости от того, вызывается ли он из \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
чтобы использовать новую длину \itemindent
вместо \parindent
, и устанавливаю прежнюю на \parindent
plus 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