如何使用 \ifx 和 \@currenvir?

如何使用 \ifx 和 \@currenvir?

描述

你好,我试图制作一个简单的 \ifx 语句来判断某些东西是否存在于环境中,并相应地执行命令。

我希望文档中的注释是无衬线的。但是,为了获得更一致的外观,我还希望它们在环境之外时缩进(主要用于描述、逐项列举和枚举),而在环境内时不缩进。

代码

因此我尝试使用以下简单代码\ifx@currenvir宏。

% Saving the \parindent value for later use
\newlength{\savedparindent}
\setlength{\savedparindent}{\parindent}
% Assigning the value 'document' to a control sequence for comparing later.
% I did this after noticing that outside any environment the \@currenvir macro would
% print the value 'document'
\newcommand*{\docname}{document}
% The actual \ifx conditional. The \Nota command (for note in spanish) is meant
% to be used in the document to add notes formatted in a distinctive way.
\newcommand{\Nota}[1]{
\begingroup
\makeatletter
\ifx\@currenvir\docname
    \raggedright\setlength{\parindent}{\savedparindent}\sffamily
    \else
    \raggedright\sffamily
   \fi  
\makeatother
#1
\endgroup
\par
}

问题

在我所有的测试中,该else部分在“正常”运行的文本中在环境内部和外部执行。有什么想法可以解释为什么它不起作用吗?(如果解决方案很明显,我很抱歉,因为我没有编程或 TeX 巫术方面的经验)。

不知道这是否相关,但该代码已经用 luatex 编译测试过。

解决方案

必须\docname在之后定义\makeatletter,也\par需要在组内才能正常工作。

答案1

您需要使用\newcommand*(或\def) 来定义\docname,以便它不是\long\long宏永远不会\ifx等于非长宏,即使它们具有相同的替换文本。

\makeatletter

必须在定义之前,将其放在任何命令内部就像将其放在\verb命令内部一样,它不起作用,因为输入已经被标记化。

最后,你需要在as\par之前,除非在之前有一个段落分隔符,否则不会产生任何效果\endgroup{\raggedright zzz}}

相关内容