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