![我的新命令有什么问题?](https://linux22.com/image/312074/%E6%88%91%E7%9A%84%E6%96%B0%E5%91%BD%E4%BB%A4%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我定义了一个问题宏,然后逐渐使其更加花哨。目前,三个宏应该定义以下内容的简写:
\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
虽然我强烈不建议在这种情况下使用newcommand
s,但这里有一种更易读的方法:
\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
清晰明了始终是一个好习惯。