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