我想创建一个\points
在数学和文本模式下都有效的命令。不幸的是,经过多次尝试后,我仍然无法创建正确的(水平)间距。这是我的基本“设置”,其中缺少空格前 \points{3}
在数学模式内。
代码
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\DeclareDocumentCommand \points { m } {\text{[#1\,P]}}
\begin{document}
Sentence end \points{1}. Between \points{2} words.
$x^2 + 9 = 0 \points{3}$
\end{document}
结果
答案1
数学模式会占用空间,因此您必须强制执行。
您可以将宏更改为:
\NewDocumentCommand \points { m } {\ifmmode\ \fi\text{[#1\,P]}}
或者在使用命令时强制使用空格:
$x^2 + 9 = 0\ \points{3}$
但不能同时使用两者,否则您将得到两个空格。
\DeclareDocumentCommand
另外,请注意,我根据@egreg 的评论将其替换为\NewDocumentCommand
。
\DeclareDocumentCommand
其行为类似于\def
已定义的命令。无论如何它都会创建命令,因此您可能正在用此命令替换已存在的宏。
\NewDocumentCommand
另一方面,相当于 LaTeX 的\newcommand
;它将检查正在创建的命令是否已存在,如果存在,则会出现错误。
答案2
\documentclass{article}
\usepackage{amsmath}
\newcommand\points[1]{\ensuremath{\mathrel{[#1\,\mathrm{P}]}}}
\begin{document}
Sentence end \points{1}. Between \points{2} words.
$x^2 + 9 = 0 \points{3}$
\end{document}
答案3
如果您将 添加\ifmmode\text{\space}
到命令中,则在数学模式下使用时,它将始终在前面插入一个空格。此外,我使用了\newcommand
而不是\NewDocumentCommand
因为创建采用单个强制参数的命令不需要 的更高级功能\NewDocumentCommand
。
\documentclass{article}
\usepackage{amsmath}
\newcommand\points[1]{\relax\ifmmode\text{ }\fi\text{[#1\,P]}}
\begin{document}
Sentence end \points{1}. Between \points{2} words.
$x^2 + 9 = 0 \points{3}$
\end{document}