在 \newcommand 中嵌套 \def 的目的是什么?

在 \newcommand 中嵌套 \def 的目的是什么?

我最近发现了以下一段代码:

\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}

在上面的例子中,用户只提供了\booktitleand \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可能更可取,因为您检查顶级命令不会与另一个包冲突,但您省略了对内部定义的检查,您知道这是总是重新定义。

相关内容