我如何创建一个普通的 TeX 宏,使其执行方式根据是否在 \item 内部调用而不同?

我如何创建一个普通的 TeX 宏,使其执行方式根据是否在 \item 内部调用而不同?

我想创建一个宏,它的行为会根据是否在 中调用而有所不同\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}

问题是,项目的环境与普通段落的环境似乎没有什么大的区别。有什么想法吗?

附言:我非常感兴趣清楚的TeX(而不是 LaTeX)!此外,如果能有一个不需要任何额外软件包的简单解决方案,我们将不胜感激!

答案1

类似于什么卡博哈建议评论,但进行了一次小小的安全检查:我重新定义\item为使用新的长度\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

在此处输入图片描述

相关内容