我正在编写一个创建边距段落的命令。这要求此命令仅在垂直模式下使用,这没问题。如果在浮动模式下使用该命令,LaTeX 会给出“不在外部段落模式”错误,这不太友好。有没有办法检测 LaTeX 当前是否处于垂直模式,以便我可以写一些对用户有帮助的内容?
答案1
开关\ifvmode
指示您是否处于垂直模式(包括内部垂直模式)。还有\ifhmode
水平模式和\ifinner
“内部”模式。
看TeXBook,第 20 章:定义(也称为宏),第 209 页了解更多详细信息。
请注意,有时需要在宏开头添加一个\relax
,\ifvmode
该宏可用于扩展标记的位置。例如,在tabular
/\halign
单元格中,标记会一直扩展,直到找到不可扩展的内容以查找\noalign
。在这种情况下,错误的模式可能仍然处于活动状态,例如,据我所知,TeX 处于行的第一个单元格的垂直模式,因为单元格尚未进入,所以 TeX 仍然在行之间。
答案2
作为尝试复制 LaTeX 所进行的测试的替代方法,您可以直接在本地重新定义\@parmoderr
或\@ehb
重新定义更特定于您的环境的内容。
\@parmoderr
最初定义为
\gdef\@parmoderr{%
\@latex@error{Not in outer par mode}\@ehb}
这会导致“不在外部 par 模式”错误,然后\@ehb
是您输入时获得的帮助文本h
,最初定义为
\gdef\@ehb{%
You've lost some text. \space \@ehc}
\gdef\@ehc{%
Try typing \space <return> %
\space to proceed.\MessageBreak
If that doesn't work, type \space X <return> \space to quit.}
全局改变这些定义不是一个好主意,但是在特定环境中改变它们是合理的。