描述
你好,我试图制作一个简单的 \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}
}