我的新命令有什么问题?

我的新命令有什么问题?

我定义了一个问题宏,然后逐渐使其更加花哨。目前,三个宏应该定义以下内容的简写:

\section{Questions}
\begin{enumerate}
\item Q1...
\item Q2...
\end{enumerate}
\section{Exercises}
\begin{enumerate}
\item exercise 1
\item exercise 2
\end{enumerate}
\href{my.url.goes/here/specific}{Take the quiz}

为此定义的三个命令是:

\newcommand{\qqq}{\section{Question}\begin{enumerate}}
\newcommand{\exer}{\end{enumerate}\section{Exercises}\begin{enumerate}}
\newcommand{\endexer}[1]{\end{enumerate}\href{my.url.com/path/{#1}}{Take the quiz}}

实现此目的的示例调用:

\qqq
\item What is 2+3?
\exer
\item Write a program to compute 2+3
\endexer{123}

应该生成以下 URL:

my.url.com/path/123

错误是:

!LaTeX 错误:命令 \endexer 已定义。或名称 \end... 非法,请参阅手册第 192 页。

我没有发布 MWE,因为我认为这是一个愚蠢的语法错误,因为我缺少有关 \newcommand 的一些信息,但如果我错了,我会创建一个 MWE 并将其添加到这里。

答案1

\end...您遇到的第一个问题是,在使用 时无法创建以 开头的宏\newcommand。此检查在 LaTeX 内核中定义为条件的一部分\@ifdefinable。要规避此问题,您需要使用 TeX 指令。也就是说,

\def\endexer#1{<stuff>}

而不是

\newcommand{\endexer}[1]{<stuff>}

其次,\newcommand语法具有以下结构(参见source2e.pdf):

\newcommand*{\foo}[<i>][<j>]{<text>}
  • *是可选的
  • \foo是要创建的命令
  • <i>是要吞食的参数的数量(最多 9 个);这引用了强制参数或可能的可选参数
  • <j>是第一个可选参数的默认值(如果存在则不存在);只能有一个
  • <text>是使用时的宏定义\foo

因为\newcommand{\foo}[1]{stuff #1}你会把它用作\foo{<stuff>},而不是\foo[<stuff>]。后一种用法需要 的定义\foo形式

\newcommand{\foo}[1][]{<stuff>}

注意第二组[],表示\foo采用可选参数(默认情况下/如果未指定则为空)。

具体到您的情况,请使用\endexer{123},而不是\endexer[123]


这是一个简单的例子:

在此处输入图片描述

\documentclass{article}
\usepackage{hyperref}
\newcommand{\qqq}{\section{Question}\begin{enumerate}}
\newcommand{\exer}{\end{enumerate}\section{Exercises}\begin{enumerate}}
\def\endexer#1{\end{enumerate}\href{my.url.com/path/{#1}}{Take the quiz}}
\begin{document}

\qqq
\item What is $2+3$?
\exer
\item Write a program to compute $2+3$.
\endexer{123}

\end{document}

答案2

以 .... 开头的名称\end是为实现环境的结束代码而保留的,因此您不能\endexer用 来定义\newcommand。您可以调用命令\stopexer\exerend或任何其他不以 开头的名称\end

答案3

虽然我强烈不建议在这种情况下使用newcommands,但这里有一种更易读的方法:

\documentclass[12pt,a4paper]{article}
\usepackage{hyperref}

\newcommand{\qqq}[1]{\section{Question}\begin{enumerate}#1\end{enumerate}}
\newcommand{\exer}[2]{\section{Exercises}\begin{enumerate}#1\end{enumerate} \href{my.url.com/path/{#2}}{Take the quiz}}

\begin{document}

\qqq{%
\item Q1 ...
\item Q2 ...}

\exer{%
\item exercise 1
\item exercise 2}
{path/to/quiz}

\end{document}

在此处输入图片描述

但是,如果您要重复此操作,我建议只添加一个快捷宏,只需按两个键盘按钮即可调用。隐藏真正的语法会使以后更难修复错误,并使您的代码容易出错。让代码LaTeX清晰明了始终是一个好习惯。

相关内容