代码

代码

我想创建一个\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}

相关内容