我最近发现了以下一段代码:
\newcommand{\ISBN}[1]{\def\ISBN{#1}}
这难道不是多余的吗?它的用途是什么?
更新
我现在明白了它的用途。我以前从未见过。它很常见吗?还有其他方法可以达到同样的效果吗——使用宏为宏赋值?(为了这个目的,我尝试在动态类型的 Python 中使用它,但它不像在 LaTeX 中那样工作:def ISBN(value): ISBN = value
。)
答案1
它可以提供一次性使用的无条件内容设置。请考虑以下示例:
\documentclass{article}
% ==============================================
% These is defined inside some class/style file
\newcommand{\booktitle}[1]{\def\booktitle{#1}}
\newcommand{\bookauthor}[1]{\def\bookauthor{#1}}
\newcommand{\ISBN}[1]{\def\ISBN{#1}}
% ==============================================
\booktitle{My title}
\bookauthor{The author}
\begin{document}
\setlength{\parindent}{0pt}% Just for this example
Book title: \booktitle{}
Book author: \bookauthor{}
ISBN: \ISBN{}
\end{document}
在上面的例子中,用户只提供了\booktitle
and \bookauthor
,但没有提供\ISBN
。但是,如果我们在文档主体中使用每个宏时为其提供一个空参数,则它会显示为空或用户提供的任何内容。
更常见的用法通常见于标题,其中
\newcommand{\title}[1]{\def\@title{#1}}
\newcommand{\author}[1]{\def\@author{#1}}
因此可以内部访问\@title
和。此外,还可以通过使用 来检查/是否存在,以\@author
测试用户是否提供了一些\title{<title>}
和/或。\author{<author>}
\@title
\@author
\@ifundefined
答案2
它真的有这个吗?除了这个问题,我在谷歌上找不到任何例子。一些期刊课程,jss.cls
例如
\newcommand{\ISBN}[1]{\def\@ISBN{#1}}
这是更合理的,并且我期望(希望!)您找到的代码应该是这种形式,并且是类中的一个错误。
如图所示,正如 Werner 所解释的那样,它是合法的,但它的用户界面很糟糕。不是因为命令被重新定义,而是因为它使用不同的参数结构重新定义,因此命令会根据它是否之前被使用过而采用不同的语法,即使它按预期工作,这也是一个糟糕的设计。
自定义宏有多种用途,例如下面的宏定义自身在第一次使用后添加逗号分隔符。
\documentclass{article}
\newcommand\foo{\theenumi\def\foo{\refstepcounter{enumi}, \theenumi}}
\begin{document}
like this {\foo}
or this {\foo\foo\foo}
or this {\foo}
or this {\foo\foo\foo}
\end{document}
\def
请注意,内部没有什么特别之处:可以对内部或内部\newcommand
进行相同的操作,但在三个内部中\def
\def
\renewcommand
\newcommand
\def
\newcommand
可能更可取,因为您检查顶级命令不会与另一个包冲突,但您省略了对内部定义的检查,您知道这是总是重新定义。