如果我在文件中多次使用命令,我希望 LaTeX 会抛出一条错误消息。
这是允许的
\documentclass{article}
\newcommand{\mycommand}{Test}
\begin{document}
\mycommand
\end{document}
这应该会抛出一个错误消息
\documentclass{article}
\newcommand{\mycommand}{Test}
\begin{document}
\mycommand
\mycommand
\end{document}
答案1
让命令重新定义自身:
\documentclass{article}
\newcommand\myCommandOnce{%
Test%
\renewcommand\myCommandOnce{\GenericError{}
{Error: \string\myCommandOnce\space used twice!}
{Command was setup to be usable only once}{}}%
}
\newcommand{\mycommand}{Test}
\begin{document}
\myCommandOnce
\myCommandOnce
\mycommand
\mycommand
\end{document}
如果您打算创建许多这样的命令,可以使用以下命令。我创建了一个小型/愚蠢的包装器,\newcommand
它将重新定义部分插入到指定定义的其余部分之后。我的代码可能看起来不太好看,我猜更有经验的 LaTeX 用户会以不同的方式创建它。
包装器宏的名称是\newonetimecommand
,它接受相同的参数,例如\newcommand
加上!
作为其第一个可选参数。如果给出感叹号,则该命令只能全局使用一次。
编辑:下面的代码是从原始版本更改而来的,因为可选处理器不起作用。因此,只能使用带参数的宏。现在我使用O{\use:c{c_novalue_tl}}
而不是o
。结果只是一些不太可能插入和检查的东西\str_if_eq:nnTF
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_set_protected:Nn \my_optional_processor:n
{
\str_if_eq:nnTF { #1 } { \use:c { c_novalue_tl } }
{ \def \ProcessedArgument {} }
{ \def \ProcessedArgument { [#1] } }
}
\ExplSyntaxOff
\newcommand*\MyStarredProcessor[1]{%
\IfBooleanTF{#1}
{\def\ProcessedArgument{*}}
{\def\ProcessedArgument{}}}
\ExplSyntaxOn
\NewDocumentCommand{\newonetimecommand}
{ t!
>{\MyStarredProcessor}s
m
>{\my_optional_processor:n}O{ \use:c { c_novalue_tl } }
>{\my_optional_processor:n}+O{ \use:c { c_novalue_tl } }
+m }{%
\newcommand#2#3#4#5{%
#6%
\IfBooleanTF{#1}{\gdef}{\def}#3{%
\GenericError{}
{Error:~\string#3~used~twice!}
{Command~was~setup~to~be~usable~only~once}{}%
}%
}}
\ExplSyntaxOff
\newonetimecommand*\myCommandOnce[1][]{Test%
\if\relax\detokenize{#1}\relax\else\ #1\fi}
\newonetimecommand!*\myCommandReallyOnce[1][]{Test%
\if\relax\detokenize{#1}\relax\else\ #1\fi}
\newonetimecommand\foo{Test}
\newcommand{\mycommand}{Test}
\begin{document}
{\myCommandOnce}
\myCommandOnce
{\myCommandReallyOnce}
%\myCommandReallyOnce
\mycommand
\mycommand
\foo
\end{document}
答案2
您可以使用
\newcommand{\mycommand}{%
\renewcommand{\mycommand}{\PackageError{mypkg}{two mycommands}{read the documentation}}%
Test}
如果你需要重新定义是全局的,那么\newcommand
即使在不同的环境中你也不会有两个
\newcommand{\mycommand}{%
\gdef\mycommand{\PackageError{mypkg}{two mycommands}{read the documentation}}%
Test}