数学术语的定义和符号的声明

数学术语的定义和符号的声明

在撰写包含数学的文章时,我希望有一种方法可以确保我没有使用未定义的术语或符号。例如,我希望仅在定义术语“简单代数”后才使用它。为此,我可以创建一个命令

\newcommand{\simplealgebra}{simple algebra}

并将其放在\begin{definition}我定义它的命令之前。另一方面,如果我写另一篇论文,其中使用了相同的术语或符号,我不希望最终出现重复的命令,因此我希望将所有命令定义在一个地方,即序言中,我可能希望在更多文档之间共享它。

有没有办法将这两个条件结合起来,即在序言中定义命令,但确保仅从文档主体中的一个点使用该命令?


以下是评论中要求的最小工作示例。该示例展示了我如何使用\newcommand来强制自己避免使用之前被定义的术语\begin{definition}

\documentclass{article}%

\newtheorem{theorem}{Theorem}
\newtheorem{definition}[theorem]{Definition}

\begin{document}

...

Some introductory things. Here we don't know what an even number is, and using ``\textbackslash evennumber'' gives error.

%uncomment the following to get an error
%Some text about \evennumber
...

Starting from here, it is allowed to talk about even numbers.
\newcommand{\evennumber}{even number}
\begin{definition}
An {\evennumber} is an integer that is divisible by $2$.
\end{definition}
\end{document}
  • 我知道如何共享包含命令定义的序言。

  • 我知道如何在定义术语后强制使用术语。但要做到这一点,我将从\newcommand序言中移出

  • 我不知道但我想知道的是,如何将其保留\newcommand在序言中,但又只能从文档正文中的给定位置开始使用它。

答案1

一种方法是定义\ActiveXXX哪些内容,然后定义哪些内容\XXX,以便可以在文档的其余部分使用。例如:

\newcommand{\ActicvateEvenNumber}{\def\EvenNumber{even number\xspace}}%

这应该从外部文件中包含,以便它们之间的使用一致。

笔记:

  • 我用过包裹xspace以消除处理可选尾随空格的情况的需要。
  • 我之前做过类似的事情,所以应该提醒你,还有其他问题可能需要提前考虑。我想到的两个问题是复数版本的问题,以及在句子开头使用这个词的问题。

代码:

\documentclass{article}
\usepackage{xspace}

%% Include these from an external .sty file:
\newcommand{\ActicvateEvenNumber}{\def\EvenNumber{even number\xspace}}%

\begin{document}

%Test error condition by uncommenting:
%An \EvenNumber is one that is divsible by 2.

\ActicvateEvenNumber
An \EvenNumber is one that is divsible by 2.

\end{document}

更优雅的方法是使用一个外部文件,其中包含两列,分别包含宏名称和相关文本。使用如下命令读入此文件:包裹datatool例如,然后调用一个宏\ActiveMacro{evennumber},该宏将\evenmacro可用于文档的其余部分。

答案2

定义\defineterm以控制序列和相应文本作为参数。我们必须使用,\gdef因为定义可能在环境内部进行,所以我们还需要检查可定义性。

\documentclass{article}

\usepackage{amsthm}

\newtheorem{theorem}{Theorem}

\theoremstyle{definition}
\newtheorem{definition}[theorem]{Definition}

\makeatletter
\newcommand{\defineterm}[2]{%
  \@ifdefinable{#1}{\gdef#1{#2}\emph{#2}}}
\makeatother

\begin{document}

Some introductory things. Here we don't know what an even number is, and using 
``\evennumber'' gives error.

Starting from here, it is allowed to talk about even numbers.
\begin{definition}
An \defineterm{\evennumber}{even number} is an integer that is divisible by $2$.
\end{definition}

And here we can talk about an \evennumber{} because we already defined it.
\end{document}

在该示例中,第一次出现\evennumber会导致错误。另一方面,无法确保在定义之前不使用明确的术语“偶数”。

这种方法有一个缺点:记住已定义的命令变得越来越困难。


这是在序言中包含定义的一种方法。实际文本存储在属性列表中,而命令则临时定义以发出错误消息。

环境definition有一个可选参数,采用逗号分隔的术语列表(控制序列名称),这些术语从那时起将是合法的。

\documentclass{article}%
\usepackage{amsthm,xparse}

\newtheorem{theorem}{Theorem}
\theoremstyle{definition}
\newtheorem{xdefinition}[theorem]{Definition}

\ExplSyntaxOn
\NewDocumentCommand{\defineterm}{mm}
 {
  \cstoica_defineterm:nn { #1 } { #2 }
 }
\NewDocumentEnvironment{definition}{O{}}
 {
  \cstoica_enable:n { #1 }
  \xdefinition
 }
 {
  \endxdefinition
 }

\prop_new:N \g_cstoica_terms_prop
\tl_new:N \l_cstoica_currentterm_tl

\cs_new_protected:Npn \cstoica_defineterm:nn #1 #2
 {
  \prop_gput:Nnn \g_cstoica_terms_prop { #1 } { #2 }
  \cs_new:cpn { #1 } { \msg_error:nnn { cstoica/terms } { early } { #1 } }
 }

\cs_new_protected:Npn \cstoica_enable:n #1
 {
  \clist_map_inline:nn { #1 } { \cstoica_enableterm:n { ##1 } }
 }
\cs_new_protected:Npn \cstoica_enableterm:n #1
 {
  \prop_get:NnNTF \g_cstoica_terms_prop { #1 } \l_cstoica_currentterm_tl
   { \cs_gset_eq:cN { #1 } \l_cstoica_currentterm_tl }
   { \msg_error:nnn { cstoica/terms } { undefined } { #1 } }
 }

\msg_new:nnnn { cstoica/terms } { early }
 {
  Term~`#1'~not~yet~defined
 }
 {
  You~have~used~`#1'~before~formally~defining~it
 }
\msg_new:nnnn { cstoica/terms } { undefined }
 {
  Undefined~term~`#1'
 }
 {
  The~term~`#1'~is~not~defined,~check~the~name
 }
\ExplSyntaxOff

\defineterm{evennumber}{even number}
\defineterm{integer}{integer number}

\begin{document}

Some introductory things. Here we don't know what an even number is, and using 
``\evennumber'' gives error.


Starting from here, it is allowed to talk about even numbers.
\begin{definition}[evennumber]
An \emph{\evennumber} is an integer that is divisible by $2$.
\end{definition}

And here we can talk about an \evennumber{} because we already defined it.

\begin{definition}[integer,rational]
Here we define an \emph{\integer}, but we get an error about \emph{\rational}.
\end{definition}
\end{document}

实现起来比较简单,只需给出控制序列名称,但可以修改它以要求

\defineterm{\evennumber}{even number}

在序言和

\begin{definition}[\evennumber]

在文档中。

答案3

这是一个快速而粗糙的方法,可以使其更加自动化:

\documentclass{article}
\usepackage{xparse}

\newtheorem{theorem}{Theorem}
\newtheorem{definition}[theorem]{Definition}

\ExplSyntaxOn

\NewDocumentEnvironment{mydef}{ o }
    {
        \bool_new:c {g_#1_bool}
        \bool_gset_true:c {g_#1_bool}
        \begin{definition}
    }
    {
        \end{definition}
    }

\NewDocumentCommand{\evennumber}{}{
    \bool_if:cTF {g_evennumber_bool}
        {even~number}
        {\msg_error:nn {Oops} {You~have~used~an~undefined~term.}}
    }

\ExplSyntaxOff

\begin{document}

Here {\evennumber} is undefined so will produce an error.

\begin{mydef}[evennumber]
An {\evennumber} is an integer that is divisible by $2$.
\end{mydef}

%Here {\evennumber} is defined and won't produce an error.

\end{document}

相关内容